2011-12-14 3 views
0

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

  • использовать OpenGL
  • и использовать Canvas.

Я не хочу использовать OpenGL для такой простой анимации. И я не понимаю, как это сделать, используя Canvas (были прочитаны this, google docs и некоторые поисковые ссылки google). Мне не нужен код, все, что мне нужно, это способ, как это сделать и алгоритм.

+0

Я не знаю, у вас есть время прямо сейчас, чтобы написать полное объяснение, но google для учебных пособий для Android. Вам нужно создать поток, который выполняет команды обновления на ваших объектах баллона, а затем попросит их вызвать команду рисования на холст. доступны, и они должны помочь вам. Я могу отправить код позже из моего проекта, который использует большую часть работы, которая вам понадобится позже. – Grambot

+0

Хорошо. Я был бы признателен за некоторый код – jumper0k

ответ

1

Хорошо, это то, что я создал для одного из моих проектов, которые будут работать именно так, как вам нужно ...

Вам нужно создать 4 основных аспекта:
- активность (продлить активность)
- A SurfaceView (расширить SurfaceView реализации SurfaceHolder.Callback)
- Нить (Продлить тему)
- Объекты, которые взаимодействуют между собой (расширяющими вытяжкой)

начнется активность и генерирует SurfaceView, который создает тему. В представлении или в потоке могут содержаться объекты, с которыми вы рисуете/взаимодействуете, а именно с тем, как вы хотите хранить данные на этом этапе, но это проще всего, если вы придумали конструкцию, которая имеет наименьшую связь между классами.

После запуска нитка постоянно до остановки (установка isRunning ложь):

/** 
* Processing loop 
*/ 
public void run() { 
    while (isRunning) { 
     try { 
       sleep(25); 
      } catch (InterruptedException e) { 
       Log.e("Thread","Thread Interruption"); 
       e.printStackTrace(); 
      } 
     update(); 
    } 
    Log.d("Thread", "Game Loop Stopped"); 
} 

/** 
* Main processing of the game loop. 
*/ 
private void update() { 
    handleInput(); 
    updatePhysics(); 
    updateUI(); 
    updateState(); 
    updateAI(); 
    updateAnimations(); 
    updateSound(); 
    updateVideo(); 
} 

В этом классе вы видите update() метод, который делает кучу действий каждой итерации нити.

Методы, которые вас будут интересовать, это методы handleInput, updateUI и updatePhysics.

В handleInput вы выполните обратный вызов SurfaceView, чтобы получить данные, необходимые для обработки информации. Мой handleInput довольно прост в том, что он просто захватывает MotionEvent из класса SurfaceView onTouchEvent (это реализуется при использовании интерфейса SurfaceHolder.OnCallBack).

Метод updateUI называет SurfaceView-х update, где она вновь рисует Canvas с каждым объектом, или воздушный шар

public void update(List<Actor> actors) { 
     Canvas canvas = null;  
     try { 
      canvas = surface.lockCanvas(); 
      synchronized (surface) { 
       //Blank the Canvas 

       for (int i = 0; i < actors.size(); i++) { 
        actors.get(i).draw(canvas); 
       } 
      } 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } finally { 
      if (canvas != null) { 
       surface.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 

Здесь мы видим, что он вызывает draw метод передачи объекта холст для каждого из ваших взаимодействующих объектов. Я назвал свои «Актеры» в коде выше. Как вы решите реализовать draw зависит от вас, но похоже, что вы будете использовать множество функций canvas.drawBitmap().

Возвращаясь к методу Thread's updatePhysics, вы захотите использовать его для обновления объектов до или после их рисования на экране.Для вас вы захотите, чтобы они изменили свои X и/или Y положения на экране или изменили направление движения после того, как handleInput решит, что вы попали в воздушный шар.


Его очень сложно объяснить это в ответе StackOverflow. Если вы действительно хотите, я могу попытаться добавить что-то более информативное вместе в этот уик-энд и опубликовать его извне для вас (я могу предоставить диаграммы классов UML среди других данных, таких как примеры изображений, структуры и потоки данных.

Сообщите мне если я могу помочь вам в дальнейшем! Обратите внимание, что это еще не все мои работы. Я использовал много учебников онлайн для базовой структуры Android-игр, но у меня нет доступных ссылок прямо сейчас, чтобы предоставить ссылки.

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