Blog.

Welcome to my blog. This is the place where I share my thoughts, sometimes in English and sometimes in Czech. Feel free to comment, I love to read comments!

TotalTranslate icon.

BinaryAge, well known author of popular TotalFinder will soon release a new product: TotalTranslate, a system-wide translation powered by Google Translate.

Activated on a keyboard shortcut. But I hope the icon speaks for itself (even there’s no key or a service gear as usual :]


TotalTranslate icon

Red alert: homepage theme remixed.

Oh well that was a tough start of the day.

Someone at our office forgot to close the alarm remote lid and the battery drained. Hence when I came in the morning, I wondered there’s no beeping. Since I thought all is OK and unlocked, I came in… But suddenly sirens started to scream and I had to call all the possible lines to cancel the red alert.

Anyways that’s all for the offline world for now. Regarding the online one I have to note I had refurbished my homepage, as you may noticed. There’s a lot of hidden good stuff going on (and I’d be glad to talk about them if time allows), but I have to mark one thing which made me recently happy: TypeKit. It’s a freaking awesome service, very well designed and reliable, however not free. There were some problems with Czech glyphs being broken on iOS, but it should be fine by now: the TypeKit team yesterday deployed a new engine, allowing to push OpenType fonts to iOS (it was handled by SVG, as far as I know).

Thank for stopping by. I would be really glad to show you some sweet new stuff I cooked recently, so stay near.

WebExpo 2010: Preparing Data for Performance-Critical Apps in Flash.

In case you’re going to attend WebExpo 2010, I’d love to invite you to my talk.

Some people don’t like Flash because they experienced it in the form of annoying Flash banners and intro animations. But this format is groundbreaking and it’s possible to create almost anything with it; from simpliest animations to very complicated and sohpisticated applications.

Flash has given me absolute creative freedom for 13 years now. I learned how to use it effectively and created my own process which I will introduce to you…

I’m illustrator, graphic designer and also a programmer of Flash games. Most of our games are designed for Facebook. They have to be fast, small and very attractive. I will share my experience with development of these games.

I will show you my workflow from application design to execution. I use self-made framework that is available as opensource. I will also talk about more general process of preparing and optimizing data.

Pokud jdete na WebExpo 2010, rád bych Vás pozval na svou přednášku.

Flash může být někým vnímán negativně po zkušenostech s otravnými bannery a intro animacemi, kde bývá tato technologie použita. Přitom je tento formát naprosto přelomový a je v něm možno vytvořit takřka cokoliv, od nejjednodušších animací, po velmi komplikované a propracované aplikace.

Mě Flash dává už 13 let naprostou tvůrčí svobodu. Naučil jsem se ho efektivně využívat a vytvořil si řadu vlastních postupů, které Vám představím.

Jsem kreslíř, grafik a v poslední době také programátor flashových her. Navrhujeme hry hlavně pro Facebook, které musejí být rychlé, malé a velmi atraktivní. I o zkušenosti z vývoje těchto her se s Vámi chci podělit.

Představím vám svou workflow od návrhu aplikace po realizaci. Používám svůj vlastnoručně naprogramovaný framework, který jsem publikoval jako opensource a je tak k dispozici i vám. Kromě toho se budu také zabývat obecnými postupy přípravy a optimalizace dat.

Bzoonkbar: seznámení.

Pokud Vás zajímá programování her v ActionScriptu, rád bych vás pozval na naší přednášku o Bzoonk Baru.

V úterý 24. srpna v českém sídlu Adobe v Nových Butovicích vás společně s Jakubem Schimerem seznámíme s projektem, který jsme poslední čtyři měsíce pod křídly společnosti Falanxia tepali. Prozradíme vám nějaké fígle a celkově vás provedeme vývojem velkého facebookového herního projektu.

Víc informací můžete vykutat na rozšafně pestré stránce Viktora Bezděka. Těšíme se na vás!

Bzoonkbar Preview.

Here at Falanxia we’re just about to publish a new Facebook game.

Here you can see a panel where you can buy (or sell) drinks, fruit, receipts etc. The whole concept and pixelpushing of the panel is done by me, however icons are done by Michal Hotovec and Petr Stefek.


Bzoonk Bar – Sidebar panel


Don’t miss the tiniest icon ever: “HI” in the header

For your consideration here is another mockup I created for the facebook game we’re going to release very soon. All unread notifications are stored here – until the player clicks the button in the middle (label translates to “Erase all messages”). There are obviously three levels of messages: info, warning and error, each with an icon.

On top there’s an info bubble with the player’s current money amount and current guests and current VIPs in their bar.

The buttons in the footer turn modals on and off. “Notifications” is the current one, while the second one is a Drinklist.

Don’t worry, of course the game will be in English (and other major languages). For us it’s much easier to maintain locales in Czech, since it’s our mother tongue.

I hope you’ll be able to play the game live on facebook soon.


All unread notifications are stored here – until the player clicks the button in the middle

TrazzlePublisher.

If you use as3logger to standardize your AS3 logging needs, I’ve got something for you.

At Falanxia we’ve been using SOS Max Logger by PowerFlasher, but recently I’ve found a great new supplement, which I think is a great leap forward: Trazzle. Let me copy paste few features we love here:

  • Bitmap logging
  • Performance monitoring
  • Multiple Log Levels
  • TextMate support

For us just the Bitmap logging feature was a reason to switch. In case we logged events just via SOS Max, there would be a need to rewrite all logger calls, and it would be a somewhat painful and completely useless experience. Since we use the as3logger approach, it was really easy to add a small Trazzle wrapper. And there was no need to rewrite anything in our sources.

Here’s the source:

/*
 * Falanxia Utilitaris.
 *
 * Copyright (c) 2010 Falanxia (http://falanxia.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.falanxia.utilitaris.logger {
    import com.falanxia.utilitaris.utils.*;
    import com.nesium.logging.*;

    import de.dev_lab.logging.*;
    import de.dev_lab.logging.publisher.*;

    import flash.display.*;



    /**
     * The {@code String} publisher outputs the Log to a Trazzle.
     * See more info about Trazzle here:
     * http://www.nesium.com/products/trazzle
     *
     * @author Vaclav Vancura @ Falanxia a.s. vaclav@falanxia.com
     * @author Falanxia (http://falanxia.com, @falanxia)
     * @since 1.0
     */
    public class TrazzlePublisher implements IPublisher {


        private static var _trazzle:TrazzleLogger;



        /**
         * Constructor.
         */
        public function TrazzlePublisher(stageReference:Stage, appName:String) {
            if(_trazzle == null) {
                _trazzle = new TrazzleLogger();
                _trazzle.setParams(stageReference, appName);
            }
        }



        /**
         * Outputs the message to the {@code String}.
         * @param logLevel Log level
         * @param object Message
         */
        public function publish(logLevel:int, object:*, ...additional):void {
            var prefix:String;

            switch(logLevel) {
                case Logger.DEBUG:
                    prefix = "d ";
                    break;

                case Logger.INFO:
                    prefix = "i ";
                    break;

                case Logger.WARN:
                    prefix = "w ";
                    break;

                case Logger.ERROR:
                    prefix = "e ";
                    break;

                case Logger.FATAL:
                    prefix = "f ";
                    break;

                default:
                    prefix = "";
            }

            if(object == null) object = "[null]";

            _trazzle.log(prefix + String(object), 4);
        }



        /**
         * Clear.
         * Trazzle has no clear method, so it's just a placeholder.
         */
        public function clear():void {
        }



        /**
         * Destructor.
         */
        public function destroy():void {
            clear();
        }



        /* ★ SETTERS & GETTERS ★ */


        /**
         * Get Trazzle reference.
         * @return Reference to Trazzle
         */
        public static function get trazzle():TrazzleLogger {
            return _trazzle;
        }
    }
}

Of course you need as3logger de.dev_lab.logging.Logger class.

All you need now is just an initialization of the logger:

Logger.addPublisher(new TrazzlePublisher(stage, "My application name"));

And you can log as you logged before:

Logger.debug("Debug message");
Logger.info("Info message");
Logger.warn("Warning message");
Logger.error("Error message");
Logger.fatal(Math.random() * 1000);

If you want to call Trazzle for any reason (e.g. to log a Bitmap), you can use:

var myBitmapData = new BitmapData(100, 100);
myBitmapData.noise(Math.random() * 1000);
TrazzlePublisher.trazzle.logBitmapData(myBitmapData);

Or to invoke a beep and show a performance window:

TrazzlePublisher.trazzle.beep();
TrazzlePublisher.trazzle.startPerformanceMonitoring();

You can fork or watch the Gist for this class here on Git.

IntelliJ IDEA Refactoring Updates.

As you may know, IntelliJ IDEA employs one of the best refactoring features you can meet in an IDE. Now the beta version 9.0.3 EAP adds something what amused me so much, that I decided to mock a small strip below.

It’s easy: when you have a variable expression you want to extract, you can use “Introduce Variable” refactoring feature. Now I noticed the last EAP is even able to find ALL similar expressions and replace them at once. Click the image below to understand what I am talking about.


IntelliJ IDEA 9.0.3 Introduce Variable features Click the image to see the full resolution mockup.

I really dig IntelliJ IDEA. And even I am 7/24 user, I still find new features which blow me away. If you’re unhappy with your current ActionScript IDE of choice, you should try IDEA today.

Dummy Tween Plugin.

A somewhat different approach to periodical calling of a method. This time with TweenLite/TweenMax by Greensock

As I said before, last few months I’ve been working for Falanxia.com, where I help to develop social games in Flash (and more platforms coming). I was not very happy with the way how to periodically call a method:

var timer:Timer = new Timer(10, 100); // call a method 100 times with 10 ms delay)
timer.addEventListener(TimerEvent.TIMER, method);
timer.start();

Is there a shorter approach to do the same thing? While we already use TweenLite/TweenMax a lot, I thought there has to be a plugin which should handle this task (no, I don’t need TweenLite.delayedCall(). Well, nope, there’s not. But sure it can be handled this way:

var tweenObj:Object = {pass:0};
TweenLite.to(tweenObj, 1, {ease:Liner.easeNone, onUpdate:method}); // 100 * 10 ms = 1 second

IMHO this way is a bit cumbersome and you need to create an Object to be tweened. I came up with a simple TweenLite plugin to do the job:

/*
 * Falanxia Utilitaris.
 *
 * Copyright (c) 2010 Falanxia (http://falanxia.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.falanxia.utilitaris.plugins {
    import com.greensock.*;
    import com.greensock.plugins.*;



    /**
     * Dummy tween plugin.
     *
     * @author Vaclav Vancura @ Falanxia a.s. vaclav@falanxia.com
     * @author Falanxia (falanxia.com
     * @since 1.0
     */
    public class DummyTweenPlugin extends TweenPlugin {


        public static const API:Number = 1.0;

        protected var _target:Object;



        /**
         * Constructor.
         */
        public function DummyTweenPlugin() {
            super();
            this.propName = "dummy";
            this.overwriteProps = ["dummy"];
        }



        /**
         * Tween initialization.
         * Gets called when any tween of the special property begins. Store any
         * initial values and/or variables that will be used in the "changeFactor"
         * setter when this method runs.
         * @param target Target object of the TweenLite instance using this plugin
         * @param value The value that is passed in through the special property
         * @param tween The TweenLite or TweenMax instance using this plugin
         * @return If the initialization failed, it returns false. Otherwise true.
         * It may fail if, for example, the plugin requires that the target be a
         * DisplayObject or has some other unmet criteria in which case the plugin
         * is skipped and a normal property tween is used inside TweenLite
         */
        override public function onInitTween(target:Object, value:*,
            tween:TweenLite):Boolean {
            return true;
        }
    }
}

How to use it?

TweenPlugin.activate([DummyTweenPlugin]);
// first you need to activate the plugin, but only once in the whole app

TweenLite.to(this, 1.0, {dummy:{}, onUpdate:method});

This way there’s no need to create an Object variable. I think it’s a bit simpler. Actually this article took much more time to write than to code the DummyTweenPlugin.