私のゲームでは、連続的に動くプラットフォームとプレーヤーを配置しました。プレーヤーは各プラットフォームを飛び越えて上りますが、プラットフォームは左から右に移動しており、プレーヤーが動くプラットフォームに座ると、プラットフォームもスライドします。
しかし、問題は、プラットフォームが画面の左端に衝突して右側に移動し始めると、プレーヤーがプラットフォームで停止せずに左側に向かって移動し続け、落下することです。プレイヤーの動きを止めるにはどうすればよいですか?車を壊すときにガラスを飛び越えるようなものです。:(
Init
メソッドでは、プレーヤーを作成しています。CCSprite *_player
ヘッダーファイルで宣言されています。
// Creates player
_player = [CCSprite spriteWithImageNamed: @"Assets.atlas/Player.png"];
[_player setPosition: ccp(160.0f, 160.0f)];
_player.physicsBody = [CCPhysicsBody bodyWithRect:(CGRect){CGPointZero, _player.contentSize} cornerRadius:0]; // 1
_player.physicsBody.collisionGroup = @"playerGroup"; // 2
_player.physicsBody.collisionType = @"player";
//[_physicsWorld addChild:_player];
[_foreground addChild: _player];
_foreground
プラットフォームが追加される CCNode であり、プレイヤーが上に移動している間に下にスクロールして、プレイヤーが上に移動している効果を与えることができます。
//This is how platform node is added in init method.
PlatformNode *platform3 = (PlatformNode *)[PlatformNode node];
[platform3 createPlatformAtPosition:CGPointMake(110, 50) ofType: PLATFORM_NORMAL];
[_foreground addChild: platform3];
createPlatform...
スプライトと物理ボディを配置するメソッドが実装されています。に記述されているメソッドのコードを参照してくださいPlatformNode.m
。
- (void) createPlatformAtPosition:(CGPoint) position ofType:(PlatformType) type {
//PlatformNode *node = [PlatformNode node];
if (type == PLATFORM_BREAK) {
_sprite = [CCSprite spriteWithImageNamed: @"PlatformBreak.png"];
} else {
_sprite = [CCSprite spriteWithImageNamed: @"Platform.png"];
}
[_sprite setPosition: ccp(_sprite.contentSize.width/2, _sprite.contentSize.height/2)];
[self addChild: _sprite];
[self setPosition: position];
[self setName: @"NODE_PLATFORM"];
[self setPlatformType: type];
self.physicsBody = [CCPhysicsBody bodyWithRect:(CGRect){CGPointZero, _sprite.contentSize} cornerRadius: 0.0];
self.physicsBody.collisionGroup = @"platform";
self.physicsBody.type = CCPhysicsBodyTypeStatic;
self.physicsBody.collisionType = @"obstacle";
// if (type == PLATFORM_MOVE) {
// // Animate projectile
// CCActionMoveBy* actionMove = [CCActionMoveBy actionWithDuration:4.0f position: CGPointMake(-100, 0)];
// CCActionReverse *actionRev = [CCActionReverse actionWithAction: actionMove];
// CCActionSequence *seq = [CCActionSequence actionWithArray: @[actionMove, actionRev]];
// [self runAction:[CCActionRepeatForever actionWithAction: seq]];
// }
//return self;
}
プラットフォームを左から右に連続的に移動させるために、次のロジックが実装されています。
CGPoint actPoint = platform3.position; CGPoint extPoint = ccp([CCDirector sharedDirector].viewSize.width - platform3.contentSize.width*2, platform3.position.y); CGPoint zrPoint = ccp(0, platform3.position.y);
//CCActionMoveBy* actionMove = [CCActionMoveTo actionWithDuration:((ccpSub(actPoint, zrPoint).x * 8.0) / extPoint.x) position: CGPointMake(0, platform3.position.y)];
CCActionMoveBy* actionMoveF = [CCActionMoveTo actionWithDuration:8.0f position: extPoint];
CCActionMoveBy* actionMoveR = [CCActionMoveTo actionWithDuration:8.0f position: zrPoint];
CCActionSequence *seq = [CCActionSequence actionWithArray: @[actionMoveF, actionMoveR]];
//CCActionReverse *actR = [CCActionReverse actionWithAction: seq];
//CCActionSequence *act = [CCActionSequence actionWithArray: @[seq, actR]];
[platform3 runAction:[CCActionRepeatForever actionWithAction: seq]];
誰でもここで私を助けることができますか?