Heyho,
Bin gerade dabei Quaxli's Tutorial zum Thema Spieleprogrammierung durchzugehen. Jedoch bin ich da ein wenig anders vorgegangen. Da ich schon meine eigenen Ideen von Anfang an einbringen wollte hab ich erst einmal mit einer Klasse gearbeitet in der ich die Bewegung eines Bildes mit Hilfe der Pfeiltasten programmiert habe. Hat alles super geklappt aber es war halt noch alles in der Klasse die das JPanel darstellte. Also hab ich eine Klasse Sprite erstellt und PlayerSprite die von Sprite erbt und hab die Berechnung der Bewegung in die PlayerSprite Klasse geschrieben. Seitdem laggt die Berechnung jedoch total. Alles läuft in einem Thread der die Berechnungen durchlaufen lässt. Im Fenster gebe ich verschiedene Daten wie delta, Winkel, Geschwindigkeit usw. Delta wird "normalschnell" im Fenster gezeichnet. bei den anderen Daten sieht man jedoch schon, dass das Zeichnen dieser Daten ruckelt (Was mich wundert da ja alles nacheinander gezeichnet wird). Der Unterschied liegt jedoch darin, dass die anderen Daten aus Objekten gelesen werden. Auch in der Berechnung übergebe ich nicht mit hilfe von Methodenparametern Werte sondern lasse die anderen auf die Daten zugreifen. Und da liegt auch glaub ich der Fehler. Eben dass irgendwelche Zugriffe zu lange dauern und dadurch die Berechnung langsam wird. Bin mir aber nicht sicher. Wäre also nett wenn ihr mal über meinen Code schaun würdet und ein paar Tipps geben könntet damit sich die Performance des Programms verbessert.
Win.java
Sprite.java
PlayerSprite.java
Bin gerade dabei Quaxli's Tutorial zum Thema Spieleprogrammierung durchzugehen. Jedoch bin ich da ein wenig anders vorgegangen. Da ich schon meine eigenen Ideen von Anfang an einbringen wollte hab ich erst einmal mit einer Klasse gearbeitet in der ich die Bewegung eines Bildes mit Hilfe der Pfeiltasten programmiert habe. Hat alles super geklappt aber es war halt noch alles in der Klasse die das JPanel darstellte. Also hab ich eine Klasse Sprite erstellt und PlayerSprite die von Sprite erbt und hab die Berechnung der Bewegung in die PlayerSprite Klasse geschrieben. Seitdem laggt die Berechnung jedoch total. Alles läuft in einem Thread der die Berechnungen durchlaufen lässt. Im Fenster gebe ich verschiedene Daten wie delta, Winkel, Geschwindigkeit usw. Delta wird "normalschnell" im Fenster gezeichnet. bei den anderen Daten sieht man jedoch schon, dass das Zeichnen dieser Daten ruckelt (Was mich wundert da ja alles nacheinander gezeichnet wird). Der Unterschied liegt jedoch darin, dass die anderen Daten aus Objekten gelesen werden. Auch in der Berechnung übergebe ich nicht mit hilfe von Methodenparametern Werte sondern lasse die anderen auf die Daten zugreifen. Und da liegt auch glaub ich der Fehler. Eben dass irgendwelche Zugriffe zu lange dauern und dadurch die Berechnung langsam wird. Bin mir aber nicht sicher. Wäre also nett wenn ihr mal über meinen Code schaun würdet und ein paar Tipps geben könntet damit sich die Performance des Programms verbessert.
Win.java
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.net.URL;
import java.io.IOException;
public class Win extends JPanel implements Runnable, KeyListener
{
boolean up, down, left, right;
long last, delta;
BufferedImage[] img;
JFrame f;
PlayerSprite player;
/*
*
* Konstruktor
*
*****************************************************/
Win()
{
f = new JFrame("Frame");
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.addKeyListener(this);
f.add(this);
// Init
img = loadPics("pics/Ship1.gif", 3);
last = System.nanoTime();
player = new PlayerSprite(img, 200, 200, 100, this);
Thread start_game = new Thread(this);
f.setVisible(true);
start_game.start();
}
/*
*
* Load Pictures
*
*****************************************************/
private BufferedImage[] loadPics(String path, int pics)
{
BufferedImage[] anim = new BufferedImage[pics];
BufferedImage source = null;
URL pic_url = getClass().getClassLoader().getResource(path);
try
{
source = ImageIO.read(pic_url);
}
catch(IOException e)
{
}
for(int i=0; i<pics; i++)
{
anim[i] = source.getSubimage(i*source.getWidth()/pics, 0,
source.getWidth()/pics, source.getHeight());
}
return anim;
}
/*
*
* Main
*
*****************************************************/
public static void main(String args[])
{
new Win();
}
/*
*
* Paint
*
*****************************************************/
public void paint(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;
super.paint(g2d);
g2d.drawString("Delta: "+delta, 50, 500);
g2d.drawString("Winkel: "+player.theta, 50, 510);
g2d.drawString("x: "+player.x+" y: "+player.y, 50, 520);
g2d.drawString("Speed: "+player.speed, 50, 530);
g2d.drawString("Rotation Speed: "+player.theta_speed, 50, 540);
player.drawObject(g2d);
}
/*
*
* Do Logic
*
*****************************************************/
public void doLogic()
{
delta = System.nanoTime()-last;
last = System.nanoTime();
player.doLogic(delta);
}
/*
*
* Thread
*
*****************************************************/
public void run()
{
while(true)
{
doLogic();
repaint();
try
{
Thread.sleep(16);
}
catch(Exception e)
{
}
}
}
/*
*
* KeyListener
*
*****************************************************/
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_UP)
{
up = true;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
down = true;
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
left = true;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
right = true;
}
}
public void keyReleased(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_UP)
{
up = false;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
down = false;
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
left = false;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
right = false;
}
}
public void keyTyped(KeyEvent e)
{
}
}
Sprite.java
Java:
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
public class Sprite extends Rectangle2D.Double
{
long delay;
long animation = 0;
Win parent;
BufferedImage[] pics;
int currentpic = 0;
double x, y;
/*
*
* Konstruktor
*
*****************************************************/
public Sprite(BufferedImage[] i, double x, double y, long delay, Win p)
{
pics = i;
this.x = x;
this.y = y;
this.delay = delay;
this.width = pics[0].getWidth();
this.height = pics[0].getHeight();
parent = p;
}
/*
*
* Draw Object
*
*****************************************************/
public void drawObject(Graphics2D g)
{
}
/*
*
* Do Logic
*
*****************************************************/
public void doLogic(long delta)
{
animation += (delta/1e6);
if(animation > delay)
{
animation = 0;
computeAnimation();
move(delta);
}
}
/*
*
* Do Logic
*
*****************************************************/
public void move(long delta)
{
}
/*
*
* Compute Animation
*
*****************************************************/
private void computeAnimation()
{
if(currentpic < pics.length-1) currentpic++;
else currentpic = 0;
}
}
PlayerSprite.java
Java:
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
public class PlayerSprite extends Sprite
{
double theta;
double speed=0, theta_speed=0;
/*
*
* Konstruktor
*
*****************************************************/
public PlayerSprite(BufferedImage[] i, double x, double y, long delay, Win p)
{
super(i, x, y, delay, p);
}
/*
*
* Draw Object
*
*****************************************************/
public void drawObject(Graphics2D g)
{
g.rotate(Math.PI/180*theta,(int)x+width/2, (int)y+height/2);
g.drawImage(pics[currentpic], (int)x, (int)y, parent);
}
/*
*
* Move
*
*****************************************************/
public void move(long delta)
{
if(parent.left && !parent.right)
{
if(theta_speed>-250) theta_speed -= 10;
theta+=theta_speed*delta*1e-9;
if(theta<=0) theta += 360;
else if(theta>=360) theta -=360;
}
if(parent.right && !parent.left)
{
if(theta_speed<250) theta_speed += 10;
theta+=theta_speed*delta*1e-9;
if(theta<=0) theta += 360;
else if(theta>=360) theta -=360;
}
if(!parent.left && !parent.right || parent.left && parent.right)
{
if(theta_speed>0) theta_speed -= 5;
else if(theta_speed<0) theta_speed += 5;
if(theta_speed!=0)
{
theta+=theta_speed*delta*1e-9;
if(theta<=0) theta += 360;
else if(theta>=360) theta -=360;
}
}
if(parent.up && !parent.down)
{
if(speed<300)
{
speed += 5;
}
x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
}
if(parent.down && !parent.up)
{
if(speed>-300)
{
speed -= 5;
}
x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
}
if(!parent.up && !parent.down || parent.up && parent.down)
{
if(speed>0)
{
speed -= 2.5;
x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
}
else if(speed<0)
{
speed += 2.5;
x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
}
}
}
}