# Space Invaders(KeyListener Problem)



## dicestacking (8. Jun 2010)

ich habe beschlossen, dass spiel space invaders ganz simpel in einem JFrame mit einem Panel und einem Button(start) zu programmieren. ich bin jetzt so weit, dass ich mein raumschiff(weisse polygonlinie) in einem schwarzen panel habe. um das raumschiff horizantal bewegen zu können habe ich einen keylistener eingebaut, und das das ganze funzt habe ich mir gedacht brauche ich sicher einen thread der paralell immer lauft.

so jetzt das problem:
wenn ich das programm starte passiert wenig...
ich sehe einen schwarzen bilsschirm mit einem wessen raumschiff, so weit so gut, aber das raumschiff lässt sich leider nicht mit meinen pfeiltasten bewegen -.- .

es wäre nett wenn mir jemand helfen könnte.

hiermal meine keypressed methode:

```
public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode()==KeyEvent.VK_RIGHT) schiffPosx = schiffPosx +5;
        if(e.getKeyCode()==KeyEvent.VK_LEFT)  schiffPosx = schiffPosx -5;
    }
```

und heir mein ganzes programm^^:

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Graphik extends javax.swing.JFrame implements Runnable, KeyListener
{
    private Thread t;
    private Graphics gRaumschiff;

    private int panbreite;
    private int panhoehe;
    private int [] arx;
    private int [] ary;
    private int schiffPosx;
    private int schiffPosy;
    

    
    public Graphik()
    {
        initComponents();
        t = new Thread(this);
        gRaumschiff = panFlaeche.getGraphics();

        panFlaeche.setBackground(Color.black);

        panbreite = panFlaeche.getWidth();
        panhoehe = panFlaeche.getHeight();
        schiffPosx = panFlaeche.getWidth()/2;
        schiffPosy = panFlaeche.getHeight()-35;
        
        
    }

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

        btnStart = new javax.swing.JButton();
        panFlaeche = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        btnStart.setText("Start");
        btnStart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                onClickStart(evt);
            }
        });
        getContentPane().add(btnStart, java.awt.BorderLayout.PAGE_END);

        panFlaeche.setBackground(new java.awt.Color(0, 0, 0));

        javax.swing.GroupLayout panFlaecheLayout = new javax.swing.GroupLayout(panFlaeche);
        panFlaeche.setLayout(panFlaecheLayout);
        panFlaecheLayout.setHorizontalGroup(
            panFlaecheLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        panFlaecheLayout.setVerticalGroup(
            panFlaecheLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 277, Short.MAX_VALUE)
        );

        getContentPane().add(panFlaeche, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>

    private void onClickStart(java.awt.event.ActionEvent evt)                                         
    {                                             
        t.start();
    }                                        

    
    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new Graphik().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton btnStart;
    private javax.swing.JPanel panFlaeche;
    // End of variables declaration

    public void run()
    {
        for(int i = 0;i==0;)
        {
            berechneRaumschiff();
            gRaumschiff.setColor(Color.WHITE);
            gRaumschiff.drawPolyline(arx, ary, arx.length);
            try
            {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                Logger.getLogger(Graphik.class.getName()).log(Level.SEVERE, null, ex);
            }
            

            
        }
    }

    public void keyTyped(KeyEvent e)
    {
        
    }

    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode()==KeyEvent.VK_RIGHT) schiffPosx = schiffPosx +5;
        if(e.getKeyCode()==KeyEvent.VK_LEFT)  schiffPosx = schiffPosx -5;
    }

    public void keyReleased(KeyEvent e)
    {
        
    }
    public void berechneRaumschiff()
    {
        int [] helpx = {schiffPosx,schiffPosx-10,schiffPosx-10,schiffPosx-25,schiffPosx-25,schiffPosx-30,schiffPosx-35,schiffPosx-35,schiffPosx+35,schiffPosx+35,schiffPosx+30,schiffPosx+25,schiffPosx+25,schiffPosx+10,schiffPosx+10,schiffPosx};
        int [] helpy = {schiffPosy-30,schiffPosy,schiffPosy+10,schiffPosy+10,schiffPosy,schiffPosy-10,schiffPosy,schiffPosy+30,schiffPosy+30,schiffPosy,schiffPosy-10,schiffPosy,schiffPosy+10,schiffPosy+10,schiffPosy,schiffPosy-30};
        arx = helpx;
        ary = helpy;
    }

}
```

Danke im voraus

wenn mir jemand andere tipps geben könnte, wie ich mich leichter tue wäre ich natürlich sicherlich auch nicht böse^^


----------



## BonesHill (8. Jun 2010)

Ich glaube deine X und Y Koordinaten des Raumschiffes müssen static sein. Weiss es aber nicht genau *_*


----------



## Steev (8. Jun 2010)

Man speichert keine Graphics-Objekte. Das ist schon vom Grundsatz her falsch.
Mir scheint, dass du von der Grundsätzlichen Repaint-Schleife noch nichts gehört hast?
Vieleicht solltest du dir mal das Spiele-Tutorial von Quaxli ansehen, da steht alles drin, was du brauchst.

Grundsätzlich solltest du das ganze irgendwie anders aufbauen.
Das Raumschiff sollte eine eigene Klasse sein und das Polygon, die Position und die Transformation beinhalten. Die Spielfläche sollte eine andere Klasse sein, die mit deiner Raumschiffklasse arbeitet.
Alles in einer Klasse ist zwar nicht zwingend falsch, aber auf jedem Fall zu umständlich...

Dein Panel muss immer dann neu gezeichnet werden, wenn sich etwas im Bild verändert, wenn dein Panel nicht neugezeichnet wird, dann hast du ein Standbild, auch wenn dein Raumschiff sich eigendlich bewegt, oder wenigstens bewegen müsste ;-)

PS: Gezeichnet wir übrigens in der paint bzw. paintComponent-Methode!

Gruß
Steev


----------



## dicestacking (8. Jun 2010)

hmm, ok danke nochmals, dann wird mir nichts mehr anderes übrig bleiben als das ganze nochmals zu überdenken... und ich werde mir auch das tut von quaxli anschauen danke nochmals. du warst mir eine große hilfe, ich werde dieses topik mal als erledigt markieren.

thx@all


----------

