2015-01-16 4 views
0

Я делаю игру, и я использую delta для контроля скорости игры. Но по какой-то причине, если игрок удерживает клавишу слишком долго, лицо лианы будет двигаться слишком быстро! Может кто-нибудь, пожалуйста, помогите мне?Delta получает слишком быстро

package net.trenterprises; 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 

import net.trenterprises.frame.MainFrame; 
import net.trenterprises.frame.Window; 

public class Main implements KeyListener { 

static boolean wPressed = false; 
public static boolean isWPressed() { 
    synchronized (Main.class) { 
     return wPressed; 
    } 
} 

static int creeperX = 0; 
static int creeperY = 0; 
static JLabel Creeper = null; 

static long lastFrame; 

public static long getTime() { 
    return (System.nanoTime() * 1000)/1000000; 
} 

public static int getDelta() { 
    long time = getTime(); 
    int delta = (int) (time - lastFrame); 
    lastFrame = time; 
    return delta; 
} 

static Main Main = new Main(); 

public static void main(String[] args) { 
    Window Frame = new MainFrame(); 
    Frame.addKeyListener(Main); 
    Frame.setLayout(null); 
    Frame.setVisible(true); 
    Frame.setSize(1380, 750); 
    try { 
     Creeper = new JLabel(new ImageIcon(ImageIO.read(new URL("https://slm-assets0.secondlife.com/assets/8754271/lightbox/creeper_head2.jpg?1384657553")))); 
     Frame.add(Creeper); 
     Creeper.setSize(Creeper.getPreferredSize()); 
     Creeper.setBounds(creeperX, creeperY, Creeper.getSize().width, Creeper.getSize().height); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    new CreeperUpdate().start(); 

} 

@Override 
public void keyTyped(KeyEvent e) { 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    if(e.getKeyChar() == 'w') { 
     wPressed = true; 
    } 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    if(e.getKeyChar() == 'w') { 
     wPressed = false; 
    } 
} 

} 

class CreeperUpdate extends Thread implements Runnable { 
public void run() { 
    while(true) { 
     if(Main.wPressed) { 
      if(Main.getDelta() > 0) { 
       System.out.println("Creeper X: " + Main.creeperX); 
       Main.creeperX += 1 * (Main.getDelta()/50); 
      } 
     } 
     Main.Creeper.setBounds(Main.creeperX, Main.creeperY, Main.Creeper.getSize().width, Main.Creeper.getSize().height); 
    } 
} 
} 
+0

Это вообще связано с операционной системой, повторяющей удерживаемый ключ снова и снова? – ryanyuyu

+0

@ryanyuyu Что значит удерживаемый ключ? Если вы имели в виду, что операционная система не изменит wPressed boolean от true до false, это не так. Дельта кажется слишком высокой, или что-то еще. Основная проблема заключается в том, что всякий раз, когда я использую дельту для перемещения изображения, если кнопка W удерживается, изображение начинает двигаться быстрее, чем земля вращается вокруг Солнца. –

+0

@ MehmetM.Inanc Рефакторинг кода обработки времени и событий в класс creeperupdate? Как в move getTime() getDelta() и слушатели клавиатуры? –

ответ

1

возвращение (System.nanoTime() * 1000)/1000000; Разве это не слишком высоко по сравнению с вашим делителем 50. Это как много пикселей в секунду, т. Е. 2e4.

Пожалуйста, не используйте излишние константы, если они вообще не используются, используйте вместо них именованные переменные.

public static final int PIXELS_PER_SECOND = 100

Это правило всегда применяется в программном обеспечении в сопровождении своих друзей; предположения. В вашем случае это упростит вашу игру и, возможно, несколько уровней сложности, если вы измените множители/дивизоры на переменные и т. Д.

И, пожалуйста, отредактируйте время обработки кода и код обработки событий в классе CreeperUpdate. Нажимайте состояние до Thread, который требует его, параллелизм трудный, и лучше избегать его, если сможете. Статические методы обычно прекрасны, в любом случае, если они не воюют с состоянием.

Извините, если это слишком много.

+0

Вначале меня смутило ваше утверждение о константах. Мне потребовалось некоторое время, чтобы понять, что вы имели в виду, что OP должен использовать именованные константы ('static final' variables в Java) вместо того, чтобы накладывать числовые литералы. – jpmc26

+0

Спасибо за помощь :) –

Смежные вопросы