首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让CCSprite转向其他CCSprite

让CCSprite转向其他CCSprite
EN

Stack Overflow用户
提问于 2014-01-04 16:15:36
回答 1查看 375关注 0票数 0

我知道这个问题已经问了很多次了,但我找不到解决办法。我的屏幕上有一个CCSprite,播放器,它是用加速度计控制的。然后在屏幕上出现其他CCSprites,每2秒生成一次,敌人。我希望所有的敌人跟随玩家,如果玩家移动玩家,敌人应该改变方向,向那个CCSprite走去。到目前为止这是我的代码:

代码语言:javascript
复制
- (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坐标上。过了一段时间,应用程序崩溃了。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-05 13:39:35

我猜问题可能在你没有发布的那一段代码中。

在Cocos2d的v2.1中,要在您的层中接收加速度计的测量值:

在init或onEnterTransitionDidFinish调用中这样做:

代码语言:javascript
复制
   self.accelerometerEnabled = YES;

并超载is方法:

代码语言:javascript
复制
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
   CCLOG(@"Acceleration (%f,%f,%f)",
         acceleration.x,
         acceleration.y,
         acceleration.z);
   // Do something meaningful...you probably want to send a notification to
   // some other scene/layer/logic.  It should cache that the acceleration value
   // and then do something on an update(...) call with it.  Then reset it so that
   // it does not get used the next update cycle untila new value comes in (here).
}

好像你有this...and,你已经表示你收到了them...so,我有点困惑。

SO (正常检查时间).

我创建了一个示例项目(这里),其中有一个单人精灵被多个怪物精灵追逐。当用户触摸屏幕时(我没有使用加速度计),玩家会改变位置,精灵会“追赶”他。我给他们的目标位置添加了一些随机偏移,这样他们就不会全部聚集在玩家的顶端。

下面是文件的代码(最重要的部分),它是HellowWorldLayer的一个修改版本,附带了一个cocos2d v2.1项目(我是从模板创建的):

代码语言:javascript
复制
-(void)createPlayer
{
   playerMoved = NO;

   if(self.player != nil)
   {
      [self removeChild:player];
      self.player = nil;
   }
   CGSize scrSize = [[CCDirector sharedDirector] winSize];
   CCSprite* playerSprite = [CCSprite spriteWithFile:@"Icon.png"];
   playerSprite.scale = 2.0;
   playerSprite.position = ccp(scrSize.width/2,scrSize.height/2);
   [self addChild:playerSprite];
   self.player = playerSprite;
}

-(void)createMonsters
{
   const int MAX_MONSTERS = 4;
   if(self.monsters.count > 0)
   {  // Get rid of them
      for(CCSprite* sprite in monsters)
      {
         [self removeChild:sprite];
      }
      [self.monsters removeAllObjects];
   }
   CGSize scrSize = [[CCDirector sharedDirector] winSize];
   for(int idx = 0; idx < MAX_MONSTERS; idx++)
   {
      CCSprite* sprite = [CCSprite spriteWithFile:@"Icon.png"];
      float randomX = (arc4random()%100)/100.0;
      float randomY = (arc4random()%100)/100.0;
      sprite.scale = 1.0;
      sprite.position = ccp(scrSize.width*randomX,scrSize.height*randomY);
      [self addChild:sprite];
      [monsters addObject:sprite];
   }
}

-(void)update:(ccTime)delta
{
   if(playerMoved)
   {  // Modify all the actions on all the monsters.
      CGPoint playerPos = player.position;
      for(CCSprite* sprite in monsters)
      {
         float randomX = (1.0)*(arc4random()%50);
         float randomY = (1.0)*(arc4random()%50);
         CGPoint position = ccp(playerPos.x+randomX,playerPos.y+randomY);
         [sprite stopAllActions];
         [sprite runAction:[CCMoveTo actionWithDuration:3.0 position:position]];
      }
      playerMoved = NO;
   }
}

我保留了一个CCSprite*对象(怪物)数组和一个CCSprite*供玩家使用。我有一个旗帜告诉我,如果球员已经改变了位置(球员移动)。在更新循环中,如果玩家已经移动,停止对怪物的所有动作并更新它们。

在屏幕上,它看起来如下:

当我移动主要的精灵..。

他们跟着它..。

这对我们有帮助吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20923382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档