开发者

Java Animation: Rotating Image

I have a very simple animation task for Java. I need to create a basic "Wheel of Fortune Applet". Basically what will be displayed is a wheel and a button. When that button is pressed I want it to select a random # of degrees (say in the range of 720-3600) and spin the wheel that many degrees. I will then use some logic to convert that degree number to a money value. My problem is in the animation, how do I get a开发者_如何转开发n image to spin at a constant pace for x number of degrees? Is there a swing function for that? Help would be much appreciated, I don't need to know anything else about Java animation right now besides that.


I'm going to assume that you understand how to rotate an image once. If you don't, you can probably find that with a quick google search.

What you need is a background process that rotates it for you. It works like this:

/**
 * Warning - this class is UNSYNCHRONIZED!
 */
public class RotatableImage {
    Image image;
    float currentDegrees;

    public RotateableImage(Image image) {
        this.image = image;
        this.currentDegrees = 0.0f;
        this.remainingDegrees = 0.0f;
    }

    public void paintOn(Graphics g) {
        //put your code to rotate the image once in here, using current degrees as your rotation
    }

    public void spin(float additionalDegrees) {
        setSpin(currentDegrees + additionalDegrees);
    }

    public void setSpin(float newDegrees) {
        currentDegrees += additionalDegrees;
        while(currentDegrees < 0f) currentDegrees += 360f;
        while(currentDegrees >= 360f) currentDegrees -= 360f;
    }

}

public class ImageSpinner implements Runnable {
    RotateableImage image;
    final float totalDegrees;
    float degrees;
    float speed; // in degrees per second
    public ImageSpinner(RotatableImage image, float degrees, float speed) {
        this.image = image;
        this.degrees = degrees;
        this.totalDegrees = degrees;
        this.speed = speed;
    }

    public void run() {
        // assume about 40 frames per second, and that the it doesn't matter if it isn't exact
        int fps = 40;
        while(Math.abs(degrees) > Math.abs(speed / fps)) { // how close is the degrees to 0? 
            float degreesToRotate = speed / fps;
            image.spin(degreesToRotate);
            degrees -= degreesToRotate;
            /* sleep will always wait at least 1000 / fps before recalcing
               but you have no guarantee that it won't take forever! If you absolutely
               require better timing, this isn't the solution for you */
            try { Thread.sleep(1000 / fps); } catch(InterruptedException e) { /* swallow */ }
        }
        image.setSpin(totalDegrees); // this might need to be 360 - totalDegrees, not sure
    }

}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜