使用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.使用静态变量之前必须确保其已经初始化

最后,还必须要提供类的实现,其代码如下

View Code
 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,函数的方法名发生了改变

原文地址:https://www.cnblogs.com/tomboy/p/2566335.html