Помогите сделать управление в игре под Андроид
Juwell Дата: Воскресенье, 15 Июля 2012, 16:10 | Сообщение # 1
участник
Сейчас нет на сайте
Помогите сделать управление в игре под Андроид! У меня есть две кнопки - вправо и влево) Я писал код в прошлых темах, но ответы не помогли Напишите пожалуйста код чтобы при нажатии на кнопки спрайт двигался влево и вправо СПАСИБО ЗАРАНЕЕ
Pesets Дата: Понедельник, 16 Июля 2012, 11:49 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
У нас было 2 кнопки, 75 таблеток мескалина, 5 упаковок кислоты, пол-солонки кокаина и целое множество транквилизаторов всех сортов и расцветок, а так же текила, ром, ящик пива, пинта чистого эфира, и амилнитрит... ну и так далее. Вот. Во-первых, на чем пишешь. Это критично. Во-вторых, что за спрайт и на какие кнопки надо реагировать - реальные или виртуальные. И в-третьих, очень бы не помешал хотя бы кусочек кода, который есть. Сразу было бы понятнее.
Jericho Дата: Понедельник, 16 Июля 2012, 12:38 | Сообщение # 3
Ubuntu 11.10 user
Сейчас нет на сайте
Pesets , Что бы понят на чем пишет ТС много ума не надо (смотрим на раздел в котором тема).
Уютненькая страничка Ерихона xxx: Так вы представляете, у него там фрагмент кода в 15 строк повторяется 37 раз. Если вынести в функцию можно сэкономить полтыщи строк! yyy: это припев. © Антон Антоненко
Pesets Дата: Понедельник, 16 Июля 2012, 15:30 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Quote (Jericho )
Pesets, Что бы понят на чем пишет ТС много ума не надо (смотрим на раздел в котором тема).
И на чем же? Java? Java - понятие растяжимое. Меня интересует фреймворк / движок. Ну или если пишется на голом Android API, то нужно смотреть большую часть исходников.
Juwell Дата: Понедельник, 16 Июля 2012, 15:33 | Сообщение # 5
участник
Сейчас нет на сайте
Пишу под Андроид! Кнопки виртуальные(я их вывожу на канаву) Вот мой код Code
public boolean onTouchEvent(MotionEvent event){ if(event.getAction()==MotionEvent.ACTION_DOWN || event.getAction()==MotionEvent.ACTION_MOVE){ if(event.getX() == arrow_leftX){ gameLoopThread.setRunning(false); } else if(event.getX() == arrow_leftX){ playerX = playerX - xSpeed; } else if(event.getX() == arrow_rightX){ gameLoopThread.setRunning(false); } else if(event.getX() == arrow_rightX){ playerX = playerX + xSpeed; } } return super.onTouchEvent(event); }
При нажатии на левую кнопку playerX = playerX - xSpeed При нажатии на правую кнопку playerX = playerX + xSpeed Вся проблема в том что мой код не работает Добавлено (16.07.2012, 15:33) ---------------------------------------------
Code
public class Game extends SurfaceView { /////////PLAYER////////////// private Bitmap player_front_left; private int playerX = 200; private int playerY = 351; private int xSpeed = 5; private boolean moveLeft = false; private boolean moveRight = false; /////////CONTROL//////////// private float touchX; private float touchY; private Bitmap arrow_up; private int arrow_upX = 710; private int arrow_upY = 250; private Bitmap arrow_left; private int arrow_leftX = 10; private int arrow_leftY = 250; private Bitmap arrow_right; private int arrow_rightX = 100; private int arrow_rightY = 250; /////////BLOCKS///////////// private Bitmap grass; //////////////////////////// private SurfaceHolder holder; private GameLoopThread gameLoopThread; public boolean onTouchEvent(MotionEvent event){ if(event.getAction()==MotionEvent.ACTION_DOWN || event.getAction()==MotionEvent.ACTION_MOVE){ if(event.getX() == arrow_leftX){ gameLoopThread.setRunning(false); } else if(event.getX() == arrow_leftX){ playerX = playerX - xSpeed; } else if(event.getX() == arrow_rightX){ gameLoopThread.setRunning(false); } else if(event.getX() == arrow_rightX){ playerX = playerX + xSpeed; } } return super.onTouchEvent(event); } public Game(Context context) { super(context); gameLoopThread = new GameLoopThread(this); holder = getHolder(); holder.addCallback(new SurfaceHolder.Callback() { public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; gameLoopThread.setRunning(false); while (retry) { try { gameLoopThread.join(); retry = false; } catch (InterruptedException e) {} } } public void surfaceCreated(SurfaceHolder holder) { Canvas canvas = holder.lockCanvas(null); onDraw(canvas); holder.unlockCanvasAndPost(canvas); gameLoopThread.setRunning(true); gameLoopThread.start(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); player_front_left = BitmapFactory.decodeResource(getResources(), R.drawable.player_front_left); grass = BitmapFactory.decodeResource(getResources(), R.drawable.grass); arrow_left = BitmapFactory.decodeResource(getResources(), R.drawable.arrow_left); arrow_right = BitmapFactory.decodeResource(getResources(), R.drawable.arrow_right); arrow_up = BitmapFactory.decodeResource(getResources(), R.drawable.arrow_up); } protected void onDraw(Canvas canvas) { canvas.drawColor(Color.CYAN); canvas.drawBitmap(arrow_left, arrow_leftX, arrow_leftY, null); canvas.drawBitmap(arrow_right, arrow_rightX, arrow_rightY, null); canvas.drawBitmap(arrow_up, arrow_upX, arrow_upY, null); canvas.drawBitmap(grass, 0, 410, null); canvas.drawBitmap(grass, 50, 410, null); canvas.drawBitmap(grass, 100, 410, null); canvas.drawBitmap(grass, 150, 410, null); canvas.drawBitmap(grass, 200, 410, null); canvas.drawBitmap(grass, 250, 410, null); canvas.drawBitmap(grass, 300, 410, null); canvas.drawBitmap(grass, 350, 410, null); canvas.drawBitmap(grass, 400, 410, null); canvas.drawBitmap(grass, 450, 410, null); canvas.drawBitmap(grass, 500, 410, null); canvas.drawBitmap(grass, 550, 410, null); canvas.drawBitmap(grass, 600, 410, null); canvas.drawBitmap(grass, 650, 410, null); canvas.drawBitmap(grass, 700, 410, null); canvas.drawBitmap(grass, 750, 410, null); canvas.drawBitmap(player_front_left, playerX, playerY, null); } }
Вот весь класс
Сообщение отредактировал Juwell - Понедельник, 16 Июля 2012, 15:34
Pesets Дата: Понедельник, 16 Июля 2012, 15:38 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Вот, уже понятнее. Во-первых, у тебя игрок двигается только когда пришло сообщение. По-хорошему, нужно просто выставлять флаг (в духе player.setSpeed(xSpeed)), а двигать его в другом потоке уже. Во-вторых, не может быть, код не работает. Хоть как-то он должен работать. 1. Посмотри, у тебя вообще onTouchEvent вызывается? 2. Посмотри, проходит ли у тебя первый if 3. Посмотри, что тебе возвращает getX() и сравни с arrow_leftx и arrow_rightx
Juwell Дата: Понедельник, 16 Июля 2012, 15:38 | Сообщение # 7
участник
Сейчас нет на сайте
Сейчас попробую изменить
Сообщение отредактировал Juwell - Понедельник, 16 Июля 2012, 15:41
Pesets Дата: Понедельник, 16 Июля 2012, 15:43 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Алсо, Code
event.getAction().equals(MotionEvent.ACTION_DOWN)
А не == попробуйДобавлено (16.07.2012, 15:43) --------------------------------------------- И я так понимаю где getX() ==, там тоже равенство фтопку, надо либо эпсилон-равенство, либо вообще "getX() > чего-то && getX() < чего-то"
Juwell Дата: Понедельник, 16 Июля 2012, 15:45 | Сообщение # 9
участник
Сейчас нет на сайте
Code
public boolean onTouchEvent(MotionEvent event){ if(event.getAction()==MotionEvent.ACTION_DOWN || event.getAction()==MotionEvent.ACTION_MOVE){ if(event.getX() == arrow_leftX){ gameLoopThread.setRunning(false); } else{ playerX = playerX - xSpeed; } } return super.onTouchEvent(event); }
Вот такой работает но двигает только влево а если дописать Code
if(event.getX() == arrow_rightX){ gameLoopThread.setRunning(false); } else{ playerX = playerX + xSpeed; }
то перестает работать
Pesets Дата: Понедельник, 16 Июля 2012, 15:52 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Я бы вообще написал так: Code
public boolean onTouchEvent(MotionEvent event){ player.setSpeed(0); if(event.getAction()==MotionEvent.ACTION_DOWN || event.getAction()==MotionEvent.ACTION_MOVE){ if(event.getX() >= arrow_leftX && event.getX() <= arrow_leftX + arrow_width){ player.setSpeed(-xSpeed); } elseif(event.getX() >= arrow_rightX && event.getX() <= arrow_rightX + arrow_width){ player.setSpeed(xSpeed); } } return super.onTouchEvent(event); }
Где arrow_width - некая константа, скажем 100, а у player'а есть поле float speed, с геттером и сеттером. А в игровом цикле я бы уже мерил прошедшее время и двигал игрока на player.getSpeed() * deltaTime единиц
Juwell Дата: Понедельник, 16 Июля 2012, 16:04 | Сообщение # 11
участник
Сейчас нет на сайте
РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Code
public boolean onTouchEvent(MotionEvent event){ if(event.getAction()==MotionEvent.ACTION_DOWN || event.getAction()==MotionEvent.ACTION_MOVE){ if(event.getX() >= arrow_leftX && event.getX() <= arrow_leftX + arrow_width){ playerX = playerX - xSpeed; } else if(event.getX() >= arrow_rightX && event.getX() <= arrow_rightX + arrow_width){ playerX = playerX + xSpeed; } } return super.onTouchEvent(event); }