string(21) "{"docs":[],"count":0}" array(2) { ["docs"]=> array(0) { } ["count"]=> int(0) } 实验1 二维游戏场景绘制(英雄快跑) - 爱码网

教材:

实验1 二维游戏场景绘制(英雄快跑)

《计算机游戏程序设计》(基础篇)(第3版)

 

说明:

课程教材《计算机游戏程序设计》(基础篇)(第3版) 提供示例代码,而课程实验在示例代码的基础上提出更高的实验要求。除此之外,本人也会额外加入些个人创意,希望同学们在参考之余也能加入自己的想法。

 

实现效果:

实验1 二维游戏场景绘制(英雄快跑)

 

实验报告:

一、实验目的与要求

1.熟悉cocos2d-x开发环境。

2.了解cocos2d-x中二维游戏场景绘制方法。

3.掌握地图编辑器使用方法。

二、实验内容与方法

1.完成基本实验 (70分)

按照“英雄快跑.pdf”文件指引,成功运行本次实验游戏。

 

2.完成游戏通关 (5分)

凭自身实力或更改游戏代码的方式通关,成功出现“Success”结束画面。

 

3.完成Bug修改 (5分)

通过更改游戏代码的方式修复树枝检测Bug。

 

4.绘制地图 (20分)

用砖块地图编辑器(Tiled Map Editor)绘制一张30×20块,块大小为32×32像素的地图,并上交PNG文件(命名格式:2015010001张三.png)。

 

三、实验步骤与过程

记录关键步骤/设计过程/设计结果的截图

1. 成功运行游戏

按要求新建一个工程名为学号的cocos2d-x的项目。并按要求移除、替换和拷贝实验给定的源代码。然后再修改一些源代码中导致小bug的代码。

比如某些游戏逻辑错误带来的小bug:

MapScene.cpp文件的void MapScene::update(float t)函数中,“if (player_screen_y <= -80) { gameOver();} 要加上return表示游戏结束,更改为“if (player_screen_y <= -80) { gameOver(); return;}

而同一函数下的判断语句 “if((int)(player_map_y / map->getTileSize().width) >= 0)”和“if (player_map_y/map->getTileSize().width >= 0)” 也要考虑角色成功通关时跑出地图最右端的情况,所以判断语句要加上“player_screen_x < sizeWidthTemp”这一判断条件(sizeWidthTemp为屏幕宽度)。

 

此时文件列表为:

图 1

 

运行游戏,成功运行如下图2、3所示:

实验1 二维游戏场景绘制(英雄快跑)

图 2

实验1 二维游戏场景绘制(英雄快跑)

图 3

 

2. 完成游戏通关

通过游戏,屏幕出现“Success!”字样:

实验1 二维游戏场景绘制(英雄快跑)

图 4

 

3. 完成Bug修改

试图修复树枝无法站立的bug。

首先我们找到判断角色站立在图块上的相关代码。在MapScene.cpp文件的void MapScene::update(float t)函数中,有这么一段代码:

// 不跳动时遇到非地面图块自动下落

if((int)(player_map_y / map->getTileSize().width) >= 0 && player_screen_x < sizeWidthTemp)

{

int playerTiledID = map->getLayer(MAP_BG_LAYER_NAME)->

getTileGIDAt(Vec2((int)(player_map_x/map->getTileSize().width),

(int)(map->getMapSize().height-1-player_map_y/map->getTileSize().height)));

if ((m_isJump == false)&&(m_jumpDir == Dir::STOP)&& (playerTiledID != 8)

&& (playerTiledID != 7) && (playerTiledID != 151) && (playerTiledID != 170)

 && (playerTiledID != 171) && (playerTiledID != 172)) {

m_isJump = true;

m_jumpDir = Dir::DOWN;

m_jumpSpeed = 2;

}

}

 

明显的,这段代码是用来判断角色“不跳动时遇到非地面图块自动下落”。而其中有一段加粗了的if判断语句则是判断目前角色是否站立在地面图块上,只有非地面图块才能执行后面的代码段更改角色的状态为下落状态。

而playerTiledID则明显是指图块的id了,因此,只要找到树枝图块对应的id号,把它作为判断条件加入到该加粗了的if判断语句中即可修复“树枝无法站立”的bug了。

值得注意的是,代码中playerTiledID变量的id是从1开始的,0代表空;而地图块中的id是从0开始的。因此两者id号相差1 (即playerTiledID - 1 才是地图块真正id号)。

 

用Tiled软件打开该游戏的地图素材图,寻找“树枝”块的id。如下图:

实验1 二维游戏场景绘制(英雄快跑)

图 5

实验1 二维游戏场景绘制(英雄快跑)

图 6

 

可见“树枝”图块的id为132和148 。因此,对应的playTiledID为133和149。

修改上文中加粗的if判断语句为:

if ((m_isJump == false)&&(m_jumpDir == Dir::STOP)&& (playerTiledID != 8) &&

(playerTiledID != 7) && (playerTiledID != 151) && (playerTiledID != 170)&&

(playerTiledID != 171) && (playerTiledID != 172) && (playerTiledID != 133) && (playerTiledID != 149))

 

    ② 在MapScene.cpp文件的void MapScene::update(float t)函数中,还有为“处理玩家跳跃”时的这么一段代码:

// 获取玩家脚下的地图块的编号

if (player_map_y/map->getTileSize().width >= 0 && player_screen_x < sizeWidthTemp) {

int tiledID = map->getLayer(MAP_BG_LAYER_NAME)->

getTileGIDAt(Vec2((int)(player_map_x/map->getTileSize().width),

(int)(map->getMapSize().height - 1 - player_map_y/map->

getTileSize().height)));

    if (tiledID == 8 || tiledID == 7 || tiledID == 151 || tiledID == 170 || tiledID == 171

|| tiledID == 172) {

check = true;

player->setPositionY((int)(player_screen_y + player->

getContentSize().height/2 - 6));

m_jumpSpeed = PLAYER_JUMP_SPEED;

m_jumpDir = Dir::STOP;

m_isJump = false;

break;

}

}

    在这段代码中,tiledID就类似于前文提到的playerTiledID变量一样。因此同理,在加粗的if语句段中加入“树枝”的id作为判断条件即可,更改为:

if (tiledID == 8 || tiledID == 7 || tiledID == 151 || tiledID == 170 || tiledID == 171

|| tiledID == 172 || tiledID == 133 || tiledID == 149)

 

至此,“树枝”bug修改完成。如下图所示,修改完该bug后,角色可以站在树枝上了:

实验1 二维游戏场景绘制(英雄快跑)

图 7

 

4. 绘制地图

实验1 二维游戏场景绘制(英雄快跑)

 

相关文章: