0

スプライトを正確なピクセル位置に移動させたい。update メソッドで次のコードを使用して、スプライトを移動します (kPlayerSpeed = 60.0f):

if (ccpDistance(self.position, requestedPosition) < kPlayerSpeed) {
            [self changeState:kStateWalking];
            return;
        }

switch (self.characterState) {
        case kStateWalkingUp:
            self.position = ccp(self.position.x, self.position.y + kPlayerSpeed * deltaTime);
            break;
        case kStateWalkingDown:
            self.position = ccp(self.position.x, self.position.y - kPlayerSpeed * deltaTime);
            break;
        case kStateWalkingLeft:
            self.position = ccp(self.position.x - kPlayerSpeed * deltaTime, self.position.y);
            break;
        case kStateWalkingRight:
            self.position = ccp(self.position.x + kPlayerSpeed * deltaTime, self.position.y);
            break;
        case kStateIdle:
            break;
        default:
            break;

if (ccpDistance(self.position, requestedPosition) < kPlayerSpeed)

このコードを使用すると、プレーヤーは近くで停止しますが、その場で正確には停止しません。

4

2 に答える 2

1

私はこれらの線に沿って何かをします。ただし、テストしていませんが、gfs pcから書いています。

CGPoint velocity = CGPointZero;
CGPoint delta = ccpSubstract(requestedPosition, self.position);

switch (self.characterState) {
        case kStateWalkingUp:
            velocity= ccp(0, kPlayerSpeed * deltaTime);
            break;
        case kStateWalkingDown:
            velocity = ccp(0,-kPlayerSpeed * deltaTime);
            break;
        case kStateWalkingLeft:
            velocity= ccp(-kPlayerSpeed * deltaTime, 0);
            break;
        case kStateWalkingRight:
            velocity= ccp(kPlayerSpeed * deltaTime, 0);
            break;
        case kStateIdle:
            break;
        default:
            break;
}
CGPoint signsVelocity = ccpNormalize(velocity);
CGPoint absVelocity = ccp( MIN( fabsf(velocity.x), fabsf(delta.x)) , MIN(fabsf(velocity.y), fabsf(velocity.x) );
self.position = ccpAdd(self.position, ccpMult(absVelocity, signsVelocity) );
于 2012-09-23T15:54:23.660 に答える
0

アンドレス、返信ありがとう。

あなたのコードをうまく機能させることができなかったので、あなたのリードを使用して、もう少し調査を行い、これを思いつきました...

    float step = kPlayerSpeed * deltaTime;
    float dist = ccpDistance(self.position, requestedPosition);

    if (dist <= step) {
        self.position = requestedPosition;
    } else {
        CGPoint vectorBetweenAB = ccpSub(self.position, requestedPosition);
        CGPoint normVectorBetweenPositionAndEnd = ccpNormalize(vectorBetweenAB);
        CGPoint movementVectorForThisFrame = ccpMult(normVectorBetweenPositionAndEnd, step);
        if (self.position.x > movementVectorForThisFrame.x) {
            movementVectorForThisFrame.x = -movementVectorForThisFrame.x;
        }
        if (self.position.y > movementVectorForThisFrame.y) {
            movementVectorForThisFrame.y = -movementVectorForThisFrame.y;
        }
        self.position = ccpAdd(self.position, movementVectorForThisFrame);
    }

これよりも良い方法はありますか?

ありがとう

于 2012-09-23T20:54:43.637 に答える