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:
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;
}
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;
}
}
}
}
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:
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);
}
}