标签:执行 素材 image 目录 frame 逻辑 项目目录 += 授权
使用C++编写一个简单的俄罗斯方块游戏。
使用C++图形库SFML,官网下载地址为https://www.sfml-dev.org/download.php
解压安装
假设安装路径为:C:\Program Files\SFML
VS配置
就一个.cpp
文件,同目录下有两个文件夹:用来描绘背景的图片素材的images
和 音乐素材的 audio
。
整个代码分为简单的5个模块:计时器、检查、转换、消除、新块生成
计时器
游戏运行核心、设置 delay 值后,计时器每到delay值,处理游戏的检查、消除和新块生成逻辑
//// Timer 逻辑
while(window.isOpen()) // SFML 窗口
{
timer += time; // time是上次计时到本次的时间
if(timer>delay){
// check
// transpose
// new block
timer = 0;
}
}
检查
检查主要检查两样东西:1是检查是否当前块落地,2是检查构成消除条件的行。
1.检查是否落地
砖块描述存储在 int field[20][10]
中,每次有砖块落地,都会将该砖块的对应的位置赋值,后续砖块在下落过程中遇到有值的场地,则停止下落。检查落地用 check 描述
bool check()
{
for (int i = 0; i<4; i++)
if (a[i].x<0 || a[i].x >= N || a[i].y >= M) return 0;
else if (field[a[i].y][a[i].x]) return 0;
return 1;
};
2.检查消除行
当满足一行的field值都不为0的时候,构成消除行,消除逻辑由 checkline 描述
int k = M - 1;
for (int i = M - 1; i>0; i--)
{
int count = 0;
for (int j = 0; j<N; j++)
{
if (field[i][j]) count++;
field[k][j] = field[i][j];
}
if (count < N) { k--; }
else {
score += 1;
}
}
新块生成
新块生成无非是rand一个颜色和砖块样式。对于砖块样式,罗列在下:
用位置描述所有类型的俄罗斯砖块。之后再转换为坐标即可。
画图
只要窗口打开着,就需要画图,画图用draw描述:
/////////draw//////////
window.clear(Color::White);
window.draw(background);
for (int i = 0; i<M; i++)
for (int j = 0; j<N; j++)
{
if (field[i][j] == 0) continue;
s.setTextureRect(IntRect(field[i][j] * 18, 0, 18, 18));
s.setPosition(j * 18, i * 18);
s.move(28, 31); //offset
window.draw(s);
}
for (int i = 0; i<4; i++)
{
s.setTextureRect(IntRect(colorNum * 18, 0, 18, 18));
s.setPosition(a[i].x * 18, a[i].y * 18);
s.move(28, 31); //offset
window.draw(s);
}
// next box
nextBox.setTextureRect(IntRect(0, 0, 72, 108));
nextBox.setPosition(240, 20);
window.draw(nextBox);
// draw next item
for (int i = 0; i<4; i++)
{
s.setTextureRect(IntRect(colorNum_next * 18, 0, 18, 18));
s.setPosition(240+18+a[i].x_next * 18, 20+18+a[i].y_next* 18);
//s.move(28, 31); //offset
window.draw(s);
}
window.draw(frame);
window.display();
C++编写简单的俄罗斯方块游戏
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
标签:执行 素材 image 目录 frame 逻辑 项目目录 += 授权
原文地址:https://www.cnblogs.com/demodashi/p/10474121.html