Space Invaders(KeyListener Problem)

dicestacking

Mitglied
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:
Java:
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^^:
Java:
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^^
 
B

BonesHill

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

Steev

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:

dicestacking

Mitglied
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:)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Space Invaders Spiele- und Multimedia-Programmierung 11
G suche das tutorial für den space invaders Spiele- und Multimedia-Programmierung 2
L Coordinate Space JavaFX 2d Spiel Spiele- und Multimedia-Programmierung 0
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6
J Power of Two empty space Spiele- und Multimedia-Programmierung 4
Developer_X Java3D-Ungeeignet für 3D Spiele wegen Heap Space=? Spiele- und Multimedia-Programmierung 23
J Rotieren eines 2D Images endet in Java heap space Error Spiele- und Multimedia-Programmierung 15
C Space Shooter Spiele- und Multimedia-Programmierung 11
M Space PingPong Game --> Performance ok? Spiele- und Multimedia-Programmierung 44
H Cell Invaders Applet Spiele- und Multimedia-Programmierung 99
E JAVA-INVADERS compilieren und starten Spiele- und Multimedia-Programmierung 7
B KeyListener Bug Spiele- und Multimedia-Programmierung 2
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
B Den KeyListener in einer JavaFXML Application benutzen Spiele- und Multimedia-Programmierung 2
A TileMap KeyListener - Problem Spiele- und Multimedia-Programmierung 2
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
M KeyListener Spiele- und Multimedia-Programmierung 8
T Problem mit JnR-Steuerung / KeyListener Spiele- und Multimedia-Programmierung 6
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
F Problem mit KeyListener in Applet Spiele- und Multimedia-Programmierung 4
StrikeTom KeyListener Funktioniert nicht Spiele- und Multimedia-Programmierung 3
S Ping Pong: KeyListener in Paint und while Spiele- und Multimedia-Programmierung 10
Developer_X Java "Multi"KeyListener Spiele- und Multimedia-Programmierung 15
C Anfängerfrage: Plazierung Panel im JFrame und KeyLIstener Spiele- und Multimedia-Programmierung 4
A Mit KeyListener zwei Tasten gleichzeitig abfragen Spiele- und Multimedia-Programmierung 2
T Doppel KeyListener Spiele- und Multimedia-Programmierung 16
S Probleme mit dem Licht und dem KeyListener Spiele- und Multimedia-Programmierung 2
K Jump n Run Keylistener und Schleifen Spiele- und Multimedia-Programmierung 8
M Jpanel mit Keylistener Spiele- und Multimedia-Programmierung 6
D Pfeiltasten beim KeyListener Spiele- und Multimedia-Programmierung 1
R KeyListener hält nicht mit Spiele- und Multimedia-Programmierung 14

Ähnliche Java Themen

Neue Themen


Oben