Debugging Listing 2 (ActionScript tutorial): Difference between revisions

From Whirled Club Wiki
Jump to navigation Jump to search
m (Text replacement - ">" to ">")
m (Text replacement - "<" to "<")
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
This is for use with the [[Debugging (ActionScript tutorial)]].
This is for use with the [[Debugging (ActionScript tutorial)]].


&lt;actionscript>
<actionscript>
   1 package {
   1 package {
   2
   2
Line 24: Line 24:
  21 import flash.text.TextFieldAutoSize;
  21 import flash.text.TextFieldAutoSize;
  22
  22
  23 [SWF(width=&quot;181&quot;, height=&quot;170&quot;)]
  23 [SWF(width="181", height="170")]
  24 public class Rooster extends Sprite
  24 public class Rooster extends Sprite
  25 {
  25 {
Line 53: Line 53:
  50
  50
  51        // add custom actions and listen for custom action events
  51        // add custom actions and listen for custom action events
  52        _control.registerActions(&quot;Beep&quot;, &quot;Double Beep&quot;, &quot;Test&quot;);
  52        _control.registerActions("Beep", "Double Beep", "Test");
  53        _control.addEventListener(ControlEvent.ACTION_TRIGGERED,
  53        _control.addEventListener(ControlEvent.ACTION_TRIGGERED,
  54            handleAction);
  54            handleAction);
Line 94: Line 94:
  91
  91
  92        // we assume that our image naturally faces left
  92        // we assume that our image naturally faces left
  93        if (orientation &lt; 180) {
  93        if (orientation < 180) {
  94            // we need to face right
  94            // we need to face right
  95            _image.x = _image.width;
  95            _image.x = _image.width;
Line 176: Line 176:
173
173
174        switch (event.name) {
174        switch (event.name) {
175        case &quot;Beep&quot;:
175        case "Beep":
176            _msg.text = &quot;Beep&quot;
176            _msg.text = "Beep"
177            _beep.play();
177            _beep.play();
178            break;
178            break;
179
179
180        case &quot;Double Beep&quot;:
180        case "Double Beep":
181            _msg.text = &quot;Double Beep&quot;
181            _msg.text = "Double Beep"
182            _beep.play(0, 2);
182            _beep.play(0, 2);
183            break;
183            break;
184
184
185        default:
185        default:
186            _msg.text = &quot;Unknown action:&quot; + event.name
186            _msg.text = "Unknown action:" + event.name
187            trace(&quot;Unknown action: &quot; + event.name);
187            trace("Unknown action: " + event.name);
188            break;
188            break;
189        }
189        }
Line 230: Line 230:
227
227
228    /** The embedded image class. */
228    /** The embedded image class. */
229    [Embed(source=&quot;Rooster.png&quot;)]
229    [Embed(source="Rooster.png")]
230    protected static const IMAGE :Class;
230    protected static const IMAGE :Class;
231
231
232    [Embed(source=&quot;beep.mp3&quot;)]
232    [Embed(source="beep.mp3")]
233    protected static const BEEP :Class;
233    protected static const BEEP :Class;
234 }
234 }
Line 239: Line 239:
236 } // END: package
236 } // END: package


&lt;/actionscript>
</actionscript>
&lt;noinclude>[[Category:Subpages]]&lt;/noinclude>
<noinclude>[[Category:Subpages]]</noinclude>

Latest revision as of 15:35, 5 September 2018

This is for use with the Debugging (ActionScript tutorial).

<actionscript>

 1 package {
 2
 3 import flash.display.DisplayObject;
 4 import flash.display.Sprite;
 5
 6 import flash.events.Event;
 7 import flash.events.TimerEvent;
 8
 9 import flash.filters.GlowFilter;
10
11 import flash.media.Sound;
12
13 import flash.utils.getTimer; // function import
14 import flash.utils.Timer;
15
16 import com.whirled.AvatarControl;
17 import com.whirled.ControlEvent;
18
19 // Text support
20 import flash.text.TextField;
21 import flash.text.TextFieldAutoSize;
22
23 [SWF(width="181", height="170")]
24 public class Rooster extends Sprite
25 {
26     /**
27      * Constructor.
28      */
29     public function Rooster ()
30     {
31         // create and add the image
32         _image = (new IMAGE() as DisplayObject);
33
34         // use the _avatarSprite sprite to easily offset the image without
35         // having to worry about the image's offset ever again
36         _avatarSprite = new Sprite();
37         _avatarSprite.x = 10;
38         _avatarSprite.y = 10;
39         _avatarSprite.addChild(_image);
40         addChild(_avatarSprite);
41
42         // create the control for whirled communication
43         _control = new AvatarControl(this);
44         // add a listener for appearance updates
45         _control.addEventListener(ControlEvent.APPEARANCE_CHANGED,
46             handleAppearanceChanged);
47         // add a listener to hear about speak events
48         _control.addEventListener(ControlEvent.AVATAR_SPOKE,
49             handleSpoke);
50
51         // add custom actions and listen for custom action events
52         _control.registerActions("Beep", "Double Beep", "Test");
53         _control.addEventListener(ControlEvent.ACTION_TRIGGERED,
54             handleAction);
55
56         // create our beep sound
57         _beep = (new BEEP() as Sound);
58
59         // When we do speak, we're going to glow purple for 200ms, then stop
60         _speakTimer = new Timer(200, 1);
61         _speakTimer.addEventListener(TimerEvent.TIMER, doneSpeaking);
62
63         // We should erase the chatBox after a second
64         _chatBoxTimer = new Timer(1000, 1);
65         _chatBoxTimer.addEventListener(TimerEvent.TIMER, doneBeeping);
66
67         // Prepare message
68         _msg = new TextField();
69         _msg.border = true;
70         _msg.background = true;
71         _msg.autoSize = TextFieldAutoSize.LEFT;
72
73         // and kick things off by updating the appearance immediately
74         updateAppearance();
75     }
76
77     /**
78      * Handles ControlEvent.APPEARANCE_CHANGED.
79      */
80     protected function handleAppearanceChanged (event :ControlEvent) :void
81     {
82         updateAppearance();
83     }
84
85     /**
86      * Update the appearance of this avatar.
87      */
88     protected function updateAppearance () :void
89     {
90         var orientation :Number = _control.getOrientation();
91
92         // we assume that our image naturally faces left
93         if (orientation < 180) {
94             // we need to face right
95             _image.x = _image.width;
96             _image.scaleX = -1;
97
98         } else {
99             // normal facing

100 _image.x = 0; 101 _image.scaleX = 1; 102 } 103 104 // see if we need to update our bouncing 105 if (_bouncing != _control.isMoving()) { 106 _bouncing = _control.isMoving(); 107 if (_bouncing) { 108 addEventListener(Event.ENTER_FRAME, handleEnterFrame); 109 _bounceStamp = getTimer(); 110 111 } else { 112 removeEventListener(Event.ENTER_FRAME, handleEnterFrame); 113 _image.y = 0; // reset to unbouncing 114 } 115 } 116 } 117 118 /** 119 * We've just spoken. Glow purple for a bit. 120 */ 121 protected function handleSpoke (event :ControlEvent) :void 122 { 123 // reset the timer, cancels any pending 'doneSpeaking' call. 124 _speakTimer.reset(); 125 126 // only set up the filter if it hasn't already 127 if (this.filters == null || this.filters.length == 0) { 128 this.filters = [ new GlowFilter(0xFF00FF, 1, 10, 10) ]; 129 } 130 // start the timer 131 _speakTimer.start(); 132 } 133 134 /** 135 * It's time to stop showing our speaking glow. 136 */ 137 protected function doneSpeaking (event :TimerEvent) :void 138 { 139 this.filters = null; 140 } 141 142 /** 143 * It's time to stop showing our chat box. 144 */ 145 protected function doneBeeping (event :TimerEvent) :void 146 { 147 /* Remove the messsage */ 148 _avatarSprite.removeChild(_msg); 149 } 150 151 /** 152 * Called just prior to every frame that is rendered to screen. 153 */ 154 protected function handleEnterFrame (event :Event) :void 155 { 156 var now :Number = getTimer(); 157 var elapsed :Number = getTimer() - _bounceStamp; 158 159 // compute our bounce 160 _image.y = BOUNCE_AMPLITUDE * 161 Math.sin(elapsed * (Math.PI * 2) / BOUNCE_PERIOD); 162 } 163 164 /** 165 * Handle ACTION_TRIGGERED to play our custom actions. 166 */ 167 protected function handleAction (event :ControlEvent) :void 168 { 169 170 // Reset the chatBox timer in case an event is 171 // retriggered before the timer goes off. 172 _chatBoxTimer.reset(); 173 174 switch (event.name) { 175 case "Beep": 176 _msg.text = "Beep" 177 _beep.play(); 178 break; 179 180 case "Double Beep": 181 _msg.text = "Double Beep" 182 _beep.play(0, 2); 183 break; 184 185 default: 186 _msg.text = "Unknown action:" + event.name 187 trace("Unknown action: " + event.name); 188 break; 189 } 190 // For all events pop up a message 191 _avatarSprite.addChild(_msg); 192 _chatBoxTimer.start(); 193 } 194 195 /** The image we're displaying. */ 196 protected var _image :DisplayObject; 197 198 /** Container for the image (avatar) */ 199 protected var _avatarSprite :Sprite; 200 201 /** Our beep sound. */ 202 protected var _beep :Sound; 203 204 /** The avatar control interface. */ 205 protected var _control :AvatarControl; 206 207 /** Controls the timing of our speak action. */ 208 protected var _speakTimer :Timer; 209 210 /** Controls the timing of our chat box. */ 211 protected var _chatBoxTimer :Timer; 212 213 /** Message variable holding our chat content */ 214 protected var _msg :TextField; 215 216 /** Are we bouncing? */ 217 protected var _bouncing :Boolean; 218 219 /** The timestamp at which we started bouncing. */ 220 protected var _bounceStamp :Number; 221 222 /** The amplitude of our bounce, in pixels. */ 223 protected static const BOUNCE_AMPLITUDE :int = 10; 224 225 /** The period of our bounce: we do one bounce every 500 milliseconds. */ 226 protected static const BOUNCE_PERIOD :int = 500; 227 228 /** The embedded image class. */ 229 [Embed(source="Rooster.png")] 230 protected static const IMAGE :Class; 231 232 [Embed(source="beep.mp3")] 233 protected static const BEEP :Class; 234 } 235 236 } // END: package

</actionscript>