SFML(C++)实现贪吃蛇(带小地图、视角等)

本文档介绍了如何使用C++和SFML库在Windows 10上开发贪吃蛇游戏。首先,详细阐述了环境配置,包括Visual Studio 2015的设置和SFML库的配置。接着,强调了学习SFML库的重要性,特别是系统、窗口和图像模块,这些对于创建游戏画面和小地图至关重要。最后,提供了源代码的主要部分,并展示了游戏的实际运行效果。
摘要由CSDN通过智能技术生成

 
 
最近用SFML(C++)写了一个贪吃蛇的小游戏,在这里分享一下,希望能够对各位有所帮助。
 
 

1、环境配置

操作系统:Win 10

C++平台:Visual Studio 2015

SFML的配置参考:https://www.sfml-dev.org/tutorials/2.5/start-vc.php
 

  • 在创建工程时,需要选择x64(对应于SFML版本)
     
    在这里插入图片描述
     

  • 注意:附加依赖项如下

sfml-graphics-d.lib

sfml-window-d.lib

sfml-system-d.lib

 
在这里插入图片描述

 
 

2、SFML库学习

在正式编写游戏前,SFML库的学习是必不可少的。这里列出需要学习的模块:

  • 系统模块:处理时间线程数

  • 窗口模块:打开和管理SFML窗口活动说明键盘鼠标和操纵杆

  • 图像模块:绘制2D素材精灵和纹理文字和字体形状使用顶点数组设计自己的实体位置、旋转、比例:变换实体通过视图控制2D摄像机
     

在这里插入图片描述

 
其中小地图是通过视图控制2D摄像机实现的,使用视图过程中可能会改变精灵的形状,可以通过比例缩放来还原。这里列出的所有模块都可以在SFML给出的官方文档中学习和参考。

SFML官方文档:https://www.sfml-dev.org/tutorials/2.5/
 

 

3、源代码

源代码分为main.cpp和parameter.h,带有注释。
 

  • main.cpp
#include "parameter.h"

//隐藏控制台
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")


//全局对象
sf::RenderWindow window;	//主窗口
sf::Font font;	//字体
sf::Clock clock_sys;	//时钟,开始计时
sf::View mainView;
sf::View ParameterView;
sf::View miniMap;
sf::Texture texture;
sf::Sprite sprite;
sf::Text gameMsg;
sf::RectangleShape border;
ParameterText parametertext;
Snake snake;
Food food;
int Snake::growFactor = GROWFACTOR;
float Snake::sensitivity = 1.5;
float Snake::crawling_distance = 1.5*SNAKESIZE/GROWFACTOR;
int Difficulty = 3;
int Highest_score = 0;
bool pauseFlag = false;
const double PI = atan(1.)*4.;	//圆周率

int main()
{
	game_init();
	sf::Clock clock_game;
	gameMsg.setString("Playing...");

	while (window.isOpen())
	{
		sf::Vector2f centertmp(0, 0);

		//updata
		snake.updataQueue(clock_game.restart());
		parametertext.upData();

		//更新主视角中心
		centertmp = snake.getSnakeHeadPosition();
		centertmp.x = limit_float(centertmp.x, WIDTH*(PWIDTH + MAINSCALE / 2), WIDTH*(1 - MAINSCALE / 2));
		centertmp.y = limit_float(centertmp.y, HIGTH*MAINSCALE / 2, HIGTH*(1 - MAINSCALE / 2));
		mainView.setCenter(centertmp);
		border.setPosition(centertmp - sf::Vector2f(WIDTH*MAINSCALE / 2 + 10, HIGTH*MAINSCALE / 2 + 10));

		//检测
		if (snake.isCapture(food.rec))
		{
			//小蛇吃到食物
			cout << "捕获" << endl;
			snake.grow();
			food.createFood();
		}
		if (snake.isCrashBorder())
		{
			//小蛇触碰到边界,游戏结束
			snake.dead = true;
			gameMsg.setString("GameOver\nPressEnter");
			cout << "碰撞边界" << endl;
		}
		
		//事件
		sf::Event event;
		while (window.pollEvent(event))
		{
			float xtmp = 0;
			float ytmp = 0;
			sf::Uint32 unicode = 0;
			switch (event.type)
			{
			case sf::Event::Closed:									//关闭
				w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值