Salve!
I've recently been working on java game with my friend. Last few days we've spent trying to make a formula checking collisions. Prototype in java 2D worked well, but after porting it to our game we ended with hex-throwing simulator. We're unable to find a miastake. Mouse input is surely correct.
Code is:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package Objects.Ships;
import Objects.Entity; import Objects.Ships.Parts.Functionals.Functional; import Objects.Ships.Parts.Hex; import java.util.ArrayList;
public abstract class Ship extends Entity { public Ship(float x, float y, float scaleX, float scaleY, float rotate, int xHexes, int yHexes) { this.x = x; this.y = y; this.scaleX = scaleX; this.scaleY = scaleY; this.rotate = rotate; this.xHexes = xHexes; this.yHexes = yHexes; hex = new Hex[xHexes][yHexes]; setCenters(); } protected void setCenters() { float xHex = xHexes; float yHex = yHexes; centerX = scaleX*(float)Math.floor(yHex/2f)*2; centerY = scaleY*(float)Math.floor(xHex/2f)*4f/3f; } public Hex[][] hex; protected ArrayList<Functional> parts; public float speedX=0; public float speedY=0; public float centerX; public float centerY; public int xHexes; public int yHexes; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package Interface.GameInterface.DesignStudio;
import Core.Graphics.SL; import Core.Graphics.TL; import Core.Input.In; import Core.Switch; import Lib.Graphics.GCore; import Objects.Ships.Parts.StructuralHex; import Objects.Ships.PlayerShip; import Objects.Ships.Ship; import org.lwjgl.opengl.Display;
public class ModifyStructuralHex { public void add(Ship ship){ int x = In.mouse.x+(int)GCore.renderer.getCameraX()-Display.getWidth()/2; int y = In.mouse.y+(int)GCore.renderer.getCameraY()-Display.getHeight()/2; for(int xCount = 0; xCount<ship.xHexes; xCount++){ for (int yCount = 1; yCount<ship.yHexes; yCount++) { if(ship.hex[xCount][yCount].checkCollisions(x, y)) ship.hex[xCount][yCount] = new StructuralHex(ship, xCount, yCount, 10); Switch.blankHexCursor = false; } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package Objects.Ships.Parts;
import Core.Input.In; import Objects.Ships.PlayerShip; import Objects.Ships.Ship;
public abstract class Hex { protected int posX; protected int posY; protected Ship father; public Hex(Ship father, int posX, int posY) { this.father = father; this.posX = posX; this.posY = posY; } public abstract void update(); public boolean checkCollisions(int inputX, int inputY){ boolean collision = true; int sX = (int)(((posY * father.scaleY*2) * Math.cos(father.rotate))-((posX * father.scaleX*4f/3f) * Math.sin(father.rotate))); int sY = (int)(((posY * father.scaleY*2) * Math.sin(father.rotate))+((posX * father.scaleX*4f/3f) * Math.cos(father.rotate))); for (int i=0; i<3; i++) { int x1 = (int)(sX + father.scaleX * Math.cos(i * 2 * Math.PI / 6 + father.rotate)-father.centerX); int y1 = (int)(sY + father.scaleY * Math.sin(i * 2 * Math.PI / 6 + father.rotate)-father.centerY); int x2 = (int)(sX + father.scaleX * Math.cos((i+1) * 2 * Math.PI / 6 + father.rotate)-father.centerX); int y2 = (int)(sY + father.scaleY * Math.sin((i+1) * 2 * Math.PI / 6 + father.rotate)-father.centerY); int x3 = (int)(sX + father.scaleX * Math.cos((i+3) * 2 * Math.PI / 6 + father.rotate)-father.centerX); int y3 = (int)(sY + father.scaleY * Math.sin((i+3) * 2 * Math.PI / 6 + father.rotate)-father.centerY); int x4 = (int)(sX + father.scaleX * Math.cos((i+4) * 2 * Math.PI / 6 + father.rotate)-father.centerX); int y4 = (int)(sY + father.scaleY * Math.sin((i+4) * 2 * Math.PI / 6 + father.rotate)-father.centerY);
int calc1 = (x2-x1)*(inputY-y1)-(y2-y1)*(inputX-x1); int calc2 = (x4-x3)*(inputY-y3)-(y4-y3)*(inputX-x3); if (calc1*calc2<0) { collision=false; } } return collision; } } |
And there's how we're filling ship array with hexs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class ShipUtils {
public static void collisionCheckFill(Ship ship){ for(int xCount = 0; xCount<ship.xHexes; xCount++){ for (int yCount = 0; yCount<ship.yHexes; yCount++) { ship.hex[xCount][yCount] = new CollisionHex(ship, xCount, yCount); } }
ship.hex[11][7] = new StructuralHex(ship, 11, 7, 10); } } |