role.png
待摸索改进的地方:
1、同时依次按下多个键,响应不及时,有时有停顿。
2、角色速度按屏幕刷新而定,应该不按屏幕刷新。
3、未实现网格行走。
4、加快speed时,行走应该更自然,画面不够流畅。
package com.test;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Test extends JFrame {
private static final long serialVersionUID = 1L;
public static final int DOWN = 0;
public static final int LEFT = 1;
public static final int RIGHT = 2;
public static final int UP = 3;
public static void main(String[] args) {
Test t = new Test();
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
t.setVisible(true);
}
public Test() {
setTitle("Gyi-neng");
MyPanel panel = new MyPanel();
getContentPane().add(panel);
pack();
}
public class MyPanel extends JPanel implements KeyListener {
private static final long serialVersionUID = 1L;
public static final int WIDTH = 400;
public static final int HEIGHT = 400;
private Role role;
public MyPanel() {
setPreferredSize(new Dimension(WIDTH,HEIGHT));
setFocusable(true);
addKeyListener(this);
role = new Role(this,100,100);
Thread repaintThread = new Thread(new PanelRepaint());
repaintThread.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
role.draw(g);
}
private class PanelRepaint implements Runnable {
public void run() {
while(true) {
role.move();
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
int keyCode = arg0.getKeyCode();
switch(keyCode) {
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
role.setStop(false);
role.setDirect(UP);
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
role.setStop(false);
role.setDirect(DOWN);
break;
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A:
role.setStop(false);
role.setDirect(LEFT);
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
role.setStop(false);
role.setDirect(RIGHT);
break;
default:
break;
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
role.setStop(true);
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
public class Role {
private Image img;
private int step;
private int x;
private int y;
private int speed;
private int direct;
private boolean stop;
private MyPanel panel;
public Role(MyPanel _p,int _x, int _y) {
panel = _p;
x = _x;
y = _y;
speed = 5;
direct = DOWN;
stop = true;
img = new ImageIcon("image/role.png").getImage();
step = 0;
}
public void draw(Graphics g) {
//g.drawImage(img, x, y, panel);
g.drawImage(img,x,y,x+32,y+48,direct+step*32,direct*48,direct+32+step*32,direct*48+48,panel);
if(!stop) {
if(++step == 4)
step = 0;
}
else
step = 0;
}
public void setDirect(int _direct) {
direct = _direct;
}
public int getDirect() {
return direct;
}
public void setStop(boolean _stop) {
stop = _stop;
}
public void move() {
if(!stop) {
if(direct == UP)
y -= speed;
else if(direct == DOWN)
y += speed;
else if(direct == LEFT)
x -= speed;
else
x += speed;
}
}
}
}