Gå til innhold

Et lite spørsmål om et javaspill


Anbefalte innlegg

Her er spillet:

import java.awt.*;
import java.applet.*;

public class dag extends Applet implements Runnable
{

Thread th;

int x_pos = 10;
int y_pos = 100;



int speed=2;
int y_speed=0;


int a=300;
int b=250;
int c=50;
int d=50;

Image offscreen;
Graphics bufferGraphics;



public void init()
{
setBackground(Color.black);

offscreen=createImage(700,400);
bufferGraphics=offscreen.getGraphics();
}

public void start()
{
th=new Thread(this);
th.start();
}

public void stop() { }

public void destroy() { }


public boolean keyDown(Event e,int key)
{

if(key==Event.LEFT)
{
speed=-2;
y_speed=0;


 }

else if(key==Event.RIGHT)
{
speed=+2;
y_speed=0;




 }

else if(key==Event.DOWN)
{
y_speed=+2;
speed=0;


}

else if(key==Event.UP)
{
y_speed=-2;
speed=0;


}



else
{
}

return true;
}





public void run ()
{

while(true)
{


x_pos=x_pos+speed;
y_pos=y_pos+y_speed;







repaint();



try{
Thread.sleep(5);
}
catch(InterruptedException ex){}
}
}

public void paint (Graphics g)
{

bufferGraphics.clearRect(0,0,700,400);

bufferGraphics.setColor(Color.red);
bufferGraphics.fillRect(a,b,c,d);
bufferGraphics.setColor(Color.yellow);
bufferGraphics.fillRect(x_pos-20,y_pos-20,20,20);
g.drawImage(offscreen,0,0,this);
}

public void update(Graphics g)
{
paint(g);
}


}

 

Spørsmålet mitt er hvordan kan jeg få til sånn at den gule firkanten stopper når den "rører" borti den røde firkanten.

Endret av willbend
Lenke til kommentar
Videoannonse
Annonse
Det funker ikke :yes:

Hva ved det fungerer ikke?

 

Hvis du bare har prøvd å skrive inn koden slik han postet den, så vil den ikke fungere siden det ikke er en "intersects" metode ferdig i java (så vidt jeg vet).

Men du burde kunne utlede et par muligheter for hvordan du kan løse problemet ut ifra den kodesnutten.

 

Hvis det er dette du har forsøkt, så er det bedre om du poster den koden slik at vi kan komme med forslag til endringer, enn at vi skal gi deg ferdig kode.

Lenke til kommentar
Hvis du bare har prøvd å skrive inn koden slik han postet den, så vil den ikke fungere siden det ikke er en "intersects" metode ferdig i java (så vidt jeg vet).

Joda,

 

boolean java.awt.Rectangle.insersects(Rectangle r)

 

Staar klart definert i javadocs.

 

Koden maa selvfoelgelig (som Mr.Garibaldi sier) puttes inn hvor det passes, som f.eks.:

 

public void run ()
{

while(true)
{
Rectangle r1 = new Rectangle(a,b,c,d);
Rectangle r2 = new Rectangle(x_pos-20,y_pos-20,20,20);

if(r1.intersects(r2)) {
   speed = 0;
    y_speed = 0;
}

[...din kode...]

 

Naa kan det vaere at koden trenger litt "tweaking" (kan ogsaa hende at jeg har glemt noe helt vesentlig), men du burde komme litt paa vei. Og ja, foelg Mr.Garibaldi's raad. "Det funker ikke" er ikke nok.

Lenke til kommentar
Hvis du bare har prøvd å skrive inn koden slik han postet den, så vil den ikke fungere siden det ikke er en "intersects" metode ferdig i java (så vidt jeg vet).

Joda,

 

boolean java.awt.Rectangle.insersects(Rectangle r)

 

Staar klart definert i javadocs.

Kult, da har jeg lært noe nytt idag også, takker :)

 

Jeg sjekket apien, men tydeligvis ikke godt nok....

Lenke til kommentar

Har ikke så my peiling på java

 

Var det sånn her dere mente?:

import java.awt.*;
import java.applet.*;


public class dag extends Applet implements Runnable
{

Thread th;

int x_pos = 10;
int y_pos = 100;



boolean java.awt.Rectangle.insersects(Rectangle r)




int speed=2;
int y_speed=0;



int a=300;
int b=250;
int c=50;
int d=50;

Image offscreen;
Graphics bufferGraphics;


Rectangle r2 = new Rectangle(x_pos-20,y_pos-20,20,20);
Rectangle r1 = new Rectangle(a,b,c,d);


public void init()
{


offscreen=createImage(700,400);
bufferGraphics=offscreen.getGraphics();

}

public void start()
{
th=new Thread(this);
th.start();
}

public void stop() { }

public void destroy() { }


public boolean keyDown(Event e,int key)
{

if(key==Event.LEFT)
{
speed=-2;
y_speed=0;


}

else if(key==Event.RIGHT)
{
speed=+2;
y_speed=0;




}

else if(key==Event.DOWN)
{
y_speed=+2;
speed=0;


}

else if(key==Event.UP)
{
y_speed=-2;
speed=0;


}



else
{
}



return true;
}





public void run ()
{

while(true)
{



if(r1.intersects(r2)) {
  speed = 0;
   y_speed = 0;
}



x_pos=x_pos+speed;
y_pos=y_pos+y_speed;







repaint();



try{
Thread.sleep(5);
}
catch(InterruptedException ex){}
}
}

public void paint (Graphics g)
{

bufferGraphics.clearRect(0,0,700,400);


bufferGraphics.fillRect(x_pos,y_pos,20,20);
bufferGraphics.setColor(Color.red);
bufferGraphics.fillRect(a,b,c,d);
bufferGraphics.setColor(Color.yellow);

g.drawImage(offscreen,0,0,this);
}

public void update(Graphics g)
{
paint(g);
}


}

Lenke til kommentar

Naar definerer r1 og r2 (som du nettopp har gjort) som klasse-variabler, saa vil variabel r1 og r2 ha en og samme verdi hele tiden, med mindre du endrer dem underveis. Siden den roede rektangelen aldri forandrer seg, saa kan r1 instansieres i klassevariabel definisjonene. r2 derimot (den gule klossen) forandrer verdi hele tiden. Altsaa boer du enten instansiere r2 ny for hver gang den brukes, eller du maa endre verdiene i r2

 

Altsaa, fjern r2 som klassevariabel, og sett foelgende inn i public void run() under while-loekka:

while(true) {
Rectangle r2 = new Rectangle(x_pos-20,y_pos-20,20,20);
[...din kode...]

 

eller la r2 bli hvor den er og gjoer foelgendes

while(true) {
   r2.x = x_pos-20;
   r2.y = y_pos-20;
[...din kode...]

 

Edit: Malplasserte CODE-tag

Endret av Patton
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...