Användarprofil

Uppgifter
Användarnamn
Email
Besök -
Hemsida Ingen
Plats (stad)
Senaste besök 01:00 - 1:a Januari 1970
Poster i forumet
Varningar
Grupp
Medlem sedan 01:00 - 1:a Januari 1970
Artiklar och filer
Den här användaren har inga artiklar eller filer

Avatar


Presentation av

Den här användaren har inte skapat någon personlig presentation.

Senaste inläggen i forumet

Kört fast totalt, java-applet

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]



Postad 17:28 - 10:e Oktober 2010

Skicka meddelande
Läs s blog