在编写获取路径方法前,我们先把角色须要的动画文件载入进来,角色的文件为png 和 plist格式。

player1_anim.png.plist             player1_anim.png

player2_anim.png.plist             player2_anim.png

plist分别记录了每张图在整张png图中的位置 大小,我们仅仅要知道每张小图名称就可以从整张png图中截取出想要的小图。

player1_anim.png图片为

player2_anim.png图片为

图片表示方法同样,每四张表示一个方向

我们在GameBaseScene中加入角色:

1、 首先定义addPlayerAnimation()方法。这种方法主要是载入动画文件到内存 并创建角色须要的上下左右四个方向的动画

void GameBaseScene::addPlayerAnimation()
{
//创建player1的帧缓存,并载入player1的动绘图片到缓存
player1_spriteFrameCache = SpriteFrameCache::getInstance();
player1_spriteFrameCache->addSpriteFramesWithFile("map/player1_anim.plist","map/player1_anim.png"); //创建player2的帧缓存,并载入player2的动绘图片到缓存
player2_spriteFrameCache = SpriteFrameCache::getInstance();
player2_spriteFrameCache->addSpriteFramesWithFile("map/player2_anim.plist","map/player2_anim.png"); //创建player1的上下左右四个方向的Vector
Vector<SpriteFrame*> player1_anim_left_vector ;
Vector<SpriteFrame*> player1_anim_right_vector;
Vector<SpriteFrame*> player1_anim_down_vector;
Vector<SpriteFrame*> player1_anim_up_vector; //创建player2的上下左右四个方向的Vector
Vector<SpriteFrame*> player2_anim_left_vector;
Vector<SpriteFrame*> player2_anim_right_vector;
Vector<SpriteFrame*> player2_anim_down_vector;
Vector<SpriteFrame*> player2_anim_up_vector;}
//定义name数组
char name[20];
memset(name, 0, 20); //第1-4张图片是表示向左的动画,把这四张图片从缓存中取出。分别保存到对应角色的vector中
for (int i=1; i<=4; i++)
{
sprintf(name, "player1_anim_%02d.png",i);
player1_anim_left_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name)); sprintf(name, "player2_anim_%02d.png",i);
player2_anim_left_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
}
//第5-8张图片是表示向右的动画
for (int i=5; i<=8; i++)
{
sprintf(name, "player1_anim_%02d.png",i);
player1_anim_right_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name)); sprintf(name, "player2_anim_%02d.png",i);
player2_anim_right_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
}
//第9-12张图片是表示向下的动画
for (int i=9; i<=12; i++)
{
sprintf(name, "player1_anim_%02d.png",i);
player1_anim_down_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
sprintf(name, "player2_anim_%02d.png",i);
player2_anim_down_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
}
//第13-16张图片是表示向上的动画
for (int i=13; i<=16; i++)
{
sprintf(name, "player1_anim_%02d.png",i);
player1_anim_up_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
sprintf(name, "player2_anim_%02d.png",i);
} <span style="white-space:pre"> </span>//依据角色的上下左右四个vector 创建四个方向的动作
Animation * player1_animation_left = Animation::createWithSpriteFrames(player1_anim_left_vector,0.1f);
Animation * player1_animation_right = Animation::createWithSpriteFrames(player1_anim_right_vector,0.1f);
Animation * player1_animation_down = Animation::createWithSpriteFrames(player1_anim_down_vector,0.1f);
Animation * player1_animation_up = Animation::createWithSpriteFrames(player1_anim_up_vector,0.1f); Animation * player2_animation_left = Animation::createWithSpriteFrames(player2_anim_left_vector,0.1f);
Animation * player2_animation_right = Animation::createWithSpriteFrames(player2_anim_right_vector,0.1f);
Animation * player2_animation_down = Animation::createWithSpriteFrames(player2_anim_down_vector,0.1f);
Animation * player2_animation_up = Animation::createWithSpriteFrames(player2_anim_up_vector,0.1f); ///依据角色的上下左右四个动作 创建四个方向的动画
player1_animate_left = Animate::create(player1_animation_left);
player1_animate_right = Animate::create(player1_animation_right);
player1_animate_down = Animate::create(player1_animation_down);
player1_animate_up = Animate::create(player1_animation_up); player2_animate_left = Animate::create(player2_animation_left);
player2_animate_right = Animate::create(player2_animation_right);
player2_animate_down = Animate::create(player2_animation_down);
player2_animate_up = Animate::create(player2_animation_up); }

2、 创建完角色须要的文件后,还须要角色在地图的位置,因为能走的路径都在way图层中,在setWayPassToGrid()方法中。我们把way图层中sprite的坐标保存到wayLayerPass_vector中。这样就能够依据当中的坐标设置角色的位置了

void  GameBaseScene::setWayPassToGrid()
{
TMXLayer* wayLayer = _map->layerNamed("way"); Size _mapSize = wayLayer->getLayerSize();
for (int j = 0; j < _mapSize.width; j++) {
for (int i = 0; i < _mapSize.height; i++) {
Sprite* _sp = wayLayer->tileAt(Point(j, i));
if (_sp)
{
float x = _sp->getPositionX();
float y = _sp->getPositionY();
int col = x/tiledWidth;
int row = y/tiledHeight;
canPassGrid[row][col] = true;
//取得该位置的坐标,保存到对象wayLayerPass_vector中
Vec2 p = _sp->getPosition();
wayLayerPass_vector.push_back(p);
log("canPassGrid row= %d ,col =%d ,canpass = %d" ,row,col,canPassGrid[row][col]);
} }
}
log("setWayPassToGrid finished");
}

3、 加入的角色我们先封装成一个RicherPlayer类。该类记录角色的信息。包含角色名称、资金、体力、敌友

RicherPlayer* RicherPlayer::create(char* name,SpriteFrame* spriteFrame,bool enemy,int money,int strength)
{
RicherPlayer* player = new RicherPlayer();
player->init(name,spriteFrame, enemy,money,strength);
player->autorelease();
return player; } bool RicherPlayer::init(char* name,SpriteFrame* spriteFrame,bool enemy,int money,int strength)
{ Sprite::initWithSpriteFrame(spriteFrame);
_name = name;
_enemy = enemy;
_money = money;
_strength = strength;
return true;
}

4、接下来在addPlayer()方法中,从容器wayLayerPass_vector中随机取出坐标,进行角色的加入。

void GameBaseScene:: addPlayer()
{
//指定随机数种子,随机数依据这个种子产生 採用当前时间生成随机种子:
struct timeval now;
gettimeofday(&now, NULL); //计算时间种子
unsigned rand_seed = (unsigned)(now.tv_sec*1000 + now.tv_usec/1000); // 初始化随机数
srand(rand_seed); //从帧缓存图片中取第一张。做为角色的初始图片
SpriteFrame* spf1 = player1_spriteFrameCache->getSpriteFrameByName("player1_anim_01.png");
player1 = RicherPlayer::create("player1",spf1,false);
//依据wayLayerPass_vector的坐标数量,取得随机的一个id
int _rand1 = rand()%(wayLayerPass_vector.size());
log("rand %d" ,_rand1);
//依据id,取出当中的坐标
Vec2 vec2ForPlayer1 = wayLayerPass_vector.at(_rand1);
//这个我们给纵向位置加入一个tiledHeight高度,目的是为了让角色居中显示在道路中
vec2ForPlayer1.y +=tiledHeight;
//设置角色的位置,以及锚点
player1->setPosition(vec2ForPlayer1);
player1->setAnchorPoint(ccp(0,0.5));
//log 相关
int col = vec2ForPlayer1.x/tiledWidth;
int row = vec2ForPlayer1.y/tiledHeight;
log("player1 position row= %d ,col = %d" ,row,col);
log("player1 position x= %f ,y = %f" , vec2ForPlayer1.x, vec2ForPlayer1.y);
//加入角色到地图场景
addChild(player1); 角色2的加入同角色1方法同样。不再累述
………………… }

測试ok 已经能够看到2个角色了

未完待续.......................

差点忘了代码

点击下载代码     http://download.csdn.net/detail/lideguo1979/8281909

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2的更多相关文章

  1. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3

    点击下载代码   http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法.用来获取 ...

  2. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

    以下是一些设计略显繁琐,有必要清除思维. 下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径. 流程如图普遍认 ...

  3. Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色的散步路径

    获得所述路径之后.我们将能够使根据的步行路径的作用,当您点击gobutton什么时候.我们呼吁player的startGo()办法.传入的参数是保存路径2一维数组 void GameBaseScene ...

  4. Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView

    于MenuScene.cpp 点击单机游戏后会调用 Director::getInstance()->pushScene(MapChooseScene::createScene()); 进入到关 ...

  5. 微信小程序开发(七)获取手机网络类型

    // succ.wxml <view>手机网络状态:{{netWorkType}}</view> // succ.js var app = getApp() Page({ da ...

  6. C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权

    通俗来讲VIEW其实就是我们在C#中常用的a标签,可以直接在自定义菜单URL的属性里面写上需要跳转的链接,也即为单纯的跳转. 但更多的情况下,我们是想通过VIEW来进入指定的页面并进行操作. 举一个简 ...

  7. 云平台编程与开发(七)-使用X5Cloud云平台开发网络彩讯

    云平台编程与开发(七)-使用X5Cloud云平台开发网络彩讯 博客分类: 云平台 云计算 Java Android Android 云平台 Java 网络彩讯定义以及工作大概流程  下载试用地址:ap ...

  8. C#的百度地图开发(三)依据坐标获取位置、商圈及周边信息

    原文:C#的百度地图开发(三)依据坐标获取位置.商圈及周边信息 我们得到了百度坐标,现在依据这一坐标来获取相应的信息.下面是相应的代码 public class BaiduMap { /// < ...

  9. 转:微信开发之使用java获取签名signature(贴源码,附工程)

    微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报  分类: 微信开发 ...

随机推荐

  1. bzoj 3111 蚂蚁 动态规划

    题目描述 在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长. 蚂蚁转弯是有一定特点的,即它的转弯序 ...

  2. 【Error】Python:UnicodeDecodeError: ‘XXX' codec can't decode bytes in position... 解决方法

    错误信息: UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 2-5: illegal multibyte sequence ...

  3. laravel的elixir和gulp用来对前端施工

    使用laravel elixer npm install --global gulp  ok 然后在安装好的laravel 下 npm install 以安装 laravel-elixir subli ...

  4. Codeforces Round #290 (Div. 2) B. Fox And Two Dots(DFS)

    http://codeforces.com/problemset/problem/510/B #include "cstdio" #include "cstring&qu ...

  5. 写一个system.data.entity的simpledatarepo,实现crudq这些功能,不需要引入entityframework,直接可以使用,用到objectset

    note:you can delete reference of entityframework when using this classes.it`s just a simple repohelp ...

  6. PHP命令行执行程序php.exe使用及常用参数

    PHP命令行执行程序php.exe参数说明 -f <file>:以命令行方式运行指定的PHP文件,只要指定具体的PHP文件(带绝对路径),php.exe就可以执行PHP文件,所以这个参数单 ...

  7. linux 内存查看方法:meminfo\maps\smaps\status 文件解析

    linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍 ...

  8. JavaScript中数组Array.sort()排序方法详解

    JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...

  9. Fiddler抓包1-抓firefox上https请求【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6538021.html 前言 fiddler是一个很好的抓包工具,默认是抓http请求的, ...

  10. 史上最全的web前端开发程序员学习清单!

    今天为什么要给大家分享这篇文章呢,我发现最近来学前端的特别多,群里面整天都有人问:前端好找工作吗?前端要怎么学啊?前端工资怎么样?前端XX,前端XXX,虽然我回答过无数次这种问题了,但是问这个的还是有 ...