【发布时间】:2014-01-04 16:15:36
【问题描述】:
我知道以前有人问过这个问题,但我找不到解决方案。我在屏幕上有一个CCSprite,播放器,它由加速度计控制。然后在屏幕顶部每隔 2 秒生成另一个 CCSprites,即敌人。我希望所有的敌人都跟随玩家,如果玩家移动玩家,敌人应该改变方向并朝着CCSprite 前进。到目前为止,这是我的代码:
- (void)spawnEnemies
{
monsterTxt = [[CCTexture2D alloc] initWithCGImage:[UIImage imageNamed:@"obj.png"].CGImage resolutionType:kCCResolutionUnknown];
monster = [CCSprite spriteWithTexture:monsterTxt];
...
//random spawn position etc.
CCMoveTo *movemonster = [CCMoveTo actionWithDuration:7.0 position:ccp(_rocket.boundingBox.origin.x, _rocket.boundingBox.origin.y)];
[monster runAction:[CCSequence actions:movemonster, nil]];
[_monsters addObject:monster]; //adds the sprite to a mutable array
}
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
...
//determines new position and move sprite there
[monster stopAllActions];
CCMoveTo *movemonster = [CCMoveTo actionWithDuration:7.0 position:ccp(_rocket.boundingBox.origin.x, _rocket.boundingBox.origin.y)];
[monster runAction:[CCSequence actions:movemonster, nil]];
}
现在,当我开始游戏时,精灵会朝玩家移动,但是当玩家移动敌人时,它们不会更新他们的目的地,它们只会继续向下并停在玩家的 y 坐标处。过了一会儿,应用程序崩溃了。我做错了什么?
【问题讨论】:
-
1.你确定你的 didAccelerate 方法被调用了吗? 2. 您真的应该对 Update 函数中的操作进行更改...将 didAccelerate 回调中的数据保存在类变量中。你可能会接到很多关于 didAccelerate 的电话。
-
如果您的 CCCallBlockN 块在“一段时间后”执行,您从 didAccelerate 方法中从哪里获得“怪物”。看起来该块正在从父级中删除它......这将释放它。如果您然后在 didAccelerate 中访问它,它是否仍然存在(从我在这里看到的无法判断)。
-
对不起,我粘贴了旧代码。那个块根本不应该在那里。但这并没有真正改变任何东西,只是敌人停在了玩家的 y 值处。
-
你接到了 didAccelerate 的电话吗?您指定的行为将与未被调用的行为一致...
-
不,它必须被调用,因为当 iphone 倾斜时播放器精灵会被移动,这是在 didAccelerate 方法中指定的
标签: objective-c cocos2d-iphone ccsprite