简单的横向滚动JFrame游戏滞后,其他问题没有帮助?

时间:2014-06-25 18:21:47

标签: java swing lag

目前我试图在Java中制作一个简单的视频游戏,只是为了好玩。但似乎有滞后,我不确定它为什么会发生。我将给予低调: 它绘制的方式是使用JFrame,实际绘图发生在ImagePanel类中。在ImagePanel中,这是我绘制的方式。它包括一些关于显示FPS的调试和一个显示运行长度的计时器,但我不确定这是否重要。它通过多个ArrayLists来显示JFrame上的所有对象。

//Painting

public void paintComponent(Graphics g) 
    {
        //Paint the background with its upper left corner at the upper left corner of the panel
        g.drawImage(background, 0, 0, null); 
        //Paint each image in the foreground where it should go
        for(MovingImage img : backgrounds)
        {
            g.drawImage(img.getImage(), (int)(img.getX()), (int)(img.getY()), null);
        }
        for(MovingImage img : foreground)
        {
            g.drawImage(img.getImage(), (int)(img.getX()), (int)(img.getY()), null);
        }

        if(g instanceof Graphics2D)
        {
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
            g2.scale(2, 2);
            g2.setColor(Color.WHITE);

            String milSpace;
            if(timer%100 < 10)
                milSpace = "0";
            else
                milSpace = "";

            String secSpace;
            if(timer/100 < 10)
                secSpace = "0";
            else
                secSpace = "";

            g2.drawString(secSpace + timer/100 + ":" + milSpace + timer%100, 10, 20);

            //Debug
            if(debug)
            {
                long currentTime = System.currentTimeMillis();
                if (currentTime > nextSecond)
                {
                    nextSecond += 1000;
                    frameInLastSecond = framesInCurrentSecond;
                    framesInCurrentSecond = 0;
                }
                framesInCurrentSecond++;
                //g2.drawString("LagMS:" + (-frameRate - 10) + " FPS:" + frameInLastSecond, 20, 40);   <-includes "lag"
                g2.drawString("FPS:" + frameInLastSecond, 20, 40);
            }
         }
    }

    //Replaces the list of foreground images with the one given, and repaints the panel
    public void updateImages(ArrayList<MovingImage> newForeground, ArrayList<MovingImage> newBackgrounds)
    {
        foreground = newForeground;
        backgrounds = newBackgrounds;
        //time checking
        long time = System.currentTimeMillis();
        lastTime = time;

        repaint();  //This repaints stuff... you don't need to know how it works
    }

在我制作的主要课程中,包括一个刻度系统,这使得它首先被绘制。

public void tick()
    {
        long lastTime = System.currentTimeMillis(); 
        int place = 0;
        boolean go = true;
        while(go)
        {
            long time = System.currentTimeMillis(); //The current time
            if(time - 10 > lastTime)    //Update every .01 seconds, or 1 TICK (if time - 10 > lastTime)
            {
                lastTime = time;
                //Reset the last time
                place++;

                imagePanel.incTime();

                for(MovingImage object : movingObjects)
                {
                    if(object instanceof Building)
                    {
                        object.incrementPosition();     //Augment position by velocity
                        if(place%500 == 0)//If 5 seconds have passed...
                        {
                            ((Building) object).speedUp();//make it go a little faster!
                        }
                    }
                    if(object instanceof Player)
                    {
                        if(jumpKeyOn)
                            ((Player) object).jump();//Initiate jump class assuming key is pressed
                        object.incrementPosition();
                        ((Player) object).constrainPlayerToObjects(movingObjects, yMax);
                        if(object.getY()>yMax + 1000)
                        {
                            go = false;
                        }
                    }
                }
                //Repaint all the things in their new positions, possibly faster
                for(MovingImage bg : backgrounds)
                {
                    bg.incrementPosition();
                    if(place%500 == 0)
                        bg.setVelocity(bg.getXvel() - 0.1, 0);
                }

                /*
                 * Acceleration
                 */
                //Removes buildings once left screen
                int i = 0;
                while(i < movingObjects.size())
                {
                    if(movingObjects.get(i) instanceof Building)
                    {
                        if(movingObjects.get(i).getX() + movingObjects.get(i).getImage().getWidth(null) < 0)
                            movingObjects.remove(i);
                        else
                            i++;
                    }
                    else
                        i++;
                }

                imagePanel.updateImages(movingObjects, backgrounds);
            }
        }
        gameOver();
    }

这是一个无休止的循环,基本上运行程序。我使用了多个ArrayLists来放下不同的层。我在做什么导致它滞后?我还是比较新的,但我会回答有关代码的任何问题或提供更多详细信息。我找不到任何有帮助的问题。

编辑:我应该提到一些奇怪的事情。偶尔它几乎在完整的FPS下运行,但大部分时间都没有。我还注意到,当我同时运行另一个java程序时,它几乎全速运行。

编辑2:我应该包括整个主类代码和ImagePanel吗?

0 个答案:

没有答案