Java代码优化

标签 java optimization graphics

我刚刚做了一个关于如何使 2d 背景上的角色基本上像一个非常有限的平台游戏一样移动的教程,没有重力或任何东西,我遇到了一些滞后,我假设这是因为按键/释放的方式有效,但我想知道是否有任何方法可以优化它,可能是我没有动画,它只是一个 block ,但我不确定,就像我按住左键然后放开左键一样一直按住向右,它就会上升,直到我放手,它会在左右之间滞后,等等。我将粘贴下面的代码。谢谢!:

//@@@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,我最初并没有改变你的交互模型,但我认为如果你一直按两个相反的移动键,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();
        }

关于Java代码优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406645/

相关文章:

java - Eclipse junit 测试在同一个项目中

java - 尝试使用 javazoom 播放 MP3 文件并收到错误消息 "unable to load resource ' sfd.ser”

matlab - L1-Regularized系统的最小化,收敛于非最小位置?

java - 使用 java.awt.BasicStroke 制作虚线动画

Android SurfaceView,已调用 OnDraw 但显示不会在没有 invalidate() 的情况下更新

java - JAXB 和 XSLT 处理器

java - StreamTokenizer 预期结束字符

c - GCC 错误地优化了自定义地址处变量的指针相等测试

php - 安全使用 PHP ini_set "memory_limit"

android - 在 Android 应用程序中从图像构造 3D 几何图形