展会信息港展会大全

Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》,边缘检测
来源:互联网   发布日期:2015-09-28 14:41:57   浏览:2119次  

导读: Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》,边缘检测 本章在前面Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要...

Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》,边缘检测

本章在前面Cocos2d-x

自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》的基础上,实现了精灵向右运动到地图中间时,地图能跟着移动,但此时精灵是原地不动只是播放跑动画。并且,当地图移动到边缘时,地图不在移动,但此时精灵能移动同时播放跑动画。当前工程一直在修改中,有需要的把邮箱留下就是哈,后头不修改了我会把每一个一个工程都上传上去。

目录

一、在英雄类中增加判断英雄是否运动到了窗口的中间位置函数

二、自定义地图类

三、根据英雄精灵和窗口的大小来移动地图或移动精灵

四、思路总结

一、在英雄类中增加判断英雄是否运动到了窗口的中间位置函数

在上一篇的英雄类中再增加一个函数:

<pre name="code" class="cpp">//判断英雄是否运动到了窗口的中间位置,visibleSize为当前窗口的大小

bool JudgePositona(CCSize visibleSize);

然后这是它的实现:

bool Hero::JudgePositona (CCSize visibleSize)

{

if(this->getPositionX()!=visibleSize.width/2)//精灵到达左边

return false;

else

return true;//到达中间位置

}

二、自定义地图类

这里为了后头地图能再实现其它功能,我自己又设计了一个地图类,它能根据英雄的运动还判断是否要移动地图

其实这里的地图就是一个CCSprite ,然后把它加到当前类中,这个类是从CCNODE中派生的。

直接看代码了Map.h:

#ifndef __MAP_H__

#define __MAP_H__

#include "cocos2d.h"

USING_NS_CC;

class Map:public CCNode

{

public:

Map();

~Map();

//初始化地图,window_sizeo为控制台大小

void InitMap(const char *map_name,const CCSize &window_size);

//根据精灵的位置移动地图,visibleSize为当前窗口的大小

void MoveMap(CCNode *hero,CCSize visibleSize);

//判断地图是否到达边缘

bool JudgeMap(CCNode *hero,CCSize visibleSize);

//virtual void update(float delta);

CREATE_FUNC(Map);

private:

CCSprite *m_map;//地图精灵

};

#endif // __MAP_H__

然后这是它的实现Map.cpp:

#include "Map.h"

Map::Map():m_map(NULL)

{

}

Map::~Map()

{

}

void Map::InitMap(const char *map_name,const CCSize &window_size)

{

this->m_map=CCSprite::create(map_name);

m_map->setAnchorPoint(ccp(0,0));//设置锚点

this->setAnchorPoint(ccp(0,0));//设置锚点

this->addChild(m_map);

}

void Map::MoveMap(CCNode *hero,CCSize visibleSize)//

{

if(hero->getPositionX()==visibleSize.width/2)//精灵运动到中间,地图才移动

{

if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地图左边运动后超出边缘

this->setPosition(this->getPositionX()-1,this->getPositionY());

}

}

bool Map::JudgeMap(CCNode *hero,CCSize visibleSize)

{

if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地图左边运动后超出边缘

return false;

else //地图已经移动到达边缘

return true;

}

三、根据英雄精灵和窗口的大小来移动地图或移动精灵

上面自定义的地图类要怎么用呢?

在HelloWorldScene.h中添加头文件#include "Map.h"

同时定义一个成员变量

private:

Map*mymap;//地图这时就可以直接用了。在init()函数中:

原本我是用:(在第一篇-虚拟摇杆的开头那里有写)

//修改背景图片

CCSprite* pSprite = CCSprite::create("background_1.jpg");

pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

this->addChild(pSprite, 0);//这里的0表示放在最底层

把上面的去掉,改成:

//更改为自己定义的地图

mymap=Map::create();

mymap->InitMap("12.png",visibleSize);

this->addChild(mymap,0);

然后再改HelloWorldScene.cpp中的updata()事件:

void HelloWorld::update(float delta)

{

CCSize visibleSize1 = CCDirector::sharedDirector()->getVisibleSize();

//判断是否按下摇杆及其类型

switch(rocker->rocketDirection)

{

case1:

//hero->SetAnimation("attack1_animation.plist","attack1_animation.png","attack_",6,rocker->rocketRun);

hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分

if(hero->getPositionX()<=visibleSize1.width-8)//不让精灵超出右边,8可以改成你喜欢的

{

if(!hero->JudgePositona(visibleSize1)||mymap->JudgeMap(hero,visibleSize1))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画

hero->setPosition(ccp(hero->getPosition().x+1,hero->getPosition().y)); //向右走

//下面是移动地图

mymap->MoveMap(hero,visibleSize1);

}

break;

case2:

hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分

hero->setPosition(ccp(hero->getPosition().x, hero->getPosition().y+1));//向上走

break;

case 3:

hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分

if(hero->getPositionX()>=8)//不让精灵超出左边,8可以改成你喜欢的

hero->setPosition(ccp(hero->getPosition().x-1,hero->getPosition().y));//向左走

break;

case 4:

hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分

hero->setPosition(ccp(hero->getPosition().x,hero->getPosition().y-1));//向下走

break;

case 0:

hero->StopAnimation();//停止所有动画和运动

break;

}

if(btn->isTouch)

hero->AttackAnimation("attack1_animation.plist","attack1_animation.png","attack_",6,rocker->rocketRun);

}

这样就大功告成了,我们来看看效果:

首先,精灵向左运动的边缘时,不能再移动过去,

接下来,英雄向右移动到中间时(地图还没到最右边),地图移动,精灵只播放动画但不改变它的位置

当地图移动到最右边时。

效果就是这样了,原本是想弄成地图可以跟着精灵左右移动的,但是这个有点儿麻烦,还得判断左右,就偷了下懒,

这里地图移动过去了就不能再移动回来 了。想移动回来是有思路,但是写比来比较费事,后头有时间再来把这好好改下吧

四、思路总结

其实简单说:

1.精灵向右还没运动到窗口中间

精灵播放跑动画同时移动位置,但此时地图位置不改变。

2.精灵向右运动到窗口中间且地图还没有移动到最右边

精灵只播放跑的动画,但是不改变它的位置。但地图要向左移动,造成精灵在移动的错觉

3.地图移动到最右边了

此时地图不要改变位置了,精灵播放跑动画同时要移动

由于当前工程一直在修改中,有需要的把邮箱留下就是哈,后头不修改了我会把每一个一个工程都上传上去。

http://www.bkjia.com/Androidjc/938000.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/938000.htmlTechArticleCocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》,边缘检测 本章在前面Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开...

赞助本站

人工智能实验室

相关热词: android开发 应用开发

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港