Flash image replacement!

February 3rd, 2010

Just Creative Design has a vote up for some fantastic logos all made in 2009. Each one is a winner of Logo of the Month.

Micheal Jackson
Micheal Jackson Logo

Lochness
Lochness Logo

Talkmore
Talkmore Logo

Coffee
Coffee Logo

Butterfly
Butterfly Logo

Friedman Psychology
Friedman Psychology Logo

Swan Songs
Swan Songs Logo

Figure 9
Figure 9 Logo

Arbeitskreis Vernetzung
Arbeitskreis Vernetzung Logo

Youth Forum
Youth Forum Logo

Jasmine Star Photography
Jasmine Star Photography Logo

Tap Project New Orleans
Tap Project New Orleans Logo

Each one of these logos does a great job of matching imagery with meaning in a creative and beautiful way. After almost resorting to Logo Tournament for my own logo (an embarrassing defeat for any designer), I’ve come up with a concept which will work for Archonic. Expect to see it March 1st.

If you see a logo above you think is better than the rest, then go vote!

January 28th, 2010

It’s almost a year old, but a recently put together video showcases a past project much better than previous ones. The BitBox was a school project for the IMD program at Carleton University. Put together from scratch by 5 guys in 3 months while attending full-time school, we were all surprised with the results. We now have a second version on the way which will employ IR lasers instead of LEDs and be encased in a arcade quality cabinet. Where that second version leads is unknown but I’m happy to have reserved OpenSurface.org. This is my excitement face.

People on the project were myself – Joshua Mark, Chris Atallah, Chris Burt, Kevin Paquette and Matt McLean. If you’d like to learn more or build a touch table yourself visit the project “learning center” at BitBox.Archonic.com. The touch input to Flash is driven by open source software called CCV (Community Core Vision) developed by the good people at the NUI Group. If you want to make one yourself, NUI Group is an invaluable resource. Let me (and the NUI forums) know of your multi-touch creations!

January 17th, 2010

Adobe Stratus

Stratus is Adobe Labs’ answer to those wanting online Flash to Flash (P2P) communication without Flash Media Server. Flash Media server can be anywhere from $995 to $4500 USD depending on your requirements. For now, Stratus is free and all you need is to sign up for a developer key.

In Adobe’s own words:

Stratus is a hosted rendezvous service that aids in establishing communications between Flash Player clients or Adobe AIR endpoints using RTMFP. Flash Player endpoints must stay connected to the server during the entire time of communications. Unlike Flash Media Server, Stratus does not stream video or support media relay, shared objects, or scripting. Stratus is being made available as a beta service through Adobe Labs to allow our developer community to begin building applications using RTMFP.

Stratus introduces a Real-Time Media Flow Protocol (RTMFP) which has the potential to completely change the online Flash experience. Being able to pass even small amounts of info between separate users blows online browser gaming wide open. It’s also fast enough to handle video and audio chat. I hope to fit in a project making use of it this year and it will certainly be gaming related.

Insideria has a great beginner tutorial or if you like videos, FlashRealTime has you covered.

January 1st, 2010

While the blog part of Archonic.com has been active since first going online in June 2009, the official launch of has yet to be set – until now! Come March 1st 2010, all sections of Archonic.com will be complete. The most significant addition will be the (super awesome) portfolio followed by the services and pricing pages.

After March 1st an even more important addition will be a contractor database sign-up with a project matching interface. This represents a dramatic difference in structure than so many other design firms. In what will soon be a completed 5 year business plan are details to a highly flexible corporate structure which will encourage growth in the most dynamic manner I know of.

This business plan is not just thoughts on paper though – it will serve as ammunition in an upcoming funding effort. Over the next 4 months I will be pitching my plan to as many entrepreneurial competitions and organizations as possible. 2010 will be a busy year of firsts and successes. Making a post on New Years Day is a fitting foreshadow. Happy New Year everyone!

November 23rd, 2009

A favorite content management system (CMS) of mine – Wordpress, has won the title of Overall Best Open Source CMS Award from the 2009 Open Source CMS Awards. This is no small feat! What this means for wordpress is that it is now considered a full featured CMS and not just a blogging system.

Wordpress also recieved 2nd place in Best Open Source PHP CMS, ahead of a very established CMS, Joomla. Since it’s inception, Wordpress has grown substantially from a lightweight Blogger like software, to a massive worldwide multi-language effort for a full CMS.

What I personally find it most useful for is 1 click installs, infinite extensibility and stunningly simple user interface. Clients have no issue with maintaining their site and even find the time to add functionality via widgets and plugins by themselves. Wordpress truly reflects our mantra of “elegant and effective”. Good job to all creators and contributors!

Open Source CMS Award via Wordpress

November 17th, 2009

It’s here! Greensock’s already very useful and comprehensive tweening platform has evolved into an entire suite of even more light weight and powerful animation engines. I try my best to avoid Flash’s default timeline animations due to their reliance on frame rate, choppiness, lack of easing options and inconvenient editing. There’s other tweening engines out there such as caurina’s, but you won’t find one as versatile, fast, lightweight, well documented and well supported as the ones produced by Greensock.

Version 11 appears to be the most changed release since the tweening platforms inception and there’s a small learning curve to get over. So, here’s the breakdown…

TweenNano

It’s 1.6k! TweenNano can handle your tweening needs for BLANK but it stops there with no support for timeline functions and limited overwrite controls.

TweenLite

This is currently the most commonly used class of the group. It’s gained a little weight (1.9k) which may seem surprising, but the with the utility it’s gained with timeline methods and with the introduction of TweenNano, you shouldn’t have any file size issues. The most comprehensive update to TweenLite is the pause(), resume(), reverse(), play(), and restart() methods, which you can see the power of in the animation on the Greensock blog.

TweenMax

A personal favorite. On top of TweenLite’s functionality, TweenMax adds performance enhancements, overwrite management, tweens for filters, hex colours, volume, tint, and even do bezier tweening.

TimelineLite

A new class that brings timeline controls for building and managing sequences at just 2.5k (8.1k with OverwriteManager and TweenLite).

TimelineMax

On top of TimelineLite’s utility, this brings infinite timeline nesting, time scale manipulation, listeners for START, UPDATE, REPEAT, REVERSE_COMPLETE, COMPLETE events and much more.

The full breakdown is of course on greensock’s version 11 page. All of the above are frequently updated for both AS3 and AS2. I’ll be using TweenMax and TimelineMax in my current project – a suite of 4 Flash touch games for the Royal Canadian Mint’s Vancouver 2010 Olympics campain playable on an HP Touchsmart dx9000.

November 16th, 2009

“One word: elegance. Beautiful use of fonts, colours, gradations and textures. Great use of Flash graphics in the homepage’s main image area. Giant, easy-to-use drop down tabs give access to navigation. And the store is just as clean and well-designed as the rest of the site.”

Web50.ca has ranked a client of ours, The Royal Canadian Mint, among Canada’s top 50 sites. For the past 8 months, Archonic has been providing Flash banners (such as the ones mentioned above), static banners, and web support for mint.ca and the Mint’s very successful email campaign.

Congratulations to all those involved in the design and maintenance of mint.ca!

October 27th, 2009

Andreas Lutz has created what seems to be the first site with mostly mouseless and keyboardless navigation. Visit the site and enable web cam and mic access and you can navigate with voice commands and gestures. A very cool concept indeed.

You can see how it’s supposed to work in the demo video but judging by the comments on abduzeedo and my own attempt to navigate, it doesn’t work terribly well.

I wonder if and when we’ll ever trump the mighty mouse…

July 21st, 2009

My break in Flash developing came, as it did for many others, when I was introduced to some powerful industry standard classes and tools. It can be hard to keep up with the times, particularly for intermittent developers, since something new and amazing comes out pretty much every week. For at least today however, here are 5 very useful tips for Flash developers looking to broaden their horizons.

0. Get with the times.

This is point zero because I imagine most reading this (who actually do Flash) are using ActionScript 3 and CS3. If you are, move on to point 1.

I’ve done an unfortunate number of ActionScript 2.0 to 3.0 conversions recently. We’re now on Flash player version 10 and CS4, so making projects in Flash 8 and AS2 is downright anti-social. Some advertisers specs require Flash 8 for things like click tags, which is just unfortunate (I feel your pain). If you’re stuck in the past and afraid to make the jump, a free 30-day CS4 trial and a visit to 8BitRocket’s AS2 to AS3 series should get you rolling. A great resource for automatic up converting is Jobe Makar’s Upconverter. For motivation, check out some of the cool things you can do with Flash 10 and AS3. Eventually that is…

1. Use Classes

This seems like a totally trivial point, but they are plenty of Flash developers not taking advantage of the power of classes. With Flash’s inherently object based environment, it’s an excellent place to implement reusable structures. One of a design firms greatest assets is their reusable class library. A powerful collection of classes can cut project time down by well over half. If you’re new, ActionScript.org has a great place to start. The rest of this article is a collection of classes that can make your platform vastly more powerful.

2. GreenSock’s Tweening engine: TweenLite and TweenMax

I use this in about every project I make. This is the most full featured, stable and well documented tweening engine out there. If your flash project needs a refined series of tweens and/or is more interactive than a basic 1-click banner (which should be just about all of them), the benefits are vast. Even if it is just a quick banner, the ability to enter fractions of a second for roll over tweens will separate you from the unenlightened masses. Where this class set shines is in it’s ease of use, speed, and documentation. Jack (a.k.a. GreenSock) is an admirably dedicated developer and the GreenSock support forum is basically a one on one classroom. Very handy.

2. Uza’s Global Class

So you’ve started using classes. You love them. You start dabbling in a more complex project, but wrapping your head around the communication between class and main variables and references to positions on the stage and within class objects has you beating your head against your keyboard. AS2 has native global variables but AS3 discontinued them. Uza.lt to the rescue! This class uses something called a singleton. All you need to know is you can create variables and functions which will be accessible anywhere. I recently used it in this project for the Royal Canadian Mint. Those dates at the top are members of a small class. Getting each instance of that class to react to the scroll bar would be cumbersome without the use of a global class. Speaking of scroll bars…

3. Archonic’s scrollbar

My own creation! Ever tried using Adobe’s component scrollbar? It’s not very fun. This (as you may have guessed) is a dynamically added scrollbar which will mask the movieclip you are scrolling and work out all your scroll ratios and distances automatically. The best part is you can customize each and every bit to look and feel any way you like. And don’t worry, the collection of event listeners on each part and mouse wheel handling makes it behave just like a scrollbar should. Kudos to Kyle Brekke who provided the starting point.

4. MIT’s Bulk Loader

MIT is a wonderful provider of all things brainy and useful. This class set is a large and powerful extension of Flash’s ability to make requests for external information. I’d recommend this particularly for larger projects which are subject to having external assets maintained by a client or anyone other than you. All it takes is a capital letter or under score in the wrong place and Flash can have a crippling hissy fit of a crash. With the bulk loader however, that crash is much more graceful, and may allow the project to continue functioning (just without whatever failed to load). The ease of syntax is also a strong point.

There you have it! Those are just a small collection of general tools to whet your appetite. Here’s some more resources which, if you’re your keen, can keep you busy indefinitely. And I do mean indefinitely.

  • GoToAndLearn

    Possibly the greatest resource for both bleeding edge and beginner Flash, Flex, Photoshop and any combination of Adobe publishing tools.

  • Adobe.tv

    This isn’t as widely known as it should be. Adobe’s own library of video tutorials on everything Adobe.

  • Senocular’s ActionScript Library

    If you’ve ever posted your Flash woes on various forums out there then you know senocular (who has his own Flash blog here).

  • Kirupa Forums

    A very enthusiastic community with lots of extra curricular chat.

  • ActionScript.org Forums

    Quite busy – your question might go unanswered. Make sure to do some extensive searching though, your answer is probably there.

  • GoToAndLearn Forums
  • The most professional of the bunch. No matter the complexity of your problem, the experts here have tackled it.

If you’re to take just one point from this post, make it this: Be active! Be a member of the community and you’ll find yourself swimming in no time.

July 5th, 2009

The Flash community is a generous one. So here’s my first small gift back to a community that has already given me quite a bit.

Scroll bars in Flash are largely taken for granted. Until you try to craft your own from scratch, you don’t realize the math and combination of mouse listeners that go into a seemingly simple but proper scroll bar. In frustration, some settle for an even more frustrating user experience with just arrows that scroll content a painfully small amount with each click. There is of course the Flash components scroll bar, but try to edit it’s look and feel and you’re presented with a limited and confusing interface. Although editing components in CS4 is notably easier than previous versions, I found a scroll bar class by fellow Flash blogger Kyle Brekke which did just what I needed it to. What I’ve added to Kyle’s framework is this:

  • A stage presence in form of a blue box. Resize this box (presence_mc) and the scroll bar will adopt the appropriate dimensions.
  • The container movie clip the scroll bar is dynamically added to allows you to use layers to cover and tween it’s properties. This is more adaptive than adding it to the stage.
  • Added scroll track click and hold functionality (more like conventional scroll bars).
  • No support for horizontal scrollbars. No one likes using them and it slims down the code.

A word of caution: If you’re using GreenSock’s TweenLite, make sure this scrollbar and your project use the same version.

Here’s the example:

You require Flash to view the Archonic Scroll bar example.

Get Adobe Flash player

And here’s the source:

/**
 * Archonic Customizable Scrollbar Component
 *
 * Derived from Kyle Brekke's Scrollbar
 * 	Derived from Li Jiansheng's Scollbar
 *
 * @author Joshua Mark
 * @date 31/07/2009
 * @version 1.0.0
 * @website http://www.Archonic.com
 */

package com.archonic.utils {

	import com.greensock.TweenLite;
	import flash.display.*;
	import flash.events.*;
	import flash.geom.Rectangle;
	import flash.geom.Point;

	public class scrollbar extends MovieClip {

		// Private Get/Set Type Constants
		private const XY:String = "xy";
		private const WH:String = "widthHeight";
		private const TB:String = "topBottom";

		// Speed of Content Scroll
		private const arrowMove:Number = 10;
		private const scrollSpeed:Number = 10;
		private const transSpeed:Number = 0.1;//seconds to tween

		// Assets used in Drawing the Class
		private var _arrowProgress:arrowProgress = new arrowProgress();
		private var _arrowRegress:arrowRegress = new arrowRegress();
		private var _scrollTrack:scrollTrack = new scrollTrack();
		private var _scrollButton:scrollButton = new scrollButton();

		// Standard Vars Set in Constructor
		private var _target:MovieClip;
		private var _stage:Stage;
		private var _container:MovieClip;

		// Numbers used in Calculating Slide Ratio
		private var trackTop:Number;
		private var dragBot:Number;
		private var trackRange:Number;
		private var slideRect:Rectangle;

		// Allow user to click and hold arrows and continue to scroll
		private var isUp:Boolean = false;
		private var isDown:Boolean = false;
		private var trackDown:Boolean = false;

		// Constructor
		public function scrollbar(s:Stage, c:MovieClip, target:MovieClip, maskWidth:Number, maskHeight:Number):void {
			_stage = s;
			_container = c;
			_target = target;			// Set the _target
			_target.startPoint = new Point(_target.x, _target.y);// Set the _target's original point

			// Set positions of the assets (into scrollbar form)
			initAssets();
			// Sets all listeners in one place
			initListeners();
			// Find the sliding range with which to create the ratio
			initTrack();
			// Draws and sets the mask
			initMask(maskWidth, maskHeight);
		}
		private function initAssets():void {
			var targetWidth = _container.presence_mc.width;
			var targetHeight = _container.presence_mc.height - (2*targetWidth);

			_scrollTrack.width = targetWidth;
			_scrollTrack.height = targetHeight;

			_scrollButton.width = targetWidth;
			_scrollButton.y += _scrollButton.height/2;//stops jumping when scrolling up with _scrollTrack

			_arrowRegress.height = targetWidth;
			_arrowRegress.width = targetWidth;
			_arrowRegress.y = _arrowRegress.height * -1;

			_arrowProgress.height = targetWidth;
			_arrowProgress.width = targetWidth;
			_arrowProgress.y += _scrollTrack.height;

			// Set arrows as buttons
			_arrowRegress.buttonMode = true;
			_arrowProgress.buttonMode = true;
			_scrollButton.buttonMode = true;

			// Add assets to this class
			addChild(_scrollTrack);
			addChild(_scrollButton);
			addChild(_arrowProgress);
			addChild(_arrowRegress);
			y = _container.presence_mc.y + _arrowRegress.height;

			// Add this class to the timeline container
			_container.addChild(this);
		}
		private function initListeners():void {
			// Event listeners for dragging and scroll wheel
			_scrollButton.addEventListener(MouseEvent.MOUSE_DOWN, dragScroll);
			_scrollButton.addEventListener(MouseEvent.MOUSE_OVER, stopTrackScroll);
			_stage.addEventListener(MouseEvent.MOUSE_UP, stopScroll);
			_stage.addEventListener(MouseEvent.MOUSE_WHEEL,mouseWheelHandler);

			// Event listeners for arrows
			_arrowRegress.addEventListener(Event.ENTER_FRAME, _arrowRegressHandler);
			_arrowRegress.addEventListener(MouseEvent.MOUSE_DOWN, upScroll);
			_arrowRegress.addEventListener(MouseEvent.MOUSE_UP, stopScroll);
			_arrowProgress.addEventListener(Event.ENTER_FRAME, _arrowProgressHandler);
			_arrowProgress.addEventListener(MouseEvent.MOUSE_DOWN, downScroll);
			_arrowProgress.addEventListener(MouseEvent.MOUSE_UP, stopScroll);

			// Event listeners for track
			_scrollTrack.addEventListener(Event.ENTER_FRAME, _trackHandler);
			_scrollTrack.addEventListener(MouseEvent.MOUSE_DOWN, trackScroll);
			_scrollTrack.addEventListener(MouseEvent.MOUSE_UP, stopScroll);
		}
		private function initTrack():void {
			trackTop = _get(XY, _scrollTrack) + (_scrollButton.height/2);
			trackRange = _get(WH, _scrollTrack) - _get(WH, _scrollButton);
			dragBot = trackTop + trackRange;

			slideRect = new Rectangle(0, trackTop, 0, trackRange);
		}
		private function initMask(w:Number, h:Number):void {
			if (_target.mask == null) {
				var square:Sprite = new Sprite();
				square.graphics.beginFill(0xFF0000);
				square.graphics.drawRect(_target.x, _target.y, w, h);
				_stage.addChild(square);
				_target.mask = square;
			}
		}

		// Next 4 functions deal with hitting the up/down arrows on the scrollbar
		private function upScroll(e:MouseEvent):void {
			isUp = true;
		}
		private function downScroll(e:MouseEvent):void {
			isDown = true;
		}
		private function _arrowRegressHandler(e:Event):void {
			if (isUp) {
				if ( _get(XY, _scrollButton) > trackTop ) {
					_set(XY, _scrollButton, _get(XY, _scrollButton) - arrowMove);
					if ( _get(XY, _scrollButton) < trackTop ) {
						_set(XY, _scrollButton, trackTop);
					}
					startScroll();
				}
			}
		}
		private function _arrowProgressHandler(e:Event):void {
			if (isDown) {
				if ( _get(XY, _scrollButton) < dragBot ) {
					_set(XY, _scrollButton, _get(XY, _scrollButton) + arrowMove);
					if ( _get(XY, _scrollButton) > dragBot ) {
						_set(XY, _scrollButton, dragBot);
					}
					startScroll();
				}
			}
		}
		private function _trackHandler(e:Event):void {
			if((isUp || isDown) && trackDown) {
				if(mouseY < _scrollButton.y) {
					_arrowRegressHandler(null);
				} else if (mouseY > _scrollButton.y) {
					_arrowProgressHandler(null);
				}
			}
		}
		private function trackScroll(e:MouseEvent):void
		{
			isUp = true;
			isDown = true;
			trackDown = true;
		}
		private function stopTrackScroll(e:MouseEvent):void
		{
			trackDown = false;
		}

		// Next 3 functions deal with dragging and mouse wheel
		public function dragScroll(e:MouseEvent):void {
			_scrollButton.startDrag(false, slideRect);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, moveScroll);
		}
		public function mouseWheelHandler(e:MouseEvent):void {
			if (e.delta < 0) { //Scrolling Down
				if ( _get(XY, _scrollButton) < dragBot ) {
					_set(XY, _scrollButton, _get(XY, _scrollButton) - (e.delta * scrollSpeed));
					if ( _get(XY, _scrollButton) > dragBot ) {
						_set(XY, _scrollButton, dragBot);
					}
					startScroll();
				}
			} else { // Scrolling Up
				if ( _get(XY, _scrollButton) > trackTop ) {
					_set(XY, _scrollButton, _get(XY, _scrollButton) - (e.delta * scrollSpeed));
					if ( _get(XY, _scrollButton) < trackTop ) {
						_set(XY, _scrollButton, trackTop);
					}
					startScroll();
				}
			}
		}

		// Replicates the startScroll function except it works during the drag
		// because it runs off the MOUSE_MOVE event
		public function moveScroll(e:MouseEvent):void {
			startScroll();
		}
		private function stopScroll(e:MouseEvent):void {
			isDown = false;
			isUp = false;
			_scrollButton.stopDrag();

			stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveScroll);
		}
		// Major controlling function
		private function startScroll():void {
			var ratio:Number = ( _get(WH, _target) - trackRange ) / trackRange;
			var sPos:Number =  ( (_get(XY, _scrollButton) - trackTop) * ratio ) - _get(XY, _target.startPoint);

			TweenLite.to( _target, transSpeed, {y:-sPos} );
		}

		// Functions used to minimize code switch for verticle/horizontal bars
		private function _set(type:String, targ:*, val:Number):void {
			if (type == XY) {
				targ.y = val;
			} else if (type == WH) {
				targ.height = val;
			} else if (type == TB) {
				targ.bottom = val;
			}
		}
		private function _get(type:String, targ:*):Number {
			if (type == XY) {
				return targ.y;
			} else if (type == WH) {
				return targ.height;
			} else if (type == TB) {
				return targ.bottom;
			}
			return 0;
		}
	}
}

Download the Archonic scrollbar

The license is MIT open source – use it, distribute it, edit it. Enjoy!