Marketing .breaking conventionS .and generating interesT

0 Comments

Very entertaining video about how drab following formulas can make things.

Now, there is something to be said about conventions. In games, specifically, many conventions are necessary and good: control schemes, for example, should be common between games because it’s less for a new player to learn (and thus less reasons to be frustrated and quit). Visual interface elements are often useful when shared across games (or computer applications, generally), such as X for “close this window” or a musical note icon for audio options.

The types of conventions I’m thinking of, though, are more along the lines of gameplay mechanics (shoot everything that moves for points) or story lines (save the princess) or visual style (photo-realism). These conventions really can make your game less than great if used carelessly.

The solution? Pick one thing, one feature or one facet of your game, and push it so far over the top that it grabs people right away. The key is balance: don’t overdo it. Too much change, and people will be left confused–and quit your game.

Business Papermint indie

0 Comments

This is a fantastic, heartfelt indie tale. Helps keep you grounded in the experience and the product–not the business plan, monetization, or demographics. Those things are important (critical!), but if you lose your vision tending to them, they don’t matter anymore. A unique game is nothing without its soul.

Please allow me to tell you – merely from my humble perspective – the unbelievable but true story about us, Avaloop, the team that created Papermint. It’s a story about friendship and independence, about how to lose a multi-million lottery ticket, about the really unique thing we created and about hope.

When I came back from the countryside to that cinema in Vienna I was welcomed with so much warmth and enthusiasm. It was just wonderful. I knew that nothing could ever blow us off our little indie feet… whatever the future will bring. With or without Mister Big.

Suddenly we felt this spirit of freedom again! The spirit we were lacking while being drunk of that strange hope for money or fame or security… whatever it was… it had tamed us. Papermint had not grown the natural way during the “PowerPoint”-times… it was endangered to be squeezed into a shape that was not its true shape… it was a marketing/PR/get more users/blah blah/demographic needs-shape we had not consciously cared for in our original plan.

But somehow we were able to stop that deformation in our minds and went back to the original plan.

Inspiring stuff! Read more, and check out the game.

Business Tapulous Pirates

0 Comments

Virtual Goods News reports that:

Over the weekend Tapulous head of business development Tim O’ Brien announced that the company was successfully monetizing pirated copies of its iPhone game Tap Tap Revenge 3 by selling the pirates virtual goods as in-app purchases. Tapulous estimates that Tap Tap Revenge 3 has been downloaded 2.5 million times, but that 1 million of those downloads are pirated copies.

Ok, first of all, if you’re pirating a $.99 game, that’s pathetic and you are a loser. Full stop.

But, it’s nice to see that you can upsell pirates with virtual goods. :)

Pirated copies can still communicate with the Tapulous network and their in-game virtual item shops still work. According to O’Brien, this has lead to some pirate users spending far more than the app’s initial cost on virtual items like additional songs and avatar customization pieces.

So, what if–for non-pirates–you offer the app/game for $.99 (or more, if it’s not on iPhone), and then if the potential customer balks and decides not to buy, you could then offer to give them the game for free?

At least then you have a chance to monetize them later in the cycle. Pirates would have nothing to pirate, and chances are you would end up making more money in the long run even if you give away a majority of copies. (I’m assuming, too, that there’s no physical COGs and it’s exclusively digital delivery.) It sounds like a decent idea and a great experiment to try.

(P.S. My time is being consumed with a non-game business venture right now, but I want to try to blog short little ones like this to keep myself in touch with my most beloved game development universe.)

ActionScript, PushButton Engine Angry Explanations #2: Spinning a freaking image with PBE!

2 Comments

Following on from Angry Explanations #1, we will now add some motion to the scene. For kicks and giggles, we’ll cause the image to rotate each frame.

(Note that this information is in reference to PushButton Engine build r625.)

The key takeaway here is that for a component to be tickable, it must implement the ITickedObject interface and then tell the ProcessManager to start and stop calling onTick() every tick.

Oh, there’s one other key takeaway here: how to use PropertyReferences. You get a property of a component by way of the owning entity. You create a PropertyReference instance for each data member that you need to access. In this example, we’re accessing the rotation field on the SpriteRenderer component we added in Angry Explanations #1.

In a bit more detail, the PropertyReference is constructed with a special string: "@Sprite.rotation" (see line 11 in the code below). That means, this is a reference to the component of this entity with the name “Sprite” (recall that we gave it that name when we created the SpriteRenderer component instance), and the field “rotation” of the SpriteRenderer class. It’s quite simple once you realize what it’s doing (but I’m no less angry, mind you!).

I thought that a SpatialComponent might be necessary to alter the sprite’s position, but apparently that component has been removed (since r470, which is the current packaged release). That data seems to now be handled by the renderer component itself.

Add this one line to the end of showLogo() from the previous example:

spriteEntity.addComponent( new SpinController(), "spinner" );

Then add the following new class in a sub-folder (components/controllers/).

package com.yourcompany.yourgame.components.controllers
{
	import com.pblabs.engine.core.ITickedObject;
	import com.pblabs.engine.core.ProcessManager;
	import com.pblabs.engine.entity.EntityComponent;
	import com.pblabs.engine.entity.PropertyReference;

	public class SpinController extends EntityComponent implements ITickedObject
	{
		// Cache the PropertyReference instance here to avoid a bunch of temporary allocations.
		private var _rotProp:PropertyReference = new PropertyReference( "@Sprite.rotation" );

		// Nothing to do in the constructor because this is such a simple example.
		public function SpinController()
		{
			super();
		}

		// When the component is added to the sprite entity, we want to register to
		// get tick updates by the ProcessManager.
		protected override function onAdd():void
		{
			super.onAdd();

			ProcessManager.instance.addTickedObject( this );
		}

		// When the component is removed from the sprite entity, we want to unregister
		// from the ProcessManager so tick updates will stop.
		protected override function onRemove():void
		{
			super.onRemove();

			ProcessManager.instance.removeTickedObject( this );
		}

		// Each tick, we just change the rotation of the sprite renderer a little bit.
		public function onTick(tickRate:Number):void
		{
			// Get the current rotation.
			var rotation:Number = owner.getProperty( _rotProp ) as Number;

			// Add 1 degree to it.
			rotation += 1;

			// Store the new rotation back in the sprite.
			owner.setProperty( _rotProp, rotation );
		}
	}
}

As an addendum, I should point out that the rotation will probably not be smooth. To fix that, you should have the SpinController implement IAnimatedObject instead of ITickedObject. The registration with the ProcessManager is the same, except you call addAnimatedObject() instead of addTickedObject().

The difference is that IAnimatedObject will update when Flash draws a frame instead of when the ProcessManager ticks, and the motion will appear a lot smoother.

And you’ll want to normalize the rotation based on delta time since the last frame. Er, like this:

public function onFrame( elapsed:Number ):void
{
	var rotation:Number = owner.getProperty( _rotProp ) as Number;

	// Rotate 15 degrees per second, nice and slow.
	rotation += 15 * elapsed;

	owner.setProperty( _rotProp, rotation );
}

ActionScript, Flex, PushButton Engine Angry Explanations #1: How to draw a freaking image with PBE!

5 Comments

(Thanks to Ben G. for that humorous title! :D And just to be super clear–I’m not angry at all about PBE. The anger is entirely tongue-in-cheek.)

So, yeah, I got started with PBE at a bad time, I think.

It’s in transition between some major changes, and so all the docs and tutorials to this point are out of sync and kind of very… confusing. Because of that, I really struggled to figure this out, and in fact couldn’t get an image on the screen without professional help (I’ll let you interpret that however you’d like).

This information is relevant for PBE r625 and up.

(This isn’t to say the engine is poorly designed–it’s simply not accurately documented in places because it has been changing so quickly. And to be fair, it’s still in beta. I wouldn’t use the engine if I didn’t think it was great.)

A frustrated noob’s guide to getting a freakin’ image on the dang screen using Flex 3

Here’s the MXML which will reference the code.

<?xml version="1.0" encoding="utf-8"?>
<game:Game
	xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:game="com.yourcompany.yourgame.*"
	width="750"
	height="600"
	layout="absolute">

</game:Game>

Now define a resource in a ResourceBundle subclass, which is the image you want to display, and let PBE automagically make it accessible through the resource manager.

package com.yourcompany.yourgame
{
	import com.pblabs.engine.resource.ResourceBundle;

	public class EmbeddedResources extends ResourceBundle
	{
		// The path is magically also the name of the resource.
		[Embed(source="../assets/images/logo.png", mimeType="application/octet-stream")]
		public var logoImage:Class;
	}
}

Put that image into action! It’s a simple notion, but somewhat complicated if you’re new to the engine and its gooey innards.

package com.yourcompany.yourgame
{
	import com.pblabs.engine.PBE;
	import com.pblabs.engine.entity.IEntity;
	import com.pblabs.engine.resource.ImageResource;
	import com.pblabs.engine.resource.ResourceManager;
	import com.pblabs.rendering2D.DisplayObjectScene;
	import com.pblabs.rendering2D.SpriteRenderer;
	import com.pblabs.rendering2D.ui.FlexSceneView;

	import mx.containers.Canvas;
	import mx.core.Application;
	import mx.events.FlexEvent;

	public class Game extends Application
	{
		public var resources:EmbeddedResources;

		// We need access to this in a couple of functions.
		private var _scene:DisplayObjectScene;

		public function Game()
		{
			super();

			// Let the Flex Application initialize fully before we muck with it.
			addEventListener( FlexEvent.APPLICATION_COMPLETE, onStartup );
		}

		// This is called once the Flex app (stage, in particular) is initialized.
		private function onStartup( e:FlexEvent ) : void
		{
			// Load our embedded resources (the image to show).
			resources = new EmbeddedResources();

			// Tell PBE to initialize and pass it our instance so it can get the stage.
			// (Remember, Application is a subclass of Sprite, which PBE needs.)
			PBE.startup( this );

			createPbeScene();

			showLogo();
		}

		private function createPbeScene():void
		{
			// Create a new IEntity for the scene view.
			var sceneEntity:IEntity = PBE.allocateEntity();
			sceneEntity.initialize( "sceneEntity" );

			_scene = new DisplayObjectScene();

			// Since this is Flex, we need the appropriate scene view class.
			var sceneView:FlexSceneView = new FlexSceneView();

			// Set up the view size.
			sceneView.width = 750;
			sceneView.height = 600;

			// FREAKIN' IMPORTANT: add the view as a child to our display list!
			this.addChild( sceneView );

			// Connect the view to the display object scene (a component).
			_scene.sceneView = sceneView;

			// Add the display object scene to the scene entity.
			sceneEntity.addComponent( _scene, "renderer" );
		}

		private function showLogo():void
		{
			// Create a new IEntity instance for the sprite to be displayed.
			var spriteEntity:IEntity = PBE.allocateEntity();
			spriteEntity.initialize( "logoEntity" );

			// Add a sprite rendering component.
			var sprite:SpriteRenderer = new SpriteRenderer();

			// Tell the renderer to draw (and load) this image resource.
			sprite.fileName = "../assets/images/logo.png";

			// Tell the renderer to draw to the display object scene.
			sprite.scene = _scene;

			// Add the component to the sprite entity.
			spriteEntity.addComponent( sprite, "sprite" );
		}
	}
}

So, what the heck just happened? Pfft! Don’t ask me! I’m still a freakin’ noob! :)

I know a couple of things, though. The SceneView is like a “canvas” where all DisplayObjectRenderers are drawn. So you create entities and fill them with components (like a SpriteRenderer) and tell the renderer component about the scene view. Magically, the sprite appears! It’s not too much to understand if you just want to know the API and how to use it.

To really understand it, you’ll need to look under the hood and figure out the connections. A good bit of hidden work is being done to simplify the API, but possibly at the expense of understanding. It’s neither good nor bad. It’s just The Way of PBE (for now).

Feel free to post here to help fill my gaps in comprehension. I haven’t used the engine enough to write a thorough explanation, and I’m not too proud to accept help. :)

Business The eight words of success

1 Comment

Everyone wants to know how to be successful at what they do. Some people get angry when others succeed (because it isn’t them), and some people get inspired. Lots of people fail, and that’s normal (especially in business). Wasn’t it Edison that said he didn’t fail 1000 times, but rather found 1000 ways not to make a light bulb?

Are there principles that can help you succeed? Maybe understanding what it takes would help you finish.

This video from TED talks describes what Richard St. John believes are the ingredients necessary to brew your own batch of success. I found it inspiring, and I hope that you might, too.

Project Darkstar Darkstar multi-server coming along, as this video shows

0 Comments

John from the Darkstar forums (and project team member? I’m not sure), has posted a short video of Keith Thompson (one of the Project Darkstar Server engineers) showing a demo at 2009’s Austin GDC. The video is a bit hard to watch if you’re sensitive to shaky motion, but it’s worth it if you’re a big enough geek, like me. :)

Apparently, the Snowman demo game is running on two servers, and the load can be dynamically managed so that if one server reaches a limit, clients will be moved onto the second server. Interestingly, this means both clients that are logging in and clients that are already in the middle of a game. The load is balanced transparently by Darkstar, with clients continuing without a hitch.

Looks like they also have some decent monitoring tools. I wonder if those will get released to the community?

I wish them all the best, because I’m using Darkstar for most (possibly all) of my future games. Go Darkstar team!!

Business Yawma and the hunt for downloadable indie games

0 Comments

I’ve taken up the role of Director of Games for an exciting startup called Yawma. It’s an online retailer specifically for digital goods of the indie variety: games, music, applications, etc. The twist is that Yawma has a unique distribution model (which, unfortunately, I cannot say anything about right now). The developer revenue share is generous compared to portal sites like Big Fish Games, Amazon, etc. If I had some downloadable games I thought were worthy of sale, I’d sign up with Yawma myself. :)

So, if you have a downloadable game you would like to talk about, I can be reached at jason [@] yawma.net.

–Jason

P.S. This doesn’t adversely affect my development progress, because I’m a multitasking madman. *howls at the moon*

ActionScript, Business Virtual item sales in Flash: a managed payment service roundup

0 Comments

The microtransaction bug seems to be going viral these days among the Flash community. There are a growing number of companies offering managed payment services to Flash developers: they handle the dirty backside, and you give them content and share the income.

I personally think that it is worth it to build your own system (and I’m usually the guy saying, “Use the middleware, fool!”). But I think it depends on the scale of what you are planning. In my case, I want total control, and I want to own access to my customers so that I can continue to communicate with them. I also don’t want my games to become advertisements for a payment service.

I don’t view virtual item sales as just a sales channel. It’s also a gesture that means a player cares about and is emotionally invested in the game, and I want to maximize that relationship to make my players happy, long-term customers. Without access to my customers, the payment service is crippling my business. I don’t know that all these systems insulate the developer from his/her customers, but that is a major issue to bear in mind.

These Flash-specific services could be really useful to someone who is making much smaller scale games and wants some add-on sales or someone experimenting with virtual goods in an effort to diminish reliance on ad revenue. I’m not reviewing any of the services, just announcing that they exist. I haven’t investigated them all very deeply, but I will be poking around.

75% – andrograde.com
70% – www.nonoba.com
60% – www.gamersafe.com
60% – www.mochimedia.com
50% – www.heyzap.com

Which is best? It depends on your goals and plans. If you’re just making little quickie games (90% of Flash games), then any of the above would work. If you have a more broadly scoped business plan, you might want to steer clear and look into services that are not Flash-specific and spend the time/money to do the integration yourself.

ActionScript, Java When instanceof doesn’t recognize an instanceof.

2 Comments

Java’s ‘instanceof’ keyword is not the same as ActionScript’s ‘is’ keyword. In theory, they do the same thing: find out if an instance of an object implements a class or interface. In reality, they’re quite different.

Java compares for an exact match. ActionScript compares for a match or any subclass of the class being compared.

Let’s say we have class A which implements interface I. And we have class B which is a subclass of A (and implicitly implements interface I).

Java:

if( A instanceof I ) // True
    print( "yeah" );

if( B instanceof A ) // True
    print( "yeah" );

if( B instanceof I ) // False!
    print( "yeah" );

ActionScript:

if( A is I ) // True
    print( "yeah" );

if( B is A ) // True
    print( "yeah" );

if( B is I ) // True!
    print( "yeah" );

So, having learned a lot of ActionScript before diving into Java, I expected ‘instanceof’ to behave just like ‘is’. But no. And that was annoying not to realize at first. So, you’ve been warned!!

Update: Hmm, now I wonder if overloading method parameters behaves the same way as instanceof in Java? I’m going to be safe and make an interface for any classes that have multiple subclasses (ie, categories of entities which require special behaviors). It’s still polymorphic, so I guess it’s “good design.” I haven’t had quite enough experience digging into the reasons for Java’s language design choices.

Update 2: Of course I had to test the behavior of overloaded methods. Turns out that Java isn’t as exacting with overloaded methods–which is a relief!

For example, I have an Entity class, and a subclass called ItemEntity. I need to do some special handling on an ItemEntity (or any subclass of it) in a method that takes Entity as a parameter. Overloading that method to take an ItemEntity gives me the desired behavior for ItemEntity or any subclass of ItemEntity. Yay!