2016-06-13 17 views
1

私はブレークアウトゲームに取り組んでいます。私はレンガの衝突を除いてほとんどすべてを行っている。今のところ、ボールがレンガに当たると、レンガは跳ね返りますが、レンガは消えません。もし誰かが私を助けることができれば、それは素晴らしいだろう。Javaのブレークアウトのレンガ衝突

メインクラス:

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); 

} 

}

レンガクラス:

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

}}

ボールクラス:

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

}

ありがとうございました。

+0

問題を解決するには、もはや気にすることはできませんでしたが、[コードブロックのぶら下がった括弧の検出/修正](http://meta.stackexchange.com/q/251795/155831)を参照してください。 –

+0

1)なぜアプレットをコーディングするのですか?教師がそれを指定している場合は、[CS教師が** Javaアプレットを教えるのを止めるべき理由](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-java-applets /)を使用します。 2)[Java Plugin support deprecated](http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/)および[Plugin-Free Webへの移動]を参照してください( https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free)。 .. –

+0

.. 3)なぜAWTを使用するのですか? Swingに賛成するコンポーネントを使用してAWTを放棄する理由は、[この回答](http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978)を参照してください。 –

答えて

0

衝突が検出された場合、Ballクラスの衝突機能で何も起こりそうにありません。

ba.setXVel(6); 

後あなたはレンガがもはや描くないようにするいくつかのコードを持っている必要があります。クラス定義でレンガにvisibility属性を与えてみてください。

ba.setXVel(6); 

private Boolean visible; 

とき衝突関数の挿入

setVisible(false); 

あなたはセッターとゲッターを書く必要がありますvisible属性の場合次に、paint関数で、visibleがtrueの場合にのみペイントするように設定します。

複数のBrick2インスタンスが必要です。各Brick2インスタンスは、1つの個々のレンガを表します。それらをListのようなコレクションに入れ、それらを描いて描きます。リストを作成する

一つの方法は、次のようになります。

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

しかし、あなたは、各レンガの位置を設定する方法を持っている必要があります。おそらく、レンガの数(i)に基づいて、レンガのコンストラクタを使用して、作成された順序に基づいてその位置を導出します。

+0

これはやっているものであります。public voidペイント(グラフィックスG){ため (INT X = 0であり、x <= 800; X + = 55)についての{ (INT Y = 0; Y <= 100; Y + = 25) { 場合(可視){ g.setColor(Color.RED)。 g.fillRect(x、y、50,20); } } } }ボールが1つのブリックに当ると、すべてのレンガが消える – matt

+0

複数のBrick2インスタンスが必要です。各Brick2インスタンスは、1つの個々のレンガを表します。それらをListのようなコレクションに入れ、それらを描いて描きます。 –

+0

レンガをリストに入れるにはどうすればいいですか? – matt