SFML C++ 项目
项目简介
这是一个跟着COMP4300的课程记录制作的项目,因不公开提供代码资料,所以我自己整理了一份方便其他人使用,放在网页上的代码和文档都test过,请放心使用。
这个项目利用SFML来制作一个含有各种图形四处悬动的窗口,示例如下:
要求从config.txt文件中读取窗口大小,生成要求的图形(positionX, positionY, speedX, speedY, r, g, b, (height, width) or radius),图形需要根据自身的速度在窗口中移动,当碰到边框时进行反弹(速度变成相反的),图形需要在正中间显示图形名字:1
2
3
4
5
6
7
8Window 1280 720
Font fonts/KillerTech.ttf 36 128 128 255
Circle CGreen 100 100 -3 2 0 255 0 50
Circle CBlue 200 200 2 4 0 0 255 100
Circle CPurple 300 300 -2 -1 255 0 255 75
Rectangle RRed 200 200 4 4 255 0 0 50 25
Rectangle RGrey 300 250 -2 2 100 100 100 50 100
Rectangle RTeal 25 100 -2 -2 0 255 255 100 100
项目Setup
- 下载SFML,官网:https://www.sfml-dev.org/download.php
- 下载Visual Studio 2022,官网:https://visualstudio.microsoft.com/downloads/
- 将SFML路径添加到系统环境变量中
- 将下载好的
SFML-2.6.1
放到C:\lib\
中(要自己新建文件夹) - 新建变量
SFML_DIR
:C:\lib\SFML-2.6.1
- 在path变量中添加:
%SFML_DIR%\bin
,%SFML_DIR%\include
- 将下载好的
- 在visual studio 2022中创建一个项目
- 跟随官网配置project settings: https://www.sfml-dev.org/tutorials/2.6/start-vc.php,这步是让Visual Studio知道SFML在哪里可以找到
- 在项目所在的文件夹中,创建一个新文件夹
fonts
,并下载一个ttf font文件放入其中(我在这里找的免费font:https://www.1001freefonts.com/)
可以去我的github COMP4300项目中查看文件夹结构,或直接下载所需文件
项目代码
如果想自己先写写试试的话,可以从以下的Sample Code入手,同时,也可以用以下代码来检测Setup是否成功。这个代码包含基本的窗口、文字和一个移动的圆形。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
int main()
{
// Create a window
const int wWidth = 640;
const int wHeight = 480;
sf::RenderWindow window(sf::VideoMode(wWidth, wHeight), "SFML Works"); // render a window in video type
window.setFramerateLimit(60); // limit the screen frame rate at 60 per second
int r = 0;
int g = 255;
int b = 255;
// Draw shapes
sf::CircleShape circle(50); // circle with radius of 50
circle.setFillColor(sf::Color(r, g, b));
circle.setPosition(300.0f, 300.0f); // set top left position of the shape
float circleSpeed = 1.0f; // 1.0f per frame
sf::Font font;
if (!font.loadFromFile("fonts/FreshMulberryDemoRegular.ttf")) // if it returns true, nothing happens
{
std::cerr << "Could not load font." << std::endl;
exit(-1);
}
// Set up text object
sf::Text text("Sample Text", font, 24); // set up text string, font and character size
text.setPosition(0, wHeight - (float)text.getCharacterSize());
// Set up the main loop to keep the window open
while (window.isOpen())
{
// Set up the supervision of the window event
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
window.close();
}
if (event.type == sf::Event::KeyPressed)
{
std::cout << "Key pressed with code = " << event.key.code << std::endl;
if (event.key.code == sf::Keyboard::D)
{
circleSpeed *= -1.0F;
}
}
}
// Update new shape position per frame
float speedX = 0.5;
float speedY = 2.0;
circle.setPosition(circle.getPosition().x + circleSpeed, circle.getPosition().y + speedY);
// Draw & Render window
window.clear(); // clear what's left in the previous frame
window.draw(circle);
window.draw(text);
window.display();
}
return 0;
}