我們已經知道基本的遊戲循環的基本架構了,第一天我們也用簡單的code
建立的簡單地window
並且將圖片繪製上了,我們可以知道一個基本遊戲當中包刮了:
window
建立前幾天我們將所有的code
都寫在main
裡面,對於常打程式競賽的人來說可能很正常,但對於常寫一些專案的人來說這會令人頭痛。
為了提高我們維護性以及便於重複使用,我們會進一步地去封裝模塊,搭建出一個遊戲的雛型。
首先就是整個遊戲的封裝,也就是Game class
class Game {
public:
Game();
~Game();
void run();
void processInput();
void update();
void render();
};
接著我們將昨天寫的東西分裝到各個function
裡
processInput
void Game::processInput() {
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
sprite.move(-0.1, 0);
if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
sprite.move(0.1, 0);
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
sprite.move(0, -0.1);
if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
sprite.move(0, 0.1);
}
render
void Game::render() {
window.clear();
window.draw(sprite);
window.display();
}
update
目前沒什麼東西要放到這裡,所以先略過
sprite
當作玩家,所以讓Game
擁有它class Game {
public:
Game();
~Game() = default;
void run();
void processInput();
void update();
void render();
private:
sf::RenderWindow window;
sf::Texture texture;
sf::Sprite sprite;
};
Game
初始化的時候將我們的window
以及sprite
初始化好
Game::Game() {
window.create(sf::VideoMode(1280, 720), "SFML Window");
if(!texture.loadFromFile("1.png"))
std::cout << "Error loading file" << std::endl;
sprite.setTexture(texture);
sprite.setPosition(sf::Vector2f(400.f, 260.f));
sprite.setScale(sf::Vector2f(0.1f, 0.1f));
}
至於整個遊戲循環就很簡單了
void Game::run() {
while(window.isOpen()) {
processInput();
update();
render();
}
}
這樣我的main
就可以變得很乾淨了
#include "Game.h"
int main(){
Game game;
game.run();
return EXIT_SUCCESS;
}