Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 2D游戏:无法正确地进行碰撞_Java_2d_Collision Detection - Fatal编程技术网

Java 2D游戏:无法正确地进行碰撞

Java 2D游戏:无法正确地进行碰撞,java,2d,collision-detection,Java,2d,Collision Detection,好的,我正在做一个Java2D游戏,我已经接近正确的碰撞。我有一个player类,一个block类,还有xvel,yvel,等等。y碰撞工作正常,但当我试图让X碰撞工作时,它完全搞砸了。此外,即使Y碰撞效果良好,玩家也只是在方块上轻微地上下摆动。 我已经为我的播放机设置了一个碰撞保险箱。我做错了什么? 这是我的代码(我知道它不是最好的): 编辑: 好的,我已经设法阻止了球员上下跳动,并且我已经改变了检查碰撞的方式。我删除了玩家的hitbox,只使用了.png精灵,我调整了它的大小,这样就可以正常

好的,我正在做一个Java2D游戏,我已经接近正确的碰撞。我有一个player类,一个block类,还有xvel,yvel,等等。y碰撞工作正常,但当我试图让X碰撞工作时,它完全搞砸了。此外,即使Y碰撞效果良好,玩家也只是在方块上轻微地上下摆动。 我已经为我的播放机设置了一个碰撞保险箱。我做错了什么? 这是我的代码(我知道它不是最好的):

编辑: 好的,我已经设法阻止了球员上下跳动,并且我已经改变了检查碰撞的方式。我删除了玩家的hitbox,只使用了.png精灵,我调整了它的大小,这样就可以正常工作了。因此,问题是,“if(player.xvel<0){}”和“if(player.xvel>0){}”仍然在执行,即使播放器没有水平运行到块中。我怎样才能使代码在播放器水平运行/走进区块时执行

Block.java:

import java.awt.*;
import javax.imageio.ImageIO;
import java.io.*;
import java.awt.Rectangle;
class Block {
    Image block_sprite;
    Image dirt;
    int x;
    int y;
    int height;
    int width;
    int i = 0;
    public Block(int X, int Y, int Width, int Height, int block_type) {
        x = X * 32;
        y = Y * 32;
        width = Width;
        height = Height;
        try {
            dirt = ImageIO.read(new File("img/dirt.png"));
        } catch(IOException e) {
            e.printStackTrace();
        }
        if (block_type == 1) {
            block_sprite = dirt;
        }
    }

    void draw(Graphics g) {
        g.fillRect(x + Display.graphics_panel.WorldX, y, width, height);
    }
    void collide(Player player) {  
        Rectangle player_hb = new Rectangle((int) player.x, (int) player.y, (int) player.width, (int) player.height);
        Rectangle block_hb = new Rectangle(x + Display.graphics_panel.WorldX, y, width, height);

        if (player_hb.intersects(block_hb)) {
            Rectangle intersection = (Rectangle) player_hb.createIntersection(block_hb);  

            if (player.yvel > 0) {
                player.jumping = false;
                player.y -= intersection.getHeight();
            }
            if (player.yvel < 0) {
                player.y += intersection.getHeight(); 
            }
            if (player.xvel > 0) {
                System.out.println("You shouldn't see this unless you run into a block!" + i++);
            }
            if (player.xvel < 0) {
                System.out.println("You shouldn't see this unless you run into a block!" + i--);
            }
        }
    }   
}
import java.awt.*;
导入javax.imageio.imageio;
导入java.io.*;
导入java.awt.Rectangle;
类块{
图像块;
图像污垢;
int x;
int-y;
内部高度;
整数宽度;
int i=0;
公共块(整数X、整数Y、整数宽度、整数高度、整数块类型){
x=x*32;
y=y*32;
宽度=宽度;
高度=高度;
试一试{
dirt=ImageIO.read(新文件(“img/dirt.png”);
}捕获(IOE异常){
e、 printStackTrace();
}
if(块类型==1){
块_雪碧=污垢;
}
}
虚线绘制(图形g){
g、 fillRect(x+Display.graphics\u panel.WorldX、y、宽度、高度);
}
无效碰撞(玩家){
矩形player_hb=新矩形((int)player.x,(int)player.y,(int)player.width,(int)player.height);
矩形块_hb=新矩形(x+Display.graphics_panel.WorldX,y,width,height);
如果(球员交叉(拦网){
矩形相交=(矩形)播放器\u hb.createIntersection(块\u hb);
如果(player.yvel>0){
player.jumping=false;
player.y-=交叉点.getHeight();
}
如果(player.yvel<0){
player.y+=交叉点.getHeight();
}
如果(player.xvel>0){
System.out.println(“除非遇到块,否则不应该看到它!”+i++);
}
如果(player.xvel<0){
System.out.println(“除非遇到块,否则不应该看到它!”+i--);
}
}
}   
}
Player.java:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.imageio.*;
import java.io.*;
class Player extends Entity {

    float x = Display.WINDOW_WIDTH / 2;
    float y = 430;
    float width = 48;
    float height = 103;

    float xvel = 0;
    float yvel = 0;
    float gravity = 0.4f;

    float xvel_max = 2;
    float yvel_max = 8;

    float xvel_min = -2;
    float yvel_min = -8;

    String dir = "left";

    float sword_offsetX = 49;
    float sword_offsetY = 32;

    Boolean jumping = false; 

    Image sprite;
    Image sword_sprite;
    Image sprite_r;
    Image sprite_r_a1;
    Image sprite_r_a2;

    Image sprite_l;
    Image sprite_l_a1;
    Image sprite_l_a2;

    Image ssprite_r;
    Image ssprite_l;
    Player() {
        try {
            sprite_r = ImageIO.read(new File("img/player_r.png"));
            sprite_r_a1 = ImageIO.read(new File("img/player_r_a1.png"));
            sprite_r_a2 = ImageIO.read(new File("img/player_r_a2.png"));

            sprite_l = ImageIO.read(new File("img/player_l.png"));
            sprite_l_a1 = ImageIO.read(new File("img/player_l_a1.png"));
            sprite_l_a2 = ImageIO.read(new File("img/player_l_a2.png"));
        ssprite_r = ImageIO.read(new File("img/sword_r.png"));

            ssprite_l = ImageIO.read(new File("img/sword_l.png"));
            if (dir == "left") {
                sprite = sprite_r;
            }
            sword_sprite = ssprite_r;
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
    Graphics2D g2d;
    void draw(Graphics g) {
        g2d = (Graphics2D) g;

        g2d.drawImage(sprite, (int) x, (int) y, null);
        g2d.drawImage(sword_sprite, (int) x + (int) sword_offsetX, (int) y + (int) sword_offsetY, null);
    }

    void update() {

        jumping = true;
        yvel += gravity;
        Display.graphics_panel.WorldX += xvel;  
        y += yvel;

        for (int i = 0; i < Display.graphics_panel.world.blocks.length; i++) {
            Display.graphics_panel.world.blocks[i].collide(this);
        }

        if (Display.keys[65] == 65 || Display.keys[68] == 68) {
                if (dir == "left") {
                    sprite = sprite_r;
                    sword_sprite = ssprite_r;
                    sword_offsetX = 49;
                } else if (dir == "right") {
                    sprite = sprite_l;
                    sword_sprite = ssprite_l;
                    sword_offsetX = -18;
                }
                if (xvel < 0) {
                    if (Display.graphics_panel.frameCount / 10 % 2 == 0) {
                        sprite = sprite_r_a1;
                    } else {
                        sprite = sprite_r_a2;
                    }
                }
                if (xvel > 0) {
                    if (Display.graphics_panel.frameCount / 10 % 2 == 0) {
                        sprite = sprite_l_a1;
                    } else {
                        sprite = sprite_l_a2;
                    }
                }
        }
        if (xvel == 0 && dir == "left") {
            sprite = sprite_r;
        }
        if (xvel == 0 && dir == "right") {
            sprite = sprite_l;
        }
        if (Display.keys[65] == 65) {
            xvel += 0.25;
            dir = "right";
        } else if (Display.keys[68] == 68) {

            xvel -= 0.25;
            dir = "left";
        } else {
            xvel = 0;
        }

    if (Display.keys[87] == 87 && jumping == false) {
        jumping = true;
        yvel = -8;
    }
        if (xvel > xvel_max) {
            xvel = xvel_max;
        } else if (xvel < xvel_min) {
            xvel = xvel_min;
        }
        if (yvel > yvel_max) {
            yvel = yvel_max;
        } else if (yvel < yvel_min) {
            yvel = yvel_min;
        }
    }
}
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入javax.imageio.*;
导入java.io.*;
类播放器扩展实体{
float x=Display.WINDOW_WIDTH/2;
浮动y=430;
浮动宽度=48;
浮子高度=103;
浮动xvel=0;
浮动yvel=0;
浮子重力=0.4f;
浮动xvel_max=2;
浮动yvel_max=8;
浮动xvel_min=-2;
浮动yvel_min=-8;
String dir=“left”;
浮剑_offsetX=49;
浮剑偏移量=32;
布尔跳跃=假;
图像精灵;
形象剑灵;
图像精灵;
图像精灵;
图像精灵2;
图像精灵;
图像精灵;
图像精灵2;
影像学;
影像学;
玩家(){
试一试{
sprite_r=ImageIO.read(新文件(“img/player_r.png”);
sprite_r_a1=ImageIO.read(新文件(“img/player_r_a1.png”);
sprite_r_a2=ImageIO.read(新文件(“img/player_r_a2.png”);
sprite_l=ImageIO.read(新文件(“img/player_l.png”);
sprite_l_a1=ImageIO.read(新文件(“img/player_l_a1.png”);
sprite_l_a2=ImageIO.read(新文件(“img/player_l_a2.png”);
ssprite_r=ImageIO.read(新文件(“img/swarm_r.png”);
ssprite_l=ImageIO.read(新文件(“img/swarm_l.png”);
if(dir==“左”){
雪碧=雪碧;
}
剑之精灵=ssprite;
}捕获(IOE异常){
e、 printStackTrace();
}
}
图形2d-g2d;
虚线绘制(图形g){
g2d=(图2d)g;
g2d.drawImage(sprite,(int)x,(int)y,null);
g2d.drawImage(剑灵,(int)x+(int)剑灵偏移量x,(int)y+(int)剑灵偏移量,空);
}
无效更新(){
跳跃=正确;
yvel+=重力;
Display.graphics_panel.WorldX+=xvel;
y+=yvel;
对于(int i=0;i0){
如果(Display.graphics\u panel.frameCount/10%2==0){
雪碧=雪碧1;
}否则{
雪碧=雪碧2;
}
}
}
如果(xvel==0&&dir==“左”){
雪碧=雪碧;
}
if(xvel==0&&dir==right){
雪碧=雪碧;
         level.material=array of points from the level
         w=width of hitbox
         h=height of hitbox
         x=upper left x
         y=upper left y
         onground=false;
         double maxy=1000;

         for (Point p:level.material) {
              if (p.x >= (int)x && p.x <= (int)x+w) { //Is the player over the point ? (is the point between player x and player x+w)
                      if (p.y >= (int)(y+h) && (int)(y+h+yvel) >= p.y && p.y-h-1 < maxy) { //Would he go through a platform if the yvel would be added ? And is this the earliest point where this happens ?
                          maxy=p.y-p2.y-1d; //Set new earliest point
                          onground=true; //He is onground
                      }
                  }
              }
         }

         if (onground==true) {
             y=maxy; //Dont fall through the floor ! Stop at the earliest point !
             yvel=0; //There isnt any velocity downwards anymore.
             xvel=xvel-xvel/4; //Friction
         }
class Rect {
     public Point[] points=new Point[4];
     public Point start;
     public Point dim;
     public Rect(double x,double y,double w,double h) {
         start=new Point((int)x,(int)y);
         dim=new Point((int)w,(int)h);
         points[0]=new Point((int)x,(int)y);
         points[1]=new Point((int)x+(int)w,(int)y);
         points[2]=new Point((int)x+(int)w,(int)y+(int)h);
         points[3]=new Point((int)y,(int)y+(int)h);
     }
     public boolean collidepoint(Point p) {
         if (p.x >= start.x && p.x <= start.x+dim.x && p.y >= start.y && p.y <= start.y+dim.y) {
             return true;
         }
         else {
             return false;
         }
     }
     public boolean colliderect(Rect rect2) {
         boolean retvar=false;
         for (Point p:rect2.points) {
              if (collidepoint(p)==true) {
                  retvar=true;
              }
         }
         if (retvar==false) {
         for (Point p:points) {
              if (rect2.collidepoint(p)==true) {
                  retvar=true;
              }
         }
         }
         if (retvar==false) {
         if (rect2.start.y >= start.y && rect2.start.y <= start.y+dim.y || rect2.start.y+rect2.dim.y >= start.y && rect2.start.y+rect2.dim.y <= start.y+dim.y) {
             if (rect2.start.x >= start.x && rect2.start.x <= start.x+dim.x || rect2.start.x+rect2.dim.x >= start.x && rect2.start.x+rect2.dim.x <= start.x+dim.x) {
                 retvar=true;
             }
         }
         }
         if (retvar==false) {
         if (start.y >= rect2.start.y && start.y <= rect2.start.y+rect2.dim.y || start.y+dim.y >= rect2.start.y && start.y+dim.y <= rect2.start.y+rect2.dim.y) {
             if (start.x >= rect2.start.x && start.x <= rect2.start.x+rect2.dim.x || start.x+dim.x >= rect2.start.x && start.x+dim.x <= rect2.start.x+rect2.dim.x) {
                 retvar=true;
             }
         }
         }
         return retvar;
     }
}