I’ve just launched the newest addition to SketchPort, a word guessing game, which runs on Node.js. Players get 90 seconds to draw the word that is given, while the other players try to guess it.
The game uses the same SWF as the draw page, so all users get a clean image with no pixelation, and the standard tools, such as alpha, blur, and layers. Also, the viewport is synchronized, so the user who is drawing can zoom and pan freely.
This is my first time deploying Node.js code into a production environment. I’m happy with the
post-receive hook in git, which made running the new code after a push pretty easy. I’m also happy with npm, which I think is one of the best parts of Node.js.
On the other hand, I haven’t figured out how to neatly break Node.js websocket applications into separate processes. Maybe I’m just spoiled from using Flash Media Server, but it seems like pretty basic functionality to break applications and instances of applications into their own processes. I’m looking into using Seaport, the new nginx websocket proxying, or most likely a custom Node.js solution using cluster or named pipes.
Overall, working with Node.js is fun, because it runs well, has good documentation, and adding new features is as easy as
Yesterday, news came out that one of the best gaming websites, OMGPOP, is shutting down. I spent a lot of time playing Draw My Thing and met a lot of friends there. I’m glad that a lot of them came to SketchPort.
Besides being a fun site, OMGPOP helped develop my career by inspiring me to create SWFWire. Because OMGPOP was a highly optimized (and well designed) Flash site, I was curious to see how things worked. This led to a lot of experimentation, and eventually I could edit code and test it while the site was running. I found that even though only a small number of colors were shown on the drawing canvas, the color actually used for drawing and being sent over the network was a standard 0xRRGGBB hex color. I exposed the new colors with a color picker and up/down keyboard shortcuts to change the shade, and put it online at Hambycomb for others to use, as it improved the quality of the drawings.
OMGPOP never said anything about it, but I didn’t want to risk losing a cool feature by publishing the source code. Now that the site is closing, I’ve posted the source code on GitHub. A technical explanation of how it works is found there.
Check out these animated versions of the awesome artwork on http://www.sketchport.com.
The videos are automatically created when you post a drawing, using Adobe AIR, ffmpeg, PHP, the YouTube API, and a little magic.
Encoding them at 1920×1080 takes about 30 minutes for a 2 minute video. Not bad for an Amazon EC2 micro instance.
Getting this error message when trying to debug an iOS application with Flash Builder 4.7 on Windows 7?
1. Open Windows Explorer and navigate to “(FLASH BUILDER)\eclipse\plugins\com.adobe.flash.compiler_188.8.131.525990\AIRSDK\lib\aot\bin\iOSBin”
2. Right click on iIPA.exe and go to properties.
3. Go to Compatibility and check “Run this program in compatibility mode for: Windows 7″
Now it will stop crashing and you can debug!
SketchPort is now mostly out of private beta. The home page, browse page, challenges page, user profiles and drawing pages no longer require login. The news section on the home page is also new.
The plan for the immediate future is to improve the drawing app with an eraser tool, allow live playback of drawings, and other new features.
class CancerBot extends NanoBot: def onCellIdentified(self, cell): if cell.is_cancer(): self.destroy(cell) bot = CancerBot() bot.run()
All I need is some help with implementation details.
- Make sure you’ve overlaid the AIR 3 SDK onto your Flex SDK. For compiler errors
-swf-version=13in the compiler args For “Error #1014 Class could not be found.” runtime errors
- This step depends on how you’re creating the window that contains Stage3D content. Fixes “Context3D unavailable” runtime errors in the release version of AIR
- If you’re using the initial window, set
directin your application.xml
- If you’re creating the window at runtime, set
nativeWindowInitOptions.renderMode = NativeWindowRenderMode.DIRECTwhen creating the
- If you’re using the initial window, set