2D-Grafik Koordinaten nicht immer die selben

Weed

Mitglied
Hallo.
Als erstes mal... Ich bin neu hier, ich hoffe ich mach jetzt nichts falsch oder so.
Hab bezüglich meines Problems nichts gefunden, also wäre es sehr net wenn mir jemand helfen könnte.

Kurze Vorgeschichte: Bin noch recht unwissend mit Java. Hab zwar schon einige Erfahrungen gesammelt (1.Jahr an einer EDV Schule Java-Basics, Plugins für Minecraft) hab aber noch viel zu lernen.

Ich möchte mir ein Jump-and-Run Game schreiben. Läuft auch im Moment alles gut bis auf ein Problem. Bin noch recht am Anfang deshalb nervt mich das recht. :)
Also ich will ein Image auf ein Panel zeichnen. Hört sich ja eigentlich leicht an was es eigentlich auch ist. Nur meine Koordinaten sind immer verschieden. Sie sind anders wenn ich sie in einer Methode zuweise und auch wenn ich nur eine if-Anweisung darüber habe.
Ich komm einfach nicht drauf was das Problem ist.
Hier Code + Pics:

So wie ich es haben will (Pic):
ImageShack® - Online Photo and Video Hosting
Aber nur mit diesem Code:
Java:
    private void startGame(String player) {
        currentPlayer = player;
        pnMainMenu.setVisible(false);
        this.remove(pnMainMenu);
        this.add(pnGame);
        pnGame.setSize(800, 600);
        pnGame.setVisible(true);
        this.setSize(806, 603);
        Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        int posX = (screen.width / 2) - 403;
        int posY = (screen.height / 2) - 301 - 50;
        setLocation(posX, posY);
        repaint();
        running = true;
        firstRun = true;
        Thread playerMoveThread = new Thread(new MovePlayer(sf));
        playerMoveThread.start();
        repaint();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g = pnGame.getGraphics();

        if (running == true) {
            int level = Player.getLevel(currentPlayer);
            Level.loadLevel(level, g);
            Graphics2D g2d = (Graphics2D) g;
            Rectangle playerRect = new Rectangle(altX, altY, 25, 22);
            g2d.setColor(pnGame.getBackground());
            g2d.draw(playerRect);
            g2d.fill(playerRect);
                playerX = 30;
                playerY = pnGame.getHeight() - 47;
                altX = playerX;
                altY = playerY;
                firstRun = false;
            g2d.drawImage(playerImg, playerX, playerY, 25, 22, pnGame);
        }
    }

Nun da ich aber die Variablen nicht bei jedem repaint() auf diese Werte setzen will, dachte ich mir ich mach einer boolean Variable die sagt das programm läuft zum ersten mal und nur dann setzt er die variablen so.

Gesagt getan:
Java:
    private void startGame(String player) {
        currentPlayer = player;
        pnMainMenu.setVisible(false);
        this.remove(pnMainMenu);
        this.add(pnGame);
        pnGame.setSize(800, 600);
        pnGame.setVisible(true);
        this.setSize(806, 603);
        Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        int posX = (screen.width / 2) - 403;
        int posY = (screen.height / 2) - 301 - 50;
        setLocation(posX, posY);
        repaint();
        running = true;
        firstRun = true;
        Thread playerMoveThread = new Thread(new MovePlayer(sf));
        playerMoveThread.start();
        repaint();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g = pnGame.getGraphics();

        if (running == true) {
            int level = Player.getLevel(currentPlayer);
            Level.loadLevel(level, g);
            Graphics2D g2d = (Graphics2D) g;
            Rectangle playerRect = new Rectangle(altX, altY, 25, 22);
            g2d.setColor(pnGame.getBackground());
            g2d.draw(playerRect);
            g2d.fill(playerRect);
            if(firstRun == true){
                playerX = 30;
                playerY = pnGame.getHeight() - 47;
                altX = playerX;
                altY = playerY;
                firstRun = false;
            }
            g2d.drawImage(playerImg, playerX, playerY, 25, 22, pnGame);
        }
    }

Doch die Koordinaten sind falsch:
ImageShack® - Online Photo and Video Hosting

Gut Gut Warum setz ich die Variablen nicht gleich in der Start methode?
Ergebnis:
ImageShack® - Online Photo and Video Hosting

Mit diesem Code:
Java:
    private void startGame(String player) {
        currentPlayer = player;
        pnMainMenu.setVisible(false);
        this.remove(pnMainMenu);
        this.add(pnGame);
        pnGame.setSize(800, 600);
        pnGame.setVisible(true);
        this.setSize(806, 603);
        Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        int posX = (screen.width / 2) - 403;
        int posY = (screen.height / 2) - 301 - 50;
        setLocation(posX, posY);
        repaint();
        running = true;
        firstRun = true;
        playerX = 30;
        playerY = pnGame.getHeight() - 47;
        altX = playerX;
        altY = playerY;
        firstRun = false;
        Thread playerMoveThread = new Thread(new MovePlayer(sf));
        playerMoveThread.start();
        repaint();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g = pnGame.getGraphics();

        if (running == true) {
            int level = Player.getLevel(currentPlayer);
            Level.loadLevel(level, g);
            Graphics2D g2d = (Graphics2D) g;
            Rectangle playerRect = new Rectangle(altX, altY, 25, 22);
            g2d.setColor(pnGame.getBackground());
            g2d.draw(playerRect);
            g2d.fill(playerRect);
            g2d.drawImage(playerImg, playerX, playerY, 25, 22, pnGame);
        }
    }

Ich versteh das nun wirklich nicht.

Zusatzinfo:
OS: Win7 64bit
IDE: Netbeans 7.0

Hoffe jemand kann mir helfen.
Danke im Vorraus.
Weed
 
Zuletzt bearbeitet:
S

SlaterB

Gast
warum machst du das so kompliziert mit den Bilden, es geht doch offensichtlich nur um den Wert von pnGame.getHeight()?
was pnGame ist wird übrigens nirgendwo gesagt?
gib doch jeweils aus was pnGame.getHeight() ist..

direkt am Anfang ist immer schwer, Komponenten-Koordinaten abzufragen,
erst muss das Layout asynchron vom AWT-Thread durchgeführt werden,

zur Verschiebung noch eine Idee:
pnGame.setSize(800, 600);
pnGame.setVisible(true); // erstes repaint irgendwann mit Höhe 600
this.setSize(806, 603); // sorgt irgendwann,z.B. beim zweiten paint dafür, dass das enthaltene pnGame nur noch Höhe 580 hat weil 20 Pixel
für deinen schwarzen Rand oder die Titelleiste des JFrames draufgehen, je nachdem was 'this' ist, auch das klärst du nicht,
falls ein JFrame, war das vorher schon sichtbar?


die Zeile
> g = pnGame.getGraphics();
ist nicht dein Ernst, oder?
wenn in pnGame was zu malen ist, dann mit der dortigen paint-Methode, diese Methode kann ja gerne ihr Graphics-Parameter-Objekt herumreichen,
der Thread mit repaint muss dann pnGame repainten,
 

Weed

Mitglied
Ja sorry hab vergessen das alles zu erwähnen. :oops:
pnGame ist das Panel auf dem das Spiel abläuft.
This ist hier meine MainKlasse und ist ein Frame. Es ist vorher sichtbar und wenn das Spiel startet nehm ich einfach das andere Panel raus und setze das Panel (pnGame) ein.

Das mit der paint Methode versteh ich gerade nicht ganz. Kannst du mir das bitte nochmal etwas besser erklären? sorry bin ein anfänger.

Achja danke schon mal ;)
 
S

SlaterB

Gast
> Das mit der paint Methode versteh ich gerade nicht ganz.

ich verstehe nicht ganz, was du daran nicht ganz verstehst, eine vollständige Frage wäre etwas besser
 

Weed

Mitglied
Was meinst du damit:

>die Zeile
>> g = pnGame.getGraphics();
>ist nicht dein Ernst, oder?
>wenn in pnGame was zu malen ist, dann mit der dortigen paint-Methode, diese Methode kann ja >gerne ihr Graphics-Parameter-Objekt herumreichen,
>der Thread mit repaint muss dann pnGame repainten,
 
S

SlaterB

Gast
das ist zwar nicht gerade viel Text von dir, aber schon ein hilfreicher Hinweis, ich dachte du beziehst dich auf das andere
mit den ersten paint-Aufrufen bis dann irgendwann die Size festgelegt ist ;)

zum anderen Punkt ganz grundsätzlich:
es gibt Lehrbücher zu Java und Beispiele, was steht dort?
dass die paint-Methode sicher nicht ohne Grund ein Graphics-Objekt als Parameter hat,
paint wird aufgerufen (nicht von dir), Graphics g kommt als Parameter, in Graphics g wird gezeichnet,
einfaches Konzept, oder?
nirgendwo wirst du Anfängerbeispiele mit getGraphics() von einer anderen Komponente finden,
damit ist quasi alles gesagt, mehr Details will ich gar nicht nennen,

jede Komponente malt in sich selber per paint, niemand anders malt von woanders aus in der Komponente, fertig

wenn du übrigens repaint() am JFrame aufrufst, dann wird auch die paint-Methode von pnGame ausgeführt,
bzw. bei Swing generell eher an paintComponent() denken, ganz wie in allen Beispielen auf der Welt nachzulesen,
das sollte ich gar nicht schreiben müssen..
 
Zuletzt bearbeitet von einem Moderator:

Weed

Mitglied
Ja sorry kenn mich halt nicht so aus :(
Danke

Hätte da noch ne Frage. Wie soll ich nun die Größen setzen damit mein Panel genau 800x600 pixel hat?

EDIT: Ok habs gelöst.
 
Zuletzt bearbeitet:

BlackViruZ

Aktives Mitglied
Eh du kannst bei dem Panel die größe setzen.
ruf auf das Panel setPreferredSize(new Dimension(800,600) auf.

Danach musst du sorge dafür tragen, dass das fenster sich an die größe der in ihm befindlichen Components anpasst.
Das geht mit
Java:
<JFramename>.pack();
Allerdings gibt das manchmal Probleme beim Aufsetzen komplexer GUIs, da pack sich glaube ich nicht von selbst in den Swing Thread depatched.
Sprich wenn du ein Fenster komplex aufbaust und dann einfach pack() aufrufst kann das ziemlich merkwürdige Ergebnisse geben - da der Swing Thread noch mit den LayoutManager aktionen beschäftigt sein könnte (beispielsweise) und dann die Fenstergröße einem Zwischenstand entspricht.

Daher kannst du da einen kleinen workaround reinnehmen.. ist so nicht sehr schön aber mir fällt da keine bessere Lösung ein, wenn jmd was schöneres hat immer her damit :D
Java:
final JFrame finalSelfRef = this;
SwingUtilities.invokeLater(new Runnable(){
  @Override
  public void run(){
    finalSelfRef.pack();
  }
});
kann sein das daoben fehler drin sind, ich habs grad heir im Browser geschrieben, die Idee sollte klar sein: durch SwingUtilities.invokeLater([...]) "dispatched" du den aufruf von pack() zu dem Zeitpunkt, bei welchem die bisherigen Aktionen im Thread abgeschlossen sind - das sollte also nach dem "auslegen" der componenten aufgerufen werden (damit meine ich den getContentPane().add([...]) kram..)

Hoffe das hilft ;-)

MfG
Daniel
 

Weed

Mitglied
Jo danke, hätte geholfen, bin aber selbst drauf gekommen ;)
Trotzdem danke :)
 
Zuletzt bearbeitet von einem Moderator:

Alan47

Mitglied
Hi,

ich bin zwar generell kein Freund von Frameworks, aber dieses hier kann ich dir wirklich nur empfehlen wenn du in Java ein Spiel schreiben willst:

Golden T Studios - Java Game Developer World

Es ist zwar schon lange nicht mehr ge-updated worden, dafür ist es einfach zu verstehen und zu verwenden, relativ performant und es gibt direkt auf der Seite ein paar gute Einsteiger-Tutorials. Nur grundlegende Java-Sprachkenntnisse werden vorausgesetzt. Kannst es dir ja mal ansehen, ich habe bereits damit gearbeitet (ist schon etwas länger her), ist durchaus brauchbar :)


Gruß,


Alan
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Polygon Koordinaten richtig sortieren AWT, Swing, JavaFX & SWT 7
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S JButtons an Koordinaten setzen AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
B Transformation und Darstellung von Koordinaten AWT, Swing, JavaFX & SWT 5
J in actionPerformed() Koordinaten ändern AWT, Swing, JavaFX & SWT 9
P JavaFX Szenegraph - Koordinaten von Children einer Group AWT, Swing, JavaFX & SWT 0
C Bild Koordinaten AWT, Swing, JavaFX & SWT 6
S Polygon mit double-Koordinaten AWT, Swing, JavaFX & SWT 2
K 3D-Grafik 2 "Boxen" auf unterschiedlichen Koordinaten AWT, Swing, JavaFX & SWT 2
Luk10 Fragen zum Koordinaten System AWT, Swing, JavaFX & SWT 3
K LayoutManager Buttons auf bestimmte x und y Koordinaten AWT, Swing, JavaFX & SWT 2
J Koordinaten von JButton AWT, Swing, JavaFX & SWT 2
C Caret Position mit X-Y-Koordinaten ermitteln AWT, Swing, JavaFX & SWT 2
D Swing JTable, Zellen-Farbe über Koordinaten ändern AWT, Swing, JavaFX & SWT 9
Y AWT Maus Koordinaten abspeichern in eine Textfile AWT, Swing, JavaFX & SWT 3
D Swing JViewPort, Absolut Koordinaten berechnen. AWT, Swing, JavaFX & SWT 2
C permanente aktualisierung der Koordinaten der Maus auf einem Panel AWT, Swing, JavaFX & SWT 8
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
S Swing Text -> HTML: Caret-Koordinaten verschoben AWT, Swing, JavaFX & SWT 6
aze SwingConstants.Center Koordinaten für JLabel herausfinden AWT, Swing, JavaFX & SWT 6
T Choice "gezielt" darstellen aber wie - mit Koordinaten aber wie? AWT, Swing, JavaFX & SWT 6
D Koordinaten von einem Kreissegment berechnen AWT, Swing, JavaFX & SWT 6
D Mouse Koordinaten AWT, Swing, JavaFX & SWT 2
R drawString mit double Koordinaten AWT, Swing, JavaFX & SWT 5
M Grafik flexibel an berechneten Koordinaten positionieren AWT, Swing, JavaFX & SWT 4
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
N Koordinaten erfassen AWT, Swing, JavaFX & SWT 5
S Koordinaten/Raster (ähnlich Schachbrett) anzeigen/ausblenden AWT, Swing, JavaFX & SWT 10
F Ermittlung der X- und Y- Koordinaten im Tree bei Tastaturst. AWT, Swing, JavaFX & SWT 5
D Koordinaten der Bildschirmposition auslesen (MouseListener?) AWT, Swing, JavaFX & SWT 7
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX PixelWriter.setColor setzt Farbe nicht AWT, Swing, JavaFX & SWT 2
M JavaFX Diagonale Linie nicht ausgegeben/angezeigt AWT, Swing, JavaFX & SWT 1
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
thor_norsk Icons laden nicht in GUI AWT, Swing, JavaFX & SWT 15
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
G JOptionPane zeigt nicht an was ich will AWT, Swing, JavaFX & SWT 2
S JavaFX WebView zeigt bestimmte Websites nicht an AWT, Swing, JavaFX & SWT 2
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
berserkerdq2 Anchorpane warum kann ich nicht Anchors setzen AWT, Swing, JavaFX & SWT 6
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
M Scrollbar funktioniert nicht AWT, Swing, JavaFX & SWT 10
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
R Fxml findet controller nicht AWT, Swing, JavaFX & SWT 2
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
_user_q [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
T Swing Tooltip-Delay funktioniert nicht immer. AWT, Swing, JavaFX & SWT 1
J Programm findet Resource nicht. AWT, Swing, JavaFX & SWT 6
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
B Swing Menü geht nicht AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
P JavaFX Änderungen am Datenmodell visuell nicht sichtbar AWT, Swing, JavaFX & SWT 3
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
G JavaFX Scene ausdrucken nicht möglich, Seite leer AWT, Swing, JavaFX & SWT 5
N Programm Läuft nicht auf anderen Pcs AWT, Swing, JavaFX & SWT 9
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
H RPG Programmieren, label.setLocation funktioniert nicht AWT, Swing, JavaFX & SWT 7
S e(fx)clipse erscheint nicht im Marketplace, lässt sich nicht installieren AWT, Swing, JavaFX & SWT 16
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
L JavaFX .fxml laden klappt nicht AWT, Swing, JavaFX & SWT 16
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
EinNickname9 Einfacher parser funktioniert nicht AWT, Swing, JavaFX & SWT 2
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
G Gui updated beim zweiten Aufruf nicht mehr AWT, Swing, JavaFX & SWT 15
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
F Swing Adapt Row Height funktioniert nicht richtig :( AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben