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

  • 相关阅读:
    剑指Offer47 不用加减乘除做加法
    剑指Offer46 求1+2+...+n
    剑指Offer45 约瑟夫环
    剑指Offer44 扑克牌的顺子
    剑指Offer43 n个骰子点数概率
    面试题分享
    初识python版本
    redis安装部署
    配置本地yum源
    闭包、装饰器
  • 原文地址:https://www.cnblogs.com/tomboy/p/2566335.html
Copyright © 2020-2023  润新知