Java冲突检测和对象设置

Java冲突检测和对象设置,java,swing,collision-detection,Java,Swing,Collision Detection,Player.java 包固定名称 import java.awt.Rectangle; import java.util.ArrayList; public class Player { private Rectangle bounding; private float posx; private float posy; private ArrayList <Obstacle> list_obs; private int world_x; private int wor

Player.java 包固定名称

  import java.awt.Rectangle;
 import java.util.ArrayList;

public class Player {
private Rectangle bounding;
private float posx;
private float posy;

private ArrayList <Obstacle> list_obs;

private int world_x;
private int world_y;
private float speed=200;
private float speedVert=350;
private float grav=300;
private boolean canJump=true;
private int size;

public Player(int x, int y, int size, int world_x,int world_y,ArrayList <Obstacle> list_obs){
    bounding = new Rectangle(x,y,size,size);
    posx = x;
    posy = y;
    this.world_x=world_x;
    this.world_y=world_y;
    this.list_obs=list_obs;
    this.size=size;
}

public void update(float timeDiff, boolean up, boolean down, boolean left, boolean right, boolean reset){
    float oldPosY=posy;
    float oldPosX=posx;
    updateBounding(posx,posy);

    for (Obstacle list_ob : list_obs) {

        if(up)posy-=speedVert*timeDiff;
        if(down)posy+=speedVert*timeDiff;
        if(right)posx+=speed*timeDiff;
        if(left)posx-=speed*timeDiff;
        if(!up)posy+=grav*timeDiff;
        //if(reset)posy=0;posx=0;canJump=true;grav=300;
        if(posy<=200)speedVert=-grav;
            canJump=false;
        if (bounding.y==550 || posy == list_ob.getBounding().y - list_ob.getBounding().height) {
            canJump=true;
        }
        if(posy>300&&canJump) speedVert=350;
        if(posx<0)posx=0;
        if(posy<0)posy=0;
        if(posx>world_x-bounding.width)posx=world_x-bounding.width;
        if(posy>world_y-bounding.height)posy=world_y-bounding.height;

        if(list_ob.getBounding().intersects(bounding)){
            updateBounding(posx,posy);
            posy=oldPosY;
            posx=oldPosX;
            up=false;
            down=false;
            right=false;
            left=false;
            grav=0;
            updateBounding(posx,posy);
        }else{grav=300;}

    //}    
        updateBounding(posx,posy);
        //bounding.x =(int) posx;
        //bounding.y =(int) posy;
    }

}

public Rectangle getBounding(){
    return bounding;
}


public void updateBounding(float new_x,float new_y){
    bounding.x=(int) new_x;
    bounding.y=(int) new_y;

}
}
Frame.java

package fixedgame;

import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;

 public class Frame extends JFrame{
private Screen screen;

final Player player;
private ArrayList <Obstacle> list_obs = new ArrayList<Obstacle>();

private boolean up=false;
private boolean down=false;
private boolean left=false;
private boolean right=false;
private boolean reset=false;


public Frame(Player player, ArrayList <Obstacle> list_obs){
    super("MoveTest");
    screen = new Screen();
    screen.setBounds(0,0,800,600);
    add(screen);
    addKeyListener(new KeyHandler());
    this.player = player;
    this.list_obs=list_obs;
}

public boolean getUp(){
    return up;
}
public boolean getDown(){
    return down;
}
public boolean getLeft(){
    return left;
}
public boolean getRight(){
    return right;
}
public boolean getReset(){
    return reset;
}



public void repaintScreen(){
    screen.repaint();
}

private class Screen extends JLabel{
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(player.getBounding().x, player.getBounding().y, player.getBounding().width, player.getBounding().height);
        for (Obstacle list_ob : list_obs) {
            g.setColor(Color.yellow);
            g.fillRect(list_ob.getBounding().x, list_ob.getBounding().y, list_ob.getBounding().width, list_ob.getBounding().height);
        }
    }
}

private class KeyHandler implements KeyListener{
    //not used//
    @Override
    public void keyTyped(KeyEvent ke) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    //not used//


    @Override
    public void keyPressed(KeyEvent ke) {
        //if(ke.getKeyCode()== KeyEvent.VK_S||ke.getKeyCode()==KeyEvent.VK_DOWN) down=true;
        if(ke.getKeyCode()== KeyEvent.VK_W||ke.getKeyCode()==KeyEvent.VK_UP) up=true;
        if(ke.getKeyCode()== KeyEvent.VK_A||ke.getKeyCode()==KeyEvent.VK_LEFT) left=true;
        if(ke.getKeyCode()== KeyEvent.VK_D||ke.getKeyCode()==KeyEvent.VK_RIGHT) right=true;
        if(ke.getKeyCode()== KeyEvent.VK_R) reset=true;
        if(ke.getKeyCode()==KeyEvent.VK_ESCAPE) System.exit(0);

    }

    @Override
    public void keyReleased(KeyEvent ke) {
        //if(ke.getKeyCode()== KeyEvent.VK_S||ke.getKeyCode()==KeyEvent.VK_DOWN) down=false;
        if(ke.getKeyCode()== KeyEvent.VK_W||ke.getKeyCode()==KeyEvent.VK_UP) up=false;
        if(ke.getKeyCode()== KeyEvent.VK_A||ke.getKeyCode()==KeyEvent.VK_LEFT) left=false;
        if(ke.getKeyCode()== KeyEvent.VK_D||ke.getKeyCode()==KeyEvent.VK_RIGHT) right=false;
        if(ke.getKeyCode()== KeyEvent.VK_R) reset=false;

    }
}
}
包固定名称;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
公共类框架扩展了JFrame{
私人屏幕;
最后一名选手;
私有ArrayList_obs=新ArrayList();
private boolean up=false;
私有布尔向下=false;
私有布尔左=假;
私有布尔右=假;
私有布尔重置=false;
公共帧(播放器、阵列列表\u obs){
超级(“移动测试”);
屏幕=新屏幕();
屏幕.设置边界(0,0800600);
添加(屏幕);
addKeyListener(新的KeyHandler());
this.player=player;
this.list\u obs=list\u obs;
}
公共布尔设置(){
返回;
}
公共布尔getDown(){
返回下来;
}
公共布尔getLeft(){
左转;
}
公共布尔getRight(){
返还权;
}
公共布尔getReset(){
返回复位;
}
公共无效重新绘制屏幕(){
screen.repaint();
}
私有类屏幕扩展JLabel{
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(Color.red);
g、 fillRect(player.getBounding().x,player.getBounding().y,player.getBounding().width,player.getBounding().height);
用于(障碍物列表\障碍物:列表\障碍物){
g、 setColor(颜色为黄色);
g、 fillRect(list_ob.getBounding().x,list_ob.getBounding().y,list_ob.getBounding().width,list_ob.getBounding().height);
}
}
}
私有类KeyHandler实现KeyListener{
//不用//
@凌驾
public void keyTyped(KeyEvent ke){
//抛出新的UnsupportedOperationException(“尚未受支持”);//若要更改生成的方法体,请选择“工具”“模板”。
}
//不用//
@凌驾
按下公共无效键(KeyEvent ke){
//如果(ke.getKeyCode()==KeyEvent.VK|S | ke.getKeyCode()==KeyEvent.VK|u DOWN)DOWN=true;
如果(ke.getKeyCode()==KeyEvent.VK_W | | ke.getKeyCode()==KeyEvent.VK_UP)UP=true;
如果(ke.getKeyCode()==KeyEvent.VK_A | | ke.getKeyCode()==KeyEvent.VK_LEFT)LEFT=true;
如果(ke.getKeyCode()==KeyEvent.VK|D | ke.getKeyCode()==KeyEvent.VK|u RIGHT)RIGHT=true;
如果(ke.getKeyCode()==KeyEvent.VK_R)reset=true;
if(ke.getKeyCode()==KeyEvent.VK_ESCAPE)System.exit(0);
}
@凌驾
公开无效密钥已释放(密钥事件){
//如果(ke.getKeyCode()==KeyEvent.VK|S | ke.getKeyCode()==KeyEvent.VK|u DOWN)DOWN=false;
如果(ke.getKeyCode()==KeyEvent.VK_W | | ke.getKeyCode()==KeyEvent.VK_UP)UP=false;
如果(ke.getKeyCode()==KeyEvent.VK_A | | ke.getKeyCode()==KeyEvent.VK_LEFT)LEFT=false;
如果(ke.getKeyCode()==KeyEvent.VK|D | ke.getKeyCode()==KeyEvent.VK|u RIGHT)RIGHT=false;
如果(ke.getKeyCode()==KeyEvent.VK_R)reset=false;
}
}
}

问题是:我可以让我的块(播放器)进入障碍(障碍)几个像素。然后我就被卡住了。如何正确执行碰撞检测?

以下是一些关于碰撞检测的教程

简单的例子:

复杂的例子:

深入教程:


以下是一些关于碰撞检测的教程

简单的例子:

复杂的例子:

深入教程:


以下是一些关于java冲突检测的教程:以下是一些关于java冲突检测的教程:
package fixedgame;

import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;

 public class Frame extends JFrame{
private Screen screen;

final Player player;
private ArrayList <Obstacle> list_obs = new ArrayList<Obstacle>();

private boolean up=false;
private boolean down=false;
private boolean left=false;
private boolean right=false;
private boolean reset=false;


public Frame(Player player, ArrayList <Obstacle> list_obs){
    super("MoveTest");
    screen = new Screen();
    screen.setBounds(0,0,800,600);
    add(screen);
    addKeyListener(new KeyHandler());
    this.player = player;
    this.list_obs=list_obs;
}

public boolean getUp(){
    return up;
}
public boolean getDown(){
    return down;
}
public boolean getLeft(){
    return left;
}
public boolean getRight(){
    return right;
}
public boolean getReset(){
    return reset;
}



public void repaintScreen(){
    screen.repaint();
}

private class Screen extends JLabel{
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(player.getBounding().x, player.getBounding().y, player.getBounding().width, player.getBounding().height);
        for (Obstacle list_ob : list_obs) {
            g.setColor(Color.yellow);
            g.fillRect(list_ob.getBounding().x, list_ob.getBounding().y, list_ob.getBounding().width, list_ob.getBounding().height);
        }
    }
}

private class KeyHandler implements KeyListener{
    //not used//
    @Override
    public void keyTyped(KeyEvent ke) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    //not used//


    @Override
    public void keyPressed(KeyEvent ke) {
        //if(ke.getKeyCode()== KeyEvent.VK_S||ke.getKeyCode()==KeyEvent.VK_DOWN) down=true;
        if(ke.getKeyCode()== KeyEvent.VK_W||ke.getKeyCode()==KeyEvent.VK_UP) up=true;
        if(ke.getKeyCode()== KeyEvent.VK_A||ke.getKeyCode()==KeyEvent.VK_LEFT) left=true;
        if(ke.getKeyCode()== KeyEvent.VK_D||ke.getKeyCode()==KeyEvent.VK_RIGHT) right=true;
        if(ke.getKeyCode()== KeyEvent.VK_R) reset=true;
        if(ke.getKeyCode()==KeyEvent.VK_ESCAPE) System.exit(0);

    }

    @Override
    public void keyReleased(KeyEvent ke) {
        //if(ke.getKeyCode()== KeyEvent.VK_S||ke.getKeyCode()==KeyEvent.VK_DOWN) down=false;
        if(ke.getKeyCode()== KeyEvent.VK_W||ke.getKeyCode()==KeyEvent.VK_UP) up=false;
        if(ke.getKeyCode()== KeyEvent.VK_A||ke.getKeyCode()==KeyEvent.VK_LEFT) left=false;
        if(ke.getKeyCode()== KeyEvent.VK_D||ke.getKeyCode()==KeyEvent.VK_RIGHT) right=false;
        if(ke.getKeyCode()== KeyEvent.VK_R) reset=false;

    }
}
}