[JAVA] Simpel jävla kollision?
VARJE gång jag ska göra något spel i Java har jag problemet. Jag kan bara inte lösa kollisionen på ett snyggt sätt.
I mitt senaste projekt trodde jag att jag äntligen löst det men efter lite mer test så inser jag att jag inte kommit ett dugg närmre.
Problemet är inte att upptäcka kollisionerna (Jag låter spelaren extenda Rectangle och använder metoden intersects(object)) utan att göra så att man inte kan hamna i den. Jag vill dessutom att det ska funka för ALLA block jag sätter ut på spelplanen (Har en ArrayList med block) så när jag lägger till ett block i listan vill jag att det automatiskt ska funka utan att jag ska behöva lägga till förutsättningar.
Om vi tar kollisioner ovanifrån så ser mitt tänk ut såhär:
1. Skapa ett nytt block som har samma X-värde som spelaren men spelarens Y-värde + spelarens Y-hastighet.
2. Kolla om det nya blocket kolliderar med något block i ArrayListen blocks
3. Om 2 är true så får spelaren det undre blockets Y-värde MINUS dess höjd (Spelaren har samma höjd som blocken)
Så jag kollar liksom på nästa "frame" i alla riktningar och ser om det kommer ske någon kollision. Om det gör det så placerar jag ut spelaren precis ovanför/under/bredvid blocket.
Om vi tar rent kodmässigt så ser det ut såhär:
public void collision()
{
Block dB = new Block(this.x, this.y + addVelY, width, height); //Det nya blocket som kollar nedåt
Block uB = new Block(this.x, this.y - addVelY, width, height); //Det nya blocket som kollar uppåt
Block rB = new Block(this.x + addVelX, this.y, width, height); //Det nya blocket som kollar höger
Block lB = new Block(this.x - addVelX, this.y, width, height); //Det nya blocket som kollar vänster
for(int i = 0; i < Main.blocks.size(); i++)
{
if(dB.intersects((Block)Main.blocks.get(i)))
{
this.setLocation(x, (int)((Block)Main.blocks.get(i)).getY() - height);
velY = 0;
Main.setGravity(0);
}
if(uB.intersects((Block)Main.blocks.get(i)))
{
this.setLocation(x, (int)((Block)Main.blocks.get(i)).getY() + height);
}
if(lB.intersects((Block)Main.blocks.get(i)))
{
this.setLocation((int)((Block)Main.blocks.get(i)).getX() + width, y);
velX = 0;
}
if(rB.intersects((Block)Main.blocks.get(i)))
{
this.setLocation((int)((Block)Main.blocks.get(i)).getX() - width, y);
velX = 0;
}
}
}
gravity har jag för att velY alltid ska öka med gravity om den inte står ovanpå ett block.
addVel är hastigheten den har i respektive riktning
Det den här koden gör är:
1) Om du kommer ovanifrån så hamnar du precis under blocket du ska stå på
2) Om du kommer från sidan hamnar du precis under blocket du ska vara bredvid
3) Kommer du underifrån får du en stor hastighet till vänster?!
Om någon vet hur man löser det här (Du behöver inte veta hur man ska få min metod att funka, går lika bra att bara förklara hur jag borde göra istälet!) så kommer jag älska den personen för evigt. Har som sagt det här problemet VARJE gång jag ska göra något spel :/
| Sony A580 | Sigma 10-20/4-5.6 | Tamron 17-50/2.8 | Sigma 70/2.8 Macro | Konica Minolta 50/1.7 | Konicha Minolta 75-300/4.5-5.6 |