0

これは解決するのが簡単な問題のように思えますが、私にはできません。タイトルが示すように、スプライトの向きが左か右かに応じて、スプライトを別のテクスチャに変更する必要があります。これが私がやろうとしたことです:

if (self.sprite.position.x > 0) //also tried "self.sprite.position.x" instead of 0.
{
    [self.sprite setTexture:[SKTexture textureWithImageNamed:@"X"]];
}
if (self.sprite.position.x < 0)
{
    [self.sprite setTexture:[SKTexture textureWithImageNamed:@"XX"]];
}

どちらも機能しませんでした (スプライトの x 軸 == 0 -_- の場合を除く)。

私はこれを読みました: SpriteKit: Change texture based on direction 役に立たなかった.

編集: すみません、スプライトの動きは 2D 空間では完全にランダムであることを忘れていました。そのために arc4random() を使用します。上がったり下がったりするときのテクスチャの変更は必要ありません。でも左右は必須。

私は何か間違ったことを書いているに違いありません:

if (self.sprite.physicsBody.velocity.dx > 0)
if (self.sprite.physicsBody.velocity.dx < 0)

私のために働いていません。どちらでもない

if (self.sprite.physicsBody.velocity.dx > 5)
if (self.sprite.physicsBody.velocity.dx < -5)

このスプライトの動きをもう一度明確にするために、

-(void)update:(CFTimeInterval)currentTime

方法。これは次のように達成されます。

-(void)update:(CFTimeInterval)currentTime
{
    /* Called before each frame is rendered */

    if (!spritehMoving)
    {   
        CGFloat fX = [self getRandomNumberBetweenMin:-5 andMax:5];
        CGFloat fY = [self getRandomNumberBetweenMin:-5 andMax:7];


        int waitDuration = arc4random() %3;

        SKAction *moveXTo       = [SKAction moveBy:CGVectorMake(fX, fY) duration:1.0];
        SKAction *wait          = [SKAction waitForDuration:waitDuration];
        SKAction *sequence      = [SKAction sequence:@[moveXTo, wait]];
        [self.sprite runAction:sequence];
    }

}

4

1 に答える 1

1

が 0 より大きいか小さいかを確認するだけfXで、x 軸の「力」が正 (右の動き) または負 (左の動き) のいずれかになります。

これは、トリックを実行する必要がある変更されたコードです-ところで-移動の開始時と終了時
にも設定しSpritehMoving BOOLました。そうしないと、スプライトが移動している場合でもこのメソッドが呼び出されます(問題はありませんそれは、BOOL値をチェックするという目的に勝っているようです。

if (!spritehMoving)
{   
    spritehMoving = YES;  

    CGFloat fX = [self getRandomNumberBetweenMin:-5 andMax:5];
    CGFloat fY = [self getRandomNumberBetweenMin:-5 andMax:7];


    int waitDuration = arc4random() %3;  

    SKAction *changeTexture;  

    if(fX > 0) { // Sprite will move to the right  
        changeTexture = [SKAction setTexture:[SKTexture textureWithImageNamed:@"RightTexture.png"]];  
    } else if (fX < 0) { // Sprite will move to the left  
        changeTexture = [SKAction setTexture:[SKTexture textureWithImageNamed:@"LeftTexture.png"]];  
    } else {  
        // Here I'm creating an action that doesn't do anything, so in case  
        // fX == 0 the texture won't change direction, and the app won't crash    
        // because of nil action  
        changeTexture = [SKAction runBlock:(dispatch_block_t)^(){}];
    }

    SKAction *moveXTo    = [SKAction moveBy:CGVectorMake(fX, fY) duration:1.0];
    SKAction *wait       = [SKAction waitForDuration:waitDuration];  
    SKAction *completion = [SKAction runBlock:(dispatch_block_t)^(){ SpritehMoving = NO; }];
    SKAction *sequence   = [SKAction sequence:@[changeTexture, moveXTo, wait, completion]];
    [self.sprite runAction:sequence];
}
于 2014-11-22T13:04:18.177 に答える