2014-02-05 116 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; 
     } 
    } 
    } 
}