JavaScript Particle System Demo

September 30, 2011 at 5:31 pm

I recently had to build a JavaScript HTML5 Canvas particle system to achieve a comet effect inside a website. I’ll be releasing the API once I clean up the code. Check out the demo in the meantime.

Jersey Shore Tech Meetup Presentation

September 15, 2011 at 5:27 pm

I presented “You Already Know How To Build Mobile Apps” at the Jersey Shore Tech Meetup last night. Attendees learned how to build native mobile applications for multiple devices using alternative web technologies. You can download the presentation in PDF form here.

Six Overground Redesign

August 15, 2011 at 11:50 am

Six Overground has finally received a long overdue revamp. Check it out!

tweetndraw Is Live!

March 11, 2011 at 11:02 am

Using only the 140 characters allowed in a single tweet, what kind of art can be generated by a programmer who understands the drawing commands used by tweetndraw?

Any tweets published with the #tweetndraw hashtag will be displayed in the tweetndraw gallery.

All proceeds from this project will benefit high school art departments.

Check It Out

Flash Papervision3D Quake MD2 Model Viewer

February 2, 2011 at 9:51 pm

Quake Model Viewer I’ve recently been working in Papervision3D with some MD2 avatars. Since the MD2 format was originally designed for Quake II, I figured there were no better models to use than the actual game models. I’ll be releasing the code in a thorough tutorial on how to accomplish this, but in the meantime, you can see the Quake Model Viewer in action.

I’ve tied in the original sounds to the avatar actions, and the two player avatars have separate weapon models that work seamlessly within the viewer. I plan on rolling in some further improvements before releasing the full tutorial.

Check out the Quake Model Viewer

RAD Model View Controller Demo

September 1, 2009 at 3:59 pm

Avatar Editor

Avatar Editor

About RAD

The Rapid ActionScript Development package lets developers get up and running with a lightweight flexible framework quickly and painlessly. Many developers are already using a model-view-controller framework. The RAD MVC package supplies a very clear set of abstract classes that will help any developer get up and running as fast as possible with a full-featured MVC design pattern. In lieu of a boring Hello World example, this demo will show how easy it is to setup an avatar editor in Flash using very little code. The user will be able to add or remove hair, add or remove a goatee, and change the hair color.

Required Files

RAD is available as open source through Google Code.
You can visit the project site or download the latest build.

You can download the entire demo source for this tutorial here.

Flash Visual Elements

This demo will have three visual components that we need to build in Flash: The Avatar Control Panel, an Avatar Info bar, and the Avatar himself. To begin, open up Flash and create a new AS3 file. Add a MovieClip titled ‘MVCDemo’ to the stage. Export the MovieClip as ‘com.craigphares.tutorials.mvc.MVCDemo’ and extend the ‘flash.display.Sprite’ class. This will be our main holder clip that will contain our three elements.

The Control Panel

Within the MVCDemo clip, create a new MovieClip called ‘ControlPanelView’, and set its instance property name on the stage to ‘controlPanelView_mc’. This will house our form controls to edit the avatar. Add a Flash ColorPicker component named ‘hairColor_cp’, and two CheckBox components named ‘hair_cb’ and ‘goatee_cb’. You can edit the labels to make it clear that one is for Hair and one is for the Goatee. That’s all we need for our ControlPanelView.

AvatarView

AvatarView

The Avatar Views

Return to the MVCDemo clip and create a new MovieClip named ‘AvatarView’, and set its instance property name on the stage to ‘avatarView_mc’. This is our main avatar display. Within the AvatarView clip, be sure to have one MovieClip named ‘hair_mc’, one named ‘eyebrows_mc’, and one MovieClip named ‘goatee_mc’. You can grab the artwork from the demo file available above, or create your own artwork for the Avatar. Just be sure to include separate artwork for the hair, eyebrows, and goatee.

Go back once more to the MVCDemo clip and create a new MovieClip named ‘AvatarInfoView’, and set its instance property name on the stage to ‘avatarInfoView_mc’. This will display some textual information about our avatar. Add a new TextField to the stage and name it ‘info_txt’.

Note: It’s important to name each important element on the stage. By working this way, a designer and programmer can work independently of each other, with the designer not needing to get involved with any ActionScript, and the programmer simply referencing the named objects within ActionScript and not worrying about the design. This significantly speeds up development time, as both members of the team can work simultaneously.

To illustrate the flexibility of the RAD framework, we’re going to show two different ways of converting these elements into View objects. So for now, edit the AvatarView in the library and export it for ActionScript as ‘com.craigphares.tutorials.mvc.AvatarView’, and export the ControlPanelView as ‘com.craigphares.tutorials.mvc.ControlPanelView’. Both of these classes will extend the RAD View class, and we will manually convert the AvatarInfoView to a View object in ActionScript.

The Model

Okay, our design is complete – now it’s on to the ActionScript. Open up your favorite ActionScript editor and create a new class named ‘com.craigphares.tutorials.mvc.AvatarModel’. This is our data model class and will extend the RAD Model class. Our AvatarModel class has three properties accessible through getters and setters: hairColor (uint), hasHair (Boolean), and hasGoatee (Boolean).

package com.craigphares.tutorials.mvc {

	import com.rad.mvc.*;

	public class AvatarModel extends Model {

		public static const DEFAULT_HAIR_COLOR:uint = 0x361808;

		private var _hairColor:uint = DEFAULT_HAIR_COLOR;	// hexadecimal hair color
		private var _hasHair:Boolean;						// if the avatar has hair
		private var _hasGoatee:Boolean;						// if the avatar has a goatee

		public function AvatarModel() {}

		public function get hairColor():uint { return _hairColor; }
		public function set hairColor(c:uint):void {
			_hairColor = c;
			notify();
		}

		public function get hasHair():Boolean { return _hasHair; }
		public function set hasHair(h:Boolean):void {
			_hasHair = h;
			notify();
		}

		public function get hasGoatee():Boolean { return _hasGoatee; }
		public function set hasGoatee(h:Boolean):void {
			_hasGoatee = h;
			notify();
		}

	}

}

The key feature of the AvatarModel is the notify() method. Whenever notify() is called from any Model, all Views associated with that Model run their own method named update(), which can handle any visual changes that need to be made to represent the change in the data model. You can see that we add the notify() method to each setter function in AvatarModel.

public function set hairColor(c:uint):void {
	_hairColor = c;
	notify();
}

AvatarView

Next, let’s create our AvatarView class. This class requires two methods, init() and update(). The init() method is called explicitly once to setup the view according to the supplied model, which will be our AvatarModel. The update() method is called every time a change is made to the AvatarModel.

package com.craigphares.tutorials.mvc {

	import com.rad.mvc.*;
	import flash.geom.ColorTransform;
	import flash.display.Sprite;
	import flash.events.Event;

	public class AvatarView extends View {

		private var _hair_mc:Sprite;
		private var _goatee_mc:Sprite;
		private var _eyebrows_mc:Sprite;
		private var _colorTransform:ColorTransform;

		public function AvatarView(m:IModel = null, c:IController = null, s:Sprite = null) {
			super(m, c, s);
		}

		override public function update(e:Event = null):void {

			_colorTransform.color = (getModel() as AvatarModel).hairColor;

			_hair_mc.transform.colorTransform = _colorTransform;
			_goatee_mc.transform.colorTransform = _colorTransform;
			_eyebrows_mc.transform.colorTransform = _colorTransform;

			_hair_mc.visible = (getModel() as AvatarModel).hasHair;
			_goatee_mc.visible = (getModel() as AvatarModel).hasGoatee;

		}

		public function init():void {

			_hair_mc = getChildByName("hair_mc") as Sprite;
			_goatee_mc = getChildByName("goatee_mc") as Sprite;
			_eyebrows_mc = getChildByName("eyebrows_mc") as Sprite;

			_colorTransform = new ColorTransform();

			update();

		}

	}

}

Let’s take a closer look at the update() method:

_colorTransform.color = (getModel() as AvatarModel).hairColor;

_hair_mc.transform.colorTransform = _colorTransform;
_goatee_mc.transform.colorTransform = _colorTransform;
_eyebrows_mc.transform.colorTransform = _colorTransform;

_hair_mc.visible = (getModel() as AvatarModel).hasHair;
_goatee_mc.visible = (getModel() as AvatarModel).hasGoatee;

Basically, we are grabbing the hair color from the model, and applying a colorTransform to all three avatar display objects: hair, goatee, and eyebrows. We also hide or show the hair or goatee based on the hasHair and hasGoatee properties of the AvatarModel. Simple enough.

AvatarInfoView

Our AvatarInfoView is even simpler. Here we are just describing the avatar as a “Hairy Man” or “Bald Man” based on whether the AvatarModel has hair.

package com.craigphares.tutorials.mvc {

	import com.rad.mvc.*;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;

	public class AvatarInfoView extends View {

		private var _info_txt:TextField;

		public function AvatarInfoView(m:IModel = null, c:IController = null, s:Sprite = null) {

			super(m, c, s);

			_info_txt = getSprite().getChildByName("info_txt") as TextField;
			update();

		}

		override public function update(e:Event = null):void {

			if ((getModel() as AvatarModel).hasHair) {
				_info_txt.text = "Hairy Man";
			} else {
				_info_txt.text = "Bald Man";
			}

		}

	}

}

Note: The AvatarInfoView class does not require an init() method because we will be constructing the class within ActionScript instead of exporting it for ActionScript within Flash. Therefore we have the ability to pass the model to the view during its construction and our initialization can happen within the constructor.

ControlPanelView

The ControlPanelView class will simply add EventListeners to the form controls and pass them along to our Controller class. During initialization we make sure to update the form controls to match the AvatarModel defaults.

package com.craigphares.tutorials.mvc {

	import com.rad.mvc.*;
	import fl.controls.ColorPicker;
	import fl.controls.CheckBox;
	import flash.display.Sprite;
	import flash.events.Event;

	public class ControlPanelView extends View {

		public function ControlPanelView(m:IModel = null, c:IController = null, s:Sprite = null) {
			super(m, c, s);
		}

		override public function defaultController(m:IModel):IController {
			return new AvatarController(getModel());
		} 

		public function init():void {

			var hairColor_cp:ColorPicker = getChildByName("hairColor_cp") as ColorPicker;
			hairColor_cp.selectedColor = (getModel() as AvatarModel).hairColor;
			hairColor_cp.addEventListener(Event.CHANGE, (getController() as AvatarController).onChange);

			var hair_cb:CheckBox = getChildByName("hair_cb") as CheckBox;
			var goatee_cb:CheckBox = getChildByName("goatee_cb") as CheckBox;

			hair_cb.addEventListener(Event.CHANGE, (getController() as AvatarController).onChange);
			goatee_cb.addEventListener(Event.CHANGE, (getController() as AvatarController).onChange);

		}

	}

}

The Controller

Now we can create our ‘AvatarController’ class, which extends the abstract Controller class. All our user input will pass through to this class through event listeners, and this class will be sure to tell the AvatarModel to change its data accordingly.

package com.craigphares.tutorials.mvc {

	import com.rad.mvc.*;
	import flash.events.Event;

	public class AvatarController extends Controller {

		public function AvatarController(m:IModel = null) {
			super(m);
		}

		public function onChange(e:Event):void {

			switch (e.target.name) {

				case"hair_cb":
					(getModel() as AvatarModel).hasHair = e.target.selected;
				break;

				case "goatee_cb":
					(getModel() as AvatarModel).hasGoatee = e.target.selected;
				break;

				case "hairColor_cp":
					(getModel() as AvatarModel).hairColor = e.target.selectedColor;
				break;

			}
		}

	}

}

The Main Class: MVCDemo

Finally, we put this all together in the ‘MVCDemo’ class:

package com.craigphares.tutorials.mvc {

	import flash.display.Sprite;

	public class MVCDemo extends Sprite {

		private var _avatarModel:AvatarModel;
		private var _controlPanelView:ControlPanelView;
		private var _avatarView:AvatarView;
		private var _avatarInfoView:AvatarInfoView;

		public function MVCDemo() {

			_avatarModel = new AvatarModel();

			_controlPanelView = getChildByName("controlPanelView_mc") as ControlPanelView;
			_controlPanelView.setModel(_avatarModel);
			_controlPanelView.init();

			_avatarView = getChildByName("avatarView_mc") as AvatarView;
			_avatarView.setModel(_avatarModel);
			_avatarView.init();

			var avatarInfoView_mc:Sprite = getChildByName("avatarInfoView_mc") as Sprite;
			_avatarInfoView = new AvatarInfoView(_avatarModel, null, avatarInfoView_mc);			

		}

	}

}

You can see that we created the AvatarInfoView differently from the AvatarView and ControlPanelView. By not exporting the class to ActionScript within Flash, we can pass the ‘avatarInfoView_mc’ Sprite through the View constructor from ActionScript. We also don’t explicitly pass the AvatarController, instead defining the defaultController within the ControlPanelView. This makes it easier to change controller classes later on without having to change our code in two places.

_avatarModel = new AvatarModel();

_controlPanelView = getChildByName("controlPanelView_mc") as ControlPanelView;
_controlPanelView.setModel(_avatarModel);
_controlPanelView.init();

_avatarView = getChildByName("avatarView_mc") as AvatarView;
_avatarView.setModel(_avatarModel);
_avatarView.init();

var avatarInfoView_mc:Sprite = getChildByName("avatarInfoView_mc") as Sprite;
_avatarInfoView = new AvatarInfoView(_avatarModel, null, avatarInfoView_mc);

So now we have a working avatar editor. You’ll see that both the AvatarView and the AvatarInfoView update in real time as you change the controls within the ControlPanelView. You can have unlimited views associated with each Model, allowing you to keep your data nice and tidy within one place.

If you have any questions or comments about this tutorial, feel free to contact me. I hope this makes your Flash projects much easier and faster to develop.

RAD Updated

12:48 am

RAD Package

RAD Package

I’ve updated the Rapid ActionScript Development package on Google Code. This update includes greater flexibility for the model-view-controller classes. This makes it even easier for both designers and hard-core programmers to use the framework. Stay tuned for a step-by-step tutorial on how to use the MVC feature of the RAD package.

RAD is available as open source through Google Code. You can visit the project site or download the latest build.

Alternatively, you an checkout the latest source from Subversion using the following command:
svn checkout http://radpackage.googlecode.com/svn/trunk/ radpackage-read-only

Wrapping Long Lines of Text in CSS

August 13, 2009 at 12:39 pm

I recently came a cross a very tricky issue where an extremely long URL needed to be displayed in a narrow DIV. Browsers refuse to wrap this line, as there is no logical place to break the text. If you don’t have the luxury of providing a shorter label for the link, and need to force it to wrap, I’ve come up with a CSS class definition that will work across virtually all browsers:

.forcewrap {
	display: block;
	white-space: pre-wrap; /* css3 */
	white-space: -moz-pre-wrap !important; /* mozilla */
	white-space: -pre-wrap; /* opera 4-6 */
	white-space: -o-pre-wrap; /* opera 7 */
	word-wrap: break-word; /* ie 5.5+ */
}

Here is an example of its use:

<div style="width:100px;">
	<a href="http://www.averylonglinkthatwillnotwrapnomatterwhatyoudo.com" class="forcewrap">http://www.averylonglinkthatwillnotwrapnomatterwhatyoudo.com</a>
</div>
CSS | |

Rapid ActionScript Development Package Released

August 12, 2009 at 9:03 am

RAD Package

RAD Package

The RAD package has been born. This is a collection of ActionScript classes that I use often in my work. In the future I plan on posting a number of tutorials with examples of their use. I’ve added the full MVC design pattern and several Papervision3D utility classes. As I go through and clean up more ActionScript, I’ll be incrementally adding these to the repository and releasing new downloads.

RAD is available as open source through Google Code. You can visit the project site, or download the latest build.

Alternatively, you an checkout the latest source from Subversion using the following command:
svn checkout http://radpackage.googlecode.com/svn/trunk/ radpackage-read-only

ActionScript | |

Flow

March 29, 2006 at 5:19 pm

Deceptively simple, deceptively addicting. Jenova Chen’s Flow is the result of his MFA thesis.

Flash Games | |