超级玛丽制作揭秘21游戏数据管理

cocos2d-x实战项目【超级玛丽】-- 配置和使用动画数据 { "animName":["smallIdle","smallWalk","smallJump","smallDie","bigIdle","bigWalk","bigJump","bigDie"], "animInfo":[ [ "small_1_walk_01.png" ], [ "small_1_walk_01.png", "small_1_walk_02.png", "small_1_walk_03.png", "small_1_walk_04.png 阅读详情

 进入每一关之前,需要对所有游戏数据初始化。进入隐藏地图,同样需要初始化。而且,从隐藏地图返回上层地图,还要保证玩家角色出现在“出水管”处。地图数据、玩家数据、视图数据,都要设置正确。

所有的游戏数据,即封装在gamemap中的数据,分成如下几种:
场景数据:包含当前关卡的地图,所有精灵,金币,提示信息。
视图数据:视图窗口坐标。
玩家数据:玩家角色的个人信息,例如金钱数量,攻击方式,游戏次数。
1. 场景数据:
 int iGameState;//当前游戏状态
 int iMatch; //当前关卡
各种精灵的数组:
 struct MapObject MapArray[MAX_MAP_OBJECT]; //地图物品
 struct MapObject MapBkArray[MAX_MAP_OBJECT];  //地图背景物品
 struct ROLE MapEnemyArray[MAX_MAP_OBJECT];  //小怪
 struct MapObject MapCoinArray[MAX_MAP_OBJECT];  //金币
 struct ROLE FireArray[MAX_MAP_OBJECT];  //子弹
 struct MapObject BombArray[MAX_MAP_OBJECT];  //爆炸效果
 //当前关卡的地图信息
 struct MAPINFO mapinfo;
 //图片帧
int ienemyframe;  //小怪图片帧
 int ibkobjframe;  //背景图片帧
 //玩家攻击
 int iTimeFire;//两个子弹的间隔时间
 int iBeginFire;//是否正在发子弹
 //攻击对象提示
 char AttackName[20];//攻击对象名称
 int iAttackLife;//攻击对象生命值
 int iAttackMaxLife;// 攻击对象最大生命值
2. 视图数据:
 int viewx;//视图起始坐标
3. 玩家数据:
 int iMoney; //金钱数量
 int iAttack; //攻击方式
 int iLife;  //玩家游戏次数
可见,每次加载地图前,要初始化场景数据和视图数据,而玩家数据不变,如金钱数量。

游戏数据处理:
假设没有隐藏地图的功能,游戏数据只需要完成初始化的功能,分别位于以下三个地方:
程序运行前,初始化;
过关后,初始化,再加载下一关地图;
失败后,初始化,再加载当前地图;

1. 游戏程序运行,所有游戏数据初始化。
函数:BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
代码:把所有游戏数据初始化
gamemap.Init();

游戏初始化函数:void GAMEMAP::Init()
代码:
 //设置游戏初始状态
 iGameState=GAME_PRE;
 //设置当前关卡
 iMatch=0;
//设置玩家数据 玩家游戏次数,金钱数量,攻击种类
 iLife=3;
 iMoney=0;
 iAttack=ATTACK_NORMAL;
 //设置视图坐标
 viewx=0;
 //初始化场景数据
 InitMatch();

场景数据初始化函数:void GAMEMAP::InitMatch()
代码:把所有游戏数据清除(置0)
 memset(MapArray,0,sizeof(MapArray));
 memset(BombArray,0,sizeof(BombArray));
 ienemyframe=0;
 iFireNum=0;
 ……
这样,程序启动,InitInstance中完成第一次初始化。

2. 过关后,游戏数据初始化,加载下一关地图。
过关检测函数:int GAMEMAP::IsWin()
代码:
 //判断玩家是否到达地图终点
if(rmain.xpos >= MAX_PAGE*GAMEW*32 )
 {
  //读取下一关地图编号
  iMatch=mapinfo.iNextMap;
  if(iMatch>=MAX_MATCH)
  {
   //如果全部通过
   Init(); //初始化所有数据
   LoadMap();   //加载地图
  }
  else
  {
   InitMatch(); //初始化场景数据
   //设置玩家坐标
   rmain.SetPos(BM_USER,3*32,8*32);
   rmain.InitRole(0,GAMEW*32*MAX_PAGE-32);   
   //加载下一关的地图
   LoadMap();  
  }

3. 如果玩家失败,重新加载当前地图。
失败检测函数:int GAMEMAP::IsWin()
代码:如果玩家碰到了小怪,或者踩到火圈,游戏失败,调用Fail()进一步处理。
 //检测角色和敌人的碰撞
 for(i=0;i<MAX_MAP_OBJECT;i++)
 {
  if(MapEnemyArray[i].show)
  {
   if(HLINE_ON_RECT(玩家坐标 小怪坐标))
   {
    if(0 == rmain.movey)
    {
     //玩家在行走过程中,碰到小怪,游戏失败
     Fail();
    }
    else
    {
     //玩家在下落过程中,碰到火圈,游戏失败
     switch(MapEnemyArray[i].id)
     {
     case ID_ANI_BOSS_HOUSE:
     case ID_ANI_BOSS_HOUSE_A:
      Fail();
 ……
//玩家到达地图底端(掉入小河),游戏失败
if(rmain.ypos > GAMEH*32)
 {
 
  Fail();
  return 0;
 }      

失败处理函数:void GAMEMAP::Fail()
代码:
 //玩家游戏次数减1
 iLife--;
 //设置游戏状态
 iGameState=GAME_FAIL_WAIT;

GAME_FAIL_WAIT状态结束后,调用函数void GAMEMAP::Fail_Wait()加载地图。
函数:void GAMEMAP::Fail_Wait()
代码:
 if( iLife <=0)
 {
  //游戏次数为0,重新开始,初始化所有数据
  Init();
 }
 else
 {
  //还能继续游戏
 }
 //设置玩家坐标
 rmain.SetPos(BM_USER,3*32,8*32);
 rmain.InitRole(0,GAMEW*32*MAX_PAGE-32);
 //加载当前地图
 LoadMap();  

至此,在没有隐藏地图的情况下,游戏数据管理(只有初始化)介绍完了。

增加了隐藏地图的功能,游戏数据管理包括:初始化,数据刷新。哪些数据刷新需要刷新
1. 刷新玩家坐标。
例如,从第一关(地图编号为0)进入隐藏地图,玩家出现在(3,8),即横向第3格,纵向第8格。玩家返回第一关后,要出现在“出水管”的位置(66,7)。
2. 刷新视图坐标。
例如,从第一关进入隐藏地图,玩家出现在(3,8),视图对应地图最左边,玩家返回第一关后,视图要移动到“出水管”的位置。
3. 刷新背景图片的坐标。
例如,从第一关进入隐藏地图,玩家出现在(3,8),天空背景对应地图最左边,玩家返回第一关后,背景图片要移动到“出水管”的位置。
隐藏地图加载函数:void GAMEMAP::ChangeMap()
代码:
 //初始化视图坐标
 viewx=0;
 //获取隐藏地图编号
 iMatch=mapinfo.iSubMap;
 //初始化场景数据
 InitMatch();
 //设置玩家坐标      
 rmain.SetPos(BM_USER,mapinfo.xReturnPoint*32,mapinfo.yReturnPoint*32);
 //玩家角色初始化
rmain.InitRole(0,GAMEW*32*MAX_PAGE-32); 
 //设定视图位置
 if(rmain.xpos - viewx > 150)
 {
  SetView(mapinfo.xReturnPoint*32-32);//往左让一格
  if(viewx>(mapinfo.viewmax-1)*GAMEW*32)
   viewx=(mapinfo.viewmax-1)*GAMEW*32;
 }
 //设定人物活动范围
 rmain.SetLimit(viewx, GAMEW*32*MAX_PAGE);
 //设定背景图片坐标
 bmSky.SetPos(BM_USER,viewx,0);
 //加载地图
 LoadMap();
}
所以,地图信息表中,要包含“出水管”的坐标。完整的地图信息表如下:
struct MAPINFO
{
 int iNextMap; //过关后的下一关编号
 int iSubMap; //进入水管后的地图编号
 int xReturnPoint; //出水管的横坐标
 int yReturnPoint; //出水管的纵坐标
 int iBackBmp;  //背景图片ID
 int viewmax;  //视图最大宽度
};
struct MAPINFO allmapinfo[]={
{1,3,66,7,0,5},
{2,4,25,4,1,5},
{MAX_MATCH,-1,-1,-1,2,5},
{-1,0,3,8,3,1},
{-1,1,3,8,3,2}
};
说明:
第0关:
{1,3,66,7,0,5},表示第0关的下一关是第1关,从水管进入第3关,出水管位于(66,7),天空背景id为0,视图最大宽度为5倍窗口宽度。
第3关:
{-1,0,3,8,3,1},表示第3关没有下一关,从水管进入第0关,出水管位于(3,8),天空背景id为3,视图最大宽度为1倍窗口宽度。
这样,隐藏地图切换的同时,视图数据,玩家数据均正确。

各个动态元素,地图的各种处理都已完成,只需要让玩家控制的小人,走路,跳跃,攻击,进出水管。玩家的动作控制怎样实现?且听下回分解。
附:
超级玛丽第一版源码链接:http://download.youkuaiyun.com/source/497676
超级玛丽增强版源码链接:http://download.youkuaiyun.com/source/584350

 

EmulatorJS进阶玩法:用iframe实现多语言FC游戏中心(附完整代码) 本文详细介绍了如何利用EmulatorJS和iframe技术构建一个支持多语言的FC游戏中心。通过动态语言切换、游戏资源管理和iframe优化等关键技术,开发者可以快速实现专业级的Web模拟器平台,让全球玩家无障碍体验经典FC游戏。文章包含完整代码示例和部署指南,助力开发者打造高性能游戏中心。 阅读详情

相关推荐

Cadence Virtuoso新手村:用拉扎维经典共源级电路,5分钟搞定DC/AC/瞬态三大仿真

本文为Cadence Virtuoso新手提供快速入门指南,通过拉扎维经典共源级电路,5分钟内完成DC、AC和瞬态三大仿真。详细介绍了电路图绘制、DC仿真寻找工作点、AC仿真测试增益以及瞬态仿真观察时间响应,帮助初学者快速掌握基本操作和常见问题解决方法。

weixin_42520780的博客 129

超级玛丽制作揭秘12旋风攻击,小怪,火圈

书接上回。前面介绍了子弹的生成、显示、运动、碰撞、消失的过程。这个过程可以推广到其他精灵上。今天讲旋风、蘑菇兵、火圈。作为魔法攻击方式的旋风,和子弹大同小异。旋风的存储与子弹同存储在一个数组中,如下:struct ROLE FireArray[MAX_MAP_OBJECT];使用时,用id区分。旋风生成函数:int GAMEMAP::CheckAni(int itimeclip)代码部分: //发

programking的快乐生活 1428

python实现超级玛丽游戏

Pygame是一个Python模块,旨在使编写视频游戏等多媒体应用程序变得更加轻松。它提供了一个用于处理音频、图像和鼠标/键盘输入等方面的工具集。Pygame也提供了一些预先编写好的模块,如Sprites(用于管理游戏中的对象)和Pygame.display(用于创建和管理窗口)

小林的博客 4703

超级玛丽制作揭秘14爆炸效果,金币

 大家的支持就是我的动力。子弹每次攻击到效果,都会显示一个爆炸效果。只涉及图片显示,它的结构很简单。如下:struct MapObject{ int x; int y; int w; int h; int id; int iframe; int iframemax;//最大帧数 int show; //是否显示};存储问题。爆炸效果仍然使用数组加游标的方法,如下: struct MapObje

programking的快乐生活 1413

经典游戏超级玛丽C语言实现完整源码解析

htmltable {th, td {th {pre {简介:【超级玛丽C语言源代码】是一份极具价值的学习资料,展示了如何使用C语言从零构建经典平台跳跃游戏《超级玛丽》的核心系统。涵盖游戏框架搭建、图形动画渲染、物理碰撞检测、音频播放、用户输入响应、关卡数据管理及状态控制等关键技术,适合希望深入掌握C语言在游戏开发中应用的程序员学习与实践。通过分析该源码,开发者可全面提升游戏编程能力,理解小型游戏项目的整体架构与模块设计。

weixin_42522857的博客 807

Unity3D实战:从2D到3D,超级玛丽游戏开发全解析

游戏开发中,将经典2D平台游戏三维化是常见挑战。Unity3D引擎凭借其物理系统和渲染管线,成为实现此类项目的首选工具。其核心原理在于通过CharacterController或Rigidbody处理角色移动与碰撞,并利用射线检测和触发区域实现踩怪、顶砖等交互。技术价值在于能高效构建可玩的三维关卡,并优化操作手感与性能。应用场景包括平台跳跃游戏、动作冒险游戏等。本文以3D版超级玛丽为例,详细讲解场景搭建、角色控制、碰撞判定及摄像机跟随等关键实现,帮助开发者掌握Unity3D核心模块。

weixin_33978722的博客 321

max_map_count超出导致的OOM

max_map_count超出导致的OOM

虚极静笃 2万+

C语言实现超级玛丽:从零构建横版平台跳跃游戏的核心机制

游戏开发的核心是理解底层逻辑,C语言作为一门基础语言,能帮助开发者深入掌握游戏循环、状态机与碰撞检测等关键机制。通过SDL2这样的轻量级图形库,即使不依赖Unity等引擎,也能实现一个完整的横版平台跳跃游戏。本文以经典超级玛丽为案例,从模块划分、固定时间步长、AABB碰撞到跳跃物理参数调优,系统讲解了用C语言构建2D游戏的完整流程。这种实践不仅适用于毕业设计,也能提升工程师对游戏运行原理的认知,为后续使用引擎或从事底层开发打下坚实基础。文章还提供了可运行的最小代码框架和调试技巧,方便读者快速上手。

weixin_29005499的博客 182

超级玛丽中那些不为人知的细节(上)惯性与冲刺

https://www.fgba.net/sitemap.xml

wangchewen的博客 1742

C语言超级玛丽源码解析:从编译到改版避坑指南

C语言学到指针和结构体后,常需要一个复杂度适中的项目来串联语法。超级玛丽游戏源码正是这样的经典课设素材,它以数组、指针、结构体、文件读写和简单物理模拟覆盖了C语言的核心知识点。实际应用中,源码分为零依赖的控制台版和基于SDL2的图形版,二者在编译方式和运行环境上有明显差异。掌握主循环三段式、重力与跳跃速度的参数换算、AABB碰撞检测与逐格修正,就能对源码进行地图替换、手感调整和角色换肤等二次开发。针对常见的伪加密zip、控制台乱码、SDL2.dll缺失、碰撞穿模等问题,也有成熟排查路径。本文从C语言工程实践

weixin_30582943的博客 296

C语言经典小游戏源码实战:从环境配置到核心算法全解析

C语言学习者常遇到瓶颈:语法掌握了,却不知道如何应用到实际项目中。阅读经典小游戏源码是一条高效路径,这些代码往往混合了标准C、Turbo C的graphics.h图形库以及Windows API等多种依赖,涉及碰撞检测、递归回溯、权重评分等基础算法。理解这些源码不仅能巩固指针、结构体、二维数组等核心知识,还能学会如何在不同编译环境下建立兼容的图形界面,比如通过DOSBox运行经典Turbo C程序。对于计算机专业的课程设计,源码中现成的游戏框架和工具类程序(如进程枚举、日期计算)可以直接复用,帮助快速完成项

weixin_31155097的博客 150

超级玛丽

MARIO CODE INSIDE超级玛丽制作揭秘制作 programking  博客 http://blog.youkuaiyun.com/programking  目  录 一、       超级玛丽制作揭秘1工程开始... 2二、       超级玛丽制作揭秘2图片基类MYBITMAP. 4三、       超级玛丽制作揭秘3游戏背景 类MYBKSKY. 7四、 

lipu13314601878的专栏 3087

从超级玛丽奥总结出的几点项目管理经验

超级玛丽奥,一个无比经典的游戏,在红白机上的受欢迎程度无出其右,游戏的设计必有其出色之处,才导致那么多人的痴迷。本篇文章试图将超级玛丽的游戏设计的部分理念和细节转换为项目管理的方案,使用游戏的方式去管理项目,找寻一条快乐的管理之道。超级玛丽的游戏组成非常简单,只有几个必要的概念,但是可以玩出无数的花样:一个水管工,名叫玛丽奥,某天他的公主被邪恶的大魔王抓走了,于是开始了拯救公主的征途……在项目中,主角无疑是整个团队,首先保证整个团队的一致性和不可分割性,使其成为一个单独的个体,而非若干个个体组合起来的松散的组织。当团队拿到项目的这一刻,就如同站在屏幕左边的玛丽奥,一段征程就此开始。游戏的最基本

基于java的超级玛丽游戏系统毕业设计(项目报告+答辩PPT+源代码+部署视频)

通过该系统,玩家可以控制超级玛丽角色在关卡中移动、跳跃,躲避敌人,收集金币,并达到关卡的终点。- 用户界面:系统提供一个游戏界面,包括开始界面、关卡选择界面和游戏界面等组件。- 实现基于Java的超级玛丽游戏系统,包括开始界面、关卡选择界面和游戏界面等。- 关卡设置:系统可以设计多个关卡,每个关卡包括地图、敌人、金币和终点的位置。- 角色移动:根据玩家的操作,超级玛丽角色可以在地图中移动,踩踏敌人等。- 进行游戏的功能测试,确保玩家操作的准确性和游戏的可玩性。

2301_78287784的博客 537

方案设计之亿级排行榜方案设计

该方案通过 “Redis Zset 为核心 + 分治策略为骨架 + 多级优化为细节”,在亿级用户场景下实现了:本质是将 “亿级大问题” 拆解为 “千万级小问题”,用分布式思想和精细化设计平衡性能、可用性与成本。

shine0312的专栏 1100

Orbbec-Gemini-335 深度相机 Python SDK 编译与配置全记录(Windows 环境)

本篇博客将围绕 Windows 系统下 Orbbec SDK 的 Python 配置与编译过程进行详细说明,主要使用的是官方提供的 pyorbbecsdk Python wrapper 项目以及 Orbbec SDK V2 Python Wrapper 配置指南,并记录了安装与配置过程中遇到的若干问题及解决办法。

Junseer的博客 1965

跨端实现经典:Flutter × OpenHarmony 超级玛丽游戏系统的数据结构与 UI 解析

本文介绍了使用Flutter和OpenHarmony构建跨平台超级玛丽游戏系统的开发实践。通过分析游戏介绍页面和排行榜UI的核心代码,展示了Flutter组件化开发的优势,包括灵活布局、性能优化和跨端一致性。文章重点解析了排行榜列表项的数据结构设计和UI实现方法,采用嵌套Row布局和圆形标记等视觉元素。开发者可以基于此框架扩展游戏逻辑、关卡管理和动画效果,实现完整的跨端游戏体验。该方案有效解决了多终端适配问题,降低了维护成本,为跨平台游戏开发提供了参考范例。

2601_95114550的博客 986

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

Python适合开发的游戏

Python凭借简洁语法和丰富库支持,在游戏开发领域具有独特优势。它特别适合开发2D休闲游戏(贪吃蛇/俄罗斯方块)、文字冒险游戏、像素风格游戏和策略类游戏,常用Pygame、Arcade等库。Python还能处理轻量级3D游戏和游戏原型开发,使用Ursina、Panda3D等引擎。知名案例包括《文明4》脚本和《DokiDoki文学俱乐部》。虽然不适合开发高性能3A游戏,但Python在快速迭代、逻辑处理和中小型游戏开发方面表现出色,开发者可通过C++扩展解决性能瓶颈问题。

2401_84149564的博客 1086

【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算

ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。

liarsup的博客 8265

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 523

第三期

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33753845的博客 150

【好玩的游戏项目】使用Docker快速部署属于你的RPG网页小游戏

【好玩的游戏项目】使用Docker快速部署属于你的RPG网页小游戏

jks212454的博客 5577

Unity新手入门:从Flappy Bird项目掌握游戏开发核心概念

游戏开发的核心在于理解游戏对象、组件和物理系统等基础概念。通过Unity引擎,开发者可以运用组件化设计思想,将游戏逻辑拆分为可复用的模块。在2D游戏开发中,物理引擎和碰撞检测是实现交互的关键技术,它们为游戏提供了真实的运动反馈和交互体验。以经典的Flappy Bird项目为例,新手可以快速实践玩家控制、状态管理和UI更新等核心开发流程。该项目不仅涵盖了预制体和单例模式等实用技巧,还能帮助开发者建立完整的项目架构思维,是入门Unity游戏开发的理想起点。

优快云头条 625

把财务与管理会计装进一张表:读懂 S/4HANA 的 ACDOCA

别慌,这反而是设计所需。只是大量历史上为汇总、加速而建的索引与汇总表被淘汰或改造,很多被兼容视图 compatibility views 替代,通过视图去 ACDOCA 或 ACDOCT 取数,从而保证老代码还能 SELECT 到数据,但失去写权限。它把原来分散在多张表里的信息整合到一起,例如总账、固定资产、物料账、盈利能力分析 CO-PA、成本控制等维度,发布过的资料多次强调这一点。其二,查询必须带上高选择性的条件,尤其是 RLDNR、RBUKRS、GJAHR 这三个维度,能大幅降低列存扫描的代价。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 947

自定义Usecase/Pipeline

Summary of Custom Usecase and Pipeline Configuration in SA8650 QCX Framework This article elaborates on the complete process of customizing a new Usecase and Pipeline based on the SA8650 QCX framework to meet OEM and Tier1 customization requirements, with

qq_39257814的博客 929
上一篇: 超级玛丽制作揭秘20地图切换
下一篇: 超级玛丽制作揭秘22玩家角色类MYROLE
programking
博客等级 码龄23年 450粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值