2014-02-05 50 views
0

我做了一個簡單的(我覺得)演示播放的背景音樂,而動畫的128x128蠟燭雪碧閃爍的背景和顯示文本和每2秒刷新一次與一個TimerTask。這個演示在模擬器(MicroEmulator)中工作正常,但在所有計數上都失敗,但在我的LG500G和摩托羅拉EM326G手機上都沒有音樂。因爲他們都以同樣的方式失敗了,我懷疑我可能做錯了什麼。使用g.drawString()都不會顯示任何文本。無論是我的手機是極其有限的,或者我寫了可怕的古怪:(注意我已經註釋掉對雪碧的代碼,因爲只有一幀顯示)g.drawString失敗對MIDP 2.0的手機

import java.io.IOException; 
    import java.util.Timer; 
    import java.util.TimerTask; 
    import javax.microedition.lcdui.Graphics; 
    import javax.microedition.lcdui.Image; 
    import javax.microedition.lcdui.game.*; 
    import javax.microedition.media.*; 

    public class GardenGameCanvas extends GameCanvas implements Runnable { 
private Image bgImage; 
private Sprite bgSprite; 
private boolean stop; 
private LayerManager manager; 
private int a = 0; 
private String[] list; 
textTask aTextTask; 
Player midiplayer = null; 

public GardenGameCanvas() { 
    super(false); 
} 

public void start() { 
    list = new String[] { "As you watch this candle", "It flickers.", 
      "Against the gale of Life", "It's flickering.", "Persistently" }; 
    try { 
     midiplayer = Manager.createPlayer(
       getClass().getResourceAsStream("/pavane_defunte_mb.mid"), 
       "audio/midi"); 
     midiplayer.prefetch(); 
     midiplayer.start(); 
    } catch (Exception e) { 
    } 
    //try { 

     //bgImage = Image.createImage("/flame.png"); 
     //bgSprite = new Sprite(bgImage, 128, 128); 
     //manager = new LayerManager(); 
     //manager.append(bgSprite); 


    //} catch (IOException ioex) { 
    // System.err.println(ioex); 
    //} 
    stop = false; 
    Thread runner = new Thread(this); 
    runner.start(); 

} 

public void run() { 
    aTextTask = new textTask(); 
    new Timer().schedule(aTextTask, 0, 2000); 
    while (!stop) { 

     update(getGraphics()); 
     try { 
      Thread.currentThread().sleep(30); 
     } catch (Exception e) { 
     } 

    } 
} 

private void update(Graphics g) { 
    g.setColor(0xFFFFFF); // white 
    g.fillRect(0, 0, getWidth(), getHeight()); 

    // bgSprite.setPosition(0, 0); 
    //bgSprite.nextFrame(); 
    //bgSprite.paint(g); 
    buildGame(g); 
    //manager.paint(g, 0, 0); 
    flushGraphics(); 
} 

private void buildGame(Graphics g) { 
    g.setColor(0xFFFFFF); 
    g.fillRect(0, getHeight()/2, getWidth(), 75); 
    g.setColor(0x000000); 
    g.drawString(list[a], 0, getHeight()/2, Graphics.LEFT); 
    flushGraphics(); 
} 

public class textTask extends TimerTask { 
    public textTask() { 
    } 

    public void run() { 
     a++; 
     if (a > 4) { 
      a = 0; 
     } 
    } 

} 

    } 

回答

0

我懷疑故障由您多次調用引起flushGraphics()

你第一次調用flushGraphics將刷新圖形並顯示它(除非它沒有機會顯示任何東西,因爲你第二次調用flushGraphics)。 你第二次調用flushGraphics之後將不會刷新屏幕,導致沒有任何顯示。

試試這個: (相同的代碼如上,只需用電話的一個註釋掉flushGraphics)。

import java.io.IOException; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.microedition.lcdui.Graphics; 
import javax.microedition.lcdui.Image; 
import javax.microedition.lcdui.game.*; 
import javax.microedition.media.*; 

public class GardenGameCanvas extends GameCanvas implements Runnable { 

    private Image bgImage; 
    private Sprite bgSprite; 
    private boolean stop; 
    private LayerManager manager; 
    private int a = 0; 
    private String[] list; 
    textTask aTextTask; 
    Player midiplayer = null; 

    public GardenGameCanvas() { 
    super(false); 
    } 

    public void start() { 
    list = new String[]{"As you watch this candle", "It flickers.", 
     "Against the gale of Life", "It's flickering.", "Persistently"}; 
    try { 
     midiplayer = Manager.createPlayer(
       getClass().getResourceAsStream("/pavane_defunte_mb.mid"), 
       "audio/midi"); 
     midiplayer.prefetch(); 
     midiplayer.start(); 
    } catch (Exception e) { 
    } 
    //try { 

    //bgImage = Image.createImage("/flame.png"); 
    //bgSprite = new Sprite(bgImage, 128, 128); 
    //manager = new LayerManager(); 
    //manager.append(bgSprite); 


    //} catch (IOException ioex) { 
    // System.err.println(ioex); 
    //} 
    stop = false; 
    Thread runner = new Thread(this); 
    runner.start(); 

    } 

    public void run() { 
    aTextTask = new textTask(); 
    new Timer().schedule(aTextTask, 0, 2000); 
    while (!stop) { 

     update(getGraphics()); 
     try { 
     Thread.currentThread().sleep(30); 
     } catch (Exception e) { 
     } 

    } 
    } 

    private void update(Graphics g) { 
    g.setColor(0xFFFFFF); // white 
    g.fillRect(0, 0, getWidth(), getHeight()); 

    // bgSprite.setPosition(0, 0); 
    //bgSprite.nextFrame(); 
    //bgSprite.paint(g); 
    buildGame(g); 
    //manager.paint(g, 0, 0); 
    flushGraphics(); 
    } 

    private void buildGame(Graphics g) { 
    g.setColor(0xFFFFFF); 
    g.fillRect(0, getHeight()/2, getWidth(), 75); 
    g.setColor(0x000000); 
    g.drawString(list[a], 0, getHeight()/2, Graphics.LEFT); 
    //flushGraphics(); // Don't call flushGraphics here, because it'll be called twice then. 
    } 

    public class textTask extends TimerTask { 

    public textTask() { 
    } 

    public void run() { 
     a++; 
     if (a > 4) { 
     a = 0; 
     } 
    } 
    } 
}