Skip to content
Snippets Groups Projects
Commit 0bfb8105 authored by Matyáš Latner's avatar Matyáš Latner
Browse files

Merge branch 'feature-pursuit' into 'devel'

#163 Maps order fix.



See merge request !203
parents 9d0ab15c 04b72e99
No related branches found
No related tags found
No related merge requests found
......@@ -6,6 +6,7 @@ import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
......@@ -179,7 +180,7 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
protected void screenResized(int width, int height) {
ScaleUtil.setFullScreen(contentGroup, getStage());
float minSide = Math.min(getViewportWidth(), getViewportHeight());
grid.setSize(minSide-2*GRID_PADDING,minSide-2*GRID_PADDING);
grid.setSize(minSide - 2 * GRID_PADDING, minSide - 2 * GRID_PADDING);
grid.setPosition(getViewportWidth() / 2 - grid.getWidth() / 2, (getViewportHeight() / 2 - grid.getHeight() / 2));
grid.scaleGrid();
......@@ -236,7 +237,7 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
public void rotated(float angle, Actor rotatedPiece) {
int circlePart = (int)(angle) / MIN_ANGLE_TO_PLAY_ROTATE_SOUND;
if(lastCirclePart != circlePart && System.currentTimeMillis() - lastTimeRotateSoundPlayed > ROTATE_SOUND_MIN_INTERVAL) {
if (lastCirclePart != circlePart && System.currentTimeMillis() - lastTimeRotateSoundPlayed > ROTATE_SOUND_MIN_INTERVAL) {
getSound(PursuitAssets.SOUND_ROTATION).play();
lastTimeRotateSoundPlayed = System.currentTimeMillis();
lastCirclePart = circlePart;
......@@ -277,17 +278,19 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
}
}
//in case we canceled rotation animation, rotate piece to correct angle
grid.addAction(new RotatePieceToClosestAngle((PuzzlePiece) draggedPiece));
}
if (grid.allPiecesInCorrectPositions()) {
backgroundImage.removeListener(dragAndRotateActorListener);
endGame();
showCheckpoints();
grid.addAction(Actions.sequence(new RotatePieceToClosestAngle((PuzzlePiece) draggedPiece), Actions.run(new Runnable() {
@Override
public void run() {
// check if puzzle is solved after possible rotation animation
checkEndGameCondition();
}
})));
}
checkEndGameCondition();
return true;
}
};
if(grid.switchPieces(puzzlePiece, overlappedPiece, onPiecesSwitchFinishedAction)) {
if (grid.switchPieces(puzzlePiece, overlappedPiece, onPiecesSwitchFinishedAction)) {
getSound(PursuitAssets.SOUND_SWITCH).play();
}
}
......@@ -298,20 +301,26 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
backgroundImage.addListener(dragAndRotateActorListener);
}
private void checkEndGameCondition() {
if (grid.allPiecesInCorrectPositions()) {
backgroundImage.removeListener(dragAndRotateActorListener);
endGame();
showCheckpoints();
}
}
private void updateMapIndex() {
String lastMap = GameDAO.getLastGameScoreValueForGameAndKey(GameDefinition.PURSUIT.getGameNumber(), SCORE_KEY_LAST_MAP);
//couldn't find the last map
if(lastMap == null) {
if (lastMap == null) {
mapNumber = 0;
}
else {
mapNumber = Integer.parseInt(lastMap);
} else {
//To loop over maps
mapNumber = Integer.parseInt(lastMap);
mapNumber = (mapNumber + 1) % MAPS_COUNT;
}
//To loop over maps
mapNumber = (mapNumber + 1) % MAPS_COUNT;
//Update last map index in db
setGameScore(SCORE_KEY_LAST_MAP, mapNumber);
}
......@@ -326,7 +335,7 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
private void prepareGrid() {
TextureRegion mapTextureRegion = getScreenTextureRegion(TextureHelper.getMapFullName(mapNumber));
float minSide = Math.min(getViewportWidth(),getViewportHeight());
grid = new Grid(((getViewportWidth()/2) - minSide/2)+GRID_PADDING,(getViewportHeight() / 2 - minSide/2)+GRID_PADDING, minSide- 2*GRID_PADDING, gridColumnCount, mapTextureRegion, getRandom());
grid = new Grid(((getViewportWidth() / 2) - minSide / 2) + GRID_PADDING,(getViewportHeight() / 2 - minSide / 2) + GRID_PADDING, minSide- 2 * GRID_PADDING, gridColumnCount, mapTextureRegion, getRandom());
contentGroup.addActor(grid);
}
......@@ -337,26 +346,26 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
Music[] vehicleSounds = getVehicleSounds(vehicleType);
vehicle = new Vehicle(getScreenTextureRegion(vehicleType.getTextureName()), vehiclePosition, vehicleSize);
vehicle.addListener(new VehicleDragListener(vehicle, vehicleSounds, getData(), new Point(roadMap.getRegionWidth(), roadMap.getRegionHeight()), finishFlag, new VehicleDragListener.OnVehicleDragCompleteListener() {
@Override
public void onVehicleDragComplete() {
vehicle = new Vehicle(getScreenTextureRegion(vehicleType.getTextureName()), vehiclePosition, vehicleSize);
vehicle.addListener(new VehicleDragListener(vehicle, vehicleSounds, getData(), new Point(roadMap.getRegionWidth(), roadMap.getRegionHeight()), finishFlag, new VehicleDragListener.OnVehicleDragCompleteListener() {
@Override
public void onVehicleDragComplete() {
showVictoryDialog();
//remove all actor listeners
//remove all actor listeners
vehicle.clear();
vehicle.remove();
vehicle.remove();
finishFlag.clear();
finishFlag.remove();
}
}));
vehicle.setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes());
grid.addActor(vehicle);
grid.addActor(vehicle);
vehicle.setVisible(false);
}
}
private void prepareFinishFlag() {
private void prepareFinishFlag() {
finishFlag = new Image(getScreenTextureRegion(TextureHelper.getFinishFlagTextureName()));
finishFlag.setSize(TextureHelper.FINISH_FLAG_SIZE.x, TextureHelper.FINISH_FLAG_SIZE.y);
finishFlag.setSize(TextureHelper.FINISH_FLAG_SIZE.x, TextureHelper.FINISH_FLAG_SIZE.y);
finishFlag.setOrigin(finishFlag.getWidth() / 2, finishFlag.getHeight() / 2);
finishFlag.setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes());
grid.addActor(finishFlag);
......@@ -437,24 +446,24 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
return ResultMapping.getResultTextMappingForGameResult(gameResult).getSoundName();
}
private String getOverallTimeText(float millis){
private String getOverallTimeText(float millis) {
String time="";
StringBuilder sb = new StringBuilder();
int seconds = (int) (millis / 1000) % 60 ;
int minutes = (int) ((millis / (1000*60)) % 60);
int hours = (int) ((millis / (1000*60*60)) % 24);
Log.info(getClass(),"TIME: "+hours+"h, "+minutes+"m, "+seconds+"s");
if(hours!=0){
Log.info(getClass(),"HOURS");
sb.append(getFormattedText(SUMMARY_TEXT_TIME_HOURS,hours));
Log.info(getClass(), "TIME: " + hours + "h, " + minutes + "m, " + seconds + "s");
if (hours != 0) {
Log.info(getClass(), "HOURS");
sb.append(getFormattedText(SUMMARY_TEXT_TIME_HOURS, hours));
}
if(minutes!=0){
Log.info(getClass(),"MINUTES");
sb.append(getFormattedText(SUMMARY_TEXT_TIME_MINUTES,minutes));
if (minutes != 0) {
Log.info(getClass(), "MINUTES");
sb.append(getFormattedText(SUMMARY_TEXT_TIME_MINUTES, minutes));
}
if(seconds!=0){
Log.info(getClass(),"SECONDS");
sb.append(getFormattedText(SUMMARY_TEXT_TIME_SECONDS,seconds));
if (seconds != 0) {
Log.info(getClass(), "SECONDS");
sb.append(getFormattedText(SUMMARY_TEXT_TIME_SECONDS, seconds));
}
return sb.toString();
}
......
......@@ -6,14 +6,14 @@ import java.util.Random;
import cz.nic.tablexia.game.games.pursuit.assets.PursuitAssets;
import cz.nic.tablexia.game.games.pursuit.model.Maps;
import cz.nic.tablexia.util.Point;
import cz.nic.tablexia.game.games.pursuit.model.VehicleType;
import cz.nic.tablexia.util.Point;
/**
* Created by Václav Tarantík on 18.6.15.
*/
public class TextureHelper {
private static final Maps maps [] = new Maps[]{Maps.MAP1, Maps.MAP5, Maps.MAP3, Maps.MAP4, Maps.MAP2,Maps.MAP6, Maps.MAP7, Maps.MAP8, Maps.MAP9, Maps.MAP10, Maps.MAP11, Maps.MAP12, Maps.MAP13, Maps.MAP14};
private static final Maps maps [] = Maps.values();
public static final Point FLAG_BLACK_DOT_RELATIVE_POSITION = new Point(0.295f,0.129f);
public static final Point FINISH_FLAG_SIZE = new Point(75, 60);
......
......@@ -23,6 +23,7 @@ public class VehicleDragListener extends DragActorListener implements Music.OnCo
private Point roadMapSize;
private Actor goalActor;
private OnVehicleDragCompleteListener onVehicleDragCompleteListener;
private final float moveTolerance;
private Music[] sounds;
......@@ -38,6 +39,8 @@ public class VehicleDragListener extends DragActorListener implements Music.OnCo
this.goalActor = goalActor;
this.onVehicleDragCompleteListener = onVehicleDragCompleteListener;
touchedPointsCache = new Point[POINTS_CACHE_SIZE];
// vehicle move tolerance is two times size of bigger side of vehicle (width / height of actor)
moveTolerance = 2 * Math.max(actor.getWidth(), actor.getHeight());
}
@Override
......@@ -64,6 +67,14 @@ public class VehicleDragListener extends DragActorListener implements Music.OnCo
if (currentTouchPointCacheElementPointer == POINTS_CACHE_SIZE - 1) {
actor.setRotation((float) ArithmeticsHelper.getAngleBetweenTwoPoints(touchedPointsCache[0], touchedPointsCache[touchedPointsCache.length - 1]));
}
double distance = Math.hypot(touchPoint.x - actor.getX(), touchPoint.y - actor.getY());
// finger or cursor is too far from vehicle to move it
if (distance > moveTolerance) {
return;
}
super.touchDragged(event, x, y, pointer);
if (((Vehicle) actor).intersectsWith(goalActor)) {
onVehicleDragCompleteListener.onVehicleDragComplete();
......
......@@ -19,6 +19,7 @@ import cz.nic.tablexia.TablexiaSettings;
import cz.nic.tablexia.game.games.pursuit.action.MovePieceToPosition;
import cz.nic.tablexia.game.games.pursuit.action.SwitchPiecesAction;
import cz.nic.tablexia.util.Log;
import cz.nic.tablexia.util.Point;
/**
* Created by Václav Tarantík on 17.6.15.
......@@ -30,7 +31,7 @@ public class Grid extends Group {
private TextureRegion textureRegion;
private Random random;
public Grid(float x, float y, float size, int numberOfColumns, TextureRegion textureRegion,Random random) {
public Grid(float x, float y, float size, int numberOfColumns, TextureRegion textureRegion, Random random) {
super();
setPosition(x, y);
setSize(size, size);
......@@ -67,7 +68,7 @@ public class Grid extends Group {
puzzlePiece.setActualPosition(i);
i++;
cz.nic.tablexia.util.Point pieceInitialPosition = getPieceGridPositionInPixels(i);
Point pieceInitialPosition = getPieceGridPositionInPixels(i);
puzzlePiece.setPosition(pieceInitialPosition.x, pieceInitialPosition.y);
piecesMap.put(piecesMap.size(), puzzlePiece);
......@@ -77,10 +78,10 @@ public class Grid extends Group {
shufflePieces(random);
}
public void scaleGrid(){
public void scaleGrid() {
float pieceSize = getWidth() / (float) numberOfColumns;
for(PuzzlePiece piece : piecesMap.values()){
piece.setSize(pieceSize,pieceSize);
for (PuzzlePiece piece : piecesMap.values()) {
piece.setSize(pieceSize, pieceSize);
piece.setOrigin(pieceSize / 2, pieceSize / 2);
}
placePiecesInGrid();
......@@ -134,26 +135,26 @@ public class Grid extends Group {
}
}
public void unscaleAllPieces(){
public void unscaleAllPieces() {
for (PuzzlePiece piece : piecesMap.values()) {
piece.setZIndex(1);
piece.setScale(1f);
}
}
public boolean switchPieces(PuzzlePiece draggedPiece, PuzzlePiece overlappedPiece,Action moveAction) {
public boolean switchPieces(PuzzlePiece draggedPiece, PuzzlePiece overlappedPiece, Action moveAction) {
if (draggedPiece != null) {
int draggedPieceActualPosition = draggedPiece.getActualPosition();
cz.nic.tablexia.util.Point draggedPiecePositionInPixels = getPieceGridPositionInPixels(draggedPieceActualPosition);
Point draggedPiecePositionInPixels = getPieceGridPositionInPixels(draggedPieceActualPosition);
//Piece was released above the empty area
if (overlappedPiece == null) {
addAction(new MovePieceToPosition(draggedPiece,draggedPiecePositionInPixels,moveAction));
addAction(new MovePieceToPosition(draggedPiece, draggedPiecePositionInPixels, moveAction));
} else {
int overlappedPieceActualPosition = overlappedPiece.getActualPosition();
cz.nic.tablexia.util.Point overlappedPiecePositionInPixels = getPieceGridPositionInPixels(overlappedPieceActualPosition);
addAction(new SwitchPiecesAction(draggedPiece,draggedPiecePositionInPixels,overlappedPiece,overlappedPiecePositionInPixels,moveAction));
Point overlappedPiecePositionInPixels = getPieceGridPositionInPixels(overlappedPieceActualPosition);
addAction(new SwitchPiecesAction(draggedPiece, draggedPiecePositionInPixels, overlappedPiece, overlappedPiecePositionInPixels, moveAction));
Log.info(getClass(),"SWITCH PIECES");
return true;
}
......@@ -162,33 +163,33 @@ public class Grid extends Group {
}
//returns the position of piece inside grid according to piece's actual position
public cz.nic.tablexia.util.Point getPieceGridPositionInPixels(int actualPositionInGrid){
public Point getPieceGridPositionInPixels(int actualPositionInGrid) {
float pieceSize = getWidth() / (float) numberOfColumns;
cz.nic.tablexia.util.Point pieceOrderNumbers = getPieceOrderNumbers(actualPositionInGrid);
Point pieceOrderNumbers = getPieceOrderNumbers(actualPositionInGrid);
return new cz.nic.tablexia.util.Point(pieceOrderNumbers.x * pieceSize, getHeight() - ((1 + pieceOrderNumbers.y) * pieceSize));
return new Point(pieceOrderNumbers.x * pieceSize, getHeight() - ((1 + pieceOrderNumbers.y) * pieceSize));
}
//Pieces are placed from upper left corner, method returns relative positions according to number of rows and columns
private cz.nic.tablexia.util.Point getPieceRelativePosition(int actualPositionInGrid){
cz.nic.tablexia.util.Point pieceOrderNumbers = getPieceOrderNumbers(actualPositionInGrid);
private Point getPieceRelativePosition(int actualPositionInGrid) {
Point pieceOrderNumbers = getPieceOrderNumbers(actualPositionInGrid);
float relativeXPosition = pieceOrderNumbers.x / (float) numberOfColumns;
float relativeYPosition = pieceOrderNumbers.y / (float) numberOfColumns;
return new cz.nic.tablexia.util.Point(relativeXPosition,relativeYPosition);
return new Point(relativeXPosition,relativeYPosition);
}
private cz.nic.tablexia.util.Point getPieceOrderNumbers(int actualPositionInGrid){
private Point getPieceOrderNumbers(int actualPositionInGrid) {
int xOrderCoord = (actualPositionInGrid % numberOfColumns);
int yOrderCoord = (actualPositionInGrid / numberOfColumns);
return new cz.nic.tablexia.util.Point(xOrderCoord,yOrderCoord);
return new Point(xOrderCoord,yOrderCoord);
}
private void placePiecesInGrid(){
for(PuzzlePiece piece: piecesMap.values()){
cz.nic.tablexia.util.Point piecePosition = getPieceGridPositionInPixels(piece.getActualPosition());
piece.setPosition(piecePosition.x,piecePosition.y);
private void placePiecesInGrid() {
for (PuzzlePiece piece: piecesMap.values()) {
Point piecePosition = getPieceGridPositionInPixels(piece.getActualPosition());
piece.setPosition(piecePosition.x, piecePosition.y);
}
}
......@@ -202,35 +203,35 @@ public class Grid extends Group {
//using random seed to shuffle sequence collection
Collections.shuffle(possibleCardPositions, random);
for(PuzzlePiece piece: piecesMap.values()){
for (PuzzlePiece piece: piecesMap.values()) {
piece.setActualPosition((Integer)possibleCardPositions.pop());
}
}
public boolean allPiecesInCorrectPositions(){
public boolean allPiecesInCorrectPositions() {
ArrayList<Integer> listToBeTransposed = new ArrayList<Integer>();
//fills the arraylist with values for default piece rotation (0)
for(PuzzlePiece piece: piecesMap.values()){
for (PuzzlePiece piece: piecesMap.values()) {
listToBeTransposed.add(piece.getCorrectPosition());
}
//direction according to the piece rotation: 0 - UP, 1 - RIGHT, 2 - DOWN, 3 - LEFT
float firstPieceRotation = ((PuzzlePiece)piecesMap.values().toArray()[0]).getRotation()%360;
float firstPieceRotation = ((PuzzlePiece)piecesMap.values().toArray()[0]).getRotation() % 360;
//recalculating piece rotation in positive range of values
if(firstPieceRotation<0){
firstPieceRotation = 360+firstPieceRotation;
if (firstPieceRotation < 0) {
firstPieceRotation = 360 + firstPieceRotation;
}
int firstPieceRotationDirection = (int)firstPieceRotation/90;
for (int i = 0;i<firstPieceRotationDirection;i++){
int firstPieceRotationDirection = (int)firstPieceRotation / 90;
for (int i = 0; i < firstPieceRotationDirection; i++) {
listToBeTransposed = transposeList(listToBeTransposed);
}
for(int i = 0; i<piecesMap.size();i++){
for (int i = 0; i < piecesMap.size(); i++) {
PuzzlePiece piece = (PuzzlePiece)piecesMap.values().toArray()[i];
float currentPieceRotation = piece.getRotation()%360;
float currentPieceRotation = piece.getRotation() % 360;
//recalculating piece rotation in positive range of values
if(currentPieceRotation<0){
currentPieceRotation = 360+currentPieceRotation;
if (currentPieceRotation < 0) {
currentPieceRotation = 360 + currentPieceRotation;
}
if(piece.getActualPosition()!=listToBeTransposed.get(i)||(currentPieceRotation!=firstPieceRotation)){
if (piece.getActualPosition() != listToBeTransposed.get(i) || (currentPieceRotation != firstPieceRotation)) {
return false;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment