SkazOff Blog

Programming | Part#9

И снова пост про нашу игрушку, продолжаем начатое.

Основное в нашей игрушке (как несложно догадаться) — это движение, для движения мы должны касаться экрана, следовательно прикосновение экрана нужно как то «отловить». Итак, как это сделать. Для начала создадим интерфейс через который будет работать GameManager:

public interface IViewCanvas {
    void drawCircle(MainCircle circle);
}

Таким образом мы разделили данные и логику управления этими самыми данными. Еще один небольшой рефакторинг, поскольку добавился интерфейс для работы GameManager’a — уберем оттуда все лишнее:

public class GameManager  {
    private MainCircle mainCircle;
    private ViewCanvas viewCanvas;
    private static int widht;
    private static int height;


    public GameManager(ViewCanvas viewCanvas, int w, int h) {
        this.viewCanvas = viewCanvas;
        widht = w;
        height = h;
        initMainCicrcle();

    }

    private void initMainCicrcle() {

        mainCircle = new MainCircle(widht/2, height/2);
    }

    public void onDraw() {
        viewCanvas.drawCircle(mainCircle);
    }
}

ViewCanvas будет выглядеть так:

public class ViewCanvas extends View implements IViewCanvas{
    private static int width;
    private static int height;
    private GameManager gameManager;
    private Paint paint;
    private Canvas canvas;

    public ViewCanvas(Context context, AttributeSet attrs) {
        super(context, attrs);
        initWidthAndHeight(context);
        initPaint();
        gameManager = new GameManager(this, width, height);

    }

    private void initPaint() {
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);
    }
    private void initWidthAndHeight(Context context) {
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        Point point = new Point();
        display.getSize(point);
        width=point.x;
        height=point.y;
    }

    @Override
    protected void onDraw (Canvas canvas) {
        super.onDraw(canvas);
        this.canvas=canvas;
        gameManager.onDraw();

    }

    @Override
    public void drawCircle(MainCircle circle) {
        canvas.drawCircle(circle.getX(),circle.getY(),circle.getRad(),paint);
    }
}

Запускаем, проверяем, работает.

Делаем движение:

В GameManager добавляем следующие строчки:

public void onTouchEvent(int x, int y) {
    mainCircle.moveMainCircleWhenTouchAt(x, y);
}

А в MainCircle:

public void moveMainCircleWhenTouchAt(int x1, int y1) {
    int dx = (x1-x)* MAIN_SPEED /GameManager.getWidth();
    int dy = (y1-y)* MAIN_SPEED /GameManager.getHeight();
    x+=dx;
    y+=dy;

}

Помимо этого, нужно еще добавить public boolean onTouchEvent(MotionEvent event) в ViewCanvas, но что там писать — думайте сами =)

З.Ы. Пять минут фотошопа, олдскул = пиксельный-человечек.

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