И снова пост про нашу игрушку, продолжаем начатое.
Основное в нашей игрушке (как несложно догадаться) — это движение, для движения мы должны касаться экрана, следовательно прикосновение экрана нужно как то «отловить». Итак, как это сделать. Для начала создадим интерфейс через который будет работать 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, но что там писать — думайте сами =)
З.Ы. Пять минут фотошопа, олдскул = пиксельный-человечек.