如何在整个程序中调用我的游戏循环以及在 tick() 中放入啥

Posted

技术标签:

【中文标题】如何在整个程序中调用我的游戏循环以及在 tick() 中放入啥【英文标题】:How to call my gameloop throughout entire program and what to put in tick()如何在整个程序中调用我的游戏循环以及在 tick() 中放入什么 【发布时间】:2014-03-28 06:48:18 【问题描述】:

好吧,很抱歉,如果这是一个菜鸟问题,但这是第一次制作游戏,我只想知道如何在游戏循环中调用,我在我的 Keylistener 类中创建了它,但每当我运行它时只是由于 run() 方法中的无限循环而冻结,但我也希望在游戏开始时调用它,这样我就可以在整个游戏中看到滴答声/ fps,如果你们需要,这是我的代码其他类请说,谢谢:) 为了更简单,我只是要展示 keylistener 类,这样你就不需要太多代码来排序,而且你知道我制作网格的方式是使用数组JLabels 称为 WizardCells 只是为了让您知道,我使用 imageicons 作为我没有使用 BufferedImage 的图标,无论如何我认为这就是您需要知道的所有内容,谢谢 :) 顺便说一句 timePassed 是 Delta 我只是不喜欢 delta 这个名字哈哈

@SuppressWarnings("serial")
public class WizardKeyHandeler extends WizardBattleGrid implements KeyListener, Runnable

    public static boolean isRunning = true;
    static Thread thread = new Thread();

    protected synchronized static void start()

    if(isRunning)
        return;
    isRunning = true;
    thread = new Thread();
    thread.start();





protected synchronized static void stop()
    if(!isRunning)
        return;

    isRunning = false;

        try

            thread.join();
        
        catch(InterruptedException e)

            e.printStackTrace();
        
        System.exit(1);





public void run() 
    long lastTime = System.nanoTime();
    final double amountOfTicks = 60.0;
    double ns = 1000000000 / amountOfTicks;
    double timePassed = 0;
    int updates = 0;
    int frames = 0;
    long timer = System.currentTimeMillis();

    while(isRunning)

        long currentTime = System.nanoTime();
        timePassed += (currentTime - lastTime)/ ns;
        lastTime = currentTime;
        if(timePassed >= 1)
            tick();
            updates++;
            timePassed--;
        

        frames++;

        if(System.currentTimeMillis() - timer > 1000)

            timer += 1000;
            System.out.println(updates + " ticks, fps " + frames);
            updates = 0;
            frames = 0;
        
    
    stop();




private void tick()

    WizardCells[getBlueSpell().getx()][getBlueSpell().gety()].setIcon(null);
    WizardCells[getBlueSpell().changex(getGoodGuy().getx())][getBlueSpell().changey(getGoodGuy().gety() +1)].setIcon(getBlueSpell().getIcon());








@Override
public void keyPressed(KeyEvent e) 
    int key = e.getKeyCode();

    if(key == KeyEvent.VK_W)

        if(getGoodGuy().getx() != 0)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().changex(getGoodGuy().getx()-1)][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());
        

    

    else if(key == KeyEvent.VK_S)

        if(getGoodGuy().getx() != 19)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().changex(getGoodGuy().getx()+1)][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_D)

        if(getGoodGuy().gety() != 9)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().getx()][getGoodGuy().changey(getGoodGuy().gety()+1)].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_A)

        if(getGoodGuy().gety() != 0)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().getx()][getGoodGuy().changey(getGoodGuy().gety()-1)].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_SPACE)


        while(getBlueSpell().gety() != 19)
            run();
        

        WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);



            














@Override
public void keyReleased(KeyEvent e) 
    int key = e.getKeyCode();
    if(key == KeyEvent.VK_W)
            if(getGoodGuy().getx() != 0)

                WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
                WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());
           
        

    else if(key == KeyEvent.VK_S)

        if(getGoodGuy().getx() != 19)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_D)

        if(getGoodGuy().gety() != 9)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_A)

        if(getGoodGuy().gety() != 0)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_SPACE)


        while(getBlueSpell().gety() != 19)
            run();
        

        WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);



            





@Override
public void keyTyped(KeyEvent e) 
    int key = e.getKeyCode();
    if(key == KeyEvent.VK_W)
        if(getGoodGuy().getx() != 0)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().changex(getGoodGuy().getx()-1)][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());

        

        

    else if(key == KeyEvent.VK_S)

        if(getGoodGuy().getx() != 19)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().changex(getGoodGuy().getx()+1)][getGoodGuy().gety()].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_D)

        if(getGoodGuy().gety() != 9)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().getx()][getGoodGuy().changey(getGoodGuy().gety()+1)].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_A)

        if(getGoodGuy().gety() != 0)

            WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);
            WizardCells[getGoodGuy().getx()][getGoodGuy().changey(getGoodGuy().gety()-1)].setIcon(getGoodGuy().getIcon());
        
    

    else if(key == KeyEvent.VK_SPACE)


        while(getBlueSpell().gety() != 19)
            run();
        

        WizardCells[getGoodGuy().getx()][getGoodGuy().gety()].setIcon(null);



            



【问题讨论】:

【参考方案1】:

您应该使用模型-视图-控制器方法。让您的击键导致模型更新,并且与此无关,有一个计时器循环根据模型所处的任何状态更新显示。该更新通常采用在 UI 中处理的重绘请求的形式线。 repaint 方法(因 UI 包而异)将调用其他方法来调整 UI 中的对象和/或在画布上绘制以获得更细粒度的 UI。

【讨论】:

好的,谢谢你的建议,你知道我有什么方法可以做到这一点而不必使用 mvc 方法吗?我基本上只是想开枪,我想避免使用 mvc 的原因是因为我必须重写我的所有代码,而且我已经花了一个月的时间才走到这一步,哈哈,如果这是我唯一能做的事情我会做的,我只是看看你是否知道任何其他方法可以做到这一点谢谢:)

以上是关于如何在整个程序中调用我的游戏循环以及在 tick() 中放入啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在游戏循环中使用 repaint() 方法

井字游戏循环在平局时停止 - Java

如何在“PARTITIONED BY”子句的括号之间以逗号分隔的tick中提取值

在游戏中处理鼠标和键盘输入的不同选项

Pygame/Python 游戏不接收输入

使用 Rust 开发一个微型游戏