Java 2D游戏优化

时间:2018-01-09 10:40:34

标签: java 2d

我正在制作一个小型的2D平台游戏。我注意到游戏滞后了很多。使用NetBeans分析模式时,问题似乎在我的gameLoop计时器内部和重绘部分。我正在使用java.util.Timer和TimerTask作为我的gameLoop计时器。它每11ms运行一次。

我找到了一个帮助一些的小修复程序,每2/3循环只调用重绘一次。我怀疑这不是最好的解决办法,因为它只会有所帮助。这里有没有人知道如何做更好的优化?

面板代码:

package main;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

public class Panel extends javax.swing.JPanel {

//Klassen som lysnar efter keylisteners
private KeyList listener;

//Skapandet av spelare och object
public Spelare p;
public ArrayList<Vägg> väggar;

int gravatyTimer = 0;
int repaintTimer = 0;
int gravSpeed;

public Panel() {
    initComponents();
    gameLoop.schedule(loop, 11, 11);
    p = new Spelare(20, 100, 50);
    väggar = new ArrayList<>();

    skapaVäggar();

    //Gör det möjligt för programet att lyssna efter keypresses
    listener = new KeyList();
    this.setFocusable(true);
    this.requestFocus();
    this.addKeyListener(listener);

    gravSpeed = p.getGravSpeed();
}

public void skapaVäggar() {
    for (int i = 0; i < 550; i += 50) {
        Vägg info = new Vägg(i, 400, 50);
        väggar.add(info);
    }
    Vägg info = new Vägg(550,350,50);
    väggar.add(info);
    Vägg ingo = new Vägg(150,200,50);
    väggar.add(ingo);
    Vägg b = new Vägg(250,240,50);
    väggar.add(b);
    Vägg a = new Vägg(400,290,50);
    väggar.add(a);
}

//Lyssnar efter keypresses och gör saker
private class KeyList extends KeyAdapter {
    @Override
    public void keyTyped(KeyEvent e) {
        //Inget
    }
    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();

        int moveSpeed = p.getWalkSpeed();

        //Höger
        if (key == 39) {
            p.setHsp( moveSpeed );
        }
        //Vänster
        if (key == 37) {
            p.setHsp( -moveSpeed );
        }

        //Hoppa
        if ( key == 32 && p.placeMeetingPreciseY(p.getY(), väggar) ) {
            p.hoppa();
        }

    }
    @Override
    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();

        //Höger
        if (key == 39) {
            p.setHsp(0);
        }
        //Vänster
        if (key == 37) {
            p.setHsp(0);
        }
    }
}

//Main game loop
Timer gameLoop = new Timer();
TimerTask loop = new TimerTask() {
    public void run() {
        //Egentliga loop

        //Lägger till gravitation
        if (gravatyTimer <= 0) {
            p.addVsp( gravSpeed );
            gravatyTimer = 8;
        } else {
            gravatyTimer--;
        }

        //Kollar kollision
        kollaKollision();

        //Flyttar spelare
        p.flyttaXLed();
        p.flyttaYLed();

        if (repaintTimer <= 0) {
            repaint();
            repaintTimer = 2;
        } else if (repaintTimer == 1) {
            repaint();
        } else {
            repaintTimer--;
        }

    }
};

public void kollaKollision() {      
    //Kollar vertikal kollision       
    if ( p.placeMeetingY(p.getY()+p.getVsp(), väggar) ) {         
        p.setVsp(0);
    }        
    //Kollar horisontel kollision
    if ( p.placeMeetingX(p.getX()+p.getHsp(), väggar) ) {
        p.setHsp(0);
    }
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    p.rita(g);
    for (int i = 0; i < väggar.size(); i++) {
        väggar.get(i).rita(g);
    }


}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>                        


    // Variables declaration - do not modify                     
    // End of variables declaration                   
}

0 个答案:

没有答案