cocos2dx3.X项目重写六添加不同高度的地图和跳跃优化

以前的时候,我的地图是一个水平的地平面,为了增加可玩性,在这一次我添加了随机出现的方块形地图,大小和高度都是随机的。
首先准备四张图图片,高度相同但是宽度不一样,作为随机出现的地图块。

那么问题来了,肯定是要在schedule的自定义函数中,添加地图块的,但是为了随机,首先得让前一块地图块的最右边划出屏幕的最右侧才可以出现第二块,在这个间隙,还得添加一个随机的时间以及随机的下一个地图块。我来一一说明我的解决办法。

首先肯定是建立地图类bigblock.cpp和bigblock.h文件,我的想法是让bigblock一生成就有两个效果,一个是向左移动,一个是随机添加一个资源(四个图片前面有准备好),第一个问题以前实现过,就是加schedule,不多说,第二个功能,为了让随机添加一个图片,我先自定义一个create函数

static bigblock* create();

那么这样就明了了,我把四个图片的名字作为字符串添加到数组,然后随机取一个传进去就好了。代码如下
bigblock* bigblock::create()
{

	bigblock* bb = new bigblock();
	bb->init();
	bb->speed = 5;
	std::string v[4]={"bigblock1.png","bigblock2.png","bigblock3.png","bigblock4.png"};
	int r=0+rand()%3;
	bb->initWithFile(v[r]);

	bb->setPhysicsBody(PhysicsBody::createBox(bb->getContentSize()));
	bb->getPhysicsBody()->setDynamic(false);

	return bb;
}
这样随机出现不同block的功能就实现了,然后再看随机时间添加

在stage里,我已经有了addblock函数每帧都执行,这时候出现了一个问题,就是如果直接随机时间添加是很简单的,设定一个随机函数,create地图块就行了,但是这样会重叠,那就不好了,我得知道前一个块的尾部刚刚走出屏幕右边,这个时候再给一段随机时间,添加个块就不会重叠了,而且会出现坑,player掉下去就挂掉。但是问题又来了,

我们添加的函数肯定是auto bb=bigblock::create();,每个精灵都叫bb,根本没法分辨(这里多说一句,如果在正常情况下我们添加两个精灵,是重名的话,一定会报错,但是在schedule函数里面,每帧添加一个同名精灵就不会报错,我查了查资料,大概的意思是schedule会把这些精灵放到类似队列或者数组里面,这样的话,可能就不会有重名问题,但是我没有找到怎么访问他们的方法),我想如果添加数组的话,简直太麻烦,后来想到了个办法,用tag,把每个精灵标上tag,用getChildByTag获得当前tag的精灵,如果他的尾部出界了,就给一个随机时间,添加下一个,然后下一个的tag++;代码如下

		int hh= 0+rand()%55;
		if (getChildByTag(bigtag)->getContentSize().width/2+getChildByTag(bigtag)->getPositionX()<visible.width)
		{
		    
			a++;
			if(a>=b)
			{
				auto bb=bigblock::create();
				this->addChild(bb);
				bb->setPosition(Vec2(visible.width+bb->getContentSize().width/2,hh));
				bigtag=bigtag+1;
				bb->setTag(bigtag);
				restar();
				
			 }
			
		}
正如你所见,在设置坐标的时候,y轴的坐标用了随机函数,我们将得到高地交错的地面。

a和b的作用以前也有说过是获得随机时间。

至此地面的问题暂时解决了,接下来是跳跃的问题。

以前的时候,我们判断跳完了没有,是看player脚底的坐标是不是在地面了,现在不行了,地面的坐标不是定数了。我想了好久这个问题,如果判断现在脚下的物体高度简直太麻烦,后来想到了可以用速度来判断,如果速度为零便是在地面了,就可以再跳,但是问题来了,在最高点的时候速度也是零,这个问题一度让我很苦恼,怎么判断是在最高点还是在地面,我想说方法一定是有的,而且一定是一个简单的小算法,但是我发现,由于在空中的时候,速度为零的时间太短暂,来不及跳跃,所以暂且马虎过去,代码如下

在schedule里

 
       if(player->getVy()==0)
	   {
		   ve=1;

	   }
	   else
	   {
		   ve=0;
	   }
在跳跃的时候
if (ve==1)
        {

	  player->getPhysicsBody()->setVelocity(Vec2(0,1200));


	 }
最后还有一个问题,有一个有意思的功能是按住跳跃按钮会跳更高,一松手就会下落,这个功能我是这样实现的,在跳跃按钮抬起的时候设置速度为零
void Stage::button_jump_touchup(Ref* pSender,Control::EventType event)
{
	auto v=player->getPhysicsBody()->getVelocity();
	if (v.y>0)
	{
    	player->getPhysicsBody()->setVelocity(Vect(0,0));
    }
}
以上是我的解决方案,如有更好的方案或疑问请留言哦~

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...