开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
跑步小游戏c/c++
前言
此篇为本人学习b站up主c语言程序变成所作,由于个人能力,部分功能没有实现,部分头文件需要在网上搜集,比如碰撞测试,图片插入,通过本次学习,可以锻炼自己函数调用以及开发项目格式书写能力。
说明
1.创建游戏窗口
2.设计游戏背景
a.三重背景不同速度同时移动;
b.循环滚动背景的实现
3.实现游戏背景
a.加载背景资源
b.渲染(背景知识:窗口坐标)
c.防止屏幕闪动
4.实现玩家奔跑
5.实现玩家跳跃
6.实现障碍物
7.碰撞处理
8.得分处理
第一部分 定义变量
初始化窗口大小 背景图片 定义一张背景图片变量 背景图片的x坐标 人物的x,y坐标 任务奔跑的图片帧序号 表示玩家正在跳跃 跳跃的最大值 跳跃偏移量 小乌龟 小乌龟水平坐标 当前窗口是否有小乌龟,保证最多只有一个小乌龟
第二部分 游戏初始化
创建游戏窗口 加载背景资源 保存背景图片x为0的坐标,图片向左移动后,回到初始位置0 加载hero奔跑的图片帧素材 设置人物的初始的位置 设置人物跳跃 加载小乌龟
第三部分 编写函数
渲染游戏背景,放出图片 使背景运动 使人物动作变化 实现跳跃 创建小乌龟 玩家碰撞检测 处理用户按键输入
第四部分 主函数
利用循环,将每张图片循环播放,达到图片动态效果,注意BeginBatchDraw()增加EndBatchDraw()以防止图片闪烁
代码区
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define WIN_WIDTH 1100
#define WIN_HEIGHT 631
IMAGE imagBgs;
int bjX[3];
IMAGE imgHeros[19];
int heroX;
int heroY;
int herpIndex;
bool heroJump;
bool heroDown;
int jumpHeightMax;
int heroJumpOFF;
IMAGE imgWugui;
int torWuguiX;
int torWuguiY;
bool torWuguiExist;
void init()
{
initgraph(WIN_WIDTH, WIN_HEIGHT);
loadimage(&imagBgs, "./picture/bj1.png");
for (int i = 0; i < 3; i++) {
bjX[i] = 0;
}
loadimage(&imgHeros[0], "./picture/19(2).jpg");
loadimage(&imgHeros[1], "./picture/18(2).jpg");
loadimage(&imgHeros[2], "./picture/17(2).jpg");
loadimage(&imgHeros[3], "./picture/16(2).jpg");
loadimage(&imgHeros[4], "./picture/15(2).jpg");
loadimage(&imgHeros[5], "./picture/14(2).jpg");
loadimage(&imgHeros[6], "./picture/13(2).jpg");
loadimage(&imgHeros[7], "./picture/12(2).jpg");
loadimage(&imgHeros[8], "./picture/11(2).jpg");
loadimage(&imgHeros[9], "./picture/10(2).jpg");
loadimage(&imgHeros[10], "./picture/9(2).jpg");
loadimage(&imgHeros[11], "./picture/8(2).jpg");
loadimage(&imgHeros[12], "./picture/7(2).jpg");
loadimage(&imgHeros[13], "./picture/6(2).jpg");
loadimage(&imgHeros[14], "./picture/5(2).jpg");
loadimage(&imgHeros[15], "./picture/4(2).jpg");
loadimage(&imgHeros[16], "./picture/3(2).jpg");
loadimage(&imgHeros[17], "./picture/2(2).jpg");
loadimage(&imgHeros[18], "./picture/1(2).jpg");
heroX = 300;
heroY = 410;
herpIndex = 0;
heroJump = false;
jumpHeightMax = 230;
heroJumpOFF = -4;
loadimage(&imgWugui, "./picture/t1.jpg");
torWuguiExist = false;
}
void updateBg()
{
putimage(bjX[0], 0, &imagBgs);
}
void fly() {
bjX[0] -= 10;
if (bjX[0] < -1170) {
bjX[0] = 0;
}
}
void run() {
if (heroJump) {
if (heroY < jumpHeightMax) {
heroJumpOFF = 4;
}
heroY += heroJumpOFF;
if (heroY > 410) {
heroJump = false;
heroJumpOFF = -4;
}
}
else {
herpIndex = (herpIndex + 1) % 19;
}
static int frameCount = 0;
static int torWuguiFre = 30;
frameCount++;
if (frameCount > torWuguiFre) {
frameCount = 0;
if (!torWuguiExist) {
torWuguiExist = true;
torWuguiX = 1100;
torWuguiY = 500;
torWuguiFre = 30 + rand() % 30;
}
}
if (torWuguiExist) {
putimage(torWuguiX, torWuguiY, &imgWugui);
torWuguiX -= 6;
if (torWuguiX < -63) {
torWuguiExist = false;
}
}
checkHit();
}
void checkHit()
{
if(heroX+/*人的长度*/==torWuguiX)
if (heroY +/*人高于乌龟的部分*/ == torWuguiY) {
static int frame = 0;
frame++;
if (frame >= 3) {
frame = 0;
heroX -= 40;
}
}
}
void keyEvent()
{
char ch;
if (_kbhit()) {
ch = _getch();
if (ch == ' ') {
heroJump = true;
}
}
}
int main(void)
{
init();
int timer = 0;
while (1) {
keyEvent();
BeginBatchDraw();
updateBg();
putimage(heroX, heroY, &imgHeros[herpIndex]);
fly();
run();
EndBatchDraw();
Sleep(30);
}
system("pause");
return 0;
}