2017-08-09 4 views
0

Ich arbeite an einem Indie-Spielprojekt und habe ein Problem mit Grafiken, die nicht angezeigt werden, wenn ich mein Projekt von meinem Windows-Computer auf mein Macbook verschiebe. Ich habe sowohl meine Java-Version als auch meine Eclipse aktualisiert, habe aber immer noch dieses Problem. Hier sind die wichtigsten zwei Dateien, die die JFrame und Panel Griff:Grafiken werden nicht auf dem Mac angezeigt

MainGameLoop

package hara; 

import javax.swing.JFrame; 

public class MainGameLoop { 

public static final String gameName = "HARA v0.0"; 

public static void main(String[] args) { 
    JFrame f = new JFrame(gameName); 
    f.setContentPane(new MainWindow()); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setResizable(false); 
    f.pack(); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
} 
} 

und Mainwindow

package hara; 

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.KeyEvent; 

import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 

import javax.swing.JPanel; 

import hara.gamestate.GameStateManager; 

public class MainWindow extends JPanel implements Runnable, KeyListener{ 
public static final int WIDTH = 320; 
public static final int HEIGHT = 240; 
public static double wSCALE = 4; 
public static double hSCALE = 4; 

private Thread thread; 
private boolean running; 
private int FPS = 60; 
private long targetTime = 1000/FPS; 

private BufferedImage image; 
private Graphics2D g; 

private GameStateManager gsm; 

public MainWindow(){ 
    super(); 
    setPreferredSize(new Dimension((int)(WIDTH * wSCALE), (int)(HEIGHT * hSCALE))); 
    setFocusable(true); 
    requestFocus(); 
} 

public void addNotify(){ 
    super.addNotify(); 
    if(thread == null){ 
     thread = new Thread(this); 
     addKeyListener(this); 
     thread.start(); 
    } 
} 

public void init(){ 
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); 

    g = (Graphics2D) image.getGraphics(); 

    running = true; 

    gsm = new GameStateManager(); 
    gsm.setState(gsm.MENUSTATE); 
} 

public void run(){ 

    init(); 

    long start; 
    long elapsed; 
    long wait; 

    while(running){ 
     start = System.nanoTime(); 

     update(); 
     draw(); 
     drawToScreen(); 

     elapsed = System.nanoTime() - start; 

     wait = targetTime - elapsed/1000000; 
     if(wait < 0){ 
      wait = 5; 
     } 

     try { 
      Thread.sleep(wait); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

} 

private void update(){ 
    gsm.update(); 
} 

private void draw(){ 
    gsm.draw(g); 
} 

private void drawToScreen(){ 
    Graphics g2 = getGraphics(); 
    g2.drawImage(image, 0, 0, (int) (WIDTH * wSCALE), (int) (HEIGHT * hSCALE), null); 
    g2.dispose(); 
} 

public void keyTyped(KeyEvent e) {} 

public void keyPressed(KeyEvent key) { 
    gsm.keyPressed(key.getKeyCode()); 
} 

public void keyReleased(KeyEvent key) { 
    gsm.keyReleased(key.getKeyCode()); 
} 
} 

Es läuft perfekt auf meinem PC und es gibt keine Probleme mit der Zeichnung aber einmal Ich habe die Dateien auf mein Macbook verschoben, es öffnet nur einen leeren JFrame und tut nichts. Ich habe getestet, ob die Methoden richtig aufgerufen wurden und sie waren. Die Zeichenmethoden werden aufgerufen, die Tastatureingabe funktioniert, aber nichts wird angezeigt. Wenn ich das Fenster in der Größe veränderbar mache und die Größe verändere, kann ich sehr schnell sehen, wie die Grafik funktioniert. Ich habe viele Lösungen ausprobiert und keiner von ihnen hat funktioniert. Ich habe auf dieser Seite viele Fragen durchgesehen und nichts schien für mich zu funktionieren. Würde irgendwelche Ideen lieben. Vielen Dank!

+0

Ich kann nicht sehen, woher der größte Teil Ihres Codes abgerufen wird? Es sieht so aus, als ob 'MainWindow' als Thread gestartet werden sollte. –

+0

Sie haben mehrere Threads ohne irgendeine Art von Synchronisation, also gibt es keinen Grund, dass irgendetwas davon überhaupt funktionieren muss. Zum Beispiel könnte 'gsm.keyPressed (...)' legal "NullPointerException" auslösen, da es auf einem anderen Thread ohne Synchronisation/flüchtig zugewiesen ist. Sie müssen die [Parallelitäts-Tutorials] lesen (https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html) oder [nur einen Timer verwenden] (https://docs.oracle.com/ javase/tutorial/uiswing/misc/timer.html) weil es wahrscheinlich keinen besonderen Grund gibt, mehrere Threads zu verwenden. – Radiodef

+0

@Radiodef Ich bin mir nicht sicher, ob ich sehe, wo ich mehrere Threads habe und trotzdem schien es keine Probleme zu verursachen, wenn ich das Programm auf meinem Windows-Desktop –

Antwort

1

Verwenden Sie getGraphics() nicht zum Malen.

Stattdessen erfolgt benutzerdefinierte Bemalung durch Überschreiben der paintComponent() Methode der JPanel. Lesen Sie den Abschnitt aus dem Swing-Tutorial unter Custom Painting für weitere Informationen und Arbeitsbeispiele.

Wenn Sie die Komponente neu zeichnen möchten, weil sich eine Eigenschaft des Bedienfelds ändert, rufen Sie repaint() auf dem Bedienfeld auf. Also loswerden Sie Ihre update() -Methode und rufen Sie einfach repaint() auf, um das Panel zu malen.

+0

Könnten Sie ansprechen, warum dies auf einem Mac zu einem anderen Verhalten führen würde? – ChiefTwoPencils

+0

@ChiefTwoPencils, Nein, weil ich noch nie einen Mac benutzt habe. Lassen Sie sich nicht durch Windows in die Irre führen. Es ist nur Glück und kann leicht brechen, wenn Sie Änderungen in der Zukunft wecken. Alles, was ich weiß, ist die richtige Art, benutzerdefinierte Bilder zu erstellen, so dass es auf allen Plattformen funktioniert und du es gerade nicht machst. – camickr

+0

Ich bin nicht derjenige, der die Frage stellt, sondern war nur neugierig, ob es detailliertere/technische Informationen gab. – ChiefTwoPencils

Verwandte Themen