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】

编译得到:

  1. bin目录:含有dll
  2. include目录:头文件
  3. 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;
}

知识点

  1. SFML采用命名空间设计,我的游戏也可以用命名空间来避免同名冲突
  2. 前置声明可以避免模块循环依赖

典型游戏简图

image

描画基本图形

#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;
}

第二章:构建游戏框架

第三章:动手

第四章:输入和事件管理器

第五章:程序状态

第六章:动画和移动

第七章:通用游戏设计元素

第八章:通用游戏设计模式

第九章:实体组件系统

第十章:GUI原理

第十一章:实现GUI

第十二章:声音和音乐

第十三章:网络基础

第十四章:多人游戏

posted @ 2022-04-03 21:32  踏月清风  阅读(250)  评论(0编辑  收藏  举报