SkazOff Blog

Programming | MonsterHunter | Part#1

Ну что, в прошлой серии уроков мы разобрались с тестовым примером, надеюсь у всех все получилось, потом что в этой серии мы будем использовать все то чему уже научились. Вспомним саму суть игры:

«На игровом поле мы управляем нашим персонажем (пиксельный человечек), который должен есть фрукты перемещающиеся вокруг него и уворачиваться от монстров (также перемещающихся рядом), с каждым новым фруктом человечек становится больше соответственно уворачиваться от монстров труднее. Цель — съесть все фрукты на поле.»

Проапгрейдим идею: После поедания всех фруктов и тем самым набравшись сил — необходимо убить монстров, это у будет «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 все же) на рисунке.

Оставить комментарий