Permalänk
Medlem

Totalt kört fast i JApplet

Hej!
Jag har i uppgift att göra ett program med en blå boll som jagar en röd boll. När den röda bollen kolliderar med den blåa bollen så ska den röda bollen flytta på sig enligt:

double dx = targetx - bilx; double dy = targety -bily; double distSqr = dx*dx+ dy*dy; if (distSqr < (RADIE+RADIE)*(RADIE+RADIE)) { targetx= RADIE+(400-2*RADIE)*Math.random(); targety= RADIE+(400-2*RADIE)*Math.random(); points++; }

Det vill säga att jag räknar ut en hypotenusa för avståndet mellan klot ett och två, där spelarens klot representeras av bilx och bily vilka är spelarens klots x och y-kordinater. När hypotunesan är mindre än 2*radien i kvadrat så kommer avståndet mellan kloten att vara noll. Därefter beräknas en ny punkt och ett poäng tilldelas variabeln points Såhär långt har jag väl förstått det rätt?

Nu ska jag göra ett växande klot. Jag har därför skapat två variabler, hinderradie som kommer att öka med 0.5 för varje varv och nega som lägger på hinderradien men samtidigt minskar den med 0.1 i varje varv, nega har för övrigt startvärdet 200. Dessa variabel använder jag för att rita ett svart växande hinder enligt:
g.fillOval((int)nega, (int)nega, (int)hinderradie, (int)hinderradie);
(variablerna ligger för övrigt i metoden run inuti en whilesats som kommer uppdateras tills det att jag får gameover)

Nu ska jag göra en kollitionsdetektering för för när jag krockar med det svarta hindret. Detta har jag gjort såhär:

ex = (nega+hinderradie) - bilx; ey = (nega+hinderradie) - bily; distSqr2 = ex*ex + ey*ey; if (distSqr2 <= (hinderradie+RADIE)*(hinderradie+RADIE)) { gameover = true; }

Det som händer när jag kör detta är att det går att köra på klotet från vänster håll och uppifrån och neråt. Detta leder till att vilkoret gameover blir sant och spelet slutar att reagera på knapptryckningar då dessa är deklarerade som while(gameover!). Dessutom ligger tråden inom detta så spelet slutar helt. Men när jag kör in i hindret från höger eller nerifrån fryser det sig en hinderradie innan klotet. Jag måste såledels förskjuta reaktionen en hinderradie åt vänster eller en hinderradie uppåt. Är detta en korrekt slutsats och skulle någon kunna tänka sig att ge tips eller lite av en vägledning till hur man gör detta?

Nedan bifogas källkoden till hela spelet. Observera att jag endast är i behov av en förklaring till hur jag ska deklarera variablerna för att lösa detta. En direkt lösning känns som fusk men jag hade velat ha en "vägbeskrivning" till hur jag löser problemet. För just nu har jag provat allt från att skifta tecken till att lägga till mer saker i uträkningarna men det känns mest som att jag famlar i mörkret.

import java.applet.*; import java.awt.*; import java.awt.event.*; public class KeyApp7 extends Applet implements Runnable, KeyListener{ double nega = 200; int RADIE = 20, points; double bilx = 200, bily = 100, vx = 0, vy = 0, ey = 0, ex = 0, targetx = 300, targety = 100, hinderradie=0, distSqr2 = 0; boolean leftDown = false, rightDown = false, rightUp = false, leftUp = false, downDown = false, upUp = false, upDown = false, downUp = false,gameover = false; public void init() { addKeyListener ( this); requestFocus(); } public void paint ( Graphics g) { g.setColor(Color.blue); g.fillOval( (int)(bilx-RADIE), (int)(bily-RADIE), 2*RADIE, 2*RADIE); g.setColor(Color.red); g.fillOval((int)targetx, (int)targety, RADIE, 15); g.setColor(Color.black); g.fillOval((int)nega, (int)nega, (int)hinderradie, (int)hinderradie); showStatus(points + " träffar"); } public void start() { Thread ny = new Thread ( this); ny.start(); } public void run(){ while ( !gameover) { nega = nega - 0.05; hinderradie = hinderradie+0.1; if ( leftDown) vx= vx- 0.05; if ( rightDown) vx = vx + 0.05; if (downDown) vy = vy + 0.5; if (upUp) vy = vy - 0.5; bilx = bilx + vx; bily = bily + vy; double dx = targetx - bilx; double dy = targety -bily; double distSqr = dx*dx+ dy*dy; if (distSqr < (RADIE+RADIE)*(RADIE+RADIE)) { targetx= RADIE+(400-2*RADIE)*Math.random(); targety= RADIE+(400-2*RADIE)*Math.random(); points = points + 1; } ex = (nega + hinderradie) - bilx; ey = (nega + hinderradie) - bily; distSqr2 = ex*ex + ey*ey; if (distSqr2 < (hinderradie+RADIE)*(hinderradie+RADIE)) { gameover = true; } Dimension appletsize = getSize(); int WIDTH = appletsize.width; int HEIGHT = appletsize.height; if (bilx+RADIE > WIDTH || bilx-RADIE <0) vx = 0; if (bily+RADIE > HEIGHT|| bily-RADIE <0) vy = 0; if (bilx+RADIE < WIDTH-WIDTH || bilx-RADIE <0) vx = 0; if (bily+RADIE < HEIGHT-HEIGHT || bily-RADIE <0) vy = 0; repaint(); try { Thread.sleep(10);} catch( InterruptedException ie) {} } } public void keyPressed ( KeyEvent ke) { if( ke.getKeyCode() == KeyEvent.VK_LEFT) leftDown = true; if( ke.getKeyCode () == KeyEvent.VK_RIGHT) rightDown = true; if (ke.getKeyCode() == KeyEvent.VK_DOWN) downDown = true; if (ke.getKeyCode() == KeyEvent.VK_UP) upUp = true; } public void keyReleased ( KeyEvent ke) { if( ke.getKeyCode() == KeyEvent.VK_LEFT) leftDown = false; if( ke.getKeyCode () == KeyEvent.VK_RIGHT) rightDown = false; if( ke.getKeyCode() == KeyEvent.VK_DOWN) downDown = false; if( ke.getKeyCode () == KeyEvent.VK_UP) upUp = false; } public void keyTyped ( KeyEvent ke) {} }