使用Canvas在J2ME中旋转一个圆圈

时间:2010-05-19 22:17:01

标签: graphics java-me

我有一个问题,我需要在J2ME中使用Canvas进行多色轮转动。我需要做的是让用户增加旋转的速度或减慢车轮的旋转。我已经完成了(我认为),但是想不到让车轮旋转而不会导致手机崩溃的方法。这是我到目前为止所做的,它很接近但不完全是我需要的。

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

我尝试使用redraw()方法将spinSpeed添加到每个楔形值(spinSpeed> 0)并在添加后调用repaint()方法,但它会导致崩溃和锁定(我假设到期无限循环)。有没有人有任何提示或想法如何自动旋转,所以你没有每次按下按钮按钮?

(PS - 我已经潜伏了一段时间,但这是我的第一篇文章。如果它太笼统或者要求太多信息(对不起,如果是),我要么删除它,要么修复它。谢谢!)

2 个答案:

答案 0 :(得分:1)

我认为你应该创建一个线程并在线程的run方法中调用这个paint / repaint方法。 如果你希望keypressed运行线程而不是简单:

case KEY_NUM6: thread.start;

答案 1 :(得分: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个'wedges',尽管你还需要更多的代码。为此,您需要以下抽象类:

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

现在,您要渲染的实体扩展了此类,允许将它们添加到渲染周期中。例如,楔形类 -     私有类Wedge扩展实体{         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,我也希望你能理解这段代码可能远非最优,如果你希望我扩展其中任何一个,只需评论。