Java冲突检测和对象设置
Player.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
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;
}
}
}