2010-05-19 61 views
0

我有一个问题,我需要在J2ME中使用Canvas制作多色轮旋转。我需要做的是让用户增加旋转的速度或减慢旋转的轮子。我主要解决了这个问题(我认为),但是不能想象一种让车轮旋转而不会导致手机崩溃的方法。这是我到目前为止,它接近但不完全是我需要的。使用画布在J2ME中旋转圆圈

class MyCanvas extends Canvas{ 
//wedgeOne/Two/Three define where this particular section of circle begins to be drawn from 
int wedgeOne; 
int wedgeTwo; 
int wedgeThree; 
int spinSpeed; 
MyCanvas(){ 
    wedgeOne = 0; 
    wedgeTwo = 120; 
    wedgeThree = 240; 
    spinSpeed = 0; 
} 
//Using the paint method to 
public void paint(Graphics g){ 
    //Redraw the circle with the current wedge series. 
    g.setColor(255,0,0); 
    g.fillArc(getWidth()/2, getHeight()/2, 100, 100, wedgeOne, 120); 
    g.setColor(0,255,0); 
    g.fillArc(getWidth()/2, getHeight()/2, 100, 100, wedgeTwo, 120); 
    g.setColor(0,0,255); 
    g.fillArc(getWidth()/2, getHeight()/2, 100, 100, wedgeThree, 120); 
} 
protected void keyPressed(int keyCode){ 
    switch (keyCode){ 
     //When the 6 button is pressed, the wheel spins forward 5 degrees. 
     case KEY_NUM6: 
      wedgeOne += 5; wedgeTwo += 5; wedgeThree += 5; 
      repaint(); 
      break; 
     //When the 4 button is pressed, the wheel spins backwards 5 degrees. 
     case KEY_NUM4: 
      wedgeOne -= 5; wedgeTwo -= 5; wedgeThree -= 5; 
      repaint(); 
    } 
} 

我已使用,其将所述spinSpeed到每个楔值的同时(spinSpeed> 0),并调用在加入后重绘()方法重绘()方法试过,但它会导致系统崩溃和锁止(我假设由于无限循环)。有没有人有任何提示或想法如何我可以自动旋转,所以你没有按下按钮,每次你想它旋转? (PS - 我已经潜伏了一段时间,但这是我的第一篇文章,如果它太笼统或要求太多的信息(对不起,如果是的话),我要么删除它,要么修复它。谢谢! )

回答

1

我想你应该创建一个线程,并在线程的run方法中调用这个paint/repaint方法。 如果您希望的keyPressed运行的线程比它简单地说:

case KEY_NUM6: thread.start;

+0

这是我遇到的问题,我没有意识到所有的动画都必须在单独的线程中完成。 – JohnQPublic 2010-06-18 00:35:30

0

考虑到你还没有回应,我想尽管我的经验不在J2ME中,我仍会尝试贡献。我在Java2D中有一些练习,在J2ME上可能会有这种练习,尽管有人可以随意告诉我,否则!

如果你能够使用JPanel,你可以设计一个类似于我以前使用过的设计的类似设计的游戏循环。

这个想法:在给定的时间间隔内,每一个必须绘制的实体(在这个例子中是楔子)互相交换,更新它以找到新的位置,并让它自己绘制。为了证明这一点,这里是一个的GamePanel的相当剥离出来的版本我已经用在─

public class GamePanel extends JPanel { 
Timer loopTimer; 
boolean changed = false; 
ArrayList<Entity> entities = new ArrayList<Entity>(); 
int spinSpeed = 1; 
int pollingMillis = 20; 

public GamePanel() { 
    setBackground(Color.black); 
    setDoubleBuffered(true); 
    entities.add(new Wedge(0,0,0,90,Color.red));  // See below about these lines 
    entities.add(new Wedge(0,0,90,90,Color.blue)); 
    entities.add(new Wedge(0,0,180,90,Color.yellow)); 
    entities.add(new Wedge(0,0,270,90,Color.green)); 
    loopTimer = new Timer(); 
    loopTimer.scheduleAtFixedRate(new runLoop(), 0, pollingMillis); 
} 

public void addEntity(Entity e) { 
    entities.add(e); 
} 

@Override 
public void paint (Graphics graph) { 
    super.paint(graph); 
    Graphics2D g = (Graphics2D) graph; 
    for (Entity e: entities) { 
     e.draw(g); 
    } 
    g.dispose(); 
} 

private class runLoop extends TimerTask { 
    @Override 
    public void run() { 
     for (Entity e: entities) { 
      e.update(); 
     } 
     if (changed) { 
      repaint(); 
      changed = false; 
     } 
    } 
} 
} 

这将创建一个基本周期,让你呈现的项目到JPanel中。上面的代码已经添加了4个“楔子”,尽管你还需要更多的代码。要做到这一点,你需要以下抽象类:

public abstract class Entity { 
int x,y; 
public Entity (int x, int y) { 
    this.x = x; 
    this.y = y; 
} 
public abstract void update(); 
public abstract void draw(Graphics2D g); 
} 

现在,你要渲染的实体扩展这个类,允许它们加入到渲染循环。例如,楔形类- 私有类楔形扩展了实体{int startAngle; int arcLength; 颜色的颜色;

public Wedge (int x, int y, int start, int length, Color color) { 
     super(x,y); 
     startAngle = start; 
     arcLength = length; 
     this.color = color; 
    } 

    @Override 
    public void update() { 
     startAngle -= spinSpeed; 
     changed = true; 
    } 

    @Override 
    public void draw(Graphics2D g) { 
     g.setColor(color); 
     g.fillArc(x, y, 200, 200, startAngle, arcLength); 
    } 
} 

这应该允许您呈现旋转的动画圆圈!我希望其中的一些可以转换到J2ME,我也希望你能够理解这个代码可能远远不是最优的,如果你希望我扩展它,请评论一下。

+0

谢谢你的回答,但J2ME没有很多上面提到的方法和类。不过,我想,你已经给了我一个关于如何解决这个问题的想法。谢谢! – JohnQPublic 2010-05-22 15:48:53

+0

没问题,但如果您希望我很乐意尝试和进一步提供帮助 - 只需告诉我哪些课程不在J2ME环境中获得,并且我可以尝试使用替代方法更好地调整解决方案! – obfuscation 2010-05-22 22:07:09