簡體   English   中英

在Sprite Kit中永久永久移動Sprite的最佳方法

[英]Best way to randomly move sprite forever in Sprite Kit

我有一個精靈,想永遠將其移動到隨機點。 我已經編寫了這段代碼,但是我認為它不是有效的。

-(void)addBoss {
    SKSpriteNode *boss = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
    boss.position = CGPointMake(self.size.width + boss.size.width / 2.0, self.size.height / 2.0);
    boss.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:boss.size];
    boss.physicsBody.dynamic = YES;
    boss.physicsBody.categoryBitMask = bossCategory;
    boss.physicsBody.contactTestBitMask = bossContact;
    boss.physicsBody.collisionBitMask = 0;
    boss.zPosition = 1;
    self.boss = boss;
    self.bossHealth = bossHP;
    CGPoint destination = CGPointMake(self.size.width - boss.size.width / 2.0, boss.position.y);
    float time = length(boss.position, destination) / bossSpeed;
    SKAction *move = [SKAction moveTo:destination duration:time];
    [self addChild:boss];
    [self.boss runAction:[SKAction sequence:@[move, [SKAction runBlock:^{
        [self artificialIntelligence];
    }]]]];

}
- (void)moveBoss {
    float minimumX = self.size.width / 2.0 + self.boss.size.width / 2.0;
    float maximumX = self.size.width - self.boss.size.width / 2.0;
    float minimumY = self.boss.size.height / 2.0;
    float maximumY = self.size.height - self.boss.size.height / 2.0;

    int rangeX = maximumX - minimumX;
    int rangeY = maximumY - minimumY;

    float x = arc4random() % rangeX + minimumX;
    float y = arc4random() % rangeY + minimumY;
    CGPoint dest = CGPointMake(x, y);
    float duration = length(self.boss.position, dest) / putinSpeed;
    [self.boss runAction:[SKAction moveTo:dest duration:duration] completion:^{
        [self moveBoss];
    }];
}

-(void)artificialIntelligence {
    [self moveBoss];
}

這段代碼可以正常工作,但是我不認為在移動完成后遞歸調用move方法不是最佳解決方案。

解決此類問題的最佳方法是什么?

這是一種快速而骯臟的方式來完成您所要求的操作:

-(void)moveCharacter {

    SKNode *playerNode;

    // get random position
    CGPoint destination = [self randomPosition];

    if(!CGPointEqualToPoint(playerNode.position, destination)) {

        // check xPos
        if(playerNode.position.x > destination.x) {
            playerNode.position = CGPointMake(playerNode.position.x-1, playerNode.position.y);
        }
        if(playerNode.position.x < destination.x) {
            playerNode.position = CGPointMake(playerNode.position.x+1, playerNode.position.y);
        }

        // check yPos
        if(playerNode.position.y > destination.y) {
            playerNode.position = CGPointMake(playerNode.position.x, playerNode.position.y-1);
        }
        if(playerNode.position.y < destination.y) {
            playerNode.position = CGPointMake(playerNode.position.x, playerNode.position.y+1);
        }

    } else {

        destinationReached = YES;
    }
}

-(CGPoint)randomPosition {

    CGRect screenRect = [[UIScreen mainScreen] bounds];

    int xPos = arc4random() % (int)screenRect.size.width;
    int yPos = arc4random() % (int)screenRect.size.height;

    return CGPointMake(xPos, yPos);
}

如何移動角色有許多不同的變體。 例如,您可以將x,y的差值划分為固定的移動量,以使播放器從點A平滑移動到B。如果您是要移動播放器的物理學家,則必須使用CGVector而不是直接改變他的x,y位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM