1) Почему бы «Canvas canvas = null» не вынести в переменные класса GameThread, а не создавать ее при каждой итерации цикла, тем самым создавая лишнюю работу для GC?
2) Зачем такие методы, как setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) и два последующих помещать в яву, когда для этих целей есть Manifest.xml?
Это самое первое что бросается в глаза. Если ваша статья была написана для новичков, то может не стоит учить новичков кодить неправильно? Как написали выше, из вставок кода понять что-то очень сложно.
Вообще, мне кажется, что учиться писать игры стоит начиная с использования готовых движков, типа AndEngine, а уже когда поймешь что к чему, тогда и начинать писать все с нуля.
1) Из тех уроков по которым учился я, делалось именно так, по этому я и написал так. Исправлюсь.
2) Вы не первый кто делает мне замечание по этому вопросу, но ни один человек мне толком не смог объяснить почему нельзя именно так? Почему именно в манифесте?
Учиться писать игры наоборот как по мне нужно учиться писать с нуля, для понимания работы игр. А если начинать писать сразу на готовых движках то они будут делать все за Вас, и тут уже весь функционал не понять.
2. В принципе так писать можно, но зачем, когда можно в манифесте описать и будет правильнее. В манифесте указываешь активити и его параметры, а в классе уже само содержимое отображаешь.
Плюс сразу еще до открытия активити приложение знает, как оно будет отображаться, а так только после запуска. Теоретически на скорость запуска влиять будет, хотя и незаметно.
В случае смены ориентации активити пересоздается заново. В вашем случае, если перед запуском игры устройство у пользователя было в портретной ориентации, то и активити начнет создаваться в портрете. Но, обнаружив в процессе создания ваш код, андроид пересоздаст активити уже в альбомном виде. Указание в манифесте позволяет сразу задать нужную ориентацию.
Вот здесь описана проблема, к которой может привести метод setRequestedOrientation() в onCreate().
Такая игра как на маркете вряд ли выйдет. Вообще думаю мало-чего хорошего выйдет при использовании канваса. А так как разработка под OpenGL на Android дело не простое, то лучшим вариантом будет использование готовых игровых движков.
К сожалению сказать насколько сложнее/легче OpenGL под Android не могу так как знаю о разработке под OpenGL очень мало. Зато знаком с игровым движком AndEngine и точно могу сказать что он достаточно легок для изучения и его возможности достаточны для такого рода игр.
Т.е. я хотел сказать что если вы только вникаете в разработку игр, то лучше всего использовать игровой движок. Ну а если вы программируете под OpenGL, то вы вероятно это уже прошли и все знаете.
Чес слово не заметил, я когда писал эту статью я залил её в песочницу и ждал пока пропустят, думал что не пропустят и залил на свободнохабр. А тут такая радость — пропустили :)
Как-то мне не понравилось как работает 2д графика без OpenGL на андроиде. Думается мне, создавать игры надо с использованеим какого-нибудь гл движка, типа AndEngine и т.п. Все хочу попробовать, да руки не доходят:)
и позицию игрока сделали по центу gameView.getHeight() / 2; а позицию пули у = 120. При разных разрешениях экрана положение по у будет не верное, лучше задать gameView.getHeight() / 2 — 20;
Создание простой 2D игры на Android