Хорошо, это то, что я настроил для одного из моих проектов, который будет работать именно так, как вам нужно ...
Вам нужно создать 4 основных аспекта:
- Задание (расширитьActivity)
- SurfaceView (расширить SurfaceView, реализовать SurfaceHolder.Callback)
- Thread (расширить поток)
- объекты, которые взаимодействуют (расширить Drawable)
Activity запускается и генерирует SurfaceViewэто создает поток.Представление или Поток могут содержать объекты, с которыми вы рисуете / взаимодействуете, в зависимости от того, как вы хотите сохранить данные на этом этапе, но это проще всего, если вы придумали дизайн, который имеет наименьшую связь между классами.
После запуска поток работает постоянно, пока не будет остановлен (установка isRunning
в значение false):
/**
* 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
из onTouchEvent
класса SurfaceView (это реализуется, когда вы используете интерфейс SurfaceHolder.OnCallBack).
Метод updateUI
вызывает update
SurfaceView, где он перерисовывает 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);
}
}
}
Здесь мы видим, что он вызывает *Метод 1035 *, передающий объект canvas каждому из ваших интерактивных объектов.Я назвал мои "Актеры" в коде выше.Как вы решите реализовать draw
, зависит от вас, но, похоже, вы будете использовать множество функций canvas.drawBitmap()
.
Возвращаясь к методу updatePhysics
, который вы захотите использовать в Thread.это обновить объекты до или после того, как они нарисованы на экране.Для вас вы захотите, чтобы они изменили свои позиции X и / или Y на экране или изменили направление его движения после того, как handleInput
решит, что вы ударили по воздушному шару.
Это оченьтрудно объяснить это хорошо в ответе StackOverflow.Если вы действительно хотите, я могу попытаться собрать что-то более информативное в эти выходные и опубликовать его для вас (я могу предоставить свои диаграммы классов UML среди другой информации, такой как примеры изображений, структуры и потоки данных.
Пожалуйста,Я знаю, смогу ли я вам чем-нибудь помочь! Обратите внимание, что это не вся моя работа. Я использовал много онлайн-уроков по базовой структуре игры для Android, но пока не имею ссылок, чтобы предоставить ссылки.