Forum: Kört fast totalt, java-applet

Forum huvudsida -> Programmering -> Kört fast totalt, java-applet

Sidor: 1

Till botten

eradico 17:28 - 10:e Oktober 2010 | Post #1
Medlem
Inlägg: 1


Skicka PM

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:

  1. 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?
  2.  
  3. Nu ska jag göra ett växande klot. Jag har därför skapat två variabel, 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. Dessa variabel använder jag för att rita ett svart växande hinder enligt:
  4. g.fillOval((int)nega, (int)nega, (int)hinderradie, (int)hinderradie);
  5.  
  6. 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:
  7. [SOURCE=java]
  8. ex = (nega+hinderradie) - bilx;
  9. ey = (nega+hinderradie) - bily;
  10.  
  11. distSqr2 = ex*ex + ey*ey;
  12.  
  13. if (distSqr2 <= (hinderradie+RADIE)*(hinderradie+RADIE))
  14. {
  15. gameover = true;
  16.  
  17. }

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 har jag bifogat hela koden till spelet:
[SOURCE=]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) {}

}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) {}

}[/SOURCE]






Sidor: 1

Forum huvudsida -> Programmering -> Kört fast totalt, java-applet
Atom feed

Du får inte posta i den här tråden | Till toppen