2013-08-28 45 views
0

我有一种情况,即如果满足一个条件,则必须禁用其他条件,即使它们在下一阶段变为true。寻找或布尔选择的算法或设计模式

基本上我有一个方法,每次移动一个精灵都会被触发。我想限制移动到单轴,所以当它开始在轴上移动时,它将只能在x上移动,直到拖动结束。

我正在寻找某种优雅的方式来做到这一点,而不是保持观察4变量状态。

E.g.在伪代码,我需要完成以下(为X轴):

if sprite starts to move along the X axis: 
    set state == moveRight 
if sprite moves more then 1 pixel on the Y axis and moveRight == true: 
    do nothing 

这里就是我目前有:

void GameController::handleTouchMoved(CCTouch* touch) 
{ 
    // right 
    if(dragX > dragPrevX) 
    { 
     pSelectedCurrent->setPosition(ccp(pSelectedCurrent->getPositionX()+movmentSpeed,pSelectedCurrent->getPositionY())); 
    } 
    // left 
    else if(dragX < dragPrevX) 
    { 
     pSelectedCurrent->setPosition(ccp(pSelectedCurrent->getPositionX()-movmentSpeed,pSelectedCurrent->getPositionY())); 
    } 
    // up 
    else if(dragY > dragPrevY) 
    { 
     pSelectedCurrent->setPosition(ccp(pSelectedCurrent->getPositionX(),pSelectedCurrent->getPositionY()+movmentSpeed)); 
    } 
    // down 
    else if(dragY < dragPrevY) 
    { 
     pSelectedCurrent->setPosition(ccp(pSelectedCurrent->getPositionX(),pSelectedCurrent->getPositionY()-movmentSpeed)); 
    } 
} 
+0

那么你可以封装那些moveUp()moveDown()等等,但是你无法避免检查.. – dreamzor

回答

1
int moveX, moveY; 
... 

// First move 
moveX = 0; 
moveY = 0; 
if sprite starts to move along the X axis 
    moveX = 1; 
else 
    moveY = 1; 

... 

// General move handling 
pSelectedCurrent->setPosition(cpp(
    pSelectedCurrent->getPositionX()+sign(dragX - dragPrevX)*movmentSpeed*moveX, 
    pSelectedCurrent->getPositionY()+sign(dragY - dragPrevY)*movmentSpeed*moveY 
    )); 

// sign(x) = -1, if x < 0, 
//   0, if x = 0, 
//   1, if x > 0 
+0

这只是为了积极的运动,也有沿着相反的方向移动 – user63898

+0

答案是编辑。 –

+0

非常好的人!我会用它 moveY需要0我猜 – user63898

1

你可以这样做:

+0

t他很好,但我需要检测,如果它的权利或离开,向下或向上 将其传递给正确的动画功能 – user63898