2013-07-28 2 views
0

Я начинаю игру dev, и у меня в настоящее время возникают проблемы с моей игрой .... Я бы хотел, чтобы игра обновляла холст каждый раз, когда я петлю, чтобы показать свою характер двигаться в одном прессе изображения ... Invalidate() не работает для меня здесь, так как он показывает только конечное положение моего персонажа Вот код для этого:Android Invalidate() каждый раз, когда возникает цикл

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    final int x = (int)event.getX(); 
    final int y = (int)event.getY(); 
    int action = event.getAction(); 

switch (action) { 
    case MotionEvent.ACTION_DOWN: 

      if (rollbounds.contains((int)x, (int)y)) 
      { 
       //dice roll 
       Random rand = new Random(); 

       move = rand.nextInt(6) + 1; 

       //end of dice roll 
       //move counting 

       for (int loop=move;loop>0;loop--) 
       { 
       if ((charypos >= 220)&&(charxpos == 9)) 
       { 
        Toast toast = Toast.makeText(getContext(), "You Win", Toast.LENGTH_SHORT); 
        toast.show(); 
        loop=1; 
       } 
       if (charxpos != 205&&charLeftMove==false) 
       { 

        for (int loop2 = 28;loop2>0;loop2--) 
        { 
         charxpos+=1; 
         //update or invalidate here 

        } 

Это вот когда я прикасаюсь к кнопке roll, я бы заставил персонажа плавно перемещать количество пробелов, так как invalidate заставляет его мгновенно переместиться в конечную позицию. Помощь с благодарностью

+0

попытаться использовать postInvalidate, и я хотел бы попробовать, чтобы получить плавное движение вне onTouchEvent, может быть, на OnDraw, тестирование, если мне нужно двигаться снова и повторно Invalidate (как эффект прокрутки: если (mScroller.computeScrollOffset()) { INT DeltaX = actualX - mPrevX; postInvalidate();} –

+0

дал мой код выше, вы пожалуйста дали бы мне пример кода I Я новичок, поэтому мне очень нужны вещи, чтобы продолжить, прежде чем я смогу попробовать. –

ответ

0

Знаете ли вы, что событие touch на самом деле находится в потоке пользовательского интерфейса? Даже если вы вызвали недействительный, холст ничего не нарисовал до тех пор, пока не будет выполнен весь ваш блок кода. Это означает, что система будет отображать пользовательский интерфейс после вашего кода.

for (int loop=move;loop>0;loop--) 

Вот почему вы всегда находите переход в конечное положение. Вы должны переместить свой код на case MotionEvent.ACTION_MOVE. Не используйте цикл в событии. просто делайте расчет один раз каждым касанием. Например, во всем мире объявить переменную и увеличить значение на TouchEvent

int a = 0; 

public boolean onTouchEvent(MotionEvent event) { 
    final int x = (int)event.getX(); 
    final int y = (int)event.getY(); 
    int action = event.getAction(); 

switch (action) { 
    case MotionEvent.ACTION_MOVE: 
       ++a; 
       invalidate(); 
+0

Я попробую и скажу что-нибудь, если это сработает: D –

+0

Я смог понять, что вы сказали yushullx но я не могу найти способ применить его к своей игре. Я хочу, чтобы персонаж переместился в позицию, заданную броском кости, одним нажатием ... –

+0

вы можете использовать обработчик для отправки сообщения в поток пользовательского интерфейса для рисования. проверьте Android doc http://developer.android.com/reference/android/os/Handler.html – yushulx

Смежные вопросы