2017-08-09 14 views
0

私はインディーゲームプロジェクトに取り組んでいます。プロジェクトをWindowsコンピュータからMacBookに移動するときにグラフィックスの問題が表示されません。 JavaのバージョンとEclipseの両方を更新しましたが、まだこの問題があります。グラフィックスがMacに表示されない

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); 
} 
} 

とメインウィンドウ

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()); 
} 
} 

それは私のPC上で完璧に動作し、何の問題の描画とが、かつては存在しない:ここでのJFrameとパネル取り扱う主な2つのファイルがあります私はMacBookにファイルを移動しました。空のJFrameを開き、何もしません。私はメソッドが適切に呼び出されていたかどうかを調べるためにテストしました。描画メソッドが呼び出され、キーボード入力は機能しますが、何も表示されません。サイズを変更できるようにウィンドウを設定してサイズを変更すると、グラフィックスの動作を簡単に確認できます。私はたくさんのソリューションを試してきましたが、どれも解決しませんでした。私はこのサイトで多くの質問を見てきましたが、何も私のために働くようには見えませんでした。アイデアが大好きです。ありがとう!

+0

ほとんどのコードがどこから呼び出されているのかわかりません。 'MainWindow'はスレッドとして起動する必要があります。 –

+0

あなたは何の同期もなしに複数のスレッドを持っていますので、これ以上の理由がありません。たとえば、 'gsm.keyPressed(...)'は、同期/揮発性を持たない別のスレッドに割り当てられているので、 'NullPointerException'を正当にスローすることができます。 [同時実行チュートリアル](https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html)または[タイマーを使用する](https://docs.oracle.com/)を読む必要があります。 javase/tutorial/uiswing/misc/timer.html)、おそらく複数のスレッドを使用する特別な理由はないからです。 – Radiodef

+0

@Radiodef複数のスレッドがある場所がわかりません.Windowsデスクトップでプログラムを実行したときに問題が発生していないようです。 –

答えて

1

getGraphics()を使用してペイントしないでください。

代わりにJPanelpaintComponent()メソッドをオーバーライドしてカスタムペインティングを行います。詳しくは、Custom PaintingのSwingチュートリアルのセクションを読んでください。

パネルのプロパティが変更されたためにコンポーネントを再描画する場合は、パネルでrepaint()を呼び出します。だからあなたのupdate()メソッドを取り除き、repaint()を呼び出してパネルをペイントしてください。

+0

なぜこれがMacで違う動作を引き起こすのでしょうか? – ChiefTwoPencils

+0

@ChiefTwoPencils、いいえ、私はMacを一度も使用していないためです。窓がうまく動作しないようにしてください。あなたが将来の変化を目覚めさせれば、それはただ運が良ければ簡単に壊れることがあります。私が知っているのは、すべてのプラットフォームで動作するようにカスタムペインティングを行う適切な方法であり、現在は行っていません。 – camickr

+0

私は質問をする人ではありませんが、より詳細な/技術的な情報があれば興味があります。 – ChiefTwoPencils

関連する問題