Archive for the ‘GAMEDEV’ Category
Looks like it is a javascript day here at *drawlogic. Here is an interesting example with some demos of a javascript and canvas based pseudo 3d engine. Anything this cool you know it has to be from Japan.
Also of note, it has been rumored that Silverlight 3 will have fully hardware accelerated 3d and canvas and javascript engines are getting much faster with great demos like this. Adobe needs to leap into hardware acceleration for flash on a broader scale soon.
But I digress, this demo it appears, was inspired by Papervision3D due to the naming and the javascript reference of “parpevision.js“. I wasn’t able to find much more information about this but it is very well done and this example even shows some environment mapping. It is not close to flash pseudo-3d engines like Papervision3D yet but at the rate of javascript engine development lately this could rival flash AVM2 in the next couple of years.
Demos
Code
- Sample iPod iTouch Mesh data (meshdata.js) – contains models
- Code from the main engine (parpevision.js)
- Sample Viewport and main app (touch.js from demo 3)
Here is the code for the parpevision.js file and the mini engine, it is an MIT license. (more…)
Box2D is responsible for inspiring many 2d physics engines including Motor2, Box2DFlashAS3 and others. Box2D the original toolkit is a solid c++ physics engine that has many great examples and features including real collision.
Now it has inspired a pure Javascript version of Box2D called Box2Djs to (using prototype dependency) to implement many of the same demos using the same functionality. So it appears Box2D if you want to find a baseline standard physics kit for 2D, it now has versions in many languages that might allow you to have 2d physics capabilities across many platforms.
Box2DJS is a JavaScript port of Box2D Physics Engine. To tell the truth, this is converted from Box2DFlashAS3_1.4.3.1 in an automatic manner. (The reason why not Box2DFlashAS3_2.0.0 based is simply because I overlooked the renewal.)
Dependencies
- prototype.js
- IECanvas (when you use a canvas tag to display the result of your physics simulation)
Links
How to use
- Download a zip file and extract it.
- Copy js/ and lib/ directories from the extracted directory to your app directory.
- Copy script tags in the header part of index.html in the extacted directory to your html file where you want to simulate physics.
Because this library does not have a lazy-loading system now, you should load all classes before starting your simulation. To make things worse, each library has a bit complicated dependency each other so that loading libraries in wrong order may cause a fatal error. To avoid such a trouble, it is strongly recommended to copy the header part of this file or `index.html’ including the downloaded zip file.
- Utilizing Box2D APIs, simulate the newton world as you like.
The Box2DJS APIs are completely same as those of Box2DFlashAS3. Please refer information about it.
Also the speed of your javascript engine makes a big difference just like the AS2 AVM1 to the AS3 AVM2 virtual machines. Chrome is much faster than FF3.
Video of Box2DJS in Chrome
Video of Box2DJS in FF3
Recently two compact tweening engines have been released. Grant Skinner’s GTweeny and laborat’s ByteTween. This adds to the two that focus on micro-tween kit sizes in TweenLite and TweensyZero
Basically these engines look to be micro and provide pretty nice features while being so small. Micro tweening engines like GTweeny (3k), ByteTween (1.7k), TweenLite (2.7k), TweensyZero (2.9k) and Tweener (9k) have varying levels of support of features (Tweener being the most loaded with color and filter support without other kits just init, also TweenLite with a nice configurator to include only what you need). Micro kits have benefits when used for banners, animated assets (where you have many assets and the per asset savings is worthwhile) and other places you just want really small output.
Light Transition ByteTween
(1.7k)
This kit has a c# version as well as a small as3 bytetween version.
The ByteTween static class eats only 1.7K of compiled clip! With this size it supports:
- Creation of tweens of any numeric property (not color/uint properties).
- Pause,Unpause,Cancel operations based on the tween target and property.
- Overlap system that cancel tweens of same property in order to avoid erroneous behavior
- Alpha tween with negative alpha support (negative alpha sets the MovieClip visibility to false)
- ’scale’ tween of both ’scaleX’ and ’scaleY’ properties.
- OnComplete callback with any number of parameters
- Easy interface for creating new tweens!
TweenLite
(2.7k) base
- SPEED – I’m not aware of any popular tweening engine with a similar feature set that’s as fast as TweenLite. See the speed comparisons yourself.
- Feature set – In addition to tweening ANY numeric property of ANY object, TweenLite can tween filters, hex colors, volume, tint, saturation, contrast, frames, and even do bezier tweening, plus LOTS more. TweenMax extends TweenLite and adds even more capabilities like pause/resume, rounding, event listeners, timeScale, and more. Overwrite management is an important consideration for a tweening engine as well which is another area where the GreenSock tweening platform shines. You have options for AUTO overwriting or you can manually define how each tween will handle overlapping tweens of the same object.
- Expandability – With its new plugin architecture, you can activate as many (or as few) features as your project requires. Or write your own plugin if you need a feature that’s unavailable. Minimize bloat, and maximize performance.
- Management features – TweenGroup makes it surprisingly simple to create complex sequences and groups of TweenLite/Max tweens that you can pause(), resume(), restart(), or reverse(). You can even tween a TweenGroup’s “progress” property to fastforward or rewind the entire group/sequence.
- Ease of use – Designers and Developers alike rave about how intuitive the GreenSock tweening platform is.
- Updates – Frequent updates and feature additions make the GreenSock tweening platform reliable and robust.
- AS2 and AS3 – Most other engines are only developed for AS2 or AS3 but not both.
TweensyZero
(2.9k) base
Here are some simple steps to help you get started with creating your first animations with TweensyZero. TweensyZero is a light weight version of Tweensy most core features found in Tweensy are available to TweensyZero. Documentation for TweensyZero can be found under the folder ‘documentation/zero’ or online
gTweeny
(3k)
gTweeny is gTween‘s lightweight younger sibling. It strips a lot of the secondary features of GTween (proxy, timing modes, etc) in favour of smaller file size. It is currently under 3kb…
Here is a list of all open AS3 “Micro” Tweening engines < 5k
- ByteTween (1.7k)
- TweenLite (2.7k)
- TweensyZero (2.9k)
- gTweeny (3k)
Here is a list of all open AS3 Tweening engines and base kits
- Animation Package
- AS3 Animation System 2.1
- AS3Easing
- Go (base animation kit – create your own tween engine)
- gTween
- KitchenSync
- Twease
- Tweener (9k)
- Tweensy
- TweenLite (TweenMax)
The decision on which to use can be affected be features you want, how it feels (many use the same object syntax so it is dynamic), what performance do they have (all are orders of magnitude faster than the built in tween (flash) or transitions (mx/flex)), which size is ok, author/community support needed (some are more active than others adding features or simplifying and tweaking performance methodically), and many other factors. There are definitely plenty to choose from.
Speed Tests for many Tween Engines
- Green Sock Tweening Comparison Tool
- Moses Benchmarking Tool (relative comparison against SimpleAS3Tween sample)
For more on each features see their sites or these previous lists on tweening engines:
The unity3d platform is about to realize about 900% or 9x more possible market for selling their wares and I believe will blow up with unity 2.5. Unity3d 2.5 will bring a windows IDE and development environment to unity3d developers. Many game companies are heavily invested in Windows and having this option is breaking down a huge wall to get this development platform and engine into many new hands and companies.
The best part about unity 3d development is the hardware acceleration, the fantastic pipeline, the ability to publish desktop, web, mobile (iphone) and console (wii) is pretty amazing. All using the powerful mono open source .net framework as a base.
Windows Editor Support
Unity 2.5 adds full support for Windows Vista and XP, with 100% feature parity and interoperability with Mac OS X. The Unity Editor has been rebuilt to look, feel, and function identically on both operating systems, each running the same underlying engine. The best part? Unity on either platform can build games for either platform — cross-platform in the truest sense.
A Whole New Look
Find the tools you need quickly and easily. The Play buttons are front and center, clearly visible and inviting you to play, test, and improve your work. And when you do, they light up, dimming the rest of the application, drawing your attention to the most important things in the play experience you’re creating.
Precise Navigation and Placement ToolsImproved Usability
Snap any object to customizable increments of position, scale, and rotation values. Drag objects around, clamped to any surface collision. Manipulate objects in local or world space. Use the new flythrough controls to get around easily. And did we mention the completely redesigned rotation tool?
3ds Max Importing
Drag and drop your .max files right into the Editor, including support for all skeletal based animation, multiple UVs, and vertex colors. Autodesk 3ds Max now joins the existing support for Maya, Blender, and all other 3D applications that integrate with the latest FBX plugin on the Windows platform.
Completely Customizable Editor
UnityGUI, Unity’s own GUI creation system, now powers the entire Editor and allows you to integrate your own unique level design tools, AI control tools, debugging tools, difficulty tuning tools, or anything else you need. Over 130 new API entry points enable you to create specialized, customized editor tools and build them into the existing Editor interface.
Tabbed Interface
We took cues from the best designed applications, and the rewritten editor has received dozens of improvements. The most visible change is the tabbed interface, where every part of the interface can be moved, undocked to a secondary monitor, and even stacked to achieve logical grouping.
Information at Your Fingertips
We’ve gone to great lengths to make sure that you always have the info you need, when you need it. Model files have previews right inside the inspector. Audio Clips show their waveform with click-to-play behaviour. Meshes show the detailed rendering stats – and that’s just scratching the surface.
I use a SoundManager class for games and interactives that require it which I picked up at evolve by . But I sometimes need to use Tweener rather than TweenLite depending on what the project uses already. So here is the class updated with Tweener. Just grab the latest Tweener to work with this. Sound is one of those things like tweening, it is easier to reuse code if everyone uses common libraries.
package game.util { import caurina.transitions.properties.SoundShortcuts; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundLoaderContext; import flash.media.SoundTransform; import flash.net.URLRequest; import flash.utils.Dictionary; import flash.utils.getQualifiedClassName; import caurina.transitions.*; /** * The SoundManager is a singleton that allows you to have various ways to control sounds in your project. * * The SoundManager can load external or library sounds, pause/mute/stop/control volume for one or more sounds at a time, * fade sounds up or down, and allows additional control to sounds not readily available through the default classes. * * This class is dependent on TweenLite (http://www.tweenlite.com) to aid in easily fading the volume of the sound. * * @author Matt Przybylski [http://www.reintroducing.com] * @version 1.0 * * @author Ryan Christensen (http://drawlogic.com) * @version 1.1 - added Tweener support and removed TweenLite support */ public class SoundManager { //- PRIVATE & PROTECTED VARIABLES ------------------------------------------------------------------------- // singleton instance private static var _instance:SoundManager; private static var _allowInstance:Boolean; private var _soundsDict:Dictionary; private var _sounds:Array; //- PUBLIC & INTERNAL VARIABLES --------------------------------------------------------------------------- //- CONSTRUCTOR ------------------------------------------------------------------------------------------- // singleton instance of SoundManager public static function getInstance():SoundManager { if (SoundManager._instance == null) { SoundManager._allowInstance = true; SoundManager._instance = new SoundManager(); SoundManager._allowInstance = false; } return SoundManager._instance; } public function SoundManager() { this._soundsDict = new Dictionary(true); this._sounds = new Array(); if (!SoundManager._allowInstance) { throw new Error("Error: Use SoundManager.getInstance() instead of the new keyword."); } } //- PRIVATE & PROTECTED METHODS --------------------------------------------------------------------------- //- PUBLIC & INTERNAL METHODS ----------------------------------------------------------------------------- /** * Adds a sound from the library to the sounds dictionary for playing in the future. * * @param $linkageID The class name of the library symbol that was exported for AS * @param $name The string identifier of the sound to be used when calling other methods on the sound * * @return Boolean A boolean value representing if the sound was added successfully */ public function addLibrarySound($linkageID:*, $name:String):Boolean { for (var i:int = 0; i < this._sounds.length; i++) { if (this._sounds[i].name == $name) return false; } var sndObj:Object = new Object(); var snd:Sound = new $linkageID; sndObj.name = $name; sndObj.sound = snd; sndObj.channel = new SoundChannel(); sndObj.position = 0; sndObj.paused = true; sndObj.volume = 1; sndObj.startTime = 0; sndObj.loops = 0; sndObj.pausedByAll = false; this._soundsDict[$name] = sndObj; this._sounds.push(sndObj); return true; } /** * Adds an external sound to the sounds dictionary for playing in the future. * * @param $path A string representing the path where the sound is on the server * @param $name The string identifier of the sound to be used when calling other methods on the sound * @param $buffer The number, in milliseconds, to buffer the sound before you can play it (default: 1000) * @param $checkPolicyFile A boolean that determines whether Flash Player should try to download a cross-domain policy file from the loaded sound's server before beginning to load the sound (default: false) * * @return Boolean A boolean value representing if the sound was added successfully */ public function addExternalSound($path:String, $name:String, $buffer:Number = 1000, $checkPolicyFile:Boolean = false):Boolean { for (var i:int = 0; i < this._sounds.length; i++) { if (this._sounds[i].name == $name) return false; } var sndObj:Object = new Object(); var snd:Sound = new Sound(new URLRequest($path), new SoundLoaderContext($buffer, $checkPolicyFile)); sndObj.name = $name; sndObj.sound = snd; sndObj.channel = new SoundChannel(); sndObj.position = 0; sndObj.paused = true; sndObj.volume = 1; sndObj.startTime = 0; sndObj.loops = 0; sndObj.pausedByAll = false; this._soundsDict[$name] = sndObj; this._sounds.push(sndObj); return true; } /** * Removes a sound from the sound dictionary. After calling this, the sound will not be available until it is re-added. * * @param $name The string identifier of the sound to remove * * @return void */ public function removeSound($name:String):void { for (var i:int = 0; i < this._sounds.length; i++) { if (this._sounds[i].name == $name) { this._sounds[i] = null; this._sounds.splice(i, 1); } } delete this._soundsDict[$name]; } /** * Removes all sounds from the sound dictionary. * * @return void */ public function removeAllSounds():void { for (var i:int = 0; i < this._sounds.length; i++) { this._sounds[i] = null; } this._sounds = new Array(); this._soundsDict = new Dictionary(true); } /** * Plays or resumes a sound from the sound dictionary with the specified name. * * @param $name The string identifier of the sound to play * @param $volume A number from 0 to 1 representing the volume at which to play the sound (default: 1) * @param $startTime A number (in milliseconds) representing the time to start playing the sound at (default: 0) * @param $loops An integer representing the number of times to loop the sound (default: 0) * * @return void */ public function playSound($name:String, $volume:Number = 1, $startTime:Number = 0, $loops:int = 0):void { var snd:Object = this._soundsDict[$name]; snd.volume = $volume; snd.startTime = $startTime; snd.loops = $loops; if (snd.paused) { snd.channel = snd.sound.play(snd.position, snd.loops, new SoundTransform(snd.volume)); } else { snd.channel = snd.sound.play($startTime, snd.loops, new SoundTransform(snd.volume)); } snd.paused = false; } /** * Stops the specified sound. * * @param $name The string identifier of the sound * * @return void */ public function stopSound($name:String):void { var snd:Object = this._soundsDict[$name]; snd.paused = true; snd.channel.stop(); snd.position = snd.channel.position; } /** * Pauses the specified sound. * * @param $name The string identifier of the sound * * @return void */ public function pauseSound($name:String):void { var snd:Object = this._soundsDict[$name]; snd.paused = true; snd.position = snd.channel.position; snd.channel.stop(); } /** * Plays all the sounds that are in the sound dictionary. * * @param $useCurrentlyPlayingOnly A boolean that only plays the sounds which were currently playing before a pauseAllSounds() or stopAllSounds() call (default: false) * * @return void */ public function playAllSounds($useCurrentlyPlayingOnly:Boolean = false):void { for (var i:int = 0; i < this._sounds.length; i++) { var id:String = this._sounds[i].name; if ($useCurrentlyPlayingOnly) { if (this._soundsDict[id].pausedByAll) { this._soundsDict[id].pausedByAll = false; this.playSound(id); } } else { this.playSound(id); } } } /** * Stops all the sounds that are in the sound dictionary. * * @param $useCurrentlyPlayingOnly A boolean that only stops the sounds which are currently playing (default: true) * * @return void */ public function stopAllSounds($useCurrentlyPlayingOnly:Boolean = true):void { for (var i:int = 0; i < this._sounds.length; i++) { var id:String = this._sounds[i].name; if ($useCurrentlyPlayingOnly) { if (!this._soundsDict[id].paused) { this._soundsDict[id].pausedByAll = true; this.stopSound(id); } } else { this.stopSound(id); } } } /** * Pauses all the sounds that are in the sound dictionary. * * @param $useCurrentlyPlayingOnly A boolean that only pauses the sounds which are currently playing (default: true) * * @return void */ public function pauseAllSounds($useCurrentlyPlayingOnly:Boolean = true):void { for (var i:int = 0; i < this._sounds.length; i++) { var id:String = this._sounds[i].name; if ($useCurrentlyPlayingOnly) { if (!this._soundsDict[id].paused) { this._soundsDict[id].pausedByAll = true; this.pauseSound(id); } } else { this.pauseSound(id); } } } /** * Fades the sound to the specified volume over the specified amount of time. * * @param $name The string identifier of the sound * @param $targVolume The target volume to fade to, between 0 and 1 (default: 0) * @param $fadeLength The time to fade over, in seconds (default: 1) * * @return void */ public function fadeSound($name:String, $targVolume:Number = 0, $fadeLength:Number = 1):void { var fadeChannel:SoundChannel = this._soundsDict[$name].channel; SoundShortcuts.init(); Tweener.addTween(fadeChannel, { _sound_volume: $targVolume, time: $fadeLength, transition:"linear" } ); //TweenLite.to(fadeChannel, $fadeLength, {volume: $targVolume}); } /** * Mutes the volume for all sounds in the sound dictionary. * * @return void */ public function muteAllSounds():void { for (var i:int = 0; i < this._sounds.length; i++) { var id:String = this._sounds[i].name; this.setSoundVolume(id, 0); } } /** * Resets the volume to their original setting for all sounds in the sound dictionary. * * @return void */ public function unmuteAllSounds():void { for (var i:int = 0; i < this._sounds.length; i++) { var id:String = this._sounds[i].name; var snd:Object = this._soundsDict[id]; var curTransform:SoundTransform = snd.channel.soundTransform; curTransform.volume = snd.volume; snd.channel.soundTransform = curTransform; } } /** * Sets the volume of the specified sound. * * @param $name The string identifier of the sound * @param $volume The volume, between 0 and 1, to set the sound to * * @return void */ public function setSoundVolume($name:String, $volume:Number):void { var snd:Object = this._soundsDict[$name]; var curTransform:SoundTransform = snd.channel.soundTransform; curTransform.volume = $volume; snd.channel.soundTransform = curTransform; } /** * Gets the volume of the specified sound. * * @param $name The string identifier of the sound * * @return Number The current volume of the sound */ public function getSoundVolume($name:String):Number { return this._soundsDict[$name].channel.soundTransform.volume; } /** * Gets the position of the specified sound. * * @param $name The string identifier of the sound * * @return Number The current position of the sound, in milliseconds */ public function getSoundPosition($name:String):Number { return this._soundsDict[$name].channel.position; } /** * Gets the duration of the specified sound. * * @param $name The string identifier of the sound * * @return Number The length of the sound, in milliseconds */ public function getSoundDuration($name:String):Number { return this._soundsDict[$name].sound.length; } /** * Gets the sound object of the specified sound. * * @param $name The string identifier of the sound * * @return Sound The sound object */ public function getSoundObject($name:String):Sound { return this._soundsDict[$name].sound; } /** * Identifies if the sound is paused or not. * * @param $name The string identifier of the sound * * @return Boolean The boolean value of paused or not paused */ public function isSoundPaused($name:String):Boolean { return this._soundsDict[$name].paused; } /** * Identifies if the sound was paused or stopped by calling the stopAllSounds() or pauseAllSounds() methods. * * @param $name The string identifier of the sound * * @return Number The boolean value of pausedByAll or not pausedByAll */ public function isSoundPausedByAll($name:String):Boolean { return this._soundsDict[$name].pausedByAll; } //- EVENT HANDLERS ---------------------------------------------------------------------------------------- //- GETTERS & SETTERS ------------------------------------------------------------------------------------- public function get sounds():Array { return this._sounds; } //- HELPERS ----------------------------------------------------------------------------------------------- public function toString():String { return getQualifiedClassName(this); } //- END CLASS --------------------------------------------------------------------------------------------- } }

(use arrow keys and spacebar to control the red ball)
A new 3d physics library is under development and in early stages called jiglibflash. Like the Box2D ports it is based on a C++ library of the same name called jiglib, only this is 3D instead of 2D. It is similar in purpose to WOW Engine which is the other current open source 3d flash physics engine. For more on this toolkit see the links below.
UPDATE: katopz has also ported this to use Away3D as the renderer.
UPDATE: Also updated for the sandy3d engine as the renderer.
Unity3D is a great platform for developing 3d games where you need hardware acceleration beyond what Flash 3d can give you for the web.
There are lots of great independent gaming companies and web gaming companies realizing this and here in the #phx Arizona market a few good ones including Flashbang Studios on their Unity3D gaming site Blurst. I have been developing Unity3D for about 6 months and it is great where you want 3d environments over 2000 polys for the web. The power of 3d hardware rendering on the web combined with a great development environment is making it possible to make really fun games with unity3d.
Unity3D Games Released Recently
Flashbang recently released Minotaur China Shop to add to their Blurst.com site of Unity3D games and community. They detailed the launch day at their blog. It is a pretty fun game and once you get further into the game design with different paths, selling products or thrashing your china shop for insurance and strategic upgrades it has legs to keep interest.
Minotaur China Shop Trailer
[vimeo]http://vimeo.com/2474951[/vimeo]
There are lots of great Unity 3d games out there here is a list of the best of 2008:
- AXE – Billions
Play it!
Provide Feedback - AXE – Dark Temptation
Play it!
Provide Feedback - Banzai Ball
Play it! (Mac OS)
Provide Feedback - Beijing Conspiration
Play it!
Provide Feedback - Chicken Target
Play it!
Provide Feedback - Circuit Defenders
Play it!
Provide Feedback - Colony Defender
Play it!
Provide Feedback - Downhill Bowling
Play it!
Provide Feedback - Feist
Play it! (Mac OS)
Provide Feedback - Flip Sorter
Play it!
Provide Feedback - Hordes of Orcs
Play it!
Provide Feedback - IndieRiffs
Play it! (Intel Mac OS)
Provide Feedback - Jeecheereen1
Play it!
Provide Feedback - Jetpack Brontosaurus
Play it! - Laka Game Show
Play it!
Provide Feedback - Lander Commander
Play it! (Mac OS)
Provide Feedback - Lies and Seductions
Play it! (Mac OS Universal)
Provide Feedback - Manta
Play it!
Provide Feedback - Mars Explorer
Play it!
Provide Feedback - Nuddz
Play it!
Provide Feedback - Oddball
Play it! (Mac OS)
Provide Feedback - Off-Road Velociraptor Safari
Play it! - Outpost
Play it! - Pirates n Dragons
Play it!
Provide Feedback - Project Cloudwitch
Play it!
Provide Feedback - RastaMonkey
Play it!
Provide Feedback - Seamulator
Play it! (Mac OS)
Provide Feedback - Sperm Racer
Play it!
Provide Feedback - Sphaira
Play it!
Provide Feedback - Super Splashdown
Play it!
Provide Feedback - Super Volei Brasil
Play it!
Provide Feedback - Tag Ball
Play it!
Provide Feedback - Traces of Illumination
Play it!
Provide Feedback - Tumbledrop
Play it!
Provide Feedback - Turret Master
Play it! (Mac OS)
Provide Feedback - Turtle Trap
Play it!
Provide Feedback - Vimto Jetski
Play it!
Provide Feedback - Widget TD
Play it!
Provide Feedback
[source]
This is pretty impressive. This is Moonlight for mono (a silverlight clone in mono.net for multiplatform) running inside of Ogre3D (a 3d renderer) as a material.
Argiris Kirtzidi (one of the developers behind Managed OGRE) modified Moonlight to run inside the Ogre3D engine. You can render Moonlight applications or XAML files inside Ogre3D.
Some details in no particular order:
-Moonlight uses cairo for the graphics. I developed a new backend for cairo that fully utilizes the GPU (through Ogre’s RenderSystem) for rendering. This is completely independent from Moonbeam and can be used standalone.
-Moonlight’s core is a native C++ engine and is not dependent in Mono. It is flexible enough to be scripted by anything, javascript, managed code, native code, etc. I’ve got it working on both Mono and the .NET framework and I plan on embedding and trying out Lua for more lightweight stuff.
-If you opt for using managed code, it should be possible, in theory, to utilize the silverlight controls, develop a silverlight widget using visual studio and have it run through moonbeam with full debugging support.
-Getting it to work on Windows was no small task as the moonlight team is completely focused on linux, and there doesn’t seem to be much consideration about cross-platform-ness. I think this is reasonable, though, since moonlight is a young project and their specific goal is to implement silverlight for *nix systems. The downside is that it reduces its flexibility, e.g. in order to inject keyboard/mouse events I will have to create and pass to it GDK events or make heavy patches to it.
Hopefully, there will be more push in the future to get the *nix dependencies abstracted away from the core moonlight engine.
- The Moonlight Calculator Example.
- Miguel’s post about this
- Original post about the technique from the author
Adobe stratus sounds pretty interesting for flash client to client communication much like peer to peer networks for small numbers of people.
Want to build a video chat application, multi-player games or voice-over-ip applications for the Flash Player or AIR without worrying about setting up a server infrastructure? Stratus (which we showcased at MAX) is your new best friend.
Stratus is a beta hosted rendezvous service that helps establish communication between Flash Player or AIR clients. Once two clients are connected to Stratus, they can send data directly client to client. The APIs in Flash Player 10 and Adobe AIR 1.5 allow for point-to-point communication between a small number of subscribers. Publishers have to send data to all subscribing clients, so the number of subscribers is limited to the available bandwidth on the publisher end.
This must be one of the first Real-Time Media Flow Protocol (RTMFP) protocol usage programs from Adobe? Basically this protocol is adding better UDP or broadcast support which allows for larger sets of users and is common in large scale real-time games. Here it seems to be more of a peer to peer usage rather than authoratative approach (maybe flash media server will have large user set support with this) which limits to about 15 users or the lowest latency in the group with anything close to real-time syncing. Stratus seems like more of a matchmaking middle man to help with nat punchthrough and then it relies on peer to peer. But more fun in store checking it out.
P2P like this can’t really be used for games due to cheating unless one client is the independent server but this works great for small file sharing apps, whiteboards, chats, watching videos at the same time, etc.
When you do lots of any language you build up libraries over time that are time savers that are repetitive and tedious if you do not consoildate into a library. Taking a look at the CASALib, an as3 library of common functions for flash that was released I have many of the same things in my libraries but CASALib just has lots of extras that go a bit deeper than some libraries, is very clean and is organized pretty well.
One cool thing about it is the IDestroyable interface and the CasaMovieClip, CasaSprite, CasaTextField , etcthat all have a destroy() method that cleans up all events, removed instances and even removes it from the parent display object. Gets me thinking why this isn’t just part of DisplayObject in the first place.
From the release:
Here are a few of our favorite things in CASA Lib AS3:
- Standardized external load API
- Easily remove listeners with IRemovableEventDispatcher
destroymethods make garbage collection easy- Large group of utility classes for common manipulations
We will be elaborating further the power of CASA Lib in future blog posts.
As with any new release there will be bugs that emerge, but with your help we promise to release updates often to keep CASA Lib as stable as possible.
1.0.0 Downloads & Documentation
ZIP: http://as3.casalib.org/releases/1.0.0/1.0.0.zip
SVN: http://svn.as3.casalib.org/releases/1.0.0/
Documentation: http://as3.casalib.org/releases/1.0.0/docs/[source]








