Вращение круга в J2ME с использованием Canvas - PullRequest
0 голосов
/ 20 мая 2010

У меня есть проблема, когда мне нужно сделать разноцветное вращение колеса, используя 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();
    }
}

Я пытался использовать метод redraw (), который добавляет spinSpeed ​​к каждому значению клина while (spinSpeed> 0) и вызывает метод repaint () после добавления, но это вызывает сбой и блокировку (полагаю, из-за в бесконечный цикл). У кого-нибудь есть какие-либо советы или идеи, как я могу автоматизировать вращение, чтобы у вас не было нажатия кнопки каждый раз, когда вы хотите, чтобы оно вращалось?

(PS - Я скрывался некоторое время, но это мой первый пост. Если он слишком общий или требует слишком много информации (извините, если это так), и я либо удаляю его, либо исправляю. Спасибо!)

Ответы [ 2 ]

1 голос
/ 13 июня 2010

Я думаю, что вы должны создать поток и в методе выполнения потока вызвать этот метод paint / repaint. Если вы хотите, чтобы нажатие клавиши запускало поток, чем просто:

case KEY_NUM6: thread.start;

0 голосов
/ 20 мая 2010

учитывая, что у вас еще нет ответа, я подумал, что постараюсь внести свой вклад, хотя мой опыт не в 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);
}

Теперь сущности, которые вы хотите визуализировать, расширяют этот класс, позволяя добавлять их в цикл визуализации. Например, класс клина Закрытый класс Wedge расширяет Entity { 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, и я также надеюсь, что вы понимаете, что этот код может быть далеко не оптимальным, и если вы хотите, чтобы я расширил его, просто прокомментируйте.

...