Java 矩形相交与绘制到屏幕的内容不匹配

Java 矩形相交与绘制到屏幕的内容不匹配,java,awt,collision-detection,Java,Awt,Collision Detection,我正在使用JavaAWT类来创建一个由两边的矩形组成的墙。wall类扩展矩形,并使用相同的变量绘制到屏幕 墙类别: import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; public class Walls extends Rectangle { public Walls(int startX, int startY, int width, int height ){ //super(

我正在使用JavaAWT类来创建一个由两边的矩形组成的墙。wall类扩展矩形,并使用相同的变量绘制到屏幕

墙类别:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;


public class Walls extends Rectangle {

public Walls(int startX, int startY, int width, int height ){
    //super(startX, startY, width, height);
//  
    //Checking with this way for the collision detection
    this.x = startX;
    this.y = startY;
    this.width = width;
    this.height = height;


    //this.wallStartX = startX;
    //this.wallStartY = startY;
    //this.wallWidth  = width;
    //this.wallHeight = height;
}

public void draw(Graphics g){

    g.setColor(Color.GRAY);
    //g.fillRect( this.wallStartX, this.wallStartY, this.wallWidth, this.wallHeight);
    //Trying with the rectangle methods
    g.fillRect( this.x, this.y, this.width, this.height);
}
我使用了rectangle.intersects方法来检查碰撞预测。它适用于左墙,但似乎总是与右墙发生碰撞,即使玩家方块不接触。我对左墙和右墙使用了相同的代码,并且我确保墙的参数对于上面类中的矩形是相同的

基于蠕虫游戏的杀手代码Java编程

消旋板:

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.text.DecimalFormat;
import java.util.Random;
import java.awt.event.KeyEvent; //Should be for Key Usage
import java.awt.event.KeyListener;


public class RacingPanel extends GamePanel implements KeyListener {
///KeyListener from https://www.youtube.com/watch?v=5UaEUrbpDPE

//Q: Serial ID? http://stackoverflow.com/questions/285793/what-is-a-        serialversionuid-and-why-should-i-use-it
private static final long serialVersionUID = 1825086766957972644L;

private DecimalFormat df = new DecimalFormat("0.##"); // 2 dp

private Main_Racer mrTop;
private Racer bob;
private Walls josephine;
private Walls jeremy;
private static Random randomGenerator = new Random();
boolean wallBuilder;
int leftCreateorDestroy = 100;
int rightCreateorDestroy = 100;
//private ArrayList()[] Walls kinderland;


//Q
private Font font;
private FontMetrics metrics;

//Q: definitely find out what this method is doing
public RacingPanel( Main_Racer rc, long period) {
    super(period);
    mrTop = rc;

    this.addKeyListener(this);
}


//In case we want to integrate mice
//Q: Why void? Why protected?
protected void mousePress( int x, int y){

}



//Q: in the worm game, it calls 
//fred.move(), presumably to move the worm

//wcTop.setTimeSpent(timeSpentInGame);
//Probably a counter
protected void simpleUpdate(){

}

//Q: Assuming that this should be things the
//game starts off with, like the block,
//the course. Also, font
protected void simpleInitialize(){

    //T: Maybe I need to initialize the racer
    bob = new Racer(PWIDTH, PHEIGHT);
    josephine = new Walls(0, 35, 100, 1);
    jeremy = new Walls(PWIDTH-100, 35, 100,1);
    //That did it!
    // so the arguments to the racer update change
    //where the square was rendered

    //TJ: I need to loop in such a way that will draw random variables

    // set up message font
            font = new Font("SansSerif", Font.BOLD, 24);
            metrics = this.getFontMetrics(font);

}

protected void simpleRender(Graphics dbg) {

    if(!gameOver){
    //These two seem pretty straight forward
    dbg.setColor(Color.blue);
    dbg.setFont(font);

    // report frame count & average FPS and UPS at top left
    // dbg.drawString("Frame Count " + frameCount, 10, 25);
    dbg.drawString("Average FPS/UPS: " + df.format(averageFPS) + ", "
            + df.format(averageUPS), 20, 25); // was (10,55)

    dbg.setColor(Color.black);

    // draw game elements: the obstacles and the worm

    //This'll probably be the block and the 
    //course instead

    //obs.draw(dbg);
    //fred.draw(dbg);

    bob.draw(dbg);
    //jeremy.draw(dbg);

    //See if we can draw this thing over and over
    for(int i = 35; i < PHEIGHT; i++){

        wallBuilder = randomGenerator.nextBoolean();

        if(wallBuilder == false){
            if ( leftCreateorDestroy < PWIDTH/2 - 50)
            leftCreateorDestroy++;
        }
        else{
            if(leftCreateorDestroy > 0){
                leftCreateorDestroy--;
            }

        }

        josephine = new Walls(0, i, leftCreateorDestroy, 1);
        josephine.draw(dbg);


        wallBuilder = randomGenerator.nextBoolean();

        //This wall keeps colliding with the other wall
        //Also, it isn't set to the other side of the screen due to conventions
        if(wallBuilder == false){
            //if ( (PWIDTH - rightCreateorDestroy) > (PWIDTH/2-150))
            if ( rightCreateorDestroy > 0)
            rightCreateorDestroy--;
        }
        else{
            if((PWIDTH/2 + 50) < PWIDTH - rightCreateorDestroy){
                rightCreateorDestroy++;
            }

        }

        //PWIDTH - rightCreateorDestroy is the length of the 
        jeremy = new Walls((PWIDTH - rightCreateorDestroy), i, rightCreateorDestroy, 1);
        //jeremy = new Walls((PWIDTH - rightCreateorDestroy), i, 100, 1);
        //Let's see if it will draw negative; will not;
        jeremy.draw(dbg);

        //Now to put up collision detection
        if(bob.intersects(josephine) ){
            System.out.println("Ouch!");
            gameOver = true;
        }

            //System.out.println(bob.);
        else if( bob.intersects(jeremy) ){
            Rectangle Sektor = bob.intersection(jeremy);
            System.out.println(Sektor);
            System.out.println(jeremy);

        }
            //System.out.println("Yow!");


        //Problems seem to be with the right side; let's take out the right and check.

        //For some reason, intersecting all of the time.
    }
    }

        //1msecond is too long. Starts clipping;
/*      try{
            Thread.sleep(1000);
        }catch ( InterruptedException exc ){
            System.out.println("No work");

            } */

        } 

    //So this does draw over and over again
    //FPS/UPS Still good





//Pretty straight forward as well. Just need
//to see when it is called
protected void gameOverMessage(Graphics g)
// center the game-over message in the panel
{
    //Keeps updating after death...
    String msg = "Game Over. Your Score: " + timeSpentInGame;
    int x = (PWIDTH - metrics.stringWidth(msg)) / 2;
    int y = (PHEIGHT - metrics.getHeight()) / 2;
    g.setColor(Color.red);
    g.setFont(font);
    g.drawString(msg, x, y);
} // end of gameOverMessage()



@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT){
        //System.out.println("Right");
        //Should set x position to current position plus 1
        bob.setRacerPositionX(bob.getRacerPositionX() + 1);
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT){
    //  System.out.println("Left");
        bob.setRacerPositionX(bob.getRacerPositionX() - 1);
    }
    if (e.getKeyCode() == KeyEvent.VK_UP){
        //System.out.println("Up");
        bob.setRacerPositionY(bob.getRacerPositionY() - 1);
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN){
        //System.out.println("Down");
        bob.setRacerPositionY(bob.getRacerPositionY() + 1);
    }
}
主要赛车手:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main_Racer  extends JFrame implements WindowListener

{

private static int DEFAULT_FPS = 80;


private RacingPanel rp;

//Let's leave now and make the panel



//Q: Just a value; why JTextField instead of int?
private JTextField jtfBox;

//Q: Just a value; why JTextField instead of int?
private JTextField jtfTime;

//Main_Racer Constructor
public Main_Racer(long period)
{
    //Q: Gotta find this constructor
    super("The Main Racder");
    //Q:What does the argument do?
    makeGUI(period);

    addWindowListener( this);
    pack();
    setResizable(false);
    setVisible(true);
}


    //Q: Warrants an in depth look
    private void makeGUI(long period)
    {
    Container c = getContentPane();    // default BorderLayout used

    rp = new RacingPanel(this, period);
    c.add(rp, "Center");

    JPanel ctrls = new JPanel();   // a row of textfields
    ctrls.setLayout( new BoxLayout(ctrls, BoxLayout.X_AXIS));

    //Keeps track of time. Might still be useful
    jtfTime = new JTextField("Time Spent: 0 secs");
    jtfTime.setEditable(false);
    ctrls.add(jtfTime);

    c.add(ctrls, "South");
    }  // end of makeGUI()

    //Pretty straing forward
    public void setTimeSpent(long t)
      {  jtfTime.setText("Time Spent: " + t + " secs"); }

// QQQ -----------------Going to copy the window listening methods, as probably n
//need em all

      public void windowActivated(WindowEvent e) 
      {  rp.resumeGame();  }

      public void windowDeactivated(WindowEvent e) 
      {  rp.pauseGame();  }


      public void windowDeiconified(WindowEvent e) 
      {  rp.resumeGame();  }

      public void windowIconified(WindowEvent e) 
      {  rp.pauseGame(); }


      public void windowClosing(WindowEvent e)
      {  rp.stopGame();  }


      public void windowClosed(WindowEvent e) {}
      public void windowOpened(WindowEvent e) {}

//=================================================================================

      public static void main(String args[])
      { 
        int fps = DEFAULT_FPS;
        if (args.length != 0)
          fps = Integer.parseInt(args[0]);

        long period = (long) 1000.0/fps;
        System.out.println("fps: " + fps + "; period: " + period + " ms");

        new Main_Racer(period*1000000L);    // ms --> nanosecs 
      }

    } // end of WormChase class

为什么碰撞检测只能在一侧工作?

您能提供可重复的示例吗?调用的方法和传递的参数。用于碰撞还是墙构造函数?这两个都在上面的代码中,但我也可以把它们拉出来;jeremy=新墙宽度-100,35100,1;交叉测试ifbob.intersectsjosephine System.out.printlnOuch!;//System.out.printlnbob。;否则,如果bob.Sjeremy{Rectangle Sektor=bob.intersectionjeremy;System.out.printlnSektor;System.out.printlnjeremy;包括我现在用于调试的相交矩形。每当我使用新的相交矩形运行时,相交等于右矩形。但是,如果播放机移出屏幕,则没有相交。您的代码未编译请提供一个我们可以运行的示例。例如PWIDTH、rightCreateorDestroy、randomGenerator等未定义…好的,添加了所有内容。对此表示抱歉。
import java.awt.*;
import java.awt.geom.*;

public class Racer extends Rectangle {

//Only method that will likely be common between
//the two areas. This presumably draws  to screen

//Size of Car
private static final int carSize = 20;



//Changing racer position from array to x and y coordinates

private int pWidth, pHeight;   // panel dimensions
private long startTime;        // in ms

public Racer (int pW, int pH){

    this.width = pW; 
    this.height = pH;

    //Meant to start racer in the center of the screen
    //But it does not
    this.x = pW/2;
    this.y = pW/2;



}

public void draw(Graphics g){
    g.setColor(Color.blue);
    g.fillRect( x, y, carSize, carSize);        
}

public int getRacerPositionX() {
    return x;
}

public void setRacerPositionX(int x) {
    this.x = x;
}

public int getRacerPositionY() {
    return y;
}

public void setRacerPositionY(int y) {
    this.y = y;
}

}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main_Racer  extends JFrame implements WindowListener

{

private static int DEFAULT_FPS = 80;


private RacingPanel rp;

//Let's leave now and make the panel



//Q: Just a value; why JTextField instead of int?
private JTextField jtfBox;

//Q: Just a value; why JTextField instead of int?
private JTextField jtfTime;

//Main_Racer Constructor
public Main_Racer(long period)
{
    //Q: Gotta find this constructor
    super("The Main Racder");
    //Q:What does the argument do?
    makeGUI(period);

    addWindowListener( this);
    pack();
    setResizable(false);
    setVisible(true);
}


    //Q: Warrants an in depth look
    private void makeGUI(long period)
    {
    Container c = getContentPane();    // default BorderLayout used

    rp = new RacingPanel(this, period);
    c.add(rp, "Center");

    JPanel ctrls = new JPanel();   // a row of textfields
    ctrls.setLayout( new BoxLayout(ctrls, BoxLayout.X_AXIS));

    //Keeps track of time. Might still be useful
    jtfTime = new JTextField("Time Spent: 0 secs");
    jtfTime.setEditable(false);
    ctrls.add(jtfTime);

    c.add(ctrls, "South");
    }  // end of makeGUI()

    //Pretty straing forward
    public void setTimeSpent(long t)
      {  jtfTime.setText("Time Spent: " + t + " secs"); }

// QQQ -----------------Going to copy the window listening methods, as probably n
//need em all

      public void windowActivated(WindowEvent e) 
      {  rp.resumeGame();  }

      public void windowDeactivated(WindowEvent e) 
      {  rp.pauseGame();  }


      public void windowDeiconified(WindowEvent e) 
      {  rp.resumeGame();  }

      public void windowIconified(WindowEvent e) 
      {  rp.pauseGame(); }


      public void windowClosing(WindowEvent e)
      {  rp.stopGame();  }


      public void windowClosed(WindowEvent e) {}
      public void windowOpened(WindowEvent e) {}

//=================================================================================

      public static void main(String args[])
      { 
        int fps = DEFAULT_FPS;
        if (args.length != 0)
          fps = Integer.parseInt(args[0]);

        long period = (long) 1000.0/fps;
        System.out.println("fps: " + fps + "; period: " + period + " ms");

        new Main_Racer(period*1000000L);    // ms --> nanosecs 
      }

    } // end of WormChase class