Add basic touch controls

This commit is contained in:
Matt Low 2020-01-14 19:10:18 +04:00
parent 1585407bcb
commit 0e906479d1
2 changed files with 105 additions and 1 deletions

View File

@ -1,11 +1,13 @@
package com.me.pacman.state; package com.me.pacman.state;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input; import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.math.Vector2;
import com.me.pacman.PacDude; import com.me.pacman.PacDude;
import com.me.pacman.Sound; import com.me.pacman.Sound;
@ -19,6 +21,10 @@ public class MenuState extends LevelState {
public static final int NEW_GAME = 0; public static final int NEW_GAME = 0;
public static final int HIGH_SCORES = 1; public static final int HIGH_SCORES = 1;
private BoundingBox NEW_GAME_BOX = new BoundingBox(88, 66, 136, 84);
private BoundingBox HIGH_SCORE_BOX = new BoundingBox(88, 42, 136, 60);
private static final int MENU_PADDING = 24; private static final int MENU_PADDING = 24;
private static final int MENU_X = 84; private static final int MENU_X = 84;
private static final int MENU_Y = 85; private static final int MENU_Y = 85;
@ -42,8 +48,16 @@ public class MenuState extends LevelState {
font = game.assets.getFont(); font = game.assets.getFont();
Gdx.input.setInputProcessor(this.new Controller()); Gdx.input.setInputProcessor(this.new Controller());
game.sound.play(Sound.Effect.BEGINNING); game.sound.play(Sound.Effect.BEGINNING);
switch(Gdx.app.getType()) {
case Android:
selectedOption = -1;
break;
default:
selectedOption = 0;
break;
}
} }
@Override @Override
@ -88,6 +102,30 @@ public class MenuState extends LevelState {
return super.keyDown(keycode); return super.keyDown(keycode);
} }
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
Vector2 coords = game.viewport.unproject(new Vector2(screenX, screenY));
if (NEW_GAME_BOX.contains(coords)) {
selectedOption = 0;
} else if (HIGH_SCORE_BOX.contains(coords)) {
selectedOption = 1;
}
return true;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
Vector2 coords = game.viewport.unproject(new Vector2(screenX, screenY));
if (selectedOption == 0 && NEW_GAME_BOX.contains(coords)) {
game.setScreen(new PlayState(game));
} else if (selectedOption == 1 && HIGH_SCORE_BOX.contains(coords)) {
selectedOption = -1;
} else {
selectedOption = -1;
}
return true;
}
} }
@Override @Override
@ -95,4 +133,25 @@ public class MenuState extends LevelState {
Gdx.input.setInputProcessor(null); Gdx.input.setInputProcessor(null);
} }
public static class BoundingBox {
private int minX, minY;
private int maxX, maxY;
public BoundingBox(int minX, int minY, int maxX, int maxY) {
this.minX = minX;
this.minY = minY;
this.maxX = maxX;
this.maxY = maxY;
}
public boolean contains(int x, int y) {
return minX < x && x < maxX && minY < y && y < maxY;
}
public boolean contains(Vector2 coords) {
return contains((int) coords.x, (int) coords.y);
}
}
} }

View File

@ -499,6 +499,10 @@ public class PlayState extends LevelState {
private final class Controller extends InputAdapter { private final class Controller extends InputAdapter {
int downX;
int downY;
long downTime;
@Override @Override
public boolean keyDown(int keycode) { public boolean keyDown(int keycode) {
switch (keycode) { switch (keycode) {
@ -535,6 +539,47 @@ public class PlayState extends LevelState {
return super.keyDown(keycode); return super.keyDown(keycode);
} }
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
if (Math.abs(downX - screenX) < 50 && Math.abs(downY - screenY) < 50
&& System.currentTimeMillis() - downTime < 250) {
paused = !paused;
return true;
}
downX = screenX;
downY = screenY;
downTime = System.currentTimeMillis();
return true;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
int relaX = screenX - downX;
int relaY = screenY - downY;
if (Math.abs(relaX) < 50 && Math.abs(relaY) < 50) {
// didn't move enough to consider a swipe
return true;
}
if (Math.abs(relaX) > Math.abs(relaY)) {
// x > y, so moving left-right
if (relaX > 0) {
pacman.setNextDirection(Direction.RIGHT);
} else {
pacman.setNextDirection(Direction.LEFT);
}
} else {
// else, moving up/down
if (relaY > 0) {
pacman.setNextDirection(Direction.DOWN);
} else {
pacman.setNextDirection(Direction.UP);
}
}
return true;
}
} }
@Override @Override