# Sprit ist leer bei Quaxli´s Heli Tutorial



## radiac (12. Aug 2009)

Hallo. Ich habe mir jetzt auch mal das Tutorial von Quaxli angeguckt. Ich find es echt toll. Voralle dem, das dort Sachen beschrieben werden, an die man so garnicht denkt .

Jetzt hab ich nur ein Problem. Heli wird angezeigt. Jetzt will ich den aber steuern.
Hab auch die Steuerung auf 2 verschiedene Wege eingebunden... jedoch tut sich nichts...
Meine ESC Taste, die ich dazu eingebaut habe, funktioniert aber... also kann es nicht am KeyListener() liegen oder?   Hier mal mein Code:


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gamepanel;

/**
 *
 * @author Radiac
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;


public class GamePanel extends JPanel implements Runnable{

    private static final long serialVersionUID = 1L;
    boolean game_running = true;
    // Screenabmessung
    static int w;
    static int h;
    
    // FPS Messung
    long delta =0;
    long last =0;
    long fps = 0;

    // BilderNamen Deklarieren
   Sprite copter;
   Vector<Sprite> actors;

// Toolbox laden für Desktop Screenabmessung
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension scrDim= tk.getScreenSize();

// Steuerung Instanzieren
boolean up  =   false;
boolean down =  false;
boolean left =  false;
boolean right = false;
int speed = 50;

public  GamePanel(){

    this.setPreferredSize(new Dimension(scrDim));
   
    JFrame frame = new JFrame("Game");
    frame.setLocation(0,0);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setUndecorated(true);
    frame.setIgnoreRepaint(false);
    frame.setResizable(false);
    frame.add(this);
    frame.pack();
    frame.setVisible(true);

    //Keyzeugs
    frame.addKeyListener(new MyKeyListener());

    // Ablesen der Screenmaße wxh
    w=scrDim.height;
    h=scrDim.width;
    doInitializations();
    }// Ende GamePanel

public static void main (String[] args){

    new GamePanel();          
}

    private void doInitializations() {
        
        
        BufferedImage[] heli = this.loadPics("pics/heli.gif", 4);
        
        last = System.nanoTime();
        
        actors = new Vector<Sprite>();
        copter = new Sprite(heli,800,600,100,this);
        actors.add(copter);

        Thread t = new Thread(this);
        t.start();
  
    }


    public void run() {

        while (game_running){

            computeDelta();
            checkKeys();
            doLogic();
            moveObjects();
            
            repaint();

            try {
                Thread.sleep(10);
            }catch (InterruptedException e) {}
        }
    }

    private void computeDelta() {

        delta = System.nanoTime() - last;
        last = System.nanoTime();

        fps = ((long) 1e9)/delta;
    }

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

        g.setColor(Color.black);
        g.drawString("FPS:" +Long.toString(fps), 20, 20);
        g.drawString("Aktuelle Auflösung: " +w+"x"+h, 20, 40);// Zeigt Aktuelle Screenabmessung an.

        if(actors!=null){
        for(Drawable draw:actors){
        draw.drawObjects(g);
            }
        }
    }

    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 x=0;x<pics;x++){
    anim[x] = source.getSubimage(x*source.getWidth()/pics, 0,
    source.getWidth()/pics,source.getHeight());

    }

    return anim;

    // Steuerung Instanzieren

    }
  
    private void checkKeys() {
        // Steuerung Instanzieren
        if(up){
            copter.setVerticalSpeed(-speed);
        }

        if(down){
            copter.setVerticalSpeed(speed);
        }

        if(right){
            copter.setVerticalSpeed(speed);
        }

        if(left){
            copter.setVerticalSpeed(-speed);
        }

        if(!up&&!down){
            copter.setVerticalSpeed(0);
        }

        if(!left&&!right){
            copter.setVerticalSpeed(0);
        }
    }

        private void doLogic(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }
    }

    private void moveObjects(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }
    }
    
    class MyKeyListener extends KeyAdapter{
// e = (event)
        @Override
    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;
        }
        if(e.getKeyCode() == KeyEvent.VK_ESCAPE){

            setVisible(false);
            System.exit(0);
        }

    }

        @Override
    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;
         }
        }

    }
}
```

Eine Exception gibt es nicht. Ein Hinweis vielleicht noch... ich habe anstatt ein JFrame Fenster ein Fullscreen eingebaut...
Woran kann das liegen das der Heli nicht fliegt??? Sprit leer? 

Greetz Radiac


Hier die Dateien File-Upload.net - GamePanel.rar


----------



## TheChemist (12. Aug 2009)

Naja, so auf Anhieb würde ich sagen die veränderst die bewegungs-booleans ja nur in deiner MyKeyListener-Klasse, fragst sie aber in deinem GamePanel ab, das klappt natürlich nicht. Oder habe ich was überlesen? Warum gehst du überhaupt den Weg über einen "eigenen" KeyListener und implementierst den nicht einfach direkt ins GamePanel?


----------



## radiac (12. Aug 2009)

Hi, und danke erstmal für deine Hilfe .



TheChemist hat gesagt.:


> Naja, so auf Anhieb würde ich sagen die veränderst die bewegungs-booleans ja nur in deiner MyKeyListener-Klasse, fragst sie aber in deinem GamePanel ab, das klappt natürlich nicht.



Wieso das denn? Ich arbeite doch mit den den gleichen Zuweisungen up,down,left,right...

Wie soll ich das denn anders machen? Woanders einsetzen? Oder gar eine seperate Klasse? Ich arbeite nach einem Tutorial von Quaxli. Da sieht das bis auf ein paar Kleinigkeiten gleich aus. DIe Frage ist natürlich, ob es da funktioniert, da ich es nicht testen kann.



TheChemist hat gesagt.:


> Warum gehst du überhaupt den Weg über einen "eigenen" KeyListener und implementierst den nicht einfach direkt ins GamePanel?



Wollte nur Testen, ob das daran liegt. Habs Mitterweile wieder umbeschrieben...

Aktuell sieht es so aus... und keine Bewegung... 


```
package gamepanel;

/**
 *
 * @author Radiac
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;


public class GamePanel extends JPanel implements Runnable, KeyListener{

    private static final long serialVersionUID = 1L;
    boolean game_running = true;
    // Screenabmessung
    static int w;
    static int h;
    
    // FPS Messung
    long delta =0;
    long last =0;
    long fps = 0;
    // BilderNamen Deklarieren
   Sprite copter;
   Vector<Sprite> actors;

   public static void main (String[] args){

    new GamePanel();
}
   
// Toolbox laden für Desktop Screenabmessung
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension scrDim= tk.getScreenSize();


// Steuerung Instanzieren
boolean up  =   false;
boolean down =  false;
boolean left =  false;
boolean right = false;
int speed = 50;

public  GamePanel(){

    this.setPreferredSize(new Dimension(scrDim));
   
    JFrame frame = new JFrame("Game");
    frame.setLocation(0,0);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setUndecorated(true);
    frame.setIgnoreRepaint(false);
    frame.setResizable(false);
    frame.add(this);
    frame.pack();
    frame.setVisible(true);
    //Keyzeugs
    frame.addKeyListener(this);
    // Ablesen der Screenmaße wxh
    w=scrDim.height;
    h=scrDim.width;
    doInitializations();
    }// Ende GamePanel


private void doInitializations() {

        last = System.nanoTime();

        actors = new Vector<Sprite>();
        BufferedImage[] heli = loadPics("pics/heli.gif", 4);
        copter = new Sprite(heli,400,300,100,this);
        actors.add(copter);

        Thread t = new Thread(this);
        t.start();
    }


    public void run() {

        while (game_running){

            computeDelta();
            checkKeys();
            doLogic();
            moveObjects();
            
            repaint();

            try {
                Thread.sleep(10);
            }catch (InterruptedException e) {}
        }
    }

    private void computeDelta() {

        delta = System.nanoTime() - last;
        last = System.nanoTime();

        fps = ((long) 1e9)/delta;
    }

    

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

        g.setColor(Color.black);
        g.drawString("FPS:" +Long.toString(fps), 20, 20);
        g.drawString("Aktuelle Auflösung: " +w+"x"+h, 20, 40);

        if(actors!=null){
        for(Drawable draw:actors){
        draw.drawObjects(g);
            }
        }
    }
    
private void checkKeys()
    {
        if (up)
            copter.setVerticalSpeed(-speed);
        if (down)
            copter.setVerticalSpeed(speed);
        if (right)
            copter.setHorizontalSpeed(speed);
        if (left)
            copter.setHorizontalSpeed(-speed);
        if (up && down)
            copter.setVerticalSpeed(0);
        if (left && right)
            copter.setHorizontalSpeed(0);
    }

    private void doLogic(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }
    }

    private void moveObjects(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }
}


    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 x=0;x<pics;x++){
    anim[x] = source.getSubimage(x*source.getWidth()/pics, 0,
    source.getWidth()/pics,source.getHeight());

    }
    return anim;
}

        // e = (event)
    public void keyTyped(KeyEvent e) {

    }

    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;
    }

   

}
```


Gruß Radiac


----------



## radiac (13. Aug 2009)

Kann mir niemand helfen?


----------



## leibimatZe (13. Aug 2009)

Hm so beim drüberschaun hab ich nichts ungewöhnliches gefunden. Poste doch mal deine Klasse in der setVerticalSpeed und horiz. speed ausprogrammiert sind.

grüße


----------



## radiac (13. Aug 2009)

Das ist die Sprite.class


```
package gamepanel;

/**
 *
 * @author Radiac
 */
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;


public class Sprite extends Rectangle2D.Double implements Drawable, Movable{

    long delay;
    long animation = 0;

    protected double dx;
    protected double dy;

    GamePanel parent;
    BufferedImage[] pics;
    int currentpic=0;
    public Sprite(BufferedImage[] i, double x, double y, long delay, GamePanel p){
        pics = i;
        this.x = x;
        this.y = y;
        this.delay = delay;
        this.width = pics[0].getWidth();
        this.height = pics[0].getHeight();
        parent = p;
    }

    public void drawObjects(Graphics g) {

        g.drawImage (pics[currentpic],(int) x,(int) y, null);

    }
    public void doLogic (long delta) {

        animation += (delta/1000000);
        if (animation > delay) {
            animation = 0;
            computeAnimation();
        }
    }
    public void move(long delta) {

        if(dx!=0){
            x += dx*(delta/1e9);
        }
        
        if(dy!=0){
            y += dy*(delta/1e9);
        }

    }

    private void computeAnimation() {

        currentpic++;

        if(currentpic>= pics.length){
            currentpic = 0;
        }
    }


    public void setVerticalSpeed(double d) {

        dy = d;

    }

    public void setHorizontalSpeed(double d) {
        dx = d;

    }

    public double getVerticalSpeed(){
        return dy;
    }
    public double getHorizontalSpeed(){
        return dx;
    }
}
```

Ziemlich weit unten ist dann die setVerticalSpeed() Methode...


----------



## leibimatZe (13. Aug 2009)

Erstmal machst du aus


```
if (up && down)
            copter.setVerticalSpeed(0);
        if (left && right)
            copter.setHorizontalSpeed(0);
```

->

```
if (!up && !down)
            copter.setVerticalSpeed(0);
        if (!left && !right)
            copter.setHorizontalSpeed(0);
```

wenns dann net geht sagst nochmal bescheid finde grad eigtl nix was net passt aber is auch früh am morgen!


----------



## Steev (13. Aug 2009)

Debugge mal das ganze und gucke, was für einen Wert die Variable delta hat, wenn hier ein kleinerer Wert vorliegt, dann kommt das ganze einer Nullmultiplikation gleich.


----------



## leibimatZe (13. Aug 2009)

Steev hat gesagt.:


> Debugge mal das ganze und gucke, was für einen Wert die Variable delta hat, wenn hier ein kleinerer Wert vorliegt, dann kommt das ganze einer Nullmultiplikation gleich.



Delta dürfte eigtl nicht null sein, das hiese ja dass keine Zeitdifferenz zwischen beiden computeDelta()-Aufrufen vorliegt und sobal ne kleine vorliegt sind wir bei 0.001... also sollte multiplikation möglich sein und wenns so gering ist dass man es beim bewegen nacher net sieht dann kann er auch ma ne halbe stunde auf ne taste drücken und bewegung sehn haha xD


----------



## radiac (13. Aug 2009)

leibimatZe hat gesagt.:


> Erstmal machst du aus
> 
> 
> ```
> ...




Passiert leider immer noch nichts.


Der Deltawert ist 156xxxxx  x= variiert schnell mit FPS.


----------



## leibimatZe (13. Aug 2009)

also was ich gesehen hab sollte es gehen kann dir da grad net weiterhelfen hab dafür auch net so die Zeit momentan.. sorry! 
Entweder du gehst es nochmal in ruhe durch und verglecihst mit dem Quellcode ausm Tutorial oder, was mir damals geholfen hat... fang einfach in Ruhe bei dem Tutorial von vorne an und machs wie es drin steht damit du verstehst was du machst.. anschliessend kannst du es an deine Wünsche anpassen!


----------



## Spacerat (13. Aug 2009)

Was passiert denn, wenn du bei "doLogic(long delta)" double statt long verwendest? Immerhin kann "delta / 1000000" glatt "0" ergeben.


----------



## radiac (13. Aug 2009)

Was passiert denn, wenn du bei "doLogic(long delta)" double statt long verwendest? Immerhin kann "delta / 1000000" glatt "0" ergeben.

Dann sagt mir die IDE, das die GamePanel nicht abstract ist. ;(


----------



## Spacerat (13. Aug 2009)

Ach verdammt... stimmt. Dann müsste man sich mal die Änderung von "animation" ansehen. Solange sich dieser Wert nicht ändert ist "1000000" offenbar zu hoch gewählt.


----------



## radiac (13. Aug 2009)

Mich wundert ein bisschen das in diesem Forum noch mindestens 3 andere dieses Tutorial durch machen (gemacht) haben, und nicht die gleichen Probleme haben wie ich.

Hab das Tutorial auch mal 1 zu 1 kopiert... aber nichts... liegt da vielleicht sogar an Netbeans?

Ich werde das jetzt nochmal abschreiben... wenn es dann nicht geht... versuche ich mal meine variante von einer movemethode... jedoch ist die im Tutorial schon irgendwie besser, weil sie die Geschwindigkeit mit den Fps anpasst und somit unnötige lags vermieden werden.

Wäre aber trotzdem super froh, wenn einer das Zauberwort hätte, damit es mit Quaxli´s version funktioniert.

Meine Version ist viel zu unausgereift.


----------



## radiac (13. Aug 2009)

Hmm... will doch noch nicht aufgeben...

Ich habe jetzt mal getestet, ob der KeyListener funktioniert... 

Ergebnis... sobald ich "up" drücke, schreibt mein String von vorher up= false dann up=true.
Das geht natürlich auch bei den restlichen tasten...
Somit ist ausgeschlossen, das ich einen Fehler habe beim KeyListener...

Dann wurde ja noch ein Objekt "Speed" erzeugt, das mit dem Wert 50 versehen ist.
Wenn ich ihn im Spiel auswerte, steht da, egal welche Taste ich drücke Speed=50.
Ich denke mal auch das muss sein...

Also muss der Fehler ja hier irgendwo stecken:


```
boolean up  =   false;
boolean down =  false;
boolean left =  false;
boolean right = false;
int speed = 50;

private void checkKeys()
    {
        if (up)
            copter.setVerticalSpeed(-speed);
        if (down)
            copter.setVerticalSpeed(speed);
        if (right)
            copter.setHorizontalSpeed(speed);
        if (left)
            copter.setHorizontalSpeed(-speed);
        if (up && down)
            copter.setVerticalSpeed(0);
        if (left && right)
            copter.setHorizontalSpeed(0);
    }

    private void doLogic(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }
    }

    private void moveObjects(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }
}
```

Ich versuche mal weiter, nach der Ursache zu forschen... und wenn ich bis Morgenfrüh davor Sitze... . Der einzige Vorteil an der Sache ist, das ich mehr über KeyListener und  moveFunktionen weis, als je zuvor...

Update meiner Analyse folgt. Wenn jemand schon ein Fehler sieht, bitte sofort schreiben... vielen Dank!

Hier ein Screenshot wie das momentan aussieht inkl. den Werten die ich bisher rausfinden konnte...

In Groß: http://www.pictureupload.de/originals/pictures/130809155210_Image1.png


----------



## Spacerat (13. Aug 2009)

Ich sehe es grad nicht und Quaxlis Tut ist schon Monate her. Aber wo wird eigentlich dieses "delta", welches an "doLogic()" übergeben wird erzeugt, gesetzt, verändert?


----------



## babuschka (13. Aug 2009)

Der Delta-Wert wird in computeDelta() berechnet und gibt in Nanosekunden an, wie lange ein Schleifendurchlauf benötigt. 


Das mit dem 
	
	
	
	





```
if (!up && !down)
            copter.setVerticalSpeed(0);
        if (!left && !right)
            copter.setHorizontalSpeed(0);
```
solltest Du allerdings übernehmen: Es dient dazu, den Heli wieder anzuhalten.

Wird der Heli eigentlich animiert oder ist auch hier nichts zu sehen?


----------



## radiac (13. Aug 2009)

Ich glaube, das evt. hier was nicht stimmt...


```
public void move(long delta) {

        if(dx!=0){
            x += dx*(delta/1e9);
        }
        
        if(dy!=0){
            y += dy*(delta/1e9);
        }

    }
```


Zu deiner Frage...


```
public void doLogic (long delta) {

        animation += (delta/1000000);
        if (animation > delay) {
            animation = 0;
            computeAnimation();
        }
    }
```

Ich glaube, das was ich oben denke hängt damit zusammen...

Was ich nicht verstehe ist, was bedeutet im oberen Javacode das "1e9"? Sieht aus wie ein 1 hoch 9???? Oder ist das UniCode???

Ich kann sowas in der Art in meinen Büchern nicht finden... :rtfm:


----------



## radiac (13. Aug 2009)

JohnMcLane hat gesagt.:


> Wird der Heli eigentlich animiert oder ist auch hier nichts zu sehen?



Ja, der Heli wird dauerhaft animiert. 

Das mit den ! ist doch gesichert, weil ich ja auch die KeyReleased() Methode drinne habe, die dann sagt, if(up)== ect... dann up=false...

Oder soll man sowas allgemein machen??? 


Zitat aus dem Tutorial:[Zeile 44: computeDelta().Hier werden wir die Zeit für den jeweils vorhergehenden
Schleifendurchlauf errechnen.

Das Interface enthält 2 Methoden zum Bewegen unserer Objekte: Die Methode
move(long delta) für die eigentliche Bewegung und die Methode doLogic(long delta)
für Logikoperationen, wie z. B. Kollisionserkennung, etc.]

Diese move (long delta) usw... wurden in 2 Interfaces eingebaut... die interfaces habe ich im selben paket gelagert, wo auch die anderen klassen sind.... Daran kann es nicht liegen oder?

INERFACES=

```
package gamepanel;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Radiac
 */

import java.awt.Graphics;


public interface Drawable {

    public void drawObjects(Graphics g);

}
```


```
package gamepanel;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Radiac
 */
public interface Movable {

    public void doLogic(long delta);

    public void move (long delta);
}
```


----------



## radiac (13. Aug 2009)

Ich finde einfach keinen Fehler. ;(

Hab das Tutorial jetzt nochmal Zeile für Zeile verglichen und den Text dazu Stück für Stück nachvollzogen...

Die einzigen Fehlerquellen könnten nur noch beim casten sein von den x und y Parametern bei der "DrawObjects" Methode... aber die ist doch nur fürs anzeigen ausschlaggebend und nicht für die Positionierung vom Bild... oder?

Denn x und y werden von (soweit ich weis double Werten) auf int Werte gebrochen...

Und was ich auch nicht verstehe ist das hier: [ZITAT aus Tutorial]: Innerhalb der Methode doLogic hinterlegen wir vorerst nur den Code für die
Animation des Objektes. Später werden wir hier zusätzlichen Code einbauen. Da wir
hier die Zeit kumulieren müssen, legen wir uns eine weitere Instanzvariable namens
animation an.

Was bedeutet "kumulieren"??? Etwa umwandeln von double in long Werte? Deshlabt vielleicht auch 1e9???

Meine Bücher behandeln das "herab wandeln" von Werten ziemlich oberflächlich wenn sowas auch dazu gehört.

Das man long werde in int werte umwandeln kann aber anders herum nicht (was logisch ist)... das weis ich ja... natürlich gilt das Wissen auch für die double Werte.


----------



## radiac (13. Aug 2009)

Huhu...

Hab was neues rausgefunden... und zwar habe ich festgestellt, wenn ich up, down oder so drücke, ist der Wert dx, 50.0 oder eben -50.0... ect...

Kann es sein, das es daran liegt???


Jetzt bekomme ich aber die Exception:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at gamepanel.GamePanel.paintComponent(GamePanel.java:127)
        at javax.swing.JComponent.paint(JComponent.java:1027)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1036)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1036)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:277)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1217)
        at javax.swing.JComponent.paint(JComponent.java:1013)
        at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
        at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
        at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
        at java.awt.Container.paint(Container.java:1762)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


----------



## babuschka (13. Aug 2009)

So, habe den Fehler vermutlich gefunden:


```
private void moveObjects(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }

private void doLogic(){
    for(Movable mov:actors){
    mov.doLogic(delta);
    }
    }
```

So können die Objekte nie bewegt werden. Die moveObjects-Methode sollte folgendermaßen aussehen: 


```
private void moveObjects(){
		for(Movable mov:actors){
			mov.move(delta);
		}
	}
```


----------



## Spacerat (13. Aug 2009)

...das isset wohl... ist mir gar nicht aufgefallen. Naja, wenns dem TS nicht mal beim 2. Versuch auffällt müssen sich die restlichen Quaxli-Tut-Absolventen die es auch hätten erkennen müssen umso weniger dafür schämen.
@Edit: siehe Quaxli-Tut Tutorial/src/GamePanel.java Ab Zeile 207.


----------



## radiac (13. Aug 2009)

Oh man... Super xD. Funktioniert

Ich bedanke mich bei euch allen... ich war echt verzweifelt. Und wegen so einem kleinen Fehler... obwohl es auch so richtig im Tutorial steht.

Da kann ich nur wieder sagen... wer lesen kann ist klar im Vorteil... 

Naja... wieder was draus gelernt... LESEN!!!!!  :toll:

Ich hoffe, das ich euch wenigstens en bissl gefordert habe. Es kann aber auch sein, das NetBeans nach dem .einfach die erste mögliche Option einfach reingesetzt hat anstatt move... (ich weis... faule Ausrede).

DANKE DANKE DANKE !!! :applaus:


// EDIT: Das Witzige an der Sache ist, das ich diesen Quellcode eigentlich genau so übernommen habe... und lediglich nur die noch nicht gecodeten Zeilen gelöscht habe... hab vielleicht auch zuviel gelöscht...

Wenigstens verstehe ich jetzt ganz genau wieso er dies und jenes gemacht hat... Was ich beim Starten des Tutorials nicht verstanden habe


----------



## Spacerat (13. Aug 2009)

radiac hat gesagt.:


> ...wer lesen kann ist klar im Vorteil...


Den Schuh zieh' ich mir auch an. Und ausserdem... \/\/


----------



## radiac (13. Aug 2009)

xD Ich hab jetzt ein büschel weisse Haare am Kopf wegen der Sache  :shock:


----------



## TKing (8. Sep 2009)

Hallo,

habe zwar nicht so viel Erfahrung, aber was mir neu ist, ist das mit dem mov:akteur oder so. kA wie das funktioniert und warum man das genau macht.

Ich kann nämlich kein Bild anzeigen lassen:
folgender Grund:
	@Override
	public void paintComponent(Graphics g)//Frames anzeigen(*)
	{
		super.paintComponents(g);

		g.setColor(Color.red);
		g.drawString("FPS: "+Long.toString(fps),0,10);

		if(akteur!=null)
		{

			for(Drawable draw:akteur)
			{
				draw.drawObject(g);
			}
		}
	}

Der akteur kalppt nicht. Immer rot unterschlängelt und die Meldung heißt:
Type missmatch:connot convert form element type Sprite to Drawable

Aber warum nicht?:autsch:

Bis jetzt kann hab ich noch nicht viel davon gemacht und will das Heli spiel ummodellieren in ein eigenes Game. Also bis jetzt hab ich nur das Fenster anzeigen lassen und die Grafik eingebunden. Mehr noch nicht.
FPS (ca. 170fps)werden im Fenster angezeigt(wenn der oben angegebene Part auskommentiert ist) jedoch das Bild nicht.

Noch eine Frage zum Bild:
Wenn man nur ein BIld hat mit 30*30 px geht das dann so in der

BufferedImage[] bomber = this.loadImage("pic/bomber.gif",1);?

Also ich weiß wirklich nicht weiter

Hoffe jemand kann mir hier helfen^^


----------



## Quaxli (8. Sep 2009)

1. für eigene Probleme eigene Threads erstellen
2. Wenn man abweichende Namen verwendet, sollte man sicherstellen, daß man nicht durcheinander kommt.

:rtfm::rtfm::rtfm:


----------

