Erste Schritte MiniProgramm

mock789

Aktives Mitglied
Hi,

ich würde gern ein kleines Programm schreiben. Ich hoffe zumindest, dass es klein ist???:L

Ich bin absoluter Java Einsteiger und habe mir bisher erst ein Grundlagen Tutorial (Video2Brain - 7 Stunden) angeschaut in dem die wichtigsten Java Elemente behandelt wurden.

Ich würde jetzt einfach nur gerne einen Oberfläche programmieren die irgendeine Farbe hat ( z.B. schwarz) und irgendeinen Punkt darauf den ich mit Hilfe der Cursor Tasten bewegen kann.

Hat irgendjemand ne Idee wie ich damit anfang?


Wäre für Anregungen sehr dankbar!!!:toll:
 

epitox

Mitglied
Ich würde nicht gleich mit so einem Spiel anfangen.
Das ist nämlich schon vergleichsweise komplex.

Versuch dich doch erst an simplen Ein-/Ausgabe-Programmen, die irgendwas berechnen oder Daten in einem Feld oder einer Tabelle ablegen.

Dann kannst du dich so langsam EventListener etc. nähern, die du für dein Spiel brauchen wirst ;)
 

Aphrim

Mitglied
Hey ich habe gedacht ich schreib dir mal ein Beispiel, hier hast du ein Fenster mit schwarzem Hintergrund mit einem weißen Punkt den du mittels Pfeiltasten bewegen kannst. Vielleicht hilft es dir.

Java:
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Punkt extends Frame{//von Frame erben lassen

	private int x=100,y=100;

	public Punkt() {
		setSize(500,500); // größe des Fensters festlegen
		setBackground(Color.BLACK); //hintergundfarbe festlegen
		addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt
			@Override
			public void keyPressed(KeyEvent e) {
				//die Änderungen wenn man eine Pfeiltaste drückt
				switch(e.getKeyCode()){
				case KeyEvent.VK_ESCAPE: dispose(); break;
				case KeyEvent.VK_LEFT: x -= 2; break;
				case KeyEvent.VK_RIGHT: x += 2; break;
				case KeyEvent.VK_UP: y -= 2; break;
				case KeyEvent.VK_DOWN: y += 2; break;
				}
				repaint();//Bildschirm neu zeichnen
			}
		});
		
	}
	
	@Override
	public void paint(Graphics g) {//Fenster zeichnen
		g.setColor(Color.WHITE);//farbe für das Objekt setzen
		g.fillOval(x, y, 30, 30);//Kreis malen an position x,y und größe festlegen
	}
	
	public static void main(String[] args) {
		new Punkt().setVisible(true);//Fenster erzeugen

	}

}
 

mock789

Aktives Mitglied
Ich hab mit deinem Code in Zeile 9 ein Problem.

Hier zeigt mir der Compiler an "Class Punkt is Public, should be declared in a file named punkt.java"

Was muss ich machen, damit der Code läuft???



Java:
package punkt.java;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
public class Punkt extends Frame{//von Frame erben lassen
 
    private int x=100,y=100;
 
    public Punkt() {
        setSize(500,500); // größe des Fensters festlegen
        setBackground(Color.BLACK); //hintergundfarbe festlegen
        addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt
            @Override
            public void keyPressed(KeyEvent e) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch(e.getKeyCode()){
                case KeyEvent.VK_ESCAPE: dispose(); break;
                case KeyEvent.VK_LEFT: x -= 2; break;
                case KeyEvent.VK_RIGHT: x += 2; break;
                case KeyEvent.VK_UP: y -= 2; break;
                case KeyEvent.VK_DOWN: y += 2; break;
                }
                repaint();//Bildschirm neu zeichnen
            }
        });
        
    }
    
    @Override
    public void paint(Graphics g) {//Fenster zeichnen
        g.setColor(Color.WHITE);//farbe für das Objekt setzen
        g.fillOval(x, y, 30, 30);//Kreis malen an position x,y und größe festlegen
    }
    
    public static void main(String[] args) {
        new Punkt().setVisible(true);//Fenster erzeugen
 
    }
 
}
 

mock789

Aktives Mitglied
Du musst den Quelltext in der Datei Punkt.java abspeichern und dann kompilieren.

Steht ja auch so in der Fehlermeldung.



Oh mann... Anfänger sein kann echt peinlich sein:lol:


Jetzt kommt gleich das nächste Problem... die Fenster kann ich nicht mehr schliessen (was zu erwarten war), aber ich kann sie auch nicht mit Alt + F4 oder sonst was schließen???:L

Irgendeine Idee:autsch:
 
G

Gast2

Gast
Statt von Frame von JFrame ableiten und die DefaultCloseOperation setzen:
Java:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 

mock789

Aktives Mitglied
Oh mann... Anfänger sein kann echt peinlich sein:lol:


Jetzt kommt gleich das nächste Problem... die Fenster kann ich nicht mehr schliessen (was zu erwarten war), aber ich kann sie auch nicht mit Alt + F4 oder sonst was schließen???:L

Irgendeine Idee:autsch:

Hab ne Möglichkeit gefunden die Fenster direkt im Compiler zu schliessen... Schätze das reicht erstmal...
Es sei denn jemand hat ne elegantere Idee (per Tastenkombination z.B:)?
 

KingOfExceptions

Bekanntes Mitglied
Passiert denn nichts wenn du auf ESCAPE auf deiner Tastatur drückst?

Immerhin ist ja diese Zeile dafür 'zuständig' :
Java:
case KeyEvent.VK_ESCAPE: dispose(); break;

Ansonsten, wenn du willst, dass das Programm beendet wird, änderst du das so:
Java:
case KeyEvent.VK_ESCAPE: System.exit(-1);

Oder hab ich deine Frage falsch verstanden? ???:L
 

mock789

Aktives Mitglied
Passiert denn nichts wenn du auf ESCAPE auf deiner Tastatur drückst?

Immerhin ist ja diese Zeile dafür 'zuständig' :
Java:
case KeyEvent.VK_ESCAPE: dispose(); break;

Ansonsten, wenn du willst, dass das Programm beendet wird, änderst du das so:
Java:
case KeyEvent.VK_ESCAPE: System.exit(-1);

Oder hab ich deine Frage falsch verstanden? ???:L



Doch! Dank! Habs gerad noch mal probiert und jetzt hat es funktioniert!!!:toll:
 

mock789

Aktives Mitglied
Statt von Frame von JFrame ableiten und die DefaultCloseOperation setzen:
Java:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Also sollte ich
Code:
public class New extends JFrame{
statt
Code:
public class New extends Frame{

schreiben...

Dann kriege ich aber einen Haufen Compiler Fehler im restlichen Code???:L
 

julian.veh

Bekanntes Mitglied
Was für ein Objekt denn?

edit: Falls du mit Objekt einen 2. Kreis meinst:
dann musst du die paint methode weiter ausführen.

zB

Java:
private int a, b;
@Override
    public void paint(Graphics g) {//Fenster zeichnen
        g.setColor(Color.WHITE);//farbe für das Objekt setzen
        g.fillOval(this.a, this.b, 60, 60);//Kreis malen an position x,y und größe festlegen
    }
 
Zuletzt bearbeitet:

Aphrim

Mitglied
Genau also wenn du einfach einen zweiten Kreis willst musst du einfach das g.fillOval... kopieren, darunter einfügen und neue Werte setzen.
Wenn du dabei aber weiter x und y benutzt würde sich der zweite Punkt genauso bewegen wie der Erste wenn du die Pfeiltasten drückst.
 

pausch

Aktives Mitglied
Ansonsten, wenn du willst, dass das Programm beendet wird, änderst du das so:
Java:
case KeyEvent.VK_ESCAPE: System.exit(-1);

Ich würde System.exit(-1); nicht empfehlen! Bei normalem Beenden des Programmes immer System.exit(0); verwenden, alles andere signalisiert, dass das Programm aufgrund von irgendwelchen Fehlern geschlossen wurde!
 
G

Gast2

Gast
Das liegt aber nicht an der setDefaultCloseOperation Anweisung, sondern eher an der Tatsache dass bei Swing Komponenten die paintComponent und nicht die paint Methode überschrieben werden sollte.
 

delpiero223

Mitglied
Um noch mal zu deinem zweiten Kreis zurückzukehren: Wenn sich die Kreise nicht gleich bewegen sollen, halt einfach andere Tasten zum Drücken und neue x/y-Variablen deklarieren. Wäre ja gleich mal eine kleine Übung :)
 

Crian

Top Contributor
Ich hab das Beispiel mal zu einem mit JFrame umgebastelt:

[JAVA=3]import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PunktAufOberflaecheBewegen extends JPanel implements KeyListener {

private static final long serialVersionUID = 3593864044147653268L;

private int x;
private int y;

private JFrame frame;

public PunktAufOberflaecheBewegen() {
x = 235;
y = 235;
frame = new JFrame("Punkt bewegen");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(this);
this.setPreferredSize(new Dimension(500, 500));
this.setBackground(Color.BLACK);
frame.add(this);
}

public void start() {
frame.pack();
frame.setVisible(true);
}

@Override
public void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
graphics.setColor(Color.WHITE);
graphics.fillOval(x, y, 30, 30);
}

@Override
public void keyPressed(KeyEvent keyEvent) {
switch (keyEvent.getKeyCode()) {
case KeyEvent.VK_ESCAPE:
frame.dispose();
break;
case KeyEvent.VK_LEFT:
x -= 2;
break;
case KeyEvent.VK_RIGHT:
x += 2;
break;
case KeyEvent.VK_UP:
y -= 2;
break;
case KeyEvent.VK_DOWN:
y += 2;
break;
}
this.repaint();
}

@Override
public void keyReleased(KeyEvent keyEvent) {
}

@Override
public void keyTyped(KeyEvent keyEvent) {
}

public static void main(String[] args) {
PunktAufOberflaecheBewegen punkt = new PunktAufOberflaecheBewegen();
punkt.start();
}

}[/code]
 

mock789

Aktives Mitglied
Genau also wenn du einfach einen zweiten Kreis willst musst du einfach das g.fillOval... kopieren, darunter einfügen und neue Werte setzen.
Wenn du dabei aber weiter x und y benutzt würde sich der zweite Punkt genauso bewegen wie der Erste wenn du die Pfeiltasten drückst.




Ahhhhhhhhhhhhh............. jetzt wird einiges klar! :D
 

julian.veh

Bekanntes Mitglied
Code:
 g.drawOval(int x, int y, int width, int height);
x und y gibt die Position an. Du kannst da nun irgendwelche beliebigen Werte einsetzen. Da sie ja nicht konstant sind, sondern sich ändern, benutzt du hierzu variablen. Ob die nun x und y heißen oder ob du hansWurstKopf heißen spielt keine Rolle, hauptsache du schreibst sie klein ;).

Um einen guten Einblick zu bekommen könntest du mal einen Blick in die API werfen ;) Graphics (Java 2 Platform SE v1.4.2) .

Grüße von Julian
 

mock789

Aktives Mitglied
Um noch mal zu deinem zweiten Kreis zurückzukehren: Wenn sich die Kreise nicht gleich bewegen sollen, halt einfach andere Tasten zum Drücken und neue x/y-Variablen deklarieren. Wäre ja gleich mal eine kleine Übung :)

Wie mach ich denn das (wenn möglich mit ausführlichen Code :toll: ), dass ich das eine Objekt mit den Cursor Tasten und das andere mit z.B. "w", "a", "s" und "d" steuern könnte???
 
Zuletzt bearbeitet:

mock789

Aktives Mitglied
Hier noch mal mein Code:


Java:
package pkgnew;
 
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
public class New extends Frame{//von Frame erben lassen
 
    private int x=100,y=100;
    private int a=100,b=100;
 
    public New() {
        
        super("Unser erstes Fenster...");
        setSize(500,500); // größe des Fensters festlegen
        setBackground(Color.BLACK); //hintergundfarbe festlegen
        
        
        addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt
            @Override
            public void keyPressed(KeyEvent e) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch(e.getKeyCode()){
                //case KeyEvent.VK_ESCAPE: dispose(); break;
                case KeyEvent.VK_ESCAPE: System.exit(0);
                case KeyEvent.VK_LEFT: a -= 10; break;
                case KeyEvent.VK_RIGHT: a += 10; break;
                case KeyEvent.VK_UP: b -= 10; break;
                case KeyEvent.VK_DOWN: b += 10; break;
                    
                }
                repaint();//Bildschirm neu zeichnen
            }
            
            
            
   
        });
        
    }
    
    
    @Override
    public void paint(Graphics g) {//Fenster zeichnen
        { 
        g.setColor(Color.WHITE);//farbe für das Objekt setzen
        g.fillOval(x, y, 30, 30);//weiss gefülltes Rechteck malen
        }
        {
        g.setColor(Color.GREEN);//farbe für das Objekt setzen
        g.fillOval(this.a, this.b, 30, 30);//Kreis malen an position x,y und größe festlegen
        }
        
        
        
           
    }
    
    public static void main(String[] args) {
        new New().setVisible(true);//Fenster erzeugen
        
 
    }
 
}
 

julian.veh

Bekanntes Mitglied
Aber um nochmal auf mein schönes Beispiel mit den Koordinaten a und b zurückzukommen

Java:
@Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == 37) {
            x--;
        }
        if (e.getKeyCode() == 38) {
            y++;
        }
        if (e.getKeyCode() == 39) {
            x++;
        }
        if (e.getKeyCode() == 40) {
            y--;
        }
        if (e.getKeyChar() == 'w') {
            b--;
        }
        if (e.getKeyChar() == 's') {
            b++;
        }
        if (e.getKeyChar() == 'a') {
            a--;
        }
        if (e.getKeyChar() == 'd') {
           a++;
        }

    }

Bei den KeyCodes bin ich mir nicht ganz sicher sollten aber stimmen ;)
 
G

Gast2

Gast
Verwende statt den "magic numbers" besser die Konstanten aus KeyEvent:
Java:
if (e.getKeyCode() == KeyEvent.VK_W)
 
H

hüteüberhüte

Gast
aussagekräftiger.
literale (hard-coded) sollten eingentlich immer vermiden werden.
 
Zuletzt bearbeitet von einem Moderator:

mock789

Aktives Mitglied
Das blöde ist jetzt nur, dass ich beide Objekte nicht gleichzeitig bewegen kann, sondern nur nacheinander.

Hat jemand ne Idee wie ich das machen kann, dass ich sie gleichzeitig bewegen kann? ???:L


Hier noch mal mein neuer Code:

Java:
package pkgnew;
 
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
public class New extends Frame{//von Frame erben lassen
 
    private int x=100,y=100;
    private int a=100,b=100;
 
    public New() {
        
        super("Unser erstes Fenster...");
        setSize(500,500); // größe des Fensters festlegen
        setBackground(Color.BLACK); //hintergundfarbe festlegen
        
        
        addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt
            @Override
            public void keyPressed(KeyEvent e) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch(e.getKeyCode()){
                //case KeyEvent.VK_ESCAPE: dispose(); break;
                case KeyEvent.VK_ESCAPE: System.exit(0);
                case KeyEvent.VK_LEFT: a -= 10; break;
                case KeyEvent.VK_RIGHT: a += 10; break;
                case KeyEvent.VK_UP: b -= 10; break;
                case KeyEvent.VK_DOWN: b += 10; break;
                    
                case KeyEvent.VK_A: x -= 10; break;
                case KeyEvent.VK_D: x += 10; break;
                case KeyEvent.VK_W: y -= 10; break;
                case KeyEvent.VK_S: y += 10; break;    
                    
                }
                repaint();//Bildschirm neu zeichnen
            }
            
            
            
   
        });
        
    }
    
    
    @Override
    public void paint(Graphics g) {//Fenster zeichnen
        { 
        g.setColor(Color.WHITE);//farbe für das Objekt setzen
        g.fillOval(x, y, 30, 30);//weiss gefülltes Rechteck malen
        }
        {
        g.setColor(Color.GREEN);//farbe für das Objekt setzen
        g.fillOval(this.a, this.b, 30, 30);//Kreis malen an position x,y und größe festlegen
        }
        
        
        
    }
    
    public static void main(String[] args) {
        new New().setVisible(true);//Fenster erzeugen
        
 
    }
 
}
 
G

Gast2

Gast
Dann musst du ein anderes Prinzip nutzen:
Im KeyListener musst du einen boolean auf true setzen wenn eine Taste gedrückt wurde, wenn sie wieder losgelassen wird setzt du den boolean auf false.
In einer Schleife (game loop) fragst du diese booleans dann ab und bewegst deine Objekte entsprechend.

EDIT:
Ich kenne mich mit switch nicht so aus, aber du solltest mal alle break rausnehmen ausser bei der letzten abfrage... vllt hilft das.
???:L Das führt doch nur dazu dass alle cases abgearbeitet werden, das ist mit Sicherheit hier nicht gewünscht...
 

julian.veh

Bekanntes Mitglied
mach doch einfach ein boolean für jede richtung von jedem objekt dass du durch drücken auf true setzt durch loslassen auf false...

|edit: öhm, sorry, das stand da ja schon xD

aber um jetzt nicht ganz doof dazustehen: sagt dir
Code:
&&
was?
du kannst einfach alle bedingungen durchgehen auch wo 2 tasten gedrückt sind, aber mach das mit den booleans ;)

Außerdem würde ich eine Methode move() machen in der du die bewegungen durchfürst spricht

Java:
private boolean ovalEinsRight = false;
private boolean ovalEinsLeft = false;
private boolean ovalEinsUp = false;
private boolean ovalEinsDown = false;
private boolean ovalZweiRight = false;
private boolean ovalZweiLeft = false;
private boolean ovalZweiUp = false;
private boolean ovalZweiDown = false;

addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt
            @Override
            public void keyPressed(KeyEvent e) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch(e.getKeyCode()){
                //case KeyEvent.VK_ESCAPE: dispose(); break;
                case KeyEvent.VK_ESCAPE: System.exit(0);
                case KeyEvent.VK_LEFT: ovalEinsLeft = true; break;
                case KeyEvent.VK_RIGHT: ovalEinsRight = true; break;
                case KeyEvent.VK_UP: ovalEinsUp = true; break;
                case KeyEvent.VK_DOWN: ovalEinsDown = true; break;
                    
                case KeyEvent.VK_A: ovalZweiLeft = true; break;
                case KeyEvent.VK_D:ovalZweiRight = true; break;
                case KeyEvent.VK_W: ovalZweiUp = true; break;
                case KeyEvent.VK_S: ovalZweiDown = true;; break;    
                    
                }
                move();
                repaint();//Bildschirm neu zeichnen
            }

move() {
if(ovalEinsRight) xPosEins++;
if(ovalEinsLeft) xPosEins--;
if(ovalEinsUp) yPosEins--;
if(ovalEinsDown) yPosEins++;
if(ovalZweiRight) xPosZwei++;
if(ovalZweiLeft) xPosZwei--;
if(ovalZweiUp) yPosZwei--;
if(ovalZweiDown) yPosZwei++;
}

Und wenn du ein boolean auf true setzt noch alle anderen auf false, aber das ist mir zu viel arbeit ^^
 
Zuletzt bearbeitet:

mock789

Aktives Mitglied
Vielen Dank für deine Antwort:applaus:


Kannst mir Nullchecker noch kurz ein Beispiel geben wie du das meinst mit die anderen Booleans auf False setzten? Nur eins, dann kann ich den Rest sicher selbst??? :)


Hier ist mein bisheriger Code mit deiner Hilfe:


Java:
package newfour;
 
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
public class Newfour extends Frame{//von Frame erben lassen
 
    private int x=100,y=100;
    private int a=100,b=100;
    
    
    int xPosEins,yPosEins,xPosZwei,yPosZwei;
        
        
        
private boolean ovalEinsRight = false;
private boolean ovalEinsLeft = false;
private boolean ovalEinsUp = false;
private boolean ovalEinsDown = false;
private boolean ovalZweiRight = false;
private boolean ovalZweiLeft = false;
private boolean ovalZweiUp = false;
private boolean ovalZweiDown = false;



 
    public Newfour() {
        
        super("Unser erstes Fenster...");
        setSize(500,500); // größe des Fensters festlegen
        setBackground(Color.BLACK); //hintergundfarbe festlegen
        
        
        addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt
            @Override
            public void keyPressed(KeyEvent e) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch(e.getKeyCode()){
                //case KeyEvent.VK_ESCAPE: dispose(); break;
                case KeyEvent.VK_ESCAPE: System.exit(0);
                case KeyEvent.VK_LEFT: ovalEinsLeft = true; break;
                case KeyEvent.VK_RIGHT: ovalEinsRight = true; break;
                case KeyEvent.VK_UP: ovalEinsUp = true; break;
                case KeyEvent.VK_DOWN: ovalEinsDown = true; break;
                    
                case KeyEvent.VK_A: ovalZweiLeft = true; break;
                case KeyEvent.VK_D:ovalZweiRight = true; break;
                case KeyEvent.VK_W: ovalZweiUp = true; break;
                case KeyEvent.VK_S: ovalZweiDown = true;; break;    
                    
                }
                move();
                repaint();//Bildschirm neu zeichnen
            }
            
       public void move() {
if(ovalEinsRight) xPosEins++;
if(ovalEinsLeft) xPosEins--;
if(ovalEinsUp) yPosEins--;
if(ovalEinsDown) yPosEins++;
if(ovalZweiRight) xPosZwei++;
if(ovalZweiLeft) xPosZwei--;
if(ovalZweiUp) yPosZwei--;
if(ovalZweiDown) yPosZwei++;
}
            
   
        });
        
    }
    
    
    @Override
    public void paint(Graphics g) {//Fenster zeichnen
        { 
        g.setColor(Color.WHITE);//farbe für das Objekt setzen
        g.fillOval(xPosEins, yPosEins, 30, 30);//weiss gefülltes Rechteck malen
        }
        {
        g.setColor(Color.GREEN);//farbe für das Objekt setzen
        g.fillOval(xPosZwei, yPosZwei, 30, 30);//Kreis malen an position x,y und größe festlegen
        }
        
        
        
           
    }
    
    public static void main(String[] args) {
        new Newfour().setVisible(true);//Fenster erzeugen
        
 
    }
 
}
 
Zuletzt bearbeitet:

julian.veh

Bekanntes Mitglied
Vielen Dank für deine Antwort:applaus:


Kannst mir Nullchecker noch kurz ein Beispiel geben wie du das meinst mit die anderen Booleans auf False setzten? Nur eins, dann kann ich den Rest sicher selbst??? :)

Code:
case KeyEvent.VK_LEFT: ovalEinsLeft = true; ovalEinsRight = false; ovalEinsUp = false; ovalEinsDown = false; break;

ganz einfach aus dem Grund, dass sich die Kreise wenn du es nicht tust, wenn du auf left drückst und anschließend auf down immernoch nach left bewegen. Oder bei einem Richtungswechsel würde sich die verschiebung nach links und rechts gegenseitig aufheben und der Körper würde stehen bleiben ;)

Und. Hui.. Egal mit welcher IDE du arbeitest, es gibt bestimmt eine Funktion, die deinen Code schön formatiert :).

Ansonsten sieht das auf den ersten Blick ganz ok aus ;).
 
Zuletzt bearbeitet:

mock789

Aktives Mitglied
Hmm... verdammt... trotz deiner Hilfe kriege ich nur einen schwarzen Bildschirm ohne Objekte zustande.;(


Kann mir jemand sagen was ich falsch mache???:L


Hier mein formatierter Code :)



Java:
package newfour;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Newfour extends Frame {//von Frame erben lassen

    private int x = 100, y = 100;
    private int a = 100, b = 100;
    int xPosEins, yPosEins, xPosZwei, yPosZwei;
    private boolean ovalEinsRight = false;
    private boolean ovalEinsLeft = false;
    private boolean ovalEinsUp = false;
    private boolean ovalEinsDown = false;
    private boolean ovalZweiRight = false;
    private boolean ovalZweiLeft = false;
    private boolean ovalZweiUp = false;
    private boolean ovalZweiDown = false;

    public Newfour() {

        super("Unser erstes Fenster...");
        setSize(500, 500); // größe des Fensters festlegen
        setBackground(Color.BLACK); //hintergundfarbe festlegen


        addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt

            @Override
            public void keyPressed(KeyEvent e) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch (e.getKeyCode()) {
                    //case KeyEvent.VK_ESCAPE: dispose(); break;
                    case KeyEvent.VK_ESCAPE:
                        System.exit(0);
                    case KeyEvent.VK_LEFT:
                        ovalEinsLeft = true;
                        ovalEinsRight = false;
                        ovalEinsUp = false;
                        ovalEinsDown = false;
                        break;
                    case KeyEvent.VK_RIGHT:
                        ovalEinsRight = true;
                        ovalEinsLeft = false;
                        ovalEinsUp = false;
                        ovalEinsDown = false;
                        break;
                    case KeyEvent.VK_UP:
                        ovalEinsUp = true;
                        ovalEinsRight = false;
                        ovalEinsLeft = false;
                        ovalEinsDown = false;
                        break;
                    case KeyEvent.VK_DOWN:
                        ovalEinsDown = true;
                        ovalEinsRight = false;
                        ovalEinsUp = false;
                        ovalEinsLeft = false;
                        break;

                    case KeyEvent.VK_A:
                        ovalZweiLeft = true;
                        ovalZweiRight = false;
                        ovalZweiUp = false;
                        ovalZweiDown = false;
                        break;
                    case KeyEvent.VK_D:
                        ovalZweiRight = true;
                        ovalZweiLeft = false;
                        ovalZweiUp = false;
                        ovalZweiDown = false;
                        break;
                    case KeyEvent.VK_W:
                        ovalZweiUp = true;
                        ovalZweiRight = false;
                        ovalZweiLeft = false;
                        ovalZweiDown = false;
                        break;
                    case KeyEvent.VK_S:
                        ovalZweiDown = true;
                        ovalZweiRight = false;
                        ovalZweiUp = false;
                        ovalZweiLeft = false;
                        break;


                }
                move();
                repaint();//Bildschirm neu zeichnen
            }

            public void move() {
                if (ovalEinsRight) {
                    xPosEins++;
                }
                if (ovalEinsLeft) {
                    xPosEins--;
                }
                if (ovalEinsUp) {
                    yPosEins--;
                }
                if (ovalEinsDown) {
                    yPosEins++;
                }
                if (ovalZweiRight) {
                    xPosZwei++;
                }
                if (ovalZweiLeft) {
                    xPosZwei--;
                }
                if (ovalZweiUp) {
                    yPosZwei--;
                }
                if (ovalZweiDown) {
                    yPosZwei++;
                }
            }
        });

    }

    @Override
    public void paint(Graphics g) {//Fenster zeichnen
        {
            g.setColor(Color.WHITE);//farbe für das Objekt setzen
            g.fillOval(xPosEins, yPosEins, 30, 30);//weiss gefülltes Rechteck malen
        }
        {
            g.setColor(Color.GREEN);//farbe für das Objekt setzen
            g.fillOval(xPosZwei, yPosZwei, 30, 30);//Kreis malen an position x,y und größe festlegen
        }




    }

    public static void main(String[] args) {
        new Newfour().setVisible(true);//Fenster erzeugen


    }
}
 

AquaBall

Top Contributor
Gratuliere zum gelungenen Formatieren.
Sieht ja plötzlich lesbar aus!:)

Ich hab jetzt die "SpielStrategie" nicht genau überprüft, aber ich habe das Gefühl, dass Folgendes eleganter wäre:
Java:
public void keyPressed(KeyEvent e) {
    //die Änderungen wenn man eine Pfeiltaste drückt
    int key=e.getKeyCode();
    ovalEinsLeft  = key==KeyEvent.VK_LEFT;
    ovalEinsRight = key==KeyEvent.VK_RIGHT;
    ovalEinsUp    = key==KeyEvent.VK_UP;
    ovalEinsDown  = key==KeyEvent.VK_DOWN;
    ovalZweiLeft  = key==KeyEvent.VK_A;
    ovalZweiRight = key==KeyEvent.VK_D;
    ovalZweiUp    = key==KeyEvent.VK_W;
    ovalZweiDown  = key==KeyEvent.VK_S;
    if (key==KeyEvent.VK_ESCAPE) {
         System.exit(0);
    }
    move();
    repaint();//Bildschirm neu zeichnen
}
Achtung: Ist ein kleiner Unterschied in der Logik: Eine Taste für
Code:
Eins
setzt auch alle
Code:
Zwei
-Richtungen auf null und umgekehrt.
Wenn das nicht gewünscht ist, wäre noch diese Lösung möglich:
Java:
public void keyPressed(KeyEvent e) {
    //die Änderungen wenn man eine Pfeiltaste drückt
    int key=e.getKeyCode();
    switch (key) {
        case KeyEvent.VK_ESCAPE:
            System.exit(0);

        case KeyEvent.VK_LEFT:
        case KeyEvent.VK_RIGHT:
        case KeyEvent.VK_UP:
        case KeyEvent.VK_DOWN:
            ovalEinsLeft  = key==KeyEvent.VK_LEFT;
            ovalEinsRight = key==KeyEvent.VK_RIGHT;
            ovalEinsUp    = key==KeyEvent.VK_UP;
            ovalEinsDown  = key==KeyEvent.VK_DOWN;
            break;
 
        case KeyEvent.VK_A:
        case KeyEvent.VK_D:
        case KeyEvent.VK_W:
        case KeyEvent.VK_S:
            ovalZweiLeft  = key==KeyEvent.VK_A;
            ovalZweiRight = key==KeyEvent.VK_D;
            ovalZweiUp    = key==KeyEvent.VK_W;
            ovalZweiDown  = key==KeyEvent.VK_S;
        break;
    }
    move();
    repaint();//Bildschirm neu zeichnen
}
 
Zuletzt bearbeitet:

Aphrim

Mitglied
@julian
Ich würde eher mit switch arbeiten anstatt eine if-Orgie zu feiern ;)
Das ist allgemein schöner anzuschauen und ist somit wesentlich übersichtlicher und leichter zu verändern.

LG
Aphrim
 

Crian

Top Contributor
Wenn mehrere Tastendrücke gleichzeitig verarbeitet werden können sollen, dann darf man NICHT mit switch arbeiten, auch nicht mit else if, sondern mit unabhängigen if-Abfragen. Sieht nicht so elegant aus, erlaubt aber, beides gleichzeitig zu bewegen (oder auch gleichzeitig nach oben und nach links).
 

mock789

Aktives Mitglied
Wenn mehrere Tastendrücke gleichzeitig verarbeitet werden können sollen, dann darf man NICHT mit switch arbeiten, auch nicht mit else if, sondern mit unabhängigen if-Abfragen. Sieht nicht so elegant aus, erlaubt aber, beides gleichzeitig zu bewegen (oder auch gleichzeitig nach oben und nach links).

Das ist genau mein Problem! Mein Programm kann nicht zwei Tastatureingaben gleichzeitig verarbeiten.

Könntest du mir ungefähr sagen wie das mit den If Anweisungen aussehen muss?

Das wär sehr cool! :toll:


Hier ist mein bisheriger Code (ich hab versucht das Problem mit zwei Keylistenern zu lösen, hat aber nichts gebracht :( ) :


Java:
package newfour;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Newfour extends Frame {//von Frame erben lassen

    int xPosEins = 100, yPosEins = 100, xPosZwei = 200, yPosZwei = 200;
    private boolean ovalEinsRight = false;
    private boolean ovalEinsLeft = false;
    private boolean ovalEinsUp = false;
    private boolean ovalEinsDown = false;
    private boolean ovalZweiRight = false;
    private boolean ovalZweiLeft = false;
    private boolean ovalZweiUp = false;
    private boolean ovalZweiDown = false;

    public Newfour() {

        super("Unser erstes Fenster...");
        setSize(500, 500); // größe des Fensters festlegen
        setBackground(Color.BLACK); //hintergundfarbe festlegen


        addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt

            @Override
            public void keyPressed(KeyEvent e) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch (e.getKeyCode()) {
                    //case KeyEvent.VK_ESCAPE: dispose(); break;
                    case KeyEvent.VK_ESCAPE:
                        System.exit(0);
                    case KeyEvent.VK_LEFT:
                        ovalEinsLeft = true;
                        ovalEinsRight = false;
                        ovalEinsUp = false;
                        ovalEinsDown = false;

                        break;
                    case KeyEvent.VK_RIGHT:
                        ovalEinsRight = true;
                        ovalEinsLeft = false;
                        ovalEinsUp = false;
                        ovalEinsDown = false;

                        break;
                    case KeyEvent.VK_UP:
                        ovalEinsUp = true;
                        ovalEinsRight = false;
                        ovalEinsLeft = false;
                        ovalEinsDown = false;

                        break;
                    case KeyEvent.VK_DOWN:
                        ovalEinsDown = true;
                        ovalEinsRight = false;
                        ovalEinsUp = false;
                        ovalEinsLeft = false;

                        break;



                }
                move();
                repaint();//Bildschirm neu zeichnen
            }

            public void move() {
                if (ovalEinsRight) {
                    xPosEins += 10;
                }
                if (ovalEinsLeft) {
                    xPosEins -= 10;
                }
                if (ovalEinsUp) {
                    yPosEins -= 10;
                }
                if (ovalEinsDown) {
                    yPosEins += 10;
                }
                if (ovalZweiRight) {
                    xPosZwei += 10;
                }
                if (ovalZweiLeft) {
                    xPosZwei -= 10;
                }
                if (ovalZweiUp) {
                    yPosZwei -= 10;
                }
                if (ovalZweiDown) {
                    yPosZwei += 10;
                }
            }
        });


        addKeyListener(new KeyAdapter() { //hier werden die Tastatureingaben erkannt

            @Override
            public void keyPressed(KeyEvent f) {
                //die Änderungen wenn man eine Pfeiltaste drückt
                switch (f.getKeyCode()) {
                    //case KeyEvent.VK_ESCAPE: dispose(); break;
                    case KeyEvent.VK_ESCAPE:
                        System.exit(0);

                    case KeyEvent.VK_A:
                        ovalZweiLeft = true;
                        ovalZweiRight = false;
                        ovalZweiUp = false;
                        ovalZweiDown = false;

                        break;

                    case KeyEvent.VK_D:
                        ovalZweiRight = true;
                        ovalZweiLeft = false;
                        ovalZweiUp = false;
                        ovalZweiDown = false;

                        break;

                    case KeyEvent.VK_W:
                        ovalZweiUp = true;
                        ovalZweiRight = false;
                        ovalZweiLeft = false;
                        ovalZweiDown = false;

                        break;

                    case KeyEvent.VK_S:
                        ovalZweiDown = true;
                        ovalZweiRight = false;
                        ovalZweiUp = false;
                        ovalZweiLeft = false;

                        break;



                }
                move();
                repaint();//Bildschirm neu zeichnen
            }

            public void move() {
                if (ovalEinsRight) {
                    xPosEins += 10;
                }
                if (ovalEinsLeft) {
                    xPosEins -= 10;
                }
                if (ovalEinsUp) {
                    yPosEins -= 10;
                }
                if (ovalEinsDown) {
                    yPosEins += 10;
                }
                if (ovalZweiRight) {
                    xPosZwei += 10;
                }
                if (ovalZweiLeft) {
                    xPosZwei -= 10;
                }
                if (ovalZweiUp) {
                    yPosZwei -= 10;
                }
                if (ovalZweiDown) {
                    yPosZwei += 10;
                }
            }
        });
         
         


    }

    @Override
    public void paint(Graphics g) {//Fenster zeichnen
        {
            g.setColor(Color.WHITE);//farbe für das Objekt setzen
            g.fillOval(xPosEins, yPosEins, 30, 30);//weiss gefülltes Rechteck malen
        }
        {
            g.setColor(Color.GREEN);//farbe für das Objekt setzen
            g.fillOval(xPosZwei, yPosZwei, 30, 30);//Kreis malen an position x,y und größe festlegen
        }




    }

    public static void main(String[] args) {
        new Newfour().setVisible(true);//Fenster erzeugen


    }
}
 

julian.veh

Bekanntes Mitglied
wieso wo liegt denn dein Problem? Wenn ich dein Programm einfüge kann ich durchaus beide Kugeln gleichzeitig bewegen.

Definierst du da Methoden im Konstruktor???????
 

Neue Themen


Oben