Java代码优化
我刚刚做了一个关于如何在2d背景上制作角色的教程,基本上就像一个非常有限的平台一样移动,没有重力或任何东西,我遇到了一些延迟,我认为这是因为按键/释放的工作方式,但我想知道是否有任何方法可以优化它,这可能是我没有动画,它只是一个块,但我不确定,这就像如果我举着左,然后我放开左,按下右,而所有的时间仍然举着它只是向上,直到我放开,它在左和右之间滞后等。我会贴下面的代码。谢谢Java代码优化,java,optimization,graphics,Java,Optimization,Graphics,我刚刚做了一个关于如何在2d背景上制作角色的教程,基本上就像一个非常有限的平台一样移动,没有重力或任何东西,我遇到了一些延迟,我认为这是因为按键/释放的工作方式,但我想知道是否有任何方法可以优化它,这可能是我没有动画,它只是一个块,但我不确定,这就像如果我举着左,然后我放开左,按下右,而所有的时间仍然举着它只是向上,直到我放开,它在左和右之间滞后等。我会贴下面的代码。谢谢 //@@@MAIN CLASS, NAMED CHECKERS ARBITRARILY import javax.swin
//@@@MAIN CLASS, NAMED CHECKERS ARBITRARILY
import javax.swing.*;
public class Checkers {
public static void main(String[] args) {
JFrame frame = new JFrame("2D Game");
frame.add(new Board());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1200,326);
frame.setVisible(true);
}
}
//@@@@@@@@@@@@@@@@@
//class called Dude this is my character(circle)
import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.event.KeyEvent;
public class Dude {
int x, dx, y, dy;
Image still;
public Dude(){
ImageIcon i = new ImageIcon("C:/still.png");
still = i.getImage();
x = 10;
y = 150;
}
public void move(){
x = x + dx;
y = y + dy;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public Image getImage(){
return still;
}
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT)
dx = -2;
if (key == KeyEvent.VK_RIGHT)
dx = 2;
if (key == KeyEvent.VK_UP)
dy = -2;
if (key == KeyEvent.VK_DOWN)
dy = 2;
}
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;
}
}
//@@@@@@@@@@@@@@@@@@@
//this is my board class (background)
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Board extends JPanel implements ActionListener{
Dude p;
Image img;
Timer time;
public Board(){
p = new Dude();
addKeyListener(new AL());
setFocusable(true);
ImageIcon i = new ImageIcon("C:/test.png");
img = i.getImage();
time = new Timer(5, this);
time.start();
}
public void actionPerformed(ActionEvent e){
p.move();
repaint();
}
public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(img, 0, 0, null);
g2d.drawImage(p.getImage(), p.getX(), p.getY(), null);
}
private class AL extends KeyAdapter{
public void keyReleased(KeyEvent e){
p.keyReleased(e);
}
public void keyPressed (KeyEvent e){
p.keyPressed(e);
}
}
}
这对我很有用:
package sof_6406645;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Checkers {
public static void main(String[] args) {
JFrame frame = new JFrame("2D Game");
frame.add(new Board());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1200,326);
frame.setVisible(true);
}
public static class Board extends JPanel implements ActionListener {
final Image img;
Point p;
final boolean[] dynamics = new boolean[4];
public Board() {
addKeyListener(new AL());
setFocusable(true);
ImageIcon i = new ImageIcon("dude.png");
img = i.getImage();
p = new Point(0,0);
Timer timer = new Timer(5, this);
timer.start();
}
public void actionPerformed(ActionEvent e){
moveImage();
}
public void moveImage (){
int dx = 0;
int dy = 0;
if(dynamics[0]) dx = -2;
if(dynamics[1]) dy = -2;
if(dynamics[2]) dx = 2;
if(dynamics[3]) dy = 2;
p.move((int)p.getX() + dx, (int)p.getY() + dy);
repaint();
}
public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(img, (int)p.getX(), (int)p.getY(), null);
}
private class AL extends KeyAdapter{
public void keyReleased(KeyEvent e){
updateDynamics(e, false);
}
public void keyPressed (KeyEvent e){
updateDynamics(e, true);
}
}
final void updateDynamics(KeyEvent e, boolean v) {
int i = e.getKeyCode() - KeyEvent.VK_LEFT;
dynamics[i] = v;
}
}
}
[编辑]:
对updateDynamics()
上的sig进行了一次小的修改,并抵制了手动内联(有效地)1行代码的冲动,该代码将在两个关键侦听器方法中重复。该方法调用应该由JIT内联。moveImage()
中if语句的顺序也可以收紧,以使检查减少一半,但我还是非常肯定JVM会为您解决这个问题
说到if
s,我最初并没有改变你的交互模式,但我认为如果你一直按两个相反的移动键,Dude
应该停止,你不觉得吗
public void moveImage (){
int dx = 0;
int dy = 0;
if(dynamics[0]) dx -= 2;
if(dynamics[1]) dy -= 2;
if(dynamics[2]) dx += 2;
if(dynamics[3]) dy += 2;
p.move((int)p.getX() + dx, (int)p.getY() + dy);
repaint();
}
你有钥匙吗?也就是说,您是否正在接收大量的
按键事件?您可以通过一个开关使您的按键和按键释放方法更加优化。现在必须执行所有4项检查。这可能对你的整体表现没有多大帮助,这就是为什么这只是一个评论而不是一个答案。我只想说声谢谢!这很好的解决了我注意到的奇怪的延迟,谢谢你!除了我注意到的两件事之外,使用新的moveImage()方法,停止时效果非常好,但如果同时按住左键和右键,那么您仍然可以上下移动吗?但是你只能向下移动,上下移动也是一样,如果你按住它们,你只能向右移动,而不能向左移动…想法?如果你把事件记录下来,你会注意到Swing并没有引发第三个关键事件。在你的情况下,它似乎有一个模式;在Mac OS X Java 6 SE上,虽然ctr alt shift等都会按预期引发事件,但我根本没有获得第三个键的事件(使用箭头)。我认为逻辑上没有问题。(请注意,我使用的是上述的moveImage()变量。)