Оптимизация кода Java - PullRequest
       7

Оптимизация кода Java

0 голосов
/ 20 июня 2011

Я только что сделал Учебное пособие о том, как заставить персонажа на 2d фоне просто перемещаться в основном как очень ограниченный платформер без гравитации или чего-либо еще, и я столкнулся с некоторым отставанием, я предполагаю, что это из-за способа нажатия / отпускания клавишработает, но мне было интересно, есть ли способ оптимизировать его, может быть, у меня нет анимации, это просто блок, но я не уверен, точно так же, как если бы я держал вверх и влево, а затем я отпустил слева инажмите вправо, в то время как все время удерживая его, он просто идет вверх, пока я не отпущу, он запаздывает между левым и правым и т. д. Я вставлю код ниже.Спасибо!

1002 *

1 Ответ

1 голос
/ 20 июня 2011

Это работает для меня:

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(), и устранил желание вручную вставить (эффективно)1-строчный код, который будет дублироваться в двух ключевых методах прослушивателя.Этот вызов метода должен быть встроен JIT.Последовательность операторов if в moveImage() также может быть ужесточена, чтобы вдвое сократить количество проверок, но опять же я уверен, что 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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...