Objective c 精灵超出/低于栅格移动系统的限制

Objective c 精灵超出/低于栅格移动系统的限制,objective-c,cocos2d-iphone,game-physics,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)。同样的事情应该发生在相反的方向。但是,全国人民代表大会决不能高

我试图在我的游戏中实现网格运动。网格有一列和三条线

[ ] 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)。同样的事情应该发生在相反的方向。但是,全国人民代表大会决不能高于193像素或低于64像素。但事实并非如此。如果你轻触两次,当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];
-(无效)触摸开始:(UITouch*)触摸事件:(UIEvent*)事件{
CGPoint touchLocation=[触摸位置Innode:self];
位置1=自身内容大小高度*.2;
位置2=自身内容大小高度*.40;
positionY3=自身内容大小高度*.60;
浮球运动;
if(touchLocation.y>\u player.position.y){
如果(_player.position.y>=positionY3){
NSLog(@“decisao 1”);
playerMove=位置y3;

}否则如果(_player.position.y>=positionY2&&&u player.position.y=positionY1&&u player.position.y一个问题肯定是您允许多个移动操作停止,因此每次点击另一个移动操作时,无论是否已经有移动操作运行。因此,请删除移动操作(或全部移动操作)在运行新程序之前:

[_player stopAllActions]; // or: remove by tag
[_player runAction:actionMove];
接下来,如果if/else均为true,则playerMove的值未定义:

float playerMove;
如果发生这种情况,变量可能会随机持有任何值,可能会将节点移动到离屏幕很远的地方。这会让它看起来像精灵会消失一样,让你很难弄清楚到底发生了什么

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

float playerMove = 0.0;

我正在使用cocos2d3.x,我没有发现removeAllActions,它在这个新版本上有变化吗?重命名为stopAllActions