tags:

views:

28

answers:

1

I've been having problems modifying this code in order to make it show 5 different world clocks. Right now, the simpleClock code shows just one simple clock. What I need help with is making it show 5 clocks next to one another and each clock having the time of a specific city in the world. I know that I only need to change the hours for each clock based on the time in that city but I also need to have the clock change color to represent the time of day. This is the codes for the AnalogClockFace and SimpleClock. If anyone could help me with this I would really, really appreciate it! Thanks.

package com.example.programmingas3.simpleclock { import flash.display.Shape; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.text.StaticText; import flash.events.*; import flash.text.TextField; import flash.text.TextFormat;

/**
 * Displays a round clock face with an hour hand, a minute hand, and a second hand.
 */
public class AnalogClockFace extends Sprite
{
    /**
     * The desired width of this component, as opposed to the .width
     * property which represents tha actual width.
     */
    public var w:uint = 200;

    /**
     * The desired height of this component, as opposed to the .height
     * property which represents tha actual height.
     */
    public var h:uint = 200;

    /**
     * The radius from the center of the clock to the 
     * outer edge of the circular face outline.
     */
    public var radius:uint;

    /**
     * The coordinates of the center of the face.
     */
    public var centerX:int;
    public var centerY:int;

    /**
     * The three hands of the clock.
     */
    public var hourHand:Shape;
    public var minuteHand:Shape;
    public var secondHand:Shape;

    /**
     * The colors of the background and each hand.
     * These could be set using parameters or 
     * styles in the future.
     */ 
    public var bgColor:uint = 0xEEEEFF;
    public var hourHandColor:uint = 0x003366;
    public var minuteHandColor:uint = 0x000099;
    public var secondHandColor:uint = 0xCC0033;

    /**
     * Stores a snapshot of the current time, so it
     * doesn't change while in the middle of drawing the
     * three hands.
     */
    public var currentTime:Date;

    /**
     * Contructs a new clock face. The width and
     * height will be equal.
     */  
    public function AnalogClockFace(w:uint) 
    {
        this.w = w;
        this.h = w;

        // Rounds to the nearest pixel
        this.radius = Math.round(this.w / 2);

        // The face is always square now, so the
        // distance to the center is the same
        // horizontally and vertically
        this.centerX = this.radius;
        this.centerY = this.radius;
    }

    /**
     * Creates the outline, hour labels, and clock hands.
     */ 
    public function init():void 
    {
        // draws the circular clock outline
        drawBorder();

        // draws the hour numbers
        drawLabels();

        // creates the three clock hands
        createHands();
    }

    /**
    * Draws a circular border.
    */
    public function drawBorder():void
    {
        graphics.lineStyle(0.5, 0x999999);
        graphics.beginFill(bgColor);
        graphics.drawCircle(centerX, centerY, radius);
        graphics.endFill();
    }

    /**
     * Puts numeric labels at the hour points.
     */
    public function drawLabels():void
    {
        for (var i:Number = 1; i <= 12; i++)
        {
            // Creates a new TextField showing the hour number
            var label:TextField = new TextField();
            label.text = i.toString();

            // Places hour labels around the clock face.
            // The sin() and cos() functions both operate on angles in radians.
            var angleInRadians:Number = i * 30 * (Math.PI/180)

            // Place the label using the sin() and cos() functions to get the x,y coordinates.
            // The multiplier value of 0.9 puts the labels inside the outline of the clock face.
            // The integer value at the end of the equation adjusts the label position,
            // since the x,y coordinate is in the upper left corner.
            label.x = centerX + (0.9 * radius * Math.sin( angleInRadians )) - 5;
            label.y = centerY - (0.9 * radius * Math.cos( angleInRadians )) - 9;

            // Formats the label text.
            var tf:TextFormat = new TextFormat();
            tf.font = "Arial";
            tf.bold = "true";
            tf.size = 12;
            label.setTextFormat(tf);

            // Adds the label to the clock face display list.
            addChild(label);
        }
    }

    /**
    * Creates hour, minute, and second hands using the 2D drawing API.
    */
    public function createHands():void
    {
        // Uses a Shape since it's the simplest component that supports
        // the 2D drawing API.
        var hourHandShape:Shape = new Shape();
        drawHand(hourHandShape, Math.round(radius * 0.5), hourHandColor, 3.0);
        this.hourHand = Shape(addChild(hourHandShape));
        this.hourHand.x = centerX;
        this.hourHand.y = centerY;

        var minuteHandShape:Shape = new Shape();
        drawHand(minuteHandShape, Math.round(radius * 0.8), minuteHandColor, 2.0);
        this.minuteHand = Shape(addChild(minuteHandShape));
        this.minuteHand.x = centerX;
        this.minuteHand.y = centerY;

        var secondHandShape:Shape = new Shape();
        drawHand(secondHandShape, Math.round(radius * 0.9), secondHandColor, 0.5);
        this.secondHand = Shape(addChild(secondHandShape));
        this.secondHand.x = centerX;
        this.secondHand.y = centerY;
    }

    /**
    * Draws a clock hand with a given size, color, and thickness.
    */
    public function drawHand(hand:Shape, distance:uint, color:uint, thickness:Number):void
    {
        hand.graphics.lineStyle(thickness, color);
        hand.graphics.moveTo(0, distance);
        hand.graphics.lineTo(0, 0);
    }

   /**
    * Called by the parent container when the display is being drawn.
    */
    public function draw():void
    {
        // Stores the current date and time in an instance variable
        currentTime = new Date();
        showTime(currentTime);
    }

    /**
     * Displays the given Date/Time in that good old analog clock style.
     */
    public function showTime(time:Date):void 
    {
        // Gets the time values
        var seconds:uint = time.getSeconds();
        var minutes:uint = time.getMinutes();
        var hours:uint = time.getHours();

        // Multiplies by 6 to get degrees
        this.secondHand.rotation = 180 + (seconds * 6);
        this.minuteHand.rotation = 180 + (minutes * 6);

        // Multiplies by 30 to get basic degrees, and then
        // adds up to 29.5 degrees (59 * 0.5) to account 
        // for the minutes
        this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5);
    }
}

}

package com.example.programmingas3.simpleclock {

import flash.display.Sprite;

public class SimpleClock extends Sprite
{
    import com.example.programmingas3.simpleclock.AnalogClockFace; 
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    /**
     * The time display component.
     */
    public var face:AnalogClockFace;

    /**
     * The Timer that acts like a heartbeat for the application.
     */
    public var ticker:Timer;

    public static const millisecondsPerMinute:int = 1000 * 60;
    public static const millisecondsPerHour:int = 1000 * 60 * 60;
    public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;

    /**
     * Sets up a SimpleClock instance.
     */
    public function initClock(faceSize:Number = 200):void 
    {

        // Creates the clock face and adds it to the Display List
        face = new AnalogClockFace(Math.max(20, faceSize));
        face.init();
        addChild(face);

        // Draws the initial clock display
        face.draw();

        // Creates a Timer that fires an event once per second.
        ticker = new Timer(1000); 

        // Designates the onTick() method to handle Timer events
        ticker.addEventListener(TimerEvent.TIMER, onTick);

        // Starts the clock ticking
        ticker.start();
    }

    /**
     * Called once per second when the Timer event is received.
     */
    public function onTick(evt:TimerEvent):void 
    {
        // Updates the clock display.
        face.draw();
    }       
}

}

A: 

You will have to change a couple of function in the AnalogFace to represent the time of the city this clock is set to.

    private var tzOffset:Number;

    public function initClock(faceSize:Number = 200 , offset:Number):void 
    {
         tzOffset = offset;
         // the rest of the code here...
    }

    public function draw():void
    {
        // Stores the current date and time in an instance variable
        //currentTime = new Date();

        var localTime:Date = new Date()

        // too lazy , I let you handle the code for that ;)
        // You need to change the currentTime property 
        // Get the UTC time , add the tzOffset (which can be negative depending on the city)
        // then get your localTime value as a Date object
        showTime(localTime);
    }

Put your locations in an Array of Objects which will contain the name of the city and a timeZoneOffset in minutes.

  var locations:Array = [{city:Paris , timeZoneOffset: 60 } , etc...];

Assuming your SimpleClock is working , to create five clocks you create five instances of Simple Clock.

 var padding:int = 20; //the distance between each clock
 var clockX:int; // a variable that you'll use to place the clock on the x axis

 for( var i:int ; i < locations.length ; ++i )
 {
    var clock:SimpleClock = new SimpleClock();
    clock.initClock( 200 , locations[i].timeZoneOffset );
    clock.x = clockX;
    clockX += clock.width + padding;

    //here you can update your Array of objects with the clock value
    //so Paris will have the first clock etc...  , to change the order , change the 
    order in the Array
    locations[i].clock = clock;
 }

Provided that you get your calculations correctly for the time difference , this should work...

PatrickS
Thanks for the help. The only problem i'm having is that I am a complete beginner to actionscript and so i'm still alittle unsure where I need to put your code. This stuff confuses the crap out of me.
Jen
You should check Colin Mook's Lost Actionscript Week End series, it's a video tutorial. It's a great introduction to Actionscript and you should feel a lot more comfortable after viewing it. http://tv.adobe.com/show/colin-moocks-lost-actionscript-weekend/
PatrickS