功能实现

  1. 背景图绘制
  2. 背景音乐

搭建初始场景

做一个游戏游戏最重要最重要的,就是把游戏画面展现给玩家,所以我们所要做的第一步,就是绘制出游戏窗口,毕竟黑框框并不符合大多数人的审美~当然像《盲景》这种只用听的游戏就是例外了

所以我们还是像制作扫雷一样,定义主函数和一个类来进行游戏内容管理,像下面这样

首先是完善我们的Game.h

#pragma once
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <windows.h>
#include <iostream>
#include <sstream>
using namespace sf;
typedef enum gameSceneState {        //不同的游戏场景
    SCENE_START, SCENE_FIGHT
};
class Game {
public:
    sf::RenderWindow window;    //定义游戏窗口
    Game();
    ~Game();
    int windowWidth, windowHeight;                        //场景宽,高
    int gameSceneState;                                    //场景状态
    bool gameOver, gameQuit;
    bool startMusic, fightBusic;                        //音乐播放状态
    Texture tGameStartBK, tGameFightBK, tStartBtn;        //加载纹理
    Sprite sGameStartBK, sGameFightBK, sStartBtn;        //精灵
    Music gameStartMusic;                                //音乐
    SoundBuffer victorSb, defeatSb, attackSb, hoverSb, pressSb, releaseSb;  //音效缓冲
    Sound victorSd, defeatSd, attackSd, hoverSd, pressSd, releaseSd;        //音效


    void Run();                //游戏运行

    void Initial();            //初始化
    void loadMediaData();    //加载媒体

    void Input();            //交互

    void Draw();            //绘制不同的内容
    void drawStart();        //初始场景
    void drawFight();        //战斗场景

    void Logic();

};

然后是Game.cpp

#include "Game.h"
using namespace std;
Game::Game() {
    windowWidth = 1680;                                //窗口宽度
    windowHeight = 985;                                //窗口高度
    window.create(VideoMode(windowWidth, windowHeight), L"月圆之夜");            //建立一个xx宽xx高,标题为xxx的窗口,L表示双字节
}
Game::~Game() {

}
void Game::Initial() {
    window.setFramerateLimit(60);                    //刷新帧数
    gameSceneState = SCENE_START;                    //初始默认游戏场景
    startMusic = true;
    fightBusic = false;
    gameOver = gameQuit = false;
    loadMediaData();
    if (startMusic) {
        gameStartMusic.play();
        gameStartMusic.setLoop(true);
    }
}
void Game::loadMediaData() {
    //加载贴图纹理
    if (!tGameStartBK.loadFromFile("data/bg/bg1.png")) {
        cout << "找不到data/bg/bg1.png" << endl;
    }
    //精灵绑定纹理
    sGameStartBK.setTexture(tGameStartBK);
    //加载音频
    if (!gameStartMusic.openFromFile("data/music/game.ogg")) {
        cout << "找不到data/music/game.ogg" << endl;
    }
}
void Game::Input() {
    Event event;
    while (window.pollEvent(event)) {                //接受事件
        if (event.type == Event::Closed) {
            window.close();                            //关闭键关闭窗口
            gameQuit = true;
        }
        if (event.type == sf::Event::EventType::KeyReleased && event.key.code == sf::Keyboard::Escape) {
            window.close();                            //按esc键关闭窗口
            gameQuit = true;
        }
    }
}
void Game::Draw() {
    if (gameSceneState == SCENE_START) {        //判断场景
        drawStart();
    } else if (gameSceneState == SCENE_FIGHT) {
        drawFight();
    }
}
void Game::drawStart() {        //初始场景
    window.clear();                            //清屏
    sGameStartBK.setPosition(0, 0);            //设置绘制位置
    window.draw(sGameStartBK);                //绘制
    window.display();                        //展示屏幕
}
void Game::drawFight() {        //战斗场景

}
void Game::Logic() {

}
void Game::Run() {
    do {
        Initial();
        while (window.isOpen()) {
            Input();
            Draw();
            Logic();
        }
    }
    while (!gameQuit);
}

最后主函数

#include<iostream>
#include"Game.h"

int main() {
    Game game;
    while (game.window.isOpen()) {
        game.Run();
    }
    return 0;
}

这样就可以运行了

要点

主要是素材的问题

  1. sfml貌似只能加载ogg文件,所以还得都转换成ogg格式

这时候我又找到一个好用的在线网站https://convertio.co/zh/

它可以在线转换各种文件的格式

  1. win10操作ogg文件慢的要死,最后在win10商店安装“Web媒体扩展”应用成功解决问题

Last modification:September 27th, 2020 at 11:17 pm