Java中的碰撞效应
是否可以向使用drawImage()方法绘制的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
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(); }