![](/img/trans.png)
[英]I Need help to move a Image Icon across the screen in java with a Jbutton ActionListener
[英]I Need to help to move an image across the screen
我在做游戏,我从电脑上拍摄的图像在屏幕上没有移动,出了点问题,请帮帮我
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon;
public class Player extends Entity{
int velX=0,velY=0, speed =5;
public Player(int x, int y) {
super(x, y);
}
public void Update(){
y+=velY;
x+=velX;
checkCollision();
}
public void draw(Graphics2D g2d){
g2d.drawImage(getPlayerImage(),x,y, null);
g2d.draw(getbounds());
}
public Image getPlayerImage(){
ImageIcon ic = new ImageIcon("D:/abc.png");
return ic.getImage();
}
public void KeyPressed(KeyEvent e){
int key = e.getKeyCode();
if(key== KeyEvent.VK_UP) velY=-speed;
else if(key==KeyEvent.VK_DOWN) velY=speed;
if(key==KeyEvent.VK_LEFT) velX-=speed;
else if(key==KeyEvent.VK_RIGHT) velX=speed;
else if(key==KeyEvent.VK_SPACE) GameFrame.addMissile(new Missile(x,y));
}
public void KeyReleased(KeyEvent e){
int key = e.getKeyCode();
if(key== KeyEvent.VK_UP)velY=0;
else if(key==KeyEvent.VK_DOWN) velY=0;
if(key==KeyEvent.VK_LEFT) velX=0;
else if(key==KeyEvent.VK_RIGHT) velX=0;
}
public void checkCollision(){
ArrayList<Enemy> enemies = GameFrame.getEnemyList();
for(int i=0; i<enemies.size(); i++){
Enemy tempEnemy = enemies.get(i);
if(getbounds().intersects(enemies.get(i).getbounds())) System.exit(0);
}
}
public Rectangle getbounds(){
return new Rectangle(x,y,getPlayerImage().getWidth(null),getPlayerImage().getHeight(null));
}
}
还有另外7个类别,但图像移动工作在此处,还有一个KeyAdapt类别,该类别仅用作keyadapter
您应该在按下鼠标时查看要移动的内容,但这取决于您向左还是向右移动,应该减小还是增大。 向上或向下相同。
因此,当您向上和向下移动时,您将沿Y轴移动,该轴以0向北(向上)开始,以Y最大值的南侧(向下)结束,因此,如果您要向上移动,请执行velY-=速度,并且如果要下去,你的速度就快了。 假设当时的velY为0,并且速度大于0。
X轴也一样,左为0,右为X的最大值。向左移动时,从0减小(velX:-5),向右移动时从0增大(velX:+5)。
另一件事是,当您多次需要ImageIcon时,最好将其设置为私有属性,因为那样只会实例化一次。 这将大大提高您的性能,因为每次使用位于硬盘驱动器上的映像实例化ImageIcon时,您都会执行磁盘IO操作,这会使所有操作变慢。
命名在Java中也很重要,因为用不正确的大写字母写方法名称。 方法名称应以小写字母开头,并使用驼峰式。
我用switch case语句重写了您的代码,以使其更具可读性。
public class Player extends Entity {
private int velX=0,velY=0, speed =5;
private ImageIcon ic = new ImageIcon("D:/abc.png");
public Player(int x, int y) {
super(x, y);
}
@Override
public void update(){
y+=velY;
x+=velX;
checkCollision();
}
public void draw(Graphics2D g2d){
g2d.drawImage(getPlayerImage(),x,y, null);
g2d.draw(getbounds());
}
public Image getPlayerImage(){
return ic.getImage();
}
public void keyPressed(KeyEvent e){
switch (e.getKeyCode()) {
case KeyEvent.VK_UP: velY -= speed; break;
case KeyEvent.VK_DOWN: velY += speed; break;
case KeyEvent.VK_LEFT: velX -= speed; break;
case KeyEvent.VK_RIGHT: velX += speed; break;
case KeyEvent.VK_SPACE: GameFrame.addMissile(new Missile(x,y)); break;
default: break;
}
}
public void keyReleased(KeyEvent e){
switch (e.getKeyCode()) {
case KeyEvent.VK_UP: velY = 0; break;
case KeyEvent.VK_DOWN: velY = 0; break;
case KeyEvent.VK_LEFT: velX = 0; break;
case KeyEvent.VK_RIGHT: velX = 0; break;
default: break;
}
}
public void checkCollision(){
ArrayList<Enemy> enemies = GameFrame.getEnemyList();
for(int i=0; i<enemies.size(); i++){
Enemy tempEnemy = enemies.get(i);
if(getbounds().intersects(enemies.get(i).getbounds())) System.exit(0);
}
}
public Rectangle getbounds(){
return new Rectangle(x,y,getPlayerImage().getWidth(null),getPlayerImage().getHeight(null));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.