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

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

概述     这里是Evankaka的博客,欢迎大家前面讨论与交流~~~~~~       转载请注明出处http://blog.csdn.net/evankaka/article/details/42439707      本章在前面Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》(2)的基础上,实现了精灵向右运动到地图中间时,地图能跟着移动,但此时精灵是原地不动只是播放

这里是Evankaka的博客,欢迎大家前面讨论与交流~~~~~~

转载请注明出处http://www.jb51.cc/article/p-boenibbc-kh.html

本章在前面Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》(2)的基础上,实现了精灵向右运动到地图中间时,地图能跟着移动,但此时精灵是原地不动只是播放跑动画。并且,当地图移动到边缘时,地图不在移动,但此时精灵能移动同时播放跑动画。网上看了些别人写的地图,很多都是通过两张地图交替显示来实现,这里我就想通过一个地图来实现,英雄移动到地图的最左边或最右边时,地图不能移动,但是英雄还是能移动。这样比较符合我们玩游戏时的情形。

cocos2d-x版本:2.2.5

工程环境:windows7+VS2010

打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开

源码免费下载博主决定本系列资源全部免费~)

目录

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

二、自定义地图类

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

四、思路总结



下面是要滚动的地图,只有一张,但是很长。


先看看效果





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

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

<pre name="code" >//判断英雄是否运动到了窗口的中间位置,visibleSize为当前窗口的大小	 bool JudgePositona(CCSize visibleSize);
 然后这是它的实现:   
  bool Hero::JudgePositona (CCSize visibleSize)  {	  if(this->getpositionX()!=visibleSize.wIDth/2)//精灵到达左边		  return false;	  else		  return true;//到达中间位置  }


二、自定义地图类

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

其实这里的地图就是一个CCSprite ,然后把它加到当前类中,这个类是从CCNODE中派生的。然后根据当前英雄的位置来判断自己是否在进行移动,在MoveMap(CCNode *hero,CCSize visibleSize)这个函数中,其实实现得很简单。传入当前英雄和当前窗口的大小,然后就是一些判断了

直接看代码了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)	{	case  1:		//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;	case  2:		hero->SetAnimation("run_animation.pList",rocker->rocketRun);//"run_"为run_animation.png集合图片中每张图片的公共名称部分		hero->setposition(ccp(hero->getposition().x,hero->getposition().y+1));   //向上走		break;	case 3:		hero->SetAnimation("run_animation.pList",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",hero->getposition().y-1));   //向下走		break;	case 0:		hero->StopAnimation();//停止所有动画和运动		break;	}	if(btn->istouch)	hero->AttackAnimation("attack1_animation.pList",rocker->rocketRun);}

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

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


2.接下来,英雄向右移动到中间时(地图还没到最右边),地图移动,精灵只播放动画但不改变它的位置(相当于英雄一直在中间,但是地图移动了,造成英雄移动的错觉)


3.当地图移动到最右边时。地图不动了,英雄可以移动超过中间的位置



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

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


四、思路总结

其实简单说:

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

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

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

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

3.地图移动到最右边了

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

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



源码免费下载决定本系列资源全部免费~)

总结

以上是内存溢出为你收集整理的Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3)全部内容,希望文章能够帮你解决Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1028800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存