SFML Game Development by Example学习笔记
SFML Game Development by Example
用SFML创建和开发令人激动的游戏。
官网:https://www.sfml-dev.org/index.php
SFML:简单快速的多媒体库(Simple and Fast Multimedia Library)
本书在线:https://www.doc88.com/p-3846108926022.html
第一章:配置项目
配置SFML
SFML五大模块
- 系统,核心模块,提供线程,时钟,用户数据和其他
- 窗口,创建和管理窗口,采集用户输入和事件,用OpenGL
- 图形,每一件事物都需要图形实现,采用双缓冲渲染
- 声音,播放音乐,声音,音频,记录声音
- 网络,和其他电脑通信
Visual Studio环境配置参考:https://www.sfml-dev.org/tutorials/2.5/start-vc.php
SFML源码下载:https://www.sfml-dev.org/files/SFML-2.5.1-sources.zip
SFML源码编译用【CMake (cmake-gui)】+【Visual Studio】
编译得到:
- bin目录:含有dll
- include目录:头文件
- lib目录:含有lib
创建一个应用
项目运行依赖dll,可以把dll拷贝到exe目录,也可以配置vs的【属性-调试-环境】
PATH=%PATH%;C:\Users\Administrator\Downloads\SFML-2.5.1-sources\SFML-2.5.1\build2\install\bin
取消勾选【从父级或项目默认设置继承】
配置【属性-VC++目录-源目录】添加对源码的索引
C:\Users\Administrator\Downloads\SFML-2.5.1-sources\SFML-2.5.1\src\SFML\Window
C:\Users\Administrator\Downloads\SFML-2.5.1-sources\SFML-2.5.1\src\SFML\Graphics
#include <SFML/Graphics.hpp>
int main(int argc, char** argv[])
{
sf::RenderWindow window(sf::VideoMode(640, 480), "First Window!");
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::Black);
window.display();
}
return 0;
}
知识点
- SFML采用命名空间设计,我的游戏也可以用命名空间来避免同名冲突
- 前置声明可以避免模块循环依赖
典型游戏简图
描画基本图形
#include <SFML/Graphics.hpp>
int main(int argc, char** argv[])
{
sf::RenderWindow window(sf::VideoMode(640, 480), "First Window!");
sf::RectangleShape rectangle(sf::Vector2f(128.0f,128.0f));
rectangle.setFillColor(sf::Color::Red);
rectangle.setPosition(320, 240);
rectangle.setOrigin(rectangle.getSize().x / 2,
rectangle.getSize().y / 2);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::Black);
window.draw(rectangle);
window.display();
}
return 0;
}
描画图片
- 纹理Texture本质是一张图片Image。
- 精灵Sprite相当于Rectangle+Texture;Sprite提供一种渲染Texture的方法。
- 常见错误一,误释放Texture资源;
- 常见错误二,加载太多Texture,卡顿;
- 建议加载一张Texture,通过修改读取区域创建Sprite。
- 图片的相对路径是相对
.vcxproj
目录的。
#include <SFML/Graphics.hpp>
int main(int argc, char** argv[])
{
sf::RenderWindow window(sf::VideoMode(640, 480), "First Window!");
sf::RectangleShape rectangle(sf::Vector2f(128.0f,128.0f));
rectangle.setFillColor(sf::Color::Red);
rectangle.setPosition(320, 240);
rectangle.setOrigin(rectangle.getSize().x / 2,
rectangle.getSize().y / 2);
sf::Texture mushroomTexture;
mushroomTexture.loadFromFile("Mushroom.png");
sf::Sprite mushroom(mushroomTexture);
sf::Vector2u size = mushroomTexture.getSize();
mushroom.setOrigin(size.x / 2, size.y / 2);
sf::Vector2f increment(0.1f, 0.1f);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
if ((mushroom.getPosition().x + (size.x / 2) > window.getSize().x && increment.x > 0)
||
(mushroom.getPosition().x - (size.x / 2) < 0) && increment.x < 0)
{
increment.x = -increment.x;
mushroom.setColor(sf::Color(0, 0, 255, 255));
}
if ((mushroom.getPosition().y + (size.y / 2) > window.getSize().y && increment.y > 0)
||
(mushroom.getPosition().y - (size.y / 2) < 0) && increment.y < 0)
{
increment.y = -increment.y;
mushroom.setColor(sf::Color(0, 255, 0, 255));
}
mushroom.setPosition(mushroom.getPosition() + increment);
window.clear(sf::Color::Black);
window.draw(rectangle);
window.draw(mushroom);
window.display();
}
return 0;
}