0

私はフラッピー バード デモと協力して、「お互いを知る」ためだけにさまざまなことを試みています。デモを進めていくと、ゲームの方向を上に移動する垂直スクロールに変更することができました。CGFloat を負の値に反転すると、障害物が上に移動しますが、範囲外になると再生成されません。下向きスクロールの値を変更すると、更新メソッドに従って再生成されます。誰かが x から y への変換で何が間違っているのか説明できますか? 画面の下部が認識され、上部が認識されないのはなぜですか? 前もって感謝します

#import "MainScene.h"

static const CGFloat scrollSpeed = -280.f; //upwards
static const CGFloat firstObstaclePosition = -568.f; 
static const CGFloat distanceBetweenObstacles = 80;

@implementation MainScene {
CCSprite *_hero;
CCPhysicsNode *_physicsNode;
NSMutableArray *_obstacles;
}

- (void)spawnNewObstacle {
CCNode *previousObstacle = [_obstacles lastObject];
CGFloat previousObstacleYPosition = previousObstacle.position.y;
if (!previousObstacle) {
    // this is the first obstacle
    previousObstacleYPosition = firstObstaclePosition;
}
CCNode *obstacle = [CCBReader load:@"Obstacle"];
obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles);
[_physicsNode addChild:obstacle];
[_obstacles addObject:obstacle];
}
- (void)update:(CCTime)delta {
_hero.position = ccp(_hero.position.x, _hero.position.y + delta * scrollSpeed);//move on Y axis
_physicsNode.position = ccp(_physicsNode.position.x, _physicsNode.position.y - (scrollSpeed *delta));//scroll in Y axis
//spawn more
NSMutableArray *offScreenObstacles = nil;
for (CCNode *obstacle in _obstacles) {
    CGPoint obstacleWorldPosition = [_physicsNode convertToWorldSpace:obstacle.position];
    CGPoint obstacleScreenPosition = [self convertToNodeSpace:obstacleWorldPosition];
    if (obstacleScreenPosition.y < -obstacle.contentSize.height) {
        if (!offScreenObstacles) {
            offScreenObstacles = [NSMutableArray array];
        }
        [offScreenObstacles addObject:obstacle];
    }
}
for (CCNode *obstacleToRemove in offScreenObstacles) {
    [obstacleToRemove removeFromParent];
    [_obstacles removeObject:obstacleToRemove];
    // for each removed obstacle, add a new one
    [self spawnNewObstacle];
}
}

- (void)didLoadFromCCB {
self.userInteractionEnabled = TRUE;
_obstacles = [NSMutableArray array];
[self spawnNewObstacle];
[self spawnNewObstacle];
[self spawnNewObstacle];
}

- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

}
@end

SB からの _physicsNode スクリーンショットを添付しました。

ここに画像の説明を入力

4

1 に答える 1

0

障害物が短く一定の高さで、障害物間の距離の値が十分に大きい場合、障害物は正常に生成されるようです。より意味のある距離変数の値を得るには、障害物の高さを組み込む方がよい場合があります。ちょっとした考え。

この線 -

obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles);

になり得る -

obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles + previousObstacle.contentSize.height);

垂直スクロールが上向きではなく下向きに機能する問題については、次の行が原因であると思います。

if (obstacleScreenPosition.y < -obstacle.contentSize.height) {

この行は、障害物がいつ画面から外れるかを判断する役割があるため、次の障害物の発生に影響を与えます。この行が下方向のスクロールでは機能するのに、上方向のスクロールでは変更する必要がある理由は理にかなっています。

試す:

 if (obstacleScreenPosition.y > (_physicsNode.contentSize.height + obstacle.contentSize.height)) {

障害物が固定されている場所に応じて、障害物のサイズが必要な場合と必要でない場合があります。

これでうまくいくといいのですが、頑張ってください。

于 2014-05-10T23:36:26.883 に答える