【发布时间】:2014-05-25 23:01:04
【问题描述】:
我正在为一个学校项目创建一个程序。这是一个基于粉丝的神奇宝贝程序,我在理解如何根据击键更改图像时遇到了一些麻烦。
这是目前为止 Character 类的代码
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.io.*; //the File class
import java.util.*; //the Scanner class
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import java.awt.image.*;
import javax.swing.ImageIcon;
public class MainCharacter {
private Image up, up1, up2, down, down1, down2, left, left1, left2, right, right1, right2;
private void loadImages() {
up = new ImageIcon("Up.png").getImage();
up1 = new ImageIcon("Up1.png").getImage();
up2 = new ImageIcon("Up2.png").getImage();
down = new ImageIcon("Down.png").getImage();
down1 = new ImageIcon("Down1.png").getImage();
down2= new ImageIcon("Down2.png").getImage();
left = new ImageIcon("Left.png").getImage();
left1 = new ImageIcon("Left1.png").getImage();
left2 = new ImageIcon("Left2.png").getImage();
right = new ImageIcon("Right.png").getImage();
right1 = new ImageIcon("Right1.png").getImage();
right2 = new ImageIcon("Right2.png").getImage();
}
/*public Image getImage()
{
//dont know what to return here
}
*/
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
//dont know what to do
}
if (key == KeyEvent.VK_RIGHT) {
//dont know what to do
}
if (key == KeyEvent.VK_UP) {
//dont know what to do
}
if (key == KeyEvent.VK_DOWN) {
//dont know what to do
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
//dont know what to do
}
if (key == KeyEvent.VK_RIGHT) {
//dont know what to do
}
if (key == KeyEvent.VK_UP) {
//dont know what to do
}
if (key == KeyEvent.VK_DOWN) {
//dont know what to do
}
}
}
这是它随地图移动的类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import javax.swing.Timer;
public class MapMovement extends JPanel implements ActionListener {
private Timer timer;
private Map map;
private MainCharacter mainCharacter;
public MapMovement() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
map = new Map();
timer = new Timer(5, this);
timer.start();
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(map.getImage(), map.getX(), map.getY(), 1000, 1500, this);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
public void actionPerformed(ActionEvent e) {
map.move();
repaint();
}
private class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {
map.keyReleased(e);
//mainCharacter.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
map.keyPressed(e);
//mainCharacter.keyPressed(e);
}
}
}
更新:
这里是地图类
import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class Map {
private String map = "Map-1stCity.png";
private int dx;
private int dy;
private int x;
private int y;
private Image image;
public Map() {
ImageIcon ii = new ImageIcon(this.getClass().getResource(map));
image = ii.getImage();
x = -100;
y = -100;
}
public void move() {
x += dx;
y += dy;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Image getImage() {
return image;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 1;
}
if (key == KeyEvent.VK_RIGHT) {
dx = -1;
}
if (key == KeyEvent.VK_UP) {
dy = 1;
}
if (key == KeyEvent.VK_DOWN) {
dy = -1;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
if (key == KeyEvent.VK_UP) {
dy = 0;
}
if (key == KeyEvent.VK_DOWN) {
dy = 0;
}
}
}
提前感谢您的所有帮助!
【问题讨论】:
-
你还看过哪些地方?
-
我已经搜索了互联网和 stackoverflow 很多,但我仍然不明白如何实现它。我不确定我是否应该使用线程。如果是这样,我不知道在这种情况下如何使用它。
-
有很多方法可以做到这一点。您可以让
getImage()方法需要一个参数(可能是String、int或enum),然后根据它们通过的内容返回一个图像。您也可以将图像放入数组中,创建一个跟踪 int(字段 var,如int i = 0;),每次调用getImage(),您可以增加跟踪器 int,然后在数组槽中返回图像images[i].当一个键被按下时,调用getImage()方法和repaint() -
您遇到了哪些问题?另外,不要在你没有创建的
Graphics上下文中调用g.dispose();,这会造成无穷无尽的问题 -
@VinceEmigh 我了解数组的内容。但是,您能否解释一下如何使
getImage()方法需要一个参数并在其中传递数组。
标签: java swing graphics jpanel actionlistener