dong-frank的博客

南京大学大一CPL期末大作业

字数统计: 926阅读时长: 3 min
2024/06/22

捣蛋猫跑酷

项目概述

本项目为南京大学软件工程CPL期末项目题F.
本项目是基于SDL2和C语言编写的跑酷游戏,游戏中玩家将扮演捣蛋猫收集金币,避开障碍物尽可能跑得更远.

项目地址

捣蛋猫跑酷


环境要求

平台:
Windows11
C语言环境:
MinGw32 8.1.0
MSVC 19.36.32535

编译选项

  1. gcc编译请使用指令
    1
    gcc common.c main.c menu.c guide.c game.c -o RUN -lSDL2main -lSDL2 -lSDL2_image -lSDL2_ttf
  2. 使用Clion编译
    请注意文件夹中的CMakeLists.txt
    在编译时,请点开编辑配置窗口,将工作目录改为本文件夹的绝对路径

第三方库

SDL2库中的SDL2main SDL2 SDL2_image SDL2_ttf


游戏方式与内容

  1. 当您点开RUN.exe时,呈现的是开始菜单,包括开始游戏,生存指南,退出游戏三个选项.
    在开始菜单可以使用键盘的方向键移动选择光标,
    按下空格回车确定选择.
    在程序运行的任意时刻都可以通过按下Esc鼠标点击右上角的叉退出程序
  2. 强烈建议第一次游玩本游戏先进入生存指南以查看本游戏的操作说明.
    在操作说明界面按下Backspace或点击右上角的返回标识回到开始菜单.
  3. 游戏界面使用键盘的方向键控制捣蛋猫的左右移动跳跃蹲下,以进行跑酷游戏
    按下P键进入暂停界面
  4. 暂停界面中,会出现返回标题,继续游戏,重新开始三个选项,
    可以使用鼠标点击操作.
  5. 当捣蛋猫的帕鲁球数量为0时或在遇到佩克龙事件时撞到障碍物时,游戏结束,进入结算界面.
  6. 结算界面玩家可以看到自己的分数,和复活,返回标题两个选项,
    可以使用鼠标点击操作.
  7. 该游戏中遇到可以按Up跳跃躲过,遇到跨栏可以按Down蹲下躲过,遇到较大的障碍物则必须按RightLeft切换跑道.
  8. 随着游戏的进行会遇到两种道具
    (1) 帕鲁球也就是捣蛋猫的生命,捣蛋猫每碰到一次障碍物帕鲁球数量减1,当数量为0时游戏结束(佩克龙事件除外)
    (2) 护盾获得护盾时捣蛋猫将获得持续一段时间的无敌效果.
  9. 随着游戏的进行会遇到两种事件
    (1) 博爱蜥事件玩家的上下左右的方向颠倒
    (2) 佩克龙事件捣蛋猫一旦碰到障碍物直接结束游戏
    事件会持续一段时间,在事件持续时间玩家获得的分数翻两倍

代码设计思路

通过将每一个界面的绘制写入不同的.c文件中,在main.c中调用Menu_logic()函数以绘制开始菜单,
menu.c中通过不同的选择调用Game_logic(),Guide_logic,Quit_Menu三种函数,以实现不同界面的绘制.
在项目编写初期曾遇到严重的内存泄露问题,导致内存占用持续增加,键盘操作卡顿,在网上查阅相关资料后对代码进行重构,将每一个图形的绘制单独写成一个函数

1
2
3
4
5
6
7
8
void Draw_background(){
menu.surface_background=IMG_Load("res/img/background/background_start.png");
menu.texture_background=SDL_CreateTextureFromSurface(app.renderer,menu.surface_background);
SDL_Rect rect_background ={0,0,menu.surface_background->w,menu.surface_background->h};
SDL_RenderCopy(app.renderer,menu.texture_background,NULL,&rect_background);
SDL_FreeSurface(menu.surface_background);
SDL_DestroyTexture(menu.texture_background);
}

每次调用完SDL_RenderCopy后即将SDL_SurfaceSDL_Texture的相关空间清除,可以有效解决内存泄露问题

CATALOG
  1. 1. 捣蛋猫跑酷
    1. 1.1. 项目概述
    2. 1.2. 项目地址
    3. 1.3. 环境要求
    4. 1.4. 编译选项
    5. 1.5. 第三方库
    6. 1.6. 游戏方式与内容
    7. 1.7. 代码设计思路