Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的游戏中有两种玩家速度?_Java_User Interface - Fatal编程技术网

Java 为什么我的游戏中有两种玩家速度?

Java 为什么我的游戏中有两种玩家速度?,java,user-interface,Java,User Interface,出于某种原因,在我的游戏“橙色探索”中有两种玩家速度。我的意思是,当我在eclipse中测试我的游戏时,我的耳机是关闭的。游戏的速度是我戴着耳机时的两倍。 我把游戏发给了我的朋友,他也遇到了同样的问题。我试着调试代码,看看是否有什么问题,但我没有看到任何问题。我还试着调整播放器的速度,但这也没有帮助,因为当我的耳机关闭时,速度仍然是原来的两倍。 这是游戏面板的代码 哦,对了,画面是700乘700 import javax.imageio.ImageIO; import javax.swing.

出于某种原因,在我的游戏“橙色探索”中有两种玩家速度。我的意思是,当我在eclipse中测试我的游戏时,我的耳机是关闭的。游戏的速度是我戴着耳机时的两倍。 我把游戏发给了我的朋友,他也遇到了同样的问题。我试着调试代码,看看是否有什么问题,但我没有看到任何问题。我还试着调整播放器的速度,但这也没有帮助,因为当我的耳机关闭时,速度仍然是原来的两倍。 这是游戏面板的代码 哦,对了,画面是700乘700

import javax.imageio.ImageIO;

import javax.swing.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class GamePanel extends JPanel implements ActionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    Player player;

    boolean running = true;
    CopyOnWriteArrayList<Wall> walls = new CopyOnWriteArrayList<>();
    CopyOnWriteArrayList<LavaWall> lavaWalls = new CopyOnWriteArrayList<>();
    CopyOnWriteArrayList<Enemy> enemies = new CopyOnWriteArrayList<>();
    CopyOnWriteArrayList<Orange> oranges = new CopyOnWriteArrayList<>();

    java.util.Timer gameTimer;
    int cameraX;
    int offset;
    int count = 0;
    int index = 0;
    int set;
    int s = 50;
    int r = 75;
    BufferedImage dirt;
    BufferedImage grass;
    BufferedImage lava;
    BufferedImage cloud;
    BufferedImage spike;
    BufferedImage undergroundLava;
    BufferedImage character;
    BufferedImage thumbnail;
    JLabel timeLabel = new JLabel();
    JLabel orangeLabel = new JLabel(": 0/7");
    double orangeCount = 0;
    int elapsedTime = 0;
    int minutes = 0;
    int seconds = 0;
    int ms = 0;
    String minutesString = String.format("%02d", minutes);
    String secondsString = String.format("%02d", seconds);
    String msString = String.format("%02d", ms);
    java.util.Timer timer = new java.util.Timer();
    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            elapsedTime += 10;
            minutes = (elapsedTime / 60000);
            seconds = (elapsedTime / 1000) % 60;
            ms = (elapsedTime / 10) % 100;
            minutesString = String.format("%02d", minutes);
            secondsString = String.format("%02d", seconds);
            msString = String.format("%02d", ms);
            timeLabel.setText(minutesString + ":" + secondsString + ":" + msString);
        }

    };

    GamePanel() {

        if (running) {
            player = new Player(400, 300, this);
            reset();
            setLayout(null);
            gameTimer = new java.util.Timer();
            add(player.death);
            player.death.setBounds(550, 15, 300, 100);
            player.death.setFont(new Font("Verdana", Font.PLAIN, 20));
            add(orangeLabel);
            orangeLabel.setBounds(320, 15, 200, 50);
            orangeLabel.setFont(new Font("Verdana", Font.PLAIN, 20));
            gameTimer.schedule(new TimerTask() {

                @Override
                public void run() {

                    try {
                        if (walls.get(walls.size() - 1).x < 800) {
                            offset += 700;
                            makeWalls(offset);
                        }

                        player.set();
                        for (Wall wall : walls)
                            wall.set(cameraX);
                        for (int i = 0; i < walls.size(); i++) {
                            if (walls.get(i).x < -800)
                                walls.remove(i);
                        }for(Enemy enemy : enemies)
                            enemy.set(cameraX);
                        for (LavaWall lava : lavaWalls)
                            lava.set(cameraX);
                        for (int i = 0; i < lavaWalls.size(); i++) {
                            if (lavaWalls.get(i).x < -800)
                                lavaWalls.remove(i);
                        }
                        for(Orange orange : oranges)
                            orange.set(cameraX);
                        for(int i = 0; i < oranges.size(); i++) {
                            if(oranges.get(i).x < -800)
                                oranges.remove(i);
                        }
                        repaint();

                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            }, 0, 17);
            add(timeLabel);
            timeLabel.setText(minutesString + ":" + secondsString + ":" + msString);
            timeLabel.setBounds(10, 15, 300, 100);
            timeLabel.setFont(new Font("Verdana", Font.PLAIN, 25));
            timer.scheduleAtFixedRate(task, 0, 10);
        } else if (!running) {
            System.exit(0);
        }
    }

    public void makeWalls(int offset) {
        Random rnd = new Random();
        try {
            dirt = ImageIO.read(getClass().getResourceAsStream("/art/dirt block.png"));
            grass = ImageIO.read(getClass().getResourceAsStream("/art/grass block.png"));
            lava = ImageIO.read(getClass().getResourceAsStream("/art/lava block.png"));
            cloud = ImageIO.read(getClass().getResourceAsStream("/art/cloud block.png"));
            undergroundLava = ImageIO.read(getClass().getResourceAsStream("/art/underground lava.png"));
            thumbnail = ImageIO.read(getClass().getResourceAsStream("/art/thumbnail.png"));
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (count == 7) {
            oranges.add(new Orange(offset + 50, 500, s, s, thumbnail)); 
            for (int i = 1; i <= 14; i++) {
                walls.add(new Wall(offset + i * 50, 600, s, s, grass));
                walls.add(new Wall(offset + i * 50, 650, s, s, dirt));
            }

        }
        else if(count != 10) {
            if (index == 0) {
                for (int i = 1; i <= 14; i++) {
                    walls.add(new Wall(offset + i * 50, 600, s, s, grass));
                    walls.add(new Wall(offset + i * 50, 650, s, s, dirt));
                    if(i == 6) {
                        enemies.add(new Enemy(offset + 350, 550, r, s));
                    }
                }
                set = 0;
            } else if (index == 1) {
                for (int j = 1; j <= 14; j++) {
                    for (int i = 650; i >= 350; i -= 50) {
                        if (i == 350)
                            walls.add(new Wall(offset, i, s, s, grass));
                        else
                            walls.add(new Wall(offset, i, s, s, dirt));
                    }
                    offset += 50;
                    set = 1;
                }
            } else if (index == 2) {
                if(set == 0) {
                    walls.add(new Wall(offset - 50, 500, s, s, cloud));
                    walls.add(new Wall(offset - 200, 400, s, s, cloud));
                    walls.add(new Wall(offset, 300, s, s, cloud));

                    for (int i = 0; i < 9; i++) {
                        walls.add(new Wall(offset + 300 + i * 50, 600, s, s, grass));
                        walls.add(new Wall(offset + 300 + i * 50, 650, s, s, dirt));
                    }
                }else {
                    for (int i = 1; i <= 14; i++) {
                        walls.add(new Wall(offset + i * 50, 600, s, s, grass));
                        walls.add(new Wall(offset + i * 50, 650, s, s, dirt));
                        if(i == 6) {
                            enemies.add(new Enemy(offset + 350, 550, r, s));
                        }
                    }
                }
            } else if (index == 3) {
                for (int i = 1; i <= 2; i++) {
                    walls.add(new Wall(offset + i * 50, 600, s, s, grass));
                    walls.add(new Wall(offset + i * 50, 650, s, s, dirt));
                }
                lavaWalls.add(new LavaWall(offset + 150, 600, s, s, lava));
                lavaWalls.add(new LavaWall(offset + 200, 600, s, s, lava));
                lavaWalls.add(new LavaWall(offset + 250, 600, s, s, lava));
                lavaWalls.add(new LavaWall(offset + 300, 600, s, s, lava));
                lavaWalls.add(new LavaWall(offset + 350, 600, s, s, lava));
                lavaWalls.add(new LavaWall(offset + 150, 650, s, s, undergroundLava));
                lavaWalls.add(new LavaWall(offset + 200, 650, s, s, undergroundLava));
                lavaWalls.add(new LavaWall(offset + 250, 650, s, s, undergroundLava));
                lavaWalls.add(new LavaWall(offset + 300, 650, s, s, undergroundLava));
                lavaWalls.add(new LavaWall(offset + 350, 650, s, s, undergroundLava));
                for (int i = 6; i <= 12; i++) {
                    walls.add(new Wall(offset + 100 + i * 50, 600, s, s, grass));
                    walls.add(new Wall(offset + 100 + i * 50, 650, s, s, dirt));
                }
            }
            for(Wall wall : walls) {
                for(LavaWall lava : lavaWalls) {
                    if(lava.hitBox.getBounds() == wall.hitBox.getBounds()) {
                        lavaWalls.remove(lava);
                    }
                }
            }
            count++;
            index = rnd.nextInt(4);
        }
    }

    public void reset() {
        count = 0;
        index = 0;
        player.x = 200;
        player.y = 150;

        cameraX = 150;
        player.xspeed = 0;
        player.yspeed = 0;
        walls.clear();
        enemies.clear();
        lavaWalls.clear();
        oranges.clear();
        offset = -150;
        makeWalls(offset);  
        player.isDed = false;
    }

    public void paint(Graphics g) {



        try {
            super.paint(g);
            Graphics2D gtd = (Graphics2D) g;
            player.draw(gtd);
            for(int i = 0; i < walls.size(); i++) {
                try {
                    walls.get(i).draw(gtd);
                } catch (Throwable e) {

                }
            }for(Enemy enemy : enemies) 
                enemy.draw(gtd);
            for(LavaWall lava : lavaWalls)
                lava.draw(gtd);
            g.drawImage(thumbnail, 270, 15, 50, 50, null);
            for(Orange orange : oranges)
                orange.draw(gtd);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {


    }

    public void keyPressed(KeyEvent e) {



        if (e.getKeyChar() == 'a')
            player.keyLeft = true;
        if (e.getKeyChar() == 'w' || e.getKeyCode() == 32)
            player.keyUp = true;
        if (e.getKeyChar() == 's')
            player.keyDown = true;
        if (e.getKeyChar() == 'd')
            player.keyRight = true;
        if (e.getKeyChar() == 'h')
            Player.keyGlide = true;
        if (e.getKeyChar() == 'j')
            player.keyMega = true;
        if (e.getKeyChar() == 'l')
            player.keyRush = true;

    }

    public void keyReleased(KeyEvent e) {



        if (e.getKeyChar() == 'a')
            player.keyLeft = false;
        if (e.getKeyChar() == 'w' || e.getKeyCode() == 32)
            player.keyUp = false;
        if (e.getKeyChar() == 's')
            player.keyDown = false;
        if (e.getKeyChar() == 'd')
            player.keyRight = false;
        if (e.getKeyCode() == 27)
            System.exit(0);
        if (e.getKeyChar() == 'h')
            Player.keyGlide = false;
        if (e.getKeyChar() == 'j')
            player.keyMega = false;
        if (e.getKeyChar() == 'l')
            player.keyRush = false;
    }
}
导入javax.imageio.imageio;
导入javax.swing.*;
导入java.awt.event.*;
导入java.awt.image.buffereImage;
导入java.awt.*;
导入java.util.*;
导入java.util.concurrent.CopyOnWriteArrayList;
公共类GamePanel扩展JPanel实现ActionListener{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
玩家;
布尔运行=真;
CopyOnWriteArrayList=新建CopyOnWriteArrayList();
CopyOnWriteArrayList=新建CopyOnWriteArrayList();
CopyOnWriteArrayList=新建CopyOnWriteArrayList();
CopyOnWriteArrayList oranges=新建CopyOnWriteArrayList();
java.util.Timer游戏计时器;
int cameraX;
整数偏移量;
整数计数=0;
int指数=0;
整数集;
int s=50;
int r=75;
缓冲图像污垢;
缓冲成像草;
缓冲影像熔岩;
缓冲影像云;
缓冲图像峰;
缓冲影像地下熔岩;
缓冲图像字符;
缓冲图像缩略图;
JLabel timeLabel=新的JLabel();
JLabel orangeLabel=新JLabel(“:0/7”);
双橙色计数=0;
int elapsedTime=0;
整数分钟=0;
整数秒=0;
int-ms=0;
字符串minuteString=String.format(“%02d”,分钟);
字符串secondsString=String.format(“%02d”,秒);
字符串msString=String.format(“%02d”,ms);
java.util.Timer Timer=新的java.util.Timer();
TimerTask任务=新的TimerTask(){
@凌驾
公开募捐{
elapsedTime+=10;
分钟=(延迟时间/60000);
秒=(延迟时间/1000)%60;
ms=(elapsedTime/10)%100;
minuteString=String.format(“%02d”,分钟);
secondsString=String.format(“%02d”,秒);
msString=String.format(“%02d”,ms);
timeLabel.setText(minuteString+“:”+secondssString+“:”+msString);
}
};
游戏面板(){
如果(正在运行){
玩家=新玩家(400300,这个);
重置();
setLayout(空);
gameTimer=new java.util.Timer();
添加(玩家死亡);
玩家。死亡。挫折(550,15300100);
player.death.setFont(新字体(“Verdana”,Font.PLAIN,20));
添加(橙色标签);
橘红色的后退(320,15200,50);
setFont(新字体(“Verdana”,Font.PLAIN,20));
gameTimer.schedule(新的TimerTask(){
@凌驾
公开募捐{
试一试{
if(walls.get(walls.size()-1).x<800){
偏移量+=700;
makeWalls(偏移);
}
player.set();
用于(墙:墙)
壁装(cameraX);
对于(int i=0;iimport java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.*;
public class Player {
    GamePanel panel;
    int x;
    int y;
    int width;
    int height;
    double xspeed;
    double yspeed;
    boolean keyLeft;
    boolean keyRight;
    boolean keyUp;
    static boolean keyGlide;
    boolean keyDown;
    boolean keyMega;
    boolean keyRush;
    boolean falling;
    boolean isDeathSound;
    boolean isDed;
    Graphics2D gtd;
    long time = 0;
    Timer timer;
    long start; 
    long stop;
    double deaths = 0;
    JLabel death = new JLabel("Deaths: 0");
    Rectangle hitBox;   
    long waitTime;
    static Clip clip;
    static boolean onGround;

    Player(){

    }
    Player(int x, int y, GamePanel panel){



        this.panel = panel;
        this.x = x;
        this.y = y;
        width = 50;
        height = 100;
        hitBox = new Rectangle(x, y, width, height);
    }
    public void set() throws Throwable{
        Iterator<Orange> orangeItr = panel.oranges.iterator();
        if(keyLeft && keyRight || !keyLeft && !keyRight) xspeed *= 0.8;
        else if(keyLeft && !keyRight)xspeed--; 
        else if(keyRight && !keyLeft)xspeed++;
        if(keyUp && keyGlide) {keyUp = false;}
        if(yspeed > 0)onGround = false;
        if(keyMega && keyGlide) {keyMega = false;}
        if(onGround && keyGlide)keyGlide = false;
        if(xspeed > 0 && xspeed < 0.75)xspeed = 0;
        if(xspeed < 0 && xspeed > -0.75)xspeed = 0;
        if(xspeed > 7 && !keyRush)xspeed = 7;
        if(xspeed < -7 && !keyRush)xspeed = -7;
        if(xspeed > 12 && keyRush)xspeed = 12;
        if(xspeed < -12 && keyRush)xspeed = -12;

        if(yspeed < -12.75) yspeed = -12.75;
        if(keyUp && onGround) {
            jumpSound();
            hitBox.y++;
            onGround = false;
            for(Wall wall : panel.walls) {

                if(wall.hitBox.intersects(hitBox)) {
                    yspeed = -8;

                }
            }hitBox.y--;
        }if(keyMega && onGround) {
            megaSound();
            onGround = false;
            hitBox.y++;

            for(Wall wall : panel.walls) {
                if(wall.hitBox.intersects(hitBox)) yspeed = -12.75;

            }hitBox.y--;

        }
        yspeed += 0.3;
        if(keyGlide && !onGround && yspeed > 1.2) {
            glideSound();
            yspeed -= 0.25;


        }if(keyDown && !onGround) {
            yspeed += 0.4;
        }
        //horizontal collision
        hitBox.x += xspeed;
        for(Wall wall : panel.walls) {
            if(hitBox.intersects(wall.hitBox)) {
                hitBox.x -= xspeed;
                while(!wall.hitBox.intersects(hitBox))hitBox.x += Math.signum(xspeed);
                hitBox.x -= Math.signum(xspeed);
                panel.cameraX += x - hitBox.x;
                xspeed = 0;
                hitBox.x = x;
            }

        }
        for(Orange orange : panel.oranges){
            isDed = false;
            if(hitBox.intersects(orange.hitBox)) {
                isDed = false;
                if(panel.orangeCount != 6) {
                    isDed = false;
                keyGlide = false;
                hitBox.x -= xspeed;
                while(!orange.hitBox.intersects(hitBox))hitBox.x += Math.signum(xspeed);
                hitBox.x -= Math.signum(xspeed);
                panel.cameraX += x - hitBox.x;
                xspeed = 0;
                x = hitBox.x;
                panel.orangeCount++;
                panel.reset();
                panel.orangeLabel.setText(": " +(int)panel.orangeCount + "/7");
                onGround = true;
                isDed = false;
                deathSound();
                }
                else {
                    keyGlide = false;
                    hitBox.x -= xspeed;
                    while(!orange.hitBox.intersects(hitBox))hitBox.x += Math.signum(xspeed);
                    hitBox.x -= Math.signum(xspeed);
                    xspeed = 0;
                    x = hitBox.x;
                    onGround = true;
                    panel.orangeCount++;
                    panel.orangeLabel.setText(": " + (int)panel.orangeCount + "/7");
                    orangeSound();
                    System.out.println("Well done");
                    Thread.sleep(1100);
                    System.out.print("your time is ");
                    System.out.println(panel.timeLabel.getText());
                    System.out.println("you died " + (int)deaths + " time(s)");
                    System.exit(0);
                }
            }
        }

        //vertical collision
        hitBox.y += yspeed;
        for(Wall wall : panel.walls) {
            if(hitBox.intersects(wall.hitBox)) {

                keyGlide = false;
                hitBox.y -= yspeed;
                while(!wall.hitBox.intersects(hitBox))hitBox.y += Math.signum(yspeed);
                hitBox.y -= Math.signum(yspeed);
                yspeed = 0;
                y = hitBox.y;
                onGround = true;
            }
        }
        try {
            for(LavaWall lava : panel.lavaWalls) {
                if(hitBox.intersects(lava.hitBox)) {
                    isDed = true;
                    isDeathSound = true;
                    keyGlide = false;
                    hitBox.y -= yspeed;
                    while(!lava.hitBox.intersects(hitBox))hitBox.y += Math.signum(yspeed);
                    hitBox.y -= Math.signum(yspeed);
                    yspeed = 0;
                    y = hitBox.y;
                    onGround = true;
                    isDed = true;
                    die();
                    
                }
            }
        for(Orange orange : panel.oranges){
                isDed = false;
                if(hitBox.intersects(orange.hitBox)) {
                    isDed = false;
                    if(!(panel.orangeCount == 7)) {
                        
                        keyGlide = false;
                        hitBox.y -= yspeed;
                        while(!orange.hitBox.intersects(hitBox))hitBox.y += Math.signum(yspeed);
                        hitBox.y -= Math.signum(yspeed);
                        yspeed = 0;
                        y = hitBox.y;
                        onGround = true;
                        panel.orangeCount++;
                        panel.reset();
                        panel.orangeLabel.setText(": " +(int)panel.orangeCount + "/7");
                        isDed = false;
                        deathSound();
                        
                    }
                    else if(panel.orangeCount == 7) {
                        keyGlide = false;
                        hitBox.y -= yspeed;
                        while(!orange.hitBox.intersects(hitBox))hitBox.y += Math.signum(yspeed);
                        hitBox.y -= Math.signum(yspeed);
                        yspeed = 0;
                        y = hitBox.y;
                        onGround = true;
                        panel.orangeCount++;
                        panel.orangeLabel.setText(": " + (int)panel.orangeCount + "/7");
                        orangeSound();
                        System.out.println("Well done");
                        Thread.sleep(1100);
                        System.out.print("your time is ");
                        System.out.println(panel.timeLabel.getText());
                        System.out.println("you died " + (int)deaths + " time(s)");
                        Thread.sleep(4500);
                        System.out.println("press v to exit");
                    }
                }
            }
        }catch(Throwable e) {

        }
        
        panel.cameraX -= xspeed;
        y += yspeed;
        hitBox.x = x;
        hitBox.y = y;
        //death code
        if(y > 800) {
            isDed = true;
            onGround = true;
            die();
        }enemyScript();
    }void enemyScript() {
        for(Enemy enemy : panel.enemies) {
            if(hitBox.intersects(enemy.hitBox)) {
                isDed = true;
                isDeathSound = true;
                keyGlide = false;
                hitBox.y -= yspeed;
                while(!enemy.hitBox.intersects(hitBox))hitBox.y += Math.signum(yspeed);
                hitBox.y -= Math.signum(yspeed);
                yspeed = 0;
                y = hitBox.y;
                onGround = true;
                isDed = true;
                die();
            }
        }
    }
    void jumpSound(){
        soundEffect("res\\musicAndSoundEffects\\jump.wav");
    }void megaSound(){
        soundEffect("res\\musicAndSoundEffects\\megajump.wav");
    }void glideSound(){
        soundEffect("res\\musicAndSoundEffects\\shorterGlide.wav");
    }void deathSound(){
        if(isDed) {
        soundEffect("res\\musicAndSoundEffects\\death.wav");
        }else if(!isDed) {
            soundEffect("res\\musicAndSoundEffects\\orangeSound.wav");
        }
    }void notDie(){
        stopSound();
    }
    void orangeSound(){
        soundEffect("res\\musicAndSoundEffects\\orangeSound.wav");
    }void stopSound(){
        clip.stop();
    }
    void die() {
        deathSound();
        panel.reset();
        deaths++;
        death.setText("Deaths: " + (int)deaths);
        onGround = true;
    }
    static void soundEffect(String filePath) {
        try {
            File file = new File(filePath);
            AudioInputStream sound = AudioSystem.getAudioInputStream(file);
            clip = AudioSystem.getClip();
            if(onGround && !filePath.equals("res\\musicAndSoundEffects\\shorterGlide.wav")) {
                clip.open(sound);
                clip.setFramePosition(0);
                clip.start();
            }else if(filePath.equals("res\\musicAndSoundEffects\\shorterGlide.wav")) {
                clip.open(sound);
                clip.setFramePosition(0);
                clip.start();
            }

        }catch(Exception e) {
            JOptionPane.showMessageDialog(null, e.getStackTrace());
        }
    }
    public void draw(Graphics2D g) {
        g.setColor(Color.BLACK);
        g.fillRect(x, y, width, height);
    }
}
class Example {
  private static final long NANOS_PER_MILLI =
    TimeUnit.MILLISECONDS.toNanos(1);
  private static final long NANOS_PER_FRAME =
    TimeUnit.SECONDS.toNanos(1) / 60;
  private static final long ADJUST_EXPECTATIONS_TRESHOLD =
    NANOS_PER_FRAME * 5;

  private long start = System.nanoTime();
  private long frameCounter = 0;

  public void run() {
    while (running) {
      gameLoop();
    }
  }

  void gameLoop() {
    frameCounter++;
    long target = startTime + NANOS_PER_FRAME * frameCounter;

    // target now holds the exact time at which point we should
    // be done with this game loop.

    recalcGameState();
    redrawStuff();

    long end = System.nanoTime();
    long delta = target - System.nanoTime();

    if (delta > 0) {
      // We had time to spare!
      // Let's sleep most of that away, giving us
      // a little bit of leeway (5msec worth) in case the system is
      // going to blip on us.

      // Also, CPU waiting is generally granularized at millis,
      // so let's convert to millis first, and be 5 millis 'early'

      long millisToWait = (delta / NANOS_PER_MILLI) - 5;
      if (millisToWait > 0) sleep(millisToWait);
    else if (-delta > READJUST_EXPECTATIONS_TRESHOLD) {
      // Rats - we missed the boat, and by a lot!
      // we are over 5 frames behind, let's readjust
      // expectations and slow down the game logic, too:

        start = end;
        frameCounter = 0;
      }
    }
  }
}