2016-11-17 12 views
0

**まだ適切な応答が得られていません** 私のプロジェクトの交差点の様子を理解する方法はよく分かりません。これまでのところ、私は上、下、左と右を決めましたが、そこからどこに行くのかは分かりません。Java用長方形の交差(フリーズタグ)

私の移動矩形が交差しているかどうかを確認するためにメインドライバが呼び出す必要があります。矩形が凍っている場合は、移動している矩形が固定解除され、色が変更されます。私はそれを解凍して色を変える方法を理解していますが、理由が何であれ、交差しているときに値を返すわけではなく、このコードが間違っていることを知っています。有用なヒントをいただければ幸いです。私が間違って投稿した場合、私はこのサイトを使用しています。ありがとう!

*CLASS CODE* 

import edu.princeton.cs.introcs.StdDraw; 
import java.util.Random; 
import java.awt.Color; 

public class MovingRectangle { 
Random rnd = new Random(); 
private int xCoord; 
private int yCoord; 
private int width; 
private int height; 
private int xVelocity; 
private int yVelocity; 
private Color color; 
private boolean frozen; 
private int canvas; 

public MovingRectangle(int x, int y, int w, int h, int xv, int yv, int canvasSize) { 
    canvas = canvasSize; 
    xCoord = x; 
    yCoord = y; 
    width = w; 
    height = h; 
    xVelocity = xv; 
    yVelocity = yv; 
    frozen = false; 
    int c = rnd.nextInt(5); 

    if (c == 0) { 
     color = StdDraw.MAGENTA; 
    } 
    if (c == 1) { 
     color = StdDraw.BLUE; 
    } 
    if (c == 2) { 
     color = StdDraw.CYAN; 
    } 
    if (c == 3) { 
     color = StdDraw.ORANGE; 
    } 
    if (c == 4) { 
     color = StdDraw.GREEN; 
    } 

} 

public void draw() { 
    StdDraw.setPenColor(color); 
    StdDraw.filledRectangle(xCoord, yCoord, width, height); 
} 

public void move() { 
    if (frozen == false) { 
     xCoord = xCoord + xVelocity; 
     yCoord = yCoord + yVelocity; 
    } 
    else { 
     xCoord +=0; 
     yCoord +=0; 
    } 
    if (xCoord >= canvas || xCoord < 0) { 
     xVelocity *= -1; 
     this.setRandomColor(); 
    } 

    if (yCoord >= canvas || yCoord < 0) { 
     yVelocity *= -1; 
     this.setRandomColor(); 
    } 


} 

public void setColor(Color c) { 
    StdDraw.setPenColor(color); 
} 

public void setRandomColor() { 
    int c = rnd.nextInt(5); 

    if (c == 0) { 
     color = StdDraw.MAGENTA; 
    } 
    if (c == 1) { 
     color = StdDraw.BLUE; 
    } 
    if (c == 2) { 
     color = StdDraw.CYAN; 
    } 
    if (c == 3) { 
     color = StdDraw.ORANGE; 
    } 
    if (c == 4) { 
     color = StdDraw.GREEN; 
    } 

} 

public boolean containsPoint(double x, double y) { 
    int bottom = yCoord - height/2; 
    int top = yCoord + height/2; 
    int left = xCoord - width/2; 
    int right = xCoord + width/2; 

    if (x > left && x < right && y > bottom && y < top) { 
     color = StdDraw.RED; 
     return true; 
    } else { 
     return false; 
    } 

} 

public boolean isFrozen() { 
    if (frozen) { 
     return true; 

    } else { 
     return false; 
    } 

} 

public void setFrozen(boolean val) { 
    frozen = val; 


} 

public boolean isIntersecting(MovingRectangle r) { 
int top = xCoord + height/2; 
int bottom = xCoord - height/2; 
int right = yCoord + width/2; 
int left = yCoord - width/2; 

int rTop = r.xCoord + r.height/2; 
int rBottom = r.xCoord - r.height/2; 
int rRight = r.yCoord + r.width/2; 
int rLeft = r.yCoord - r.width/2; 

    if(right <= rRight && right >= rLeft || bottom <= rBottom && bottom  
    >= rTop){ 

    return true; 

    } else { 
     return false; 
    } 

    } 

} 

ここでも私の主なドライバーは、私もここでも間違っているかもしれないからです。

import edu.princeton.cs.introcs.StdDraw; 
import java.util.Random; 

public class FreezeTagDriver { 
public static final int CANVAS_SIZE = 800; 

public static void main(String[] args) { 
    StdDraw.setCanvasSize(CANVAS_SIZE, CANVAS_SIZE); 
    StdDraw.setXscale(0, CANVAS_SIZE); 
    StdDraw.setYscale(0, CANVAS_SIZE); 

    Random rnd = new Random(); 
    MovingRectangle[] recs; 
    recs = new MovingRectangle[5]; 
    boolean frozen = false; 

    for (int i = 0; i < recs.length; i++) { 
     int xv = rnd.nextInt(4); 
     int yv = rnd.nextInt(4); 
     int x = rnd.nextInt(400); 
     int y = rnd.nextInt(400); 
     int h = rnd.nextInt(100) + 10; 
     int w = rnd.nextInt(100) + 10; 

     recs[i] = new MovingRectangle(x, y, w, h, xv, yv, CANVAS_SIZE); 
    } 
    while (true) { 
     StdDraw.clear(); 

     for (int i = 0; i < recs.length; i++) { 

      recs[i].draw(); 
      recs[i].move(); 

     } 

     if (StdDraw.mousePressed()) { 

      for (int i = 0; i < recs.length; i++) { 
       double x = StdDraw.mouseX(); 
       double y = StdDraw.mouseY(); 

       if (recs[i].containsPoint(x, y)) { 
        recs[i].setFrozen(true); 
       } 
      } 
     } 

     for (int i = 0; i < recs.length; i++) { 
//for 0 
     if(recs[0].isFrozen() && recs[0].isIntersecting(recs[1])){ 
      recs[0].setFrozen(false); 
       } 

     if(recs[0].isFrozen() && recs[0].isIntersecting(recs[2])){ 
      recs[0].setFrozen(false); 
       } 

     if(recs[0].isFrozen() && recs[0].isIntersecting(recs[3])){ 
      recs[0].setFrozen(false); 

       } 

//for 1  
     if(recs[1].isFrozen() && recs[1].isIntersecting(recs[2])){ 
      recs[1].setFrozen(false); 

       } 
     if(recs[1].isFrozen() && recs[1].isIntersecting(recs[3])){ 
      recs[1].setFrozen(false); 
       } 

     if(recs[1].isFrozen() && recs[1].isIntersecting(recs[4])){ 
      recs[1].setFrozen(false); 
       } 

//for 2 
     if(recs[2].isFrozen() && recs[2].isIntersecting(recs[0])){ 
      recs[2].setFrozen(false); 

       } 
     if(recs[2].isFrozen() && recs[2].isIntersecting(recs[1])){ 
      recs[2].setFrozen(false); 
       } 

     if(recs[2].isFrozen() && recs[2].isIntersecting(recs[3])){ 
      recs[2].setFrozen(false); 

       } 
     if(recs[2].isFrozen() && recs[2].isIntersecting(recs[4])){ 
      recs[2].setFrozen(false); 

       } 
//for 3     
     if(recs[3].isFrozen() && recs[3].isIntersecting(recs[0])){ 
      recs[3].setFrozen(false); 

       } 

     if(recs[3].isFrozen() && recs[3].isIntersecting(recs[1])){ 
      recs[3].setFrozen(false); 
       } 

     if(recs[3].isFrozen() && recs[3].isIntersecting(recs[2])){ 
      recs[3].setFrozen(false); 
       } 

     if(recs[3].isFrozen() && recs[3].isIntersecting(recs[4])){ 
      recs[3].setFrozen(false); 
       } 
//for 4   
     if(recs[4].isFrozen() && recs[4].isIntersecting(recs[0])){ 
      recs[4].setFrozen(false); 
       } 

     if(recs[4].isFrozen() && recs[4].isIntersecting(recs[1])){ 
      recs[4].setFrozen(false); 
       } 

     if(recs[4].isFrozen() && recs[4].isIntersecting(recs[3])){ 
       recs[4].setFrozen(false); 
       } 

     if(recs[4].isFrozen() && recs[4].isIntersecting(recs[2])) 
       recs[4].setFrozen(false); 
       } 










     if (recs[0].isFrozen() && recs[1].isFrozen() &&  
    recs[2].isFrozen() && recs[3].isFrozen() 
       && recs[4].isFrozen()) { 
      StdDraw.text(400, 400, "YOU WIN"); 

     } 
     StdDraw.show(20); 

    } 

} 

}

+0

ようこそを持っているとして、あなたは、単に、Javaのrectangleクラスを使用することができます複雑になる場合は!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、もう少し詳しくお聞かせください。 –

+0

ここを見てください - >(http://gamedev.stackexchange.com/questions/586/what-is-the-fastest-way-to-work-out-2d-bounding-box-intersection) – Hobbs2000

+1

以下の答えがあなたのコードをどこかに投稿して、もっと見たり、ダウンロードしたりすることができます。質問を更新したり、後でコードをアップロードすることに決めた場合は、あなたの更新に関する '@ username'というコメントの人に返信してください。 – DrZoo

答えて

0

あなたがここにOR演算子を使用している点に注意してください。したがって、rightがrLeftより小さい場合、あなたのintersectorはtrueを返します。これはどのように動作するはずではありません。

あなたが話すために、四角形の枠内に右が入っているかどうかを確認する必要があります。

if(right <= rRight && right >= rLeft || the other checks here) 

上記のコードをチェックし右のは、矩形の右よりも小さいですが、また、右のは、それが長方形の左右の真ん中にどこかだ意味し、長方形の左よりも大きいということならば。

これはあまりにもそれは方法containsとスタックオーバーフローにintersects

+0

ありがとう!残念なことに、このプロジェクトでは長方形を使用することはできません。長方形を描画するためにStdDrawを使用しているため、まだクラスをカバーしていないためです。私は説明のおかげでこのメソッドを試してみましょう! –

関連する問題