N
nitsche2
Gast
Moin,
ich bin grade dabei mir ein bisschen Java beizubringen, und probier eine Art GTA 1/2 Verschnitt zu machen, also eine Person die sich mit denn Pfeiltasten bewegen lässt.
Es funktioniert auch ganz gut soweit, das einzige Problem ist das Performance Problem. Es hackt teilweise (bei schnellen Rechnern nicht, aber bei langsamen <2Ghz).
Die ganze Sache funktioniert wie folgt. Es läuft ein Thread das Bild aktualisiert und sich nach 2 ms neu aufruft (ich brauch so wenig, sonst wirkt es nicht richtig flüssig).
In diesem Thread holt er sich die Akuellen Positionsdaten aus der Instanz Figur, die einen Thread Figur_Bewegen hat.
Bin ich auf dem Holzpfad, bzw. sollte man es komplett anders programmieren? Bin ein ziemlicher Neueinsteiger?
Hier das Programm zum Selbst-Testen (einmal auf die Fläche klicken, dann Pfeiltasten)
www.blumenallee.de/java.zip
Hab halt wenig Erfahrung, vielleicht könnt ihr mir ein paar Ansätze geben.
Vielen Dank im Vorraus Smile
ich bin grade dabei mir ein bisschen Java beizubringen, und probier eine Art GTA 1/2 Verschnitt zu machen, also eine Person die sich mit denn Pfeiltasten bewegen lässt.
Es funktioniert auch ganz gut soweit, das einzige Problem ist das Performance Problem. Es hackt teilweise (bei schnellen Rechnern nicht, aber bei langsamen <2Ghz).
Die ganze Sache funktioniert wie folgt. Es läuft ein Thread das Bild aktualisiert und sich nach 2 ms neu aufruft (ich brauch so wenig, sonst wirkt es nicht richtig flüssig).
In diesem Thread holt er sich die Akuellen Positionsdaten aus der Instanz Figur, die einen Thread Figur_Bewegen hat.
Bin ich auf dem Holzpfad, bzw. sollte man es komplett anders programmieren? Bin ein ziemlicher Neueinsteiger?
Hier das Programm zum Selbst-Testen (einmal auf die Fläche klicken, dann Pfeiltasten)
www.blumenallee.de/java.zip
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.image.BufferedImage;
import java.awt.geom.AffineTransform;
import java.io.File;
import javax.imageio.ImageIO;
import java.lang.Thread;
class Figur
{
public Thread Laufen = null ;
public Image ImageSpielfigur,ImageSpielfigurSteht;
public double DoubleGradRad;
public Figur_Bewegen BewegeVorgang;
public void TastenAuswertung( int Richtung, boolean TastenGedrueckt)
{
switch(Richtung)
{
case 39:
if(TastenGedrueckt==true)
{
BewegeVorgang.IntGradRichtung=1;
}
else
{
BewegeVorgang.IntGradRichtung=0;
}
break;
case 37:
if(TastenGedrueckt==true)
{
BewegeVorgang.IntGradRichtung=-1;
}
else
{
BewegeVorgang.IntGradRichtung=0;
}
break;
case 38:
if(TastenGedrueckt==true)
{
BewegeVorgang.IntRichtung=-1;
}else{
BewegeVorgang.IntRichtung=0;
}
break;
case 40:
if(TastenGedrueckt==true)
{
BewegeVorgang.IntRichtung=1;
}else{
BewegeVorgang.IntRichtung=0;
}
break;
}
}
class Figur_Bewegen implements Runnable
{
public Thread Laufen;
public int IntRichtung;
public int IntGrad;
public double DoubleGradRad;
public double DoublePosX=500;
public double DoublePosY=500;
public int IntGradRichtung=0;
public int IntGeschwindigkeitGrad=2;
public int IntGeschwindigkeitPosition=1;
public void run()
{
while(true)
{
try
{
IntGrad+=IntGeschwindigkeitGrad*IntGradRichtung;
DoubleGradRad=2 * Math.PI / 360 * IntGrad;
DoublePosX+=(Math.sin(DoubleGradRad)*IntRichtung*IntGeschwindigkeitPosition);
DoublePosY+=(Math.cos(DoubleGradRad)*IntRichtung*-1)*IntGeschwindigkeitPosition;
Laufen.sleep(5);
}
catch(Exception e)
{
}
}
}
Figur_Bewegen()
{
IntGrad=180;
System.out.println("ja");
Laufen=new Thread( this );
Laufen.start();
}
}
Figur()
{
ImageSpielfigur = Toolkit.getDefaultToolkit().getImage( "gesicht.gif" );
ImageSpielfigurSteht = Toolkit.getDefaultToolkit().getImage( "gesicht_steht.gif" );
BewegeVorgang=new Figur_Bewegen();
}
}
class Bild extends Canvas implements Runnable
{
private Image image,ImageOffscreen;
private Figur spieler;
public int IntFensterBreite;
public int IntFensterHoehe;
private Dimension DimensionOffscreen;
private Graphics2D Graphics2dOffscreen;
private Thread th = null ;
private Figur Spielfigur = null;
private double IntAbweichungY,IntAbweichungX = 0;
private int IntAbweichungGrad = 0;
private Font myFont;
public void TastenAuswertung( int Richtung, boolean TastenGedrueckt)
{
Spielfigur.TastenAuswertung(Richtung, TastenGedrueckt);
}
public void run()
{
}
public void paint( Graphics bild )
{
// Bild anlegen
try
{
repaint();
th.sleep(2);
}
catch(Exception e)
{
}
}
public void update(Graphics g)
{
if(Graphics2dOffscreen == null || getSize().width != DimensionOffscreen.width || getSize().height != DimensionOffscreen.height)
{
DimensionOffscreen = getSize();
ImageOffscreen = createImage(DimensionOffscreen.width, DimensionOffscreen.height);
Graphics2dOffscreen = (Graphics2D) ImageOffscreen.getGraphics();
}
Graphics2dOffscreen.clearRect((int) Spielfigur.BewegeVorgang.DoublePosX-IntFensterBreite/2-250, (int) Spielfigur.BewegeVorgang.DoublePosY-IntFensterHoehe/2-250, IntFensterBreite+500, IntFensterHoehe+500);
// Zeichenvorgang beginnen
Graphics2dOffscreen.drawImage(image,1,1,this);
Graphics2dOffscreen.drawImage(image,1,1,this);
Graphics2dOffscreen.setFont( myFont ); //Schriftart setzen
// Debug Funktionen
Graphics2dOffscreen.drawString(""+Spielfigur.BewegeVorgang.IntGrad+ "sin:"+Math.sin(Spielfigur.BewegeVorgang.DoubleGradRad)+", cos:"+Math.cos(Spielfigur.BewegeVorgang.DoubleGradRad),IntFensterBreite-250,IntFensterHoehe-50); //String rendern
Graphics2dOffscreen.drawString("x"+Spielfigur.BewegeVorgang.DoublePosX+"--y"+Spielfigur.BewegeVorgang.DoublePosY,IntFensterBreite-250,IntFensterHoehe-100); //String rendern
// Debug Ende
Graphics2dOffscreen.translate((int) Spielfigur.BewegeVorgang.DoublePosX, Spielfigur.BewegeVorgang.DoublePosY);
IntAbweichungGrad=0;
IntAbweichungGrad-=Spielfigur.BewegeVorgang.IntGrad;
Graphics2dOffscreen.rotate(Spielfigur.BewegeVorgang.DoubleGradRad);
if(Spielfigur.BewegeVorgang.IntRichtung==0)
{
Graphics2dOffscreen.drawImage(Spielfigur.ImageSpielfigurSteht,0,0,this);
}else{
Graphics2dOffscreen.drawImage(Spielfigur.ImageSpielfigur,0,0,this);
}
// Zurückverschieben
Graphics2dOffscreen.rotate(2 * Math.PI / 360 * IntAbweichungGrad);
Graphics2dOffscreen.translate((int) -Spielfigur.BewegeVorgang.DoublePosX+(IntAbweichungX-Spielfigur.BewegeVorgang.DoublePosX), -Spielfigur.BewegeVorgang.DoublePosY+(IntAbweichungY-Spielfigur.BewegeVorgang.DoublePosY));
// davor 500
// jetzt -500+(500-497)
IntAbweichungX=Spielfigur.BewegeVorgang.DoublePosX;
IntAbweichungY=Spielfigur.BewegeVorgang.DoublePosY;
paint(g);
g.drawImage (ImageOffscreen, 0, 0, this);
}
Bild()
{
// Alles initalisieren
// Nun die Spielfigur
Spielfigur=new Figur();
// Haus
image = Toolkit.getDefaultToolkit().getImage( "hintergrund.jpg" );
// Font
myFont=new Font("Arial", Font.ITALIC|Font.PLAIN, 26);
// Abweichung
IntAbweichungX=Spielfigur.BewegeVorgang.DoublePosX;
IntAbweichungY=Spielfigur.BewegeVorgang.DoublePosY;
if( th==null)
{
th = new Thread(this);
th.start();
}
}
}
public class Spiel extends JFrame
{
private Bild Bild1;
public static int IntFensterBreite=1024;
public static int IntFensterHoehe=800;
public Spiel ()
{
super("Testspiel");
// Fenster.getContentPane().setLayout( new BorderLayout(5, 5) );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( IntFensterBreite, IntFensterHoehe );
Bild1 = new Bild();
Bild1.run();
Bild1.IntFensterBreite=IntFensterBreite;
Bild1.IntFensterHoehe=IntFensterHoehe;
getContentPane().add(Bild1);
Bild1.addKeyListener( new KeyListener(){
public void keyReleased(KeyEvent k)
{
Bild1.TastenAuswertung( k.getKeyCode(), false);
}
public void keyPressed(KeyEvent k)
{
Bild1.TastenAuswertung( k.getKeyCode(), true);
}
public void keyTyped(KeyEvent k){}
});
setVisible( true );
}
public static void main( String[] args )
{
Spiel das_Spiel=new Spiel();
das_Spiel.IntFensterBreite=IntFensterBreite;
das_Spiel.IntFensterHoehe=IntFensterHoehe;
}
}
Hab halt wenig Erfahrung, vielleicht könnt ihr mir ein paar Ansätze geben.
Vielen Dank im Vorraus Smile