Sprite高于/低于网格移动系统的限制

时间:2014-03-24 07:49:42

标签: objective-c cocos2d-iphone game-physics

我正在尝试在游戏中实现网格运动。网格有一列和三行。

[ ] Y3 - 60 % of height
[ ] Y2 - 40% of height
[ ] Y1 - 20% of height

在3.5英寸的iphone中,这些高度为:

[ ] Y3 - 193px
[ ] Y2 - 128px
[ ] Y1 - 64px

当用户点击NPC上方的屏幕时,NPC应该移动到他上方的下一个小区(例如,如果NPC在Y1中,他应该转到Y2)。同样的事情应该发生在相反的方向。但是,NPC不应该高于193px或低于64px。哪个没有发生。如果你点击两次,当NPC移动时,他开始移动得更快并忽略了研磨,并且高于/低于边界。

这是我的代码。如何改进它以做我想做的事?

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

CGPoint touchLocation = [touch locationInNode:self];

positionY1 = self.contentSize.height*.2;
positionY2 = self.contentSize.height*.40;
positionY3 =  self.contentSize.height*.60;


float playerMove;

if (touchLocation.y > _player.position.y) {

    if (_player.position.y >= positionY3) {
        NSLog(@"decisao 1");
        playerMove = positionY3;

    } else  if (_player.position.y >= positionY2 && _player.position.y <= positionY3) {
        NSLog(@"decisao 2");
        playerMove = positionY3;

    } else  if (_player.position.y >= positionY1 && _player.position.y <= positionY2) {
        NSLog(@"decisao 3");
        playerMove = positionY2;

    } else  if (_player.position.y <= positionY1) {
        NSLog(@"decisao 4");
        playerMove = positionY1;

    }           

} else if ((touchLocation.y < _player.position.y)) {

    if (_player.position.y <= positionY1) {
        NSLog(@"decisao 5");
        playerMove = positionY1;

    } else  if (_player.position.y >= positionY1 && _player.position.y <= positionY2) {
        NSLog(@"decisao 6");
        playerMove = positionY1;

    } else  if (_player.position.y >= positionY2 && _player.position.y <= positionY3) {
        NSLog(@"decisao 7");
        playerMove = positionY2;

    } else  if (_player.position.y >= positionY3) {
        NSLog(@"decisao 8");
        playerMove = positionY3;

    }


}

// Move our sprite to touch location
CCActionMoveTo *actionMove = [CCActionMoveTo actionWithDuration:1.0f position:CGPointMake(_player.position.x, playerMove)];
[_player runAction:actionMove];

}

1 个答案:

答案 0 :(得分:2)

一个问题当然是您允许多个移动操作停止,因此每次您点击另一个移动操作都会运行,无论是否已经有移动操作正在运行。因此,在运行新动作之前删除它们(或所有动作):

[_player stopAllActions]; // or: remove by tag
[_player runAction:actionMove];

接下来,如果你的if / else都不为true,那么playerMove的值将保持未定义:

float playerMove;

如果发生这种情况,变量可以随机保存任何值,可能会使节点移动远离屏幕。这样看起来像精灵就会消失,让你很难弄清楚发生了什么。

总是使用默认值初始化标准值类型是一种很好的做法,非常好的做法:

float playerMove = 0.0;