gpt4 book ai didi

Java 2D 游戏 : Cant get collisions right

转载 作者:行者123 更新时间:2023-12-01 09:00:51 25 4
gpt4 key购买 nike

好的,我正在开发一个 Java2D 游戏,并且我已经接近正确处理碰撞了。我有一个玩家类、一个 block 类以及玩家的 xvel、yvel 等。 y 碰撞工作正常,但是当我尝试让 X 碰撞工作时,它完全困惑了。另外,即使 Y 碰撞工作正常,玩家也只是在方 block 上轻微地上下 Swing 。我为我的玩家设置了一个碰撞箱。我究竟做错了什么?这是我的代码(我知道它不是最好的):

编辑:好的,我已经设法阻止玩家上下 Swing ,并且更改了检查碰撞的方式。我删除了玩家的碰撞盒,只使用 .png Sprite ,并调整了它的大小,以便运行良好。所以,问题是,即使玩家没有水平运行到方 block 中,“if (player.xvel < 0) { }”和“if (player.xvel > 0) { }”仍在执行。我怎样才能让代码在玩家水平跑/走入方 block 时执行?

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--);
}
}
}
}

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;
}
}
}

最佳答案

所以,我实际上用 hitbox 制作了一个小平台游戏。您可能需要的部分是在碰撞发生之前了解它们。也许我游戏中的这个例子对您有帮助。

         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
}

您应该能够轻松地将其复制到所有其他对齐方式(左、右、下)。这是“地上”(over)。因此玩家能够站在平台上。

关于Java 2D 游戏 : Cant get collisions right,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41681911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com