2016-06-13 17 views
1

Ich arbeite an einem Breakout-Spiel. Ich habe fast alles außer der Kollision für die Ziegel getan. Wenn der Ball den Stein trifft, springt der Stein zurück, aber der Stein verschwindet nicht. Wenn mir jemand helfen könnte, wäre das großartig.Brick Kollision für Breakout in Java

Hauptklasse:

public class Breakout extends Applet implements Runnable{ 
Thread thread = new Thread(this); 
boolean running = true; 
Brick2 b; 
Paddle p; 
Ball ba; 
Image dbImage; 
Graphics dbg; 
public void init(){ 
    setSize(800,600); 
    b = new Brick2(); 
    p = new Paddle(this); 
    ba = new Ball(this); 
} 
public void start(){ 
    thread.start(); 
} 
public void destroy(){ 
    running = false; 
} 
public void stop(){ 
    running = false; 
} 
public void run(){ 
    while(running){ 
     b.update(ba); 
     p.update(this); 
     ba.update(this,p); 
     repaint(); 
     try{ 
      thread.sleep(20); 
     } 
     catch (InterruptedException e){ 
      System.out.println("AN ERROR HAS OCCURED"); 
     } 
    } 
} 
public void update(Graphics g){ 
    dbImage = createImage(getWidth(),getHeight()); 
    dbg = dbImage.getGraphics(); 
    paint(dbg); 
    g.drawImage(dbImage,0,0,this); 
} 
public void paint(Graphics g){ 
    g.fillRect(0,0,800,600); 
    b.paint(g); 
    p.paint(g,this); 
    ba.paint(g,this); 

} 

}

Brick Klasse:

public class Brick2{ 
private int x; 
private int y; 

public Brick2(){ 

} 
public void update(Ball ba){ 
    collision(ba); 
} 
public void collision(Ball ba){ 
    int bX = ba.getX(); 
    int bY = ba.getY(); 
    int bHeight = ba.getImageHeight(); 
    int bWidth = ba.getImageWidth(); 
    for(int x=0; x <= 800; x+=55){ 
     for (int y=0; y<= 100; y+=25){ 
      if (bX-bWidth<=x && bX+bWidth>=x && bY-bHeight<=y && bY+bHeight>=y){ 
       ba.setXVel(6); 

      } 
     } 
    } 
    } 
    public int getX(){ 
    return x; 
} 
public int getY(){ 
    return y; 
} 
public void paint(Graphics g){ 
    for(int x=0; x <= 800; x+=55){ 
     for (int y=0; y<= 100; y+=25){ 
      g.setColor(Color.RED); 
      g.fillRect(x,y,50,20); 
     } 
    } 

} }

Kugel Klasse:

public class Ball { 
private int x=355 ; 
private int y=200; 
private int speed = 6; 
private int xVel = -speed; 
private int yVel = speed; 
private boolean gameOver = false; 
private Image ball; 
public Ball (Breakout bR){ 
    ball = bR.getImage(bR.getDocumentBase(),"ball.png"); 
    } 
public void update(Breakout bR, Paddle p){ 
    x += xVel; 
    y += yVel; 
    if (x < 0){ 
     xVel = speed; 
    } 
    else if (x > bR.getWidth()){ 
     xVel = -speed; 
    } 
    if(y > bR.getHeight()){ 
     gameOver = true; 
    } 
    else if (y < 0){ 
     yVel = speed; 
    } 

    collision(p); 
} 
public void collision(Paddle p){ 
    int pX = p.getX(); 
    int pY = p.getY(); 
    int pHeight = p.getImageHeight(); 
    int pWidth = p.getImageWidth(); 

    if (pX<=x && pX+pWidth>=x && pY-pHeight<=y && pY+pHeight>=y){ 
     yVel = -speed; 
    } 
} 
public int getX(){ 
    return x; 
} 
public int getY(){ 
    return y; 
} 
public int getImageWidth(){ 
    return ball.getWidth(null); 
} 
public int getImageHeight(){ 
    return ball.getHeight(null); 
} 
public void setXVel(int xv){ 
    yVel = xv; 
} 
public void paint (Graphics g, Breakout bR){ 
    g.drawImage(ball,x,y,bR); 
    if (gameOver){ 
     g.setColor(Color.WHITE); 
     g.drawString("Game Over", 100,300); 
    } 
} 

}

Vielen Dank für Ihre Hilfe.

+0

Siehe [Erkennung/Fix für die hängenden schließen Klammer eines Codeblocks] (http://meta.stackexchange.com/q/251795/155831) für ein Problem, das ich nicht mehr gestört werden könnte zu reparieren. –

+0

1) Warum ein Applet codieren? Wenn es aufgrund der Angabe des Lehrers geschieht, verweisen Sie bitte auf [Warum CS-Lehrer ** aufhören sollten ** Java-Applets zu unterrichten] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-Java-Applets /). 2) Siehe [Java Plugin-Unterstützung nicht mehr unterstützt] (http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) und [Wechsel zu einem Plugin-freien Web] (https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free). .. –

+0

.. 3) Warum AWT verwenden? Siehe [diese Antwort] (http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978) aus vielen guten Gründen, AWT mit Komponenten zugunsten von Swing zu verlassen. –

Antwort

0

In der Kollisionsfunktion der Klasse Ball scheint nichts zu passieren, wenn eine Kollision erkannt wird.

Nach

ba.setXVel(6); 

Sie benötigen einen Code haben die Ziegel nicht mehr malen zu machen. Versuchen Sie, die Ziegel ein Sichtbarkeitsattribut in der Klassendefinition geben:

private Boolean visible; 

Wenn in der Kollisionsfunktion nach

ba.setXVel(6); 

Insert

setVisible(false); 

Sie werden einen Setter und Getter schreiben müssen für das sichtbare Attribut. Stellen Sie dann in der Paint-Funktion nur das Malen ein, wenn sichtbar ist.

Sie benötigen mehr als eine Brick2-Instanz. Jede Brick2-Instanz repräsentiert einen einzelnen Baustein. Legen Sie sie in eine Sammlung wie Liste und durchlaufen Sie sie, um sie zu zeichnen.

Eine Möglichkeit, um die Liste zu erstellen wäre:

List<Brick2> bricks = new List<Brick2>; 
for (i = 0; i > num_bricks; i++) { 
    bricks.add(new Brick2()); 
} 

Aber Sie werden eine Möglichkeit haben müssen, um die Position jeden Ziegel zu setzen. Vielleicht basierend auf der Brick-Nummer (i) und dem Brick-Konstruktor, um seine Position basierend auf der Reihenfolge zu ermitteln, in der sie erstellt wurden.

+0

Dies ist, was ist: public void paint (Grafiken g) { für (int x = 0; x <= 800; x + = 55) { für (int y = 0; y <= 100; y + = 25) { wenn (sichtbar) { g.setColor (Color.RED); g.fillRect (x, y, 50,20); } } } } aber wenn der Ball einen Stein trifft, verschwinden alle Steine ​​ – matt

+0

Sie müssen mehr als eine Brick2-Instanz haben. Jede Brick2-Instanz repräsentiert einen einzelnen Baustein. Legen Sie sie in eine Sammlung wie Liste und durchlaufen Sie sie, um sie zu zeichnen. –

+0

Wie lege ich die Steine ​​in eine Liste? – matt