Ну что, в прошлой серии уроков мы разобрались с тестовым примером, надеюсь у всех все получилось, потом что в этой серии мы будем использовать все то чему уже научились. Вспомним саму суть игры:
«На игровом поле мы управляем нашим персонажем (пиксельный человечек), который должен есть фрукты перемещающиеся вокруг него и уворачиваться от монстров (также перемещающихся рядом), с каждым новым фруктом человечек становится больше соответственно уворачиваться от монстров труднее. Цель — съесть все фрукты на поле.»
Проапгрейдим идею: После поедания всех фруктов и тем самым набравшись сил — необходимо убить монстров, это у будет «WIN!».
Создаем новый проект, назовем его MonsterHunter и главную Activity — MHActivity
package ru.skazoff.monsterhunter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MHActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mh); } }
Далее игровой цикл. Для получения View самым простым способом является создать класс (например GamePanel) на основе SurfaceView. Сделаем это:
public class GamePanel extends SurfaceView implements SurfaceHolder.Callback { public GamePanel(Context context) { super(context); getHolder().addCallback(this); setFocusable(true); }
Естественно необходимо добавить: surfaceChanged, surfaceCreated, surfaceDestroyed, onTouchEvent, onDraw, но с этим думаю все ясно.
Далее для игрового цикла необходимо создать отдельный игровой поток — вспоминаем прошлые посты и делаем класс MHThread, после чего определяем его в нашу GamePanel:
public class GamePanel extends SurfaceView implements SurfaceHolder.Callback { private MHThread thread; public GamePanel(Context context) { super(context); getHolder().addCallback(this); thread = new MHThread(); setFocusable(true); }
А surfaceCreated, surfaceDestroyed соответственно тоже нужно изменить.
Теперь выведем нашего «СуперменаМонстроХантера» на экран. Создадим рисунок 20*20 пикселей, в формате png, загружаем его в drawable и пишем следующий код в метод onCreate нашей GamePanel:
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.hero_1),150,220,null);
А в метод run нашего потока добавим:
this.gamePanel.onDraw(canvas);
Плюс к этому можно использовать Android logging framework для дальнейшего логирования, но это уже на ваше усмотрение.
Полученный итог видно (хоть и плохо 20*20 все же) на рисунке.