Java中的碰撞效应

Java中的碰撞效应,java,Java,是否可以向使用drawImage()方法绘制的Java图像添加碰撞效果?如果是,我怎么做? 例如: import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.KeyEvent; public class Racquet { private static final int Y = 330; private static final int WIDTH = 60; priva

是否可以向使用drawImage()方法绘制的Java图像添加碰撞效果?如果是,我怎么做? 例如:

  import java.awt.Graphics2D;
  import java.awt.Rectangle; 
  import java.awt.event.KeyEvent;

public class Racquet {
  private static final int Y = 330;
  private static final int WIDTH = 60;
  private static final int HEIGHT = 10;
  int x = 0;
  int xa = 0;
  private Game game;

  public Racquet(Game game) {
    this.game = game;
  }

  public void move() {
    if (x + xa > 0 && x + xa < game.getWidth() - WIDTH)
        x = x + xa;
  }

  public void paint(Graphics2D g) {
    g.fillRect(x, Y, WIDTH, HEIGHT);
  }

  public void keyReleased(KeyEvent e) {
    xa = 0;
  }

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT)
        xa = -1;
    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        xa = 1;
  }

  public Rectangle getBounds() {
    return new Rectangle(x, Y, WIDTH, HEIGHT);
  }

  public int getTopY() {
    return Y;
  }
}
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.event.KeyEvent;
公营网拍{
专用静态最终整数Y=330;
专用静态最终整数宽度=60;
专用静态最终整数高度=10;
int x=0;
int-xa=0;
私人游戏;
公众网拍(游戏){
这个游戏=游戏;
}
公开作废动议(){
if(x+xa>0&&x+xa
球类:

    import java.awt.Graphics2D;
    import java.awt.Rectangle;

  public class Ball {
  private static final int DIAMETER = 30;
  int x = 0;
  int y = 0;
  int xa = 1;
  int ya = 1;
  private Game game;

  public Ball(Game game) {
    this.game= game;
  }

  void move() {
    if (x + xa < 0)
        xa = 1;
    if (x + xa > game.getWidth() - DIAMETER)
        xa = -1;
    if (y + ya < 0)
        ya = 1;
    if (y + ya > game.getHeight() - DIAMETER)
        game.gameOver();
    if (collision()){
        ya = -1;
        y = game.racquet.getTopY() - DIAMETER;
    }
    x = x + xa;
    y = y + ya;
  }

  private boolean collision() {
    return game.racquet.getBounds().intersects(getBounds());
  }

  public void paint(Graphics2D g) {
    g.fillOval(x, y, DIAMETER, DIAMETER);
  }

  public Rectangle getBounds() {
    return new Rectangle(x, y, DIAMETER, DIAMETER);
  }
  }
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
公共班级舞会{
专用静态最终内径=30;
int x=0;
int y=0;
int-xa=1;
int-ya=1;
私人游戏;
公众舞会(游戏){
这个。游戏=游戏;
}
无效移动(){
if(x+xa<0)
xa=1;
if(x+xa>game.getWidth()-DIAMETER)
xa=-1;
如果(y+ya<0)
ya=1;
如果(y+ya>game.getHeight()-DIAMETER)
game.gameOver();
if(碰撞()){
ya=-1;
y=游戏.racket.getTopY()-直径;
}
x=x+xa;
y=y+ya;
}
私有布尔冲突(){
返回游戏。网拍。getBounds()。相交(getBounds());
}
公共空隙涂料(图2D g){
g、 圆角(x,y,直径,直径);
}
公共矩形getBounds(){
返回新矩形(x,y,直径,直径);
}
}
上面的代码检测网拍和球之间的碰撞,现在,如果我的网拍/球拍是一个图像,我能检测到它与球的碰撞有多大?还有,有更简单的碰撞检测方法吗?(只是问问)

我能多大程度上察觉到它与球的碰撞

我看到您已经有了一个
getBounds()
方法,它返回一个
矩形
对象。您可以使用此选项检查碰撞

你可以这样做:

if(racquet.getBounds().intersects(ball.getBounds()))
    //collision happens
如果球必须在网拍内,则:

if(racquet.getBounds().contains(ball.getBounds()))
    //collision happens
但是,如果网拍对象的高度包括网拍手柄的长度,则可以为网拍实现
getHitBox()
方法,如下所示:

public Rectangle getHitBox(){
    return new Rectangle(x, Y, WIDTH, HEIGHT-handleHeight);
}
是否可以向使用drawImage()方法绘制的Java图像添加碰撞效果?如果是,我怎么做

不确定您的
drawImage()
是如何实现的,因此我无法对此发表评论。然而,在定制绘画中添加一些“碰撞效果”是绝对可能的。每当检测到碰撞时,请在特定位置(即发生碰撞的位置)播放动画

您可以构造如下方法:

playAnimation(int locX, int locY, Animation anima, int duration)
在这种情况下,动画类可以只播放精灵工作表中的精灵

还有,有更简单的碰撞检测方法吗?(只是问问)

你可能只有一个球,最多4个球拍在你的游戏。在这种情况下,您只需检查球是否击中任何球拍:

for(int x=0; x<allRacquets.size(); x++) 
    if(allRacquets.get(x).collidesWith(ball))
        collidedRacquet = allRacquets.get(x);

我认为您可能需要在游戏中创建自己的
update()
方法来检查碰撞。当然可以重写像
drawImage()
这样的方法,我认为这不是一个好主意。如果我正在绘制一幅图像,getBounds()方法对它有效吗?示例:如果像这样修改racquet类中的paint方法,getBounds()是否有效?公共空白油漆(图形2D g){如果(x@user7244039如果我是你,我将绘制一个BuffereImage,而不是使用ImageIcon,并且在发生碰撞时正确播放动画可能应该使用观察者模式完成,而不是在paintComponent方法中写入
If条件
,当您添加更多游戏元素时,将有太多的条件需要处理。顺便说一下,您应该调用
paintComponent()
,而不是
paint()
//implement within Racquet class
public boolean collidesWith(Ball ball){
    return (this.getBounds().intersects(ball.getBounds()));
}
class MyImage extends BufferedImage {
  int x, y, xa, ya;

  public Rectangle getBounds() {
    return new Rectangle(x, y, getWidth(), getHeight());
  }

// all other methods in raquet remain the same except you remove paint()

private Game game;

  public MyImage(Game game) {
    this.game = game;
  }

  public void move() {
    if (x + xa > 0 && x + xa < game.getWidth() - WIDTH)
        x = x + xa;
  }

  public void keyReleased(KeyEvent e) {
    xa = 0;
  }

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT)
        xa = -1;
    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        xa = 1;
  }


  public int getY() {
    return y;
  }
}
MyImage myImage=null;
try {
  myImage=ImageIO.read(new File(...));
}
catch (Exception ex) { ex.printStackTrace(); }