如何在Cocos2d中完成所有操作后才执行功能

时间:2014-12-24 22:47:25

标签: java android cocos2d-android

你能告诉我如何在函数slideTiles(String s)中的所有节点操作完成后才能执行函数updateTiles()吗?我尝试添加一些while循环,但它冻结了整个程序。在一个接一个地运行功能之后,动画就不会显示出来。

public boolean ccTouchesEnded(MotionEvent event)
{
CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY()));
x2=location.x; y2=location.y;

 float diffY = y1-y2;
 float diffX = x1-x2;

 if (Math.abs(diffX)>Math.abs(diffY)&&diffX<0)
     move="right";
 else if (Math.abs(diffX)>Math.abs(diffY)&&diffX>=0)
     move="left";
 else if (Math.abs(diffX)<=Math.abs(diffY)&&diffY<0)
     move="up";
 else if (Math.abs(diffX)<=Math.abs(diffY)&&diffY>=0)
     move="down";

 int row=(int)(y1/TILE_SQUARE_SIZE);
 int column=(int)(x1/TILE_SQUARE_SIZE);

 slideTiles(move);

 //wait for animations to finish
 int sum=0;
 boolean actionDone=false;
 while (!actionDone)
 {
     for (CCNode c : tilesNode.getChildren())
     {
         sum+=c.numberOfRunningActions();
     }

     //String s=sum+"";
     //statusLabel.setString(s);

     if (sum==0){
         actionDone=true;
         break;
     }

     sum=0;
 }

 updateTiles();




 return true;
 }

//////

public void slideTiles(String move)
{
//  Increment the moves label and animate the tile
CCBitmapFontAtlas moveslabel = (CCBitmapFontAtlas) getChildByTag(MOVES_LABEL_TAG);
moves++;

    moveslabel.runAction(CCSequence.actions(
            //CCDelayTime.action(0.25f),
            CCScaleTo.action(0.2f, 6/5f),
            //CCDelayTime.action(0.25f),
            CCScaleTo.action(0.2f, 5/6f)
            ));
    moveslabel.setString("Moves:\n  " + CCFormatter.format("%03d", moves ));

    if (move.equals("up"))
    {   
        for (int start=NUM_COLUMNS; start<2*NUM_COLUMNS; start++)
        for (int y=start; y<NUM_COLUMNS*NUM_ROWS; y+=NUM_COLUMNS)
        {
            if (tileNumbers[y]!=EMPTY)
            {
                for (int f=start-NUM_COLUMNS; f<y; f+=NUM_COLUMNS)
                {
                    if (tileNumbers[f]==EMPTY)
                    {   
                        //y->f
                        CGPoint moveTo = tilesNode.getChildByTag(f).getPosition();
                        CCMoveTo movetile = CCMoveTo.action(0.25f, moveTo);
                        CCSequence movetileSeq = CCSequence.actions(movetile);//CCCallFunc.action(this,"stopAction"));
                        tilesNode.getChildByTag(y).runAction(movetileSeq);

                        tileNumbers[f]=tileNumbers[y];
                        tileNumbers[y]=EMPTY;

                        break;
                    }
                }
            }
        }
    }

编辑:这种解决方案是否正确?它运作得非常好。

 public boolean ccTouchesEnded(MotionEvent event)
 {   

 ...
 ...

 slideTiles(move);

 float time = 0.25f+0.05f; //0.25f is time of moveTo action for each tile
 CCDelayTime delay = CCDelayTime.action(time);
 CCCallFunc cA = CCCallFunc.action(this, "updateTiles");
 CCSequence se = CCSequence.actions(delay, cA);
 runAction(se);

 return true;

 }

1 个答案:

答案 0 :(得分:0)

一般情况下,你不应该使用while循环在UI线程中等待,这会导致你看到它的大问题。

您应该使用Thread来完成这项等待工作。

new Thread(new Runnable() {
        @Override
        public void run() {
             while(true){
                 //here you wait forever doesn't matter the UI thread.
                 if(everythingDone) {//here to add your condition
                      new Handler().post(new Runable() {
                          @Override
                          public void run() {
                               //Here you can do what you want and will be done in UI Thread
                          }
                      });
                 }
             }
        }
}).start();