使用C++与SFML编写一个简单的撞球游戏Part2——创建游戏窗口
环境搭建好了,接下来就开始正式编码了!!!
首先在stdafx.h里面添加需要用到的文件,以后需要的时候只要include stdafx.h这文件就可以了
1 // stdafx.h : 标准系统包含文件的包含文件, 2 // 或是经常使用但不常更改的 3 // 特定于项目的包含文件 4 // 5 6 #pragma once 7 8 #include "targetver.h" 9 10 #include <stdio.h> 11 #include <tchar.h> 12 13 14 15 // TODO: 在此处引用程序需要的其他头文件 16 #include <SFML/System.hpp> 17 #include <SFML/Graphics.hpp> 18 #include <SFML/Window.hpp> 19 #include <SFML/Audio.hpp> 20 21 #include <map> 22 #include <iostream> 23 #include <cassert>
然后在BallGame.cpp中添加启动代码
1 // BallGame.cpp : 定义控制台应用程序的入口点。 2 3 #include "stdafx.h" 4 #include "Game.h" 5 6 int _tmain(int argc, _TCHAR* argv[]) 7 { 8 Game::Start(); 9 return 0; 10 }
当然,也需要新建一个名为Game.h的头文件,其代码如下
1 #pragma once 2 3 class Game 4 { 5 6 public: 7 static void Start(); 8 9 private: 10 static bool IsExiting(); 11 static void GameLoop(); 12 //用枚举类型来代替常量表示游戏状态 13 enum GameState { Uninitialized, ShowingSplash, Paused, 14 ShowingMenu, Playing, Exiting }; 15 16 static GameState _gameState; 17 static sf::RenderWindow _mainWindow; 18 };
补充点:根据原文介绍,把整个类都设计成static,是因为需要一个全局接口,而为什么不用单例模式呢?
是因为单例模式代码量比较多,原文作者想用比较直接和直观的方式表达出来。
在类之中使用static时要注意的地方:
1.静态方法只能接受静态成员变量
2.在静态方法里面并不存在this指针
3.不能在类的构造函数里面设置一个静态变量
4.必须在类的外部初始化静态变量
5.使用静态变量之前必须确保其已经初始化
最后,还必须要提供类的实现,其代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "stdafx.h" 2 #include "Game.h" 3 4 void Game::Start(void) 5 { 6 if(_gameState != Uninitialized) 7 return; 8 9 //设置窗口参数 10 _mainWindow.create(sf::VideoMode(1024,768,32),"BallGame!"); 11 _gameState = Game::Playing; 12 13 //游戏循环,当游戏状态为Exiting则退出游戏 14 while(!IsExiting()) 15 { 16 GameLoop(); 17 } 18 19 _mainWindow.close(); 20 } 21 22 bool Game::IsExiting() 23 { 24 if(_gameState == Game::Exiting) 25 return true; 26 else 27 return false; 28 } 29 30 void Game::GameLoop() 31 { 32 sf::Event currentEvent; 33 while(_mainWindow.pollEvent(currentEvent)) 34 { 35 36 switch(_gameState) 37 { 38 case Game::Playing: 39 { 40 //用红色填充游戏画面 41 _mainWindow.clear(sf::Color(255,0,0)); 42 _mainWindow.display(); 43 44 if(currentEvent.type == sf::Event::Closed) 45 { 46 _gameState = Game::Exiting; 47 } 48 break; 49 } 50 } 51 } 52 } 53 54 //此处要手动声明静态变量,不然编译器会报错 55 Game::GameState Game::_gameState = Uninitialized; 56 sf::RenderWindow Game::_mainWindow;
现在按F5试试吧,如果出现诸如下图的错误
请把SFML-2.0-rc -> bin文件夹里面的所有dll都拷贝到项目下的debug文件夹里面去就可以了
补充点:可能你会发现这里的代码跟原文的代码有出入,那是因为原文用的是SFML1.6版本,这里是用2.0,函数的方法名发生了改变