K
Katharsas
Gast
Ich bin dabei, ein kleines 2D-Spiel in Java zu programmieren. Man steuert einen kleine Jäger und schießt damit um sich.
Es funktioniert zwar, aber wenn man anfängt, zu schießen, fängt das Spiel plötzlich stark an zu flackern. Und zwar erst nach ein paar Sekunden, d.h.:
Wenn ich wild um mich schieße, daurt es ein paar Sekunden, bis es wild flackert, wenn nicht, dann flackert es nur hin und wieder und beginnt, wenn man nach den paar sekunden um sich schießt, sofort an wild zu flackern.
Die Schüsse sind wie die Spieler und Gegner auch einfache .png-Grafiken, die bei jedem Frame auf den Hintergrund gepaintet werden.
Wenn ich im Konstruktor meiner Klasse:
=>
aufrufe, verbesset sich das ganze bzw. verzögert sich, ist aber immer noch ziemlich nervig.
Ich poste erst mal die Klassen CInterface und CObject. CInterface paintet alle CObject-Objekte (bzw. alle, die von CObject erben).
CInterface:
Bei jedem Frame wird die Funktion
und repaint aufgerufen:
Funtion "run" aus Klasse CRuntime:
Es werden Objekte gepaintet, die alle CObject erben:
CObject:
Hat jemand eine Idee?
Es funktioniert zwar, aber wenn man anfängt, zu schießen, fängt das Spiel plötzlich stark an zu flackern. Und zwar erst nach ein paar Sekunden, d.h.:
Wenn ich wild um mich schieße, daurt es ein paar Sekunden, bis es wild flackert, wenn nicht, dann flackert es nur hin und wieder und beginnt, wenn man nach den paar sekunden um sich schießt, sofort an wild zu flackern.
Die Schüsse sind wie die Spieler und Gegner auch einfache .png-Grafiken, die bei jedem Frame auf den Hintergrund gepaintet werden.
Wenn ich im Konstruktor meiner Klasse:
Code:
class CInterface extends JFrame
Code:
createBufferStrategy(2);
Ich poste erst mal die Klassen CInterface und CObject. CInterface paintet alle CObject-Objekte (bzw. alle, die von CObject erben).
CInterface:
Java:
import java.util.ArrayList;
import java.util.LinkedList;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.lang.Math;
import java.awt.Toolkit;
import java.awt.Dimension;
class CInterface extends JFrame
{
private LinkedList<CObject> m_ObjectList;
private int printout;
private KeyAdapter m_kKeyAdapter;
private boolean[] m_baBooleanArray;
private boolean[] m_baMouseArray;
private vector2 m_v2MousePosition;
private boolean m_bIsDefined;
private int screen_width;
private int screen_height;
private Image dbImage;
private Graphics dbg;
CInterface()
{
printout=2;
m_bIsDefined=false;
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension dim = toolkit.getScreenSize();
screen_width=dim.width;
screen_height=dim.height;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("GAME");
setSize((int)CData.size.x,(int)CData.size.y);
setLocation((screen_width/2)-((int)CData.size.x/2)+310,(screen_height/2)-((int)CData.size.y/2));
setResizable(false);
if(printout>1){
setResizable(true);}
setVisible(true);
defineVariables();
createBufferStrategy(3);
}
public void defineVariables()
{
CData.insets = new vector2(getInsets().left, getInsets().top);
m_baMouseArray = new boolean[3];
m_v2MousePosition = new vector2(0,0);
m_baBooleanArray = new boolean[30];
m_ObjectList = new LinkedList<CObject>();
m_bIsDefined=true; // Frame-Grafikobjekte werden ab jetzt gepainted
}
public void paint(Graphics g) //Graphiken werden auf Frame gepaintet
{
if (m_bIsDefined)
{
for (int i=m_ObjectList.size();i>0;i--)
{
g = m_ObjectList.get(i-1).render(g);
}
}
}
public void update(Graphics g)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
dbg.setColor (getForeground());
paint(dbg);
g.drawImage (dbImage, 0, 0, this);
}
public void setObjectList(LinkedList<CObject> objectList)
{
m_ObjectList = objectList;
}
}
Bei jedem Frame wird die Funktion
Code:
public void setObjectList(LinkedList<CObject> objectList)
Funtion "run" aus Klasse CRuntime:
Java:
public void run()
{
long m_lTime = 0;
while(true)
{
m_lTime = System.currentTimeMillis();
if(true)//Pausieren entfernt
{
m_Interface.setObjectList(createObjectList());
m_Interface.repaint();
}
wait.waitms((1000/m_iFramerate)-(System.currentTimeMillis()-m_lTime));
}
}
Es werden Objekte gepaintet, die alle CObject erben:
CObject:
Java:
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
/**
* Abstrakte Klasse, Objekte dieser Klasse können gepaintet werden.
* Alle gepainteten Objekte des Spiels leiten sich von dieser Klasse ab.
*
* @author
*/
abstract class CObject
{
public vector2 m_v2Pos;
public vector2 m_v2Size;
public BufferedImage m_gfx;
public void CObject(String sFileName, vector2 v2Pos, vector2 v2Size)
{
m_v2Pos = v2Pos;
m_v2Size = v2Size;
try
{
m_gfx = ImageIO.read(new File(sFileName));
}
catch(IOException e)
{
e.printStackTrace();
}
}
public void CObject()
{
}
public Graphics render(Graphics g)
{
g.drawImage(m_gfx, (int)m_v2Pos.x, (int)m_v2Pos.y, null);
return g;
}
public void addPos(vector2 v2Pos)
{
m_v2Pos.x += v2Pos.x;
m_v2Pos.y += v2Pos.y;
}
}
Hat jemand eine Idee?