Gå til innhold

Anbefalte innlegg

Kan noen vær så snill å skrive om koden slik at ballen spretter tilbake når det treffer det hvite rektangelet?

 

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

public class dag extends Applet implements Runnable
{

Thread ball;

Graphics bufferGraphics;
Image offscreen;

   String status="";

   int x=150;
   int y=150;
   int x_speed=3;
   int y_speed=3;
   int bar=200;
public void start()
{
 ball=new Thread(this);
 ball.start();
setBackground(Color.black);

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

public void paint(Graphics g)
{
bufferGraphics.clearRect(0,0,700,400);


   bufferGraphics.setColor(Color.white);


   bufferGraphics.fillRect(1,bar,10,50);

   bufferGraphics.drawString(" "+status+" ",200,200);

   bufferGraphics.fillOval(x,y,50,50);
   bufferGraphics.setColor(Color.yellow);
   bufferGraphics.fillRect(1,1,700,10);
   bufferGraphics.fillRect(1,390,700,10);



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

   }

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





public boolean keyDown(Event e,int key)
{






 if(key==Event.DOWN)
 {
   bar=bar+30;
 }

 else if(key==Event.UP)
 {
bar=bar-30;
 }


 else
 {
 }

return true;
}


public void dag()
{

status="Game Over";
repaint();
ball.stop();
}

   public void run()
   {
while(true)
{
 try{
 Thread.sleep(5);
 x=x+x_speed;
 y=y+y_speed;

 if(x+50>700)
 {
 	x_speed=-3;
 }



       if(x<0)
       {
 	dag();
 }

       if(y>350-10)
       {
 	y_speed=-3;
 }

       if(y<0+10)
         {
   	y_speed=+3;
 }



 repaint();

    }
 catch(InterruptedException e){}
   }

}

}

Lenke til kommentar
Videoannonse
Annonse
Kan noen vær så snill å skrive om koden slik at ballen spretter tilbake når det treffer det hvite rektangelet?

Du liker å lage spill...

 

Hvis du ser hvordan du stoppet den ene firkanten i forrige spill, så skulle du forholdsvis enkelt kode om den slik at du kan bruke den her. Men i stedet for å stoppe, så snur du bare retningen...

Lenke til kommentar

kall på denne metoden i din run metode under de andre testene..det finnes

bedre måter å gjøre det på men det blir mer avansert. Du kunne jo f.eks lage noen

klasser som representerer firkantobjektene i spillet ditt.

 

private void sjekkhvitfirkantkrasj() {

       Rectangle ball = new Rectangle(x,y,50,50);
Rectangle hvitfirkant = new Rectangle(1,bar,10,50);

if( ball.intersects(hvitfirkant) ){
 //snu x-retning
 	x_speed *= -1;
 
}

}

Lenke til kommentar

Her er appleten. Men det er et problem jeg ikke greier å løse. Når jeg trykker på "new game" så flytter ikke ballen på seg. Noen som skjønner hvorfor?

 

Koden:

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


public class dag extends Applet implements Runnable,ActionListener
{

Thread game;
Graphics m1;
Image offscreen;

int x_pos=199;
int y_pos=180;

int x_speed=1;
int y_speed=-1;

int playerbar=-100;

int score=0;

String status="";
String player_name="";

Panel panel;

Button newgame;

Button startknapp;
TextField felt;
Label skriv_navn;

public void paint(Graphics g)
{
       m1.clearRect(0,0,400,350);
       m1.setColor(Color.yellow);

       // ramme
       m1.fillRect(10,10,380,2);
       m1.fillRect(10,340,382,2);
       m1.fillRect(200,10,2,330);

       m1.fillRect(10,10,2,330);
       m1.fillRect(390,10,2,330);

       // ballen
       m1.setColor(Color.white);
       m1.fillRect(x_pos,y_pos,5,5);

       // playerbar
       m1.fillRect(370,playerbar,2,50);

       // status
       m1.drawString(" "+status+" ",70,70);

       // playername & score
       m1.setColor(Color.yellow);
       m1.drawString(" "+felt.getText()+"    |     score:  "+score+" ",215,25);



       repaint();

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

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

public boolean mouseMove(Event e,int x,int y)
{
playerbar=y;
return true;
}

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==startknapp)
{
 panel.setVisible(false);
 game.start();
}

if(e.getSource()==newgame)
{
 newgame.hide();
 status="";
 x_pos=200;
 y_pos=200;

       x_speed=1;
       y_speed=-1;

 game.start();
}

}



public void init()
{
setLayout(null);

game=new Thread(this);

setBackground(Color.black);
offscreen=createImage(400,350);
m1=offscreen.getGraphics();

// GUI
panel=new Panel();
panel.setLayout(new FlowLayout());
panel.setBounds(100,80,200,70);
panel.setBackground(Color.white);

   newgame=new Button("New game");
   newgame.setBounds(70,90,80,25);
   newgame.hide();
   newgame.addActionListener(this);
   add(newgame);

   felt=new TextField(10);

startknapp=new Button("Start game");
startknapp.addActionListener(this);

skriv_navn=new Label("Enter your name:");

   panel.add(skriv_navn);
panel.add(felt);
panel.add(startknapp);


   panel.setVisible(true);
   add(panel);

}

public void run()
{
while(true)
{
 try
 {
 	Thread.sleep(1);
 	flyttball();
 	krasj();
 }
 catch(InterruptedException e){}

}
}

private void flyttball()
{

if(x_pos>384)
{
       newgame.show();
 status="GAME OVER";
 game.stop();
 repaint();
}



   if(y_pos==10)
   {
 y_speed=y_speed+1;
}

   if(x_pos==13)
   {
 x_speed=x_speed+1;

   }

if(y_pos>333)
{
 y_speed=y_speed-1;
}






   x_pos=x_pos+x_speed;
y_pos=y_pos+y_speed;
repaint();
}

private void krasj()
{
Rectangle ball=new Rectangle(x_pos,y_pos,5,5);
Rectangle player_bar=new Rectangle(370,playerbar,2,50);

if(ball.intersects(player_bar))
{
    x_speed=x_speed*-1;
    score++;
}

}

}

Lenke til kommentar

Fordi du bruker game.stop() også game.start() igjen for å starte tråden..dette er usikkert og du får en exception når du prøver å starte tråden igjen.

 

Istedenfor å stoppe og starte tråden som et middel for å stoppe spillet bør du opprette en boolean variabel f.eks boolean spill og lar denne variabelen bestemme om tråden skal gjøre spill-relaterte oppgaver eller ikke...(kalle på krasj() og flyttball() metodene.

 

Tråden vil da sjekke om spill variabelen er true og hvis den er true så skal den kalle på

krasj() og flyttball(), altså spillet er igang, men hvis spill variabelen er false hopper den bare over..altså skjer ingenting.

 

Så du må sette spill = true; når start knappen og new game knappen blir trykket inn..og spill = false; istedenfor game.stop()

 

public void run()
{
while(true)
{
try
{
 Thread.sleep(1);
   
    //spillet er igang så gjør beregningene..
    if(spill){
         flyttball();
         krasj();
    }
}
catch(InterruptedException e){}

}
}

 

Slik kan du bruke samme tråden hele tiden, men du lar tråden sjekke hvilke variabler som gjelder, og da kan du gjøre forskjellige ting ettersom hvilken "mode" spillet er i..du kan f.eks lage en intro mode eller meny mode eller pause mode ved å bare sjekke hvilke variabler som er satt. Hvis du har en INTRO variabel som er true f.eks kan du tegne opp ting som ikke blir tegnet opp i selve spillet..osv osv..

Lenke til kommentar

Å stoppe en tråd med stop() er regnet for å være farlig siden tråden kan ha vert midt i en metode og forlatt et objekt i ulovlig tilstand, hvis man f.eks dreper tråden midt i en tegneoperasjon kan man sette et eller annet objekt i Java2D rammeverket i en ulovlig tilstand og krasje hele JVM'et.

 

Bruk, som zulo sier, variabler til å bestemme tilstander og la tråden kjøre ferdig i stedet for å drepe den når du vil stoppe. stop(), suspend() og resume() er ikke trygge.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...