平台上的怪物/敌人(如Doodlejump)Cocos2d
我是新来的,所以我希望你能帮助我。
我正在做一个简单的cocos2d游戏的教程
Ray Wenderlich的教程
我在另一个游戏中实现了跳跃式的跳跃。
在上述教程中,怪物/目标自由地从右侧移动到屏幕的左侧。 当我在我的应用程序上实现它的怪物就像从左到右飞行。 如果我想让怪物像嘟嘟跳跃那样站在平台上呢? 我会做什么特别的事情?
PS:我在谷歌上尝试了一些其他的东西,但没有任何作品
这里是怪物/目标的代码:
- (void)initPlatforms { // NSLog(@"initPlatforms"); currentPlatformTag = kPlatformsStartTag; while(currentPlatformTag < kPlatformsStartTag + kNumPlatforms) { [self initPlatform]; currentPlatformTag++; } [self resetPlatforms]; } - (void)initPlatform { CGRect rect; switch(random()%2) { case 0: rect = CGRectMake(608,64,102,36); break; case 1: rect = CGRectMake(608,128,90,32); break; } AtlasSpriteManager *spriteManager = (AtlasSpriteManager*)[self getChildByTag:kSpriteManager]; AtlasSprite *platform = [AtlasSprite spriteWithRect:rect spriteManager:spriteManager]; [spriteManager addChild:platform z:3 tag:currentPlatformTag]; } -(void)addTarget { Sprite *target = [Sprite spriteWithFile:@"komodo.png"]; target.position = ccp(300,200); [self addChild:target]; CGSize winSize = [[Director sharedDirector]winSize]; int minX = target.contentSize.height/2; int maxX = winSize.height -target.contentSize.height/2; int rangeX = maxX - minX; int actualX = (arc4random() % rangeX) +minX; int minDuration = 2.0; int maxDuration = 4.0; int rangeDuration = maxDuration - minDuration; int actualDuration = (arc4random() % rangeDuration) + minDuration; id actionMove = [MoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width,actualX)]; id actionMoveDone = [CallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)]; [target runAction:[Sequence actions:actionMove, actionMoveDone,nil]]; target.tag = 1; [_targets addObject:target]; }
感谢那些会帮助你…你真好。
不幸的是,这是一个相当广泛的问题,这使得很难以任何明确的方式来回答。 如果您希望创build可以弹跳的实际平台(以跳转的方式),您将需要在怪物和平台ccNodes之间实现碰撞检测。 网上有很多关于cocos2d碰撞检测的教程,既有简单的实现,也有更先进的基于2d / chipmunk的盒子解决scheme。
如果你想克隆涂鸦跳得很紧密,那么在github上有一个可用的克隆的开源版本 – 虽然我没有看到代码。
最后,如果你的意思是你只是想限制怪物的移动到屏幕的某个特定区域(所以他们不会跑出边缘),你只需要把目标放在屏幕上的一个区域, ccAction
使得ccMoveTo
使用“平台”的最左点作为最远点,它可以移动到最右边的最右边。 (我会承认我没有玩过涂鸦跳,所以不知道敌人究竟在做什么)。
如果敌人在平台上来回奔跑,你应该在你的移动序列中使用ccRepeatForever进行研究,并且在CCSequence
序列中有两个目标位置:一个将怪物移动到平台的左边,另一个移动到右边。
附加信息
好的,我明白你在做什么。 这应该让你开始:
平台是在initPlatforms
中创build的。 这会多次调用initPlatform
。 这从平台的AtlasSprite
抓取图像,为每个平台创build一个ccSprite
并为其分配一个唯一的标签。
然后,在- (void)step:(ccTime)dt
它遍历所有的平台,并根据鸟的移动距离将它们移动到正确的位置:
for(t; t < kPlatformsStartTag + kNumPlatforms; t++) { AtlasSprite *platform = (AtlasSprite*)[spriteManager getChildByTag:t]; //etc...
所以,你正在等待的一点:
如果你想添加一个怪物到这些平台,你将不得不遵循一个类似的模式。 要开始尝试这样的事情(你会希望比这更清洁的devise,但它应该把你放在正确的轨道上)
在initPlatform
添加以下函数的结尾
// add a monster sprite AtlasSprite *monster = [AtlasSprite spriteWithRect:CGRectMake(608,128,64,64) spriteManager:spriteManager]; [spriteManager addChild:monster z:3 tag:currentPlatformTag + 1000];
(我刚刚从现有的Atlas中抓取了一张图片,你可以用你的实际的“Monster”精灵对象来代替上面的图片,注意我在当前平台currentPlatformTag
加1000,这只是为了testing,最终你应该有一个monsterTag
实现。
所以现在每个平台都有一个“怪物”(再一次,你只想瞄准随机平台),所以我们需要更新怪物的位置。
在- (void)step:(ccTime)dt
之后直接获取当前平台
AtlasSprite *platform = (AtlasSprite*)[spriteManager getChildByTag:t];
你现在也需要得到当前的怪物(记住要使用我们为“怪物”创build的更新的标签值:
AtlasSprite *monster = (AtlasSprite*)[spriteManager getChildByTag:t + 1000];
然后,在我们重新定位平台的下方几行,我们将需要重新定位怪物
platform.position = pos; // We update the monster and set it a 32 pixels above the platform: monster.position = ccp(pos.x, pos.y + 32);
所以现在每个平台都有一个怪物,它的y位置随平台移动:-)希望这有助于