功能实现
- 背景图绘制
- 背景音乐
搭建初始场景
做一个游戏游戏最重要最重要的,就是把游戏画面展现给玩家,所以我们所要做的第一步,就是绘制出游戏窗口,毕竟黑框框并不符合大多数人的审美~当然像《盲景》这种只用听的游戏就是例外了
所以我们还是像制作扫雷一样,定义主函数和一个类来进行游戏内容管理,像下面这样
首先是完善我们的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;
}
这样就可以运行了
要点
主要是素材的问题
- sfml貌似只能加载ogg文件,所以还得都转换成ogg格式
这时候我又找到一个好用的在线网站https://convertio.co/zh/
它可以在线转换各种文件的格式
- win10操作ogg文件慢的要死,最后在win10商店安装“Web媒体扩展”应用成功解决问题
是的
是杭电的吗
是的
李仕老师的实践作业(´இ皿இ`)
hhh,加油做吧
太难了(´இ皿இ`)