My gamedev year in review

A new year is just around the corner, so I think it’s a good idea to review my year as a game developer. If I had to use a single word to describe 2013, there is no doubt I would pick the word “awesome“! ūüėÄ

The year 2013 went by so fast that I barely noticed. At the beginning of the year, I started working on my projects for One Game A Month. I managed to work on 1GAM¬†until June, when my university tasks consumed all my free time. I was really motivated to publish 12 games in 2013, but I’m proud to say that I’ve published 6 (six!) instead: Blacksmith Dash, Squared Puzzle, Spell Cracking, Madly Angry Cat¬†and Invade Pirates. It was an outstanding experience: I’ve met new gamedevs, exploded in ideas, learned new tools, sharpened my skills and a lot more! I strongly recommend anyone to try 1GAM in 2014.

logo

Compared to 2012, when I released just a single game, 2013 was a success. It had 500% more games released and a lot more developed. All over the year I also wrote tutorials for the Game Development section of the Tuts+ network. I covered several topics, such as steering behaviors, FSM, network programming and how to deal with cheaters. I even had the happy opportunity to share my own trajectory as a game developer. The Tuts+ community is great and I owe them a huge thank you! Thanks for all the feedback, comments and suggestions. You guys rock!

In November something beyond my wildest dreams happened. I’ve been following OUYA¬†development since their very first day, when the idea was nothing more than a Kickstarter campaign. I really admire Julie¬†Uhrman and her team. It’s not easy to insert yourself in a market dominated by big players, specially when you have to attract game developer along the way. After watching Julie’s talk at the XOXOs festival I emailed her. She answered my e-mail (how cool was that?) and they sent me one¬†OUYA!¬†Oh man! I never asked one, but she decided to support me as a game developer! A-W-E-S-O-M-E!

I was already reading about OUYA gamedev, but that was a real boost. I integrated the console in all my plans, including my gamedev classes (see the video above). I have no words to say how much I am thankful for that. Thank you, the OUYA team, thank you so much!

I can’t forget to mention the Flixel Community project. It was my very first “real” open-source project, with users and other developers to talk to. We did a hell of a job hammering lots of bugs and in November we announced our¬†first released¬†under the community label. I’ve learned a lot during the process and I’m sure we will bring tons of new features to the engine in 2014.

In 2013 I also did some cool things that are not related to code. I’ve bootstrapped a new series called game dissection¬†here at As3GameGears. It allows me to motivate other developers (including myself) showing how a game was made and, at the same time, it helps me get in touch with amazing people. I was also invited by¬†Ben Whitman¬†to join his Indie Interview Series. That was so cool! Several game developers I admire are there too. It was a huge pleasure to me to be side-by-side with them. It was my very first recorded interview in English (bare the accent!) and a great opportunity to make something different from coding. Thanks, Ben, for the invitation!

My 2013 as a gamedev year was pretty busy. Unfortunately the day has only 24 hours, so I had to put several idea in hold. On the other hand, it motivates me even more to make 2014 another great year. Now it’s time to rest a bit and enjoy the holidays, 2014 will be awesome too!

1gam 2013 gamedev onegameamonth OUYA
2 Comments

GPS

GPS is a native extension to use the geographical location information of a device. It is able to read  time, geographical location and the device’s last location information. When the location of the device changes, the application can receive updates about the changes too. All of the needed geographical location data (time, accuracy, latitude, longitude, altitude, speed, provider and bearing ) can be extracted in the form of an Object.

Even though Adobe AIR already has a Geolocation API, the extension has even more features, such as access to location menu, checking the GPS status ( Is it on or off), enabling/disabling listeners, checking GPS availability  and the device GPS support.

Sample

var _ex:Gps;

// initialize the extension
_ex = new Gps();

// This listener tells you that the location menu has been closed.
_ex.addEventListener(GpsEvent.LOCATION_MENU_CLOSED, closed);

// This listener informs you when new location data is gained.
_ex.addEventListener(GpsEvent.UPDATE_STATUS, location);

// This listener informs you when the GPS is temporarily unavailable.
_ex.addEventListener(GpsEvent.GPS_TEMPORARILY_UNAVAILABLE, unavailable);

// This listener infors you when the device GPS has been activated.
_ex.addEventListener(GpsEvent.GPS_ENABLE, enable);

// This listener informs you when the device GPS has been deactivated.
_ex.addEventListener(GpsEvent.GPS_DISABLE, disable);

// If you want to find out whether the device supports GPS or not you can use the isSupported property.
var Support:boolean = _ex.isSupported;
trace("is Supported >> " + support);

// If you want to find out whether the GPS is active or not you can use the isGpsEnabled property.
var Enable:boolean = _ex.isGpsEnabled;
trace("isGpsEnabled >>" + Enable);

// In order to have access to the GPS location menu you can use the openLocationMenu() function.
_ex.openLocationMenu();
Commercial
3 Comments

Argonaut

Argonaut is an AS3/JSON serializer/deserializer. It provides a simple way for client applications to share classes with servers through JSON. The task of converting JSON data into instantiated objects is tedious and error-prone, and can be difficult if the JSON file has deeply nested elements. Argonaut bypasses all this hand-tooling by automating the process.

It uses reflection to analyze mapped classes and can use these mappings to infer a lot of information about the JSON it’s processing. For example, if the mapped AS class uses a typed Vector to store the JSON array of a class, Argonaut knows to manufacture that class from the JSON array. It understands all common JSON data types (Number, String, Boolean, Object, Array and Null) and can also interpret JSON as custom classes or even core Actionscript classes (e.g., Sprite or BitmapData). Additionally, Argonaut allows the JSON to provide deterministic mappings to remove any guessing.

Sample

var argonaut:Argonaut = new Argonaut();
argonaut.registerClassAlias(‚Äúcom.example.EpicGalley‚ÄĚ, EpicGalley);
argonaut.registerClassAlias("com.example.Hero", Hero);
var galley:EpicGalley = argonaut.generate(json);
// or using an explicit class
var galley:EpicGalley = argonaut.generateAs(json, EpicGalley);
MIT
2 Comments

Native Toast

Native Toast is a native extensions that allows the use of custom toast messages. Additionally to the default toast style provided by the Android system, the extensions allows the use of extremely customized messages, includes HTML ones.

Among the available toast styles there are a profile toast, an image toast, a profile sketch toast, a header toast, an alert toast and an HTML toast.

Sample

// initialize the extension
var _ex:Toast = new Toast();

// Use this method to create a custom toast with the following configuration
_ex.ShowCustomMessage("MYFLASHLAB :)", 25, false, 100, 0, 10, 50, 50,"0x00aa00","0xaa00ff","0xffffff", Toast.GRAVITY_RIGHT);

// Use this method to create a default toast style
_ex.ShowDefaultMessage("MYFLASHLAB", false);

// Use this method to use a bitmap as the toast
_ex.ShowImageToast(bm.bitmapData, true, 300, 100, 200, 60, 15, 30, 70);

// Use this method to create a toast with a bitmap and a text right to it
_ex.ShowProfileToast("MYFLASHLAB", 20, bm.bitmapData, true, 130, 130, 200, 90, 20, 60, 20);

// Use this method to create a toast with a bitmap and a text over it
_ex.ShowProfileSketchToast("MYFLASHLAB", 20, bm.bitmapData, true, 140, 140,"0x000000","0xffffff",Toast.GRAVITY_TOP);

// Use this method to create a toast with a bitmap and a text below it
_ex.ShowHeaderToast("MYFLASHLAB", 20, bm.bitmapData, false, 120, 120, 150, 50, 10, 40, 10, "0xffaa00", "0xaaff55", "0xffaaff", Toast.GRAVITY_CENTER);

// Use this method to create a default AlertToast
_ex.ShowAlertToast("MYFLASHLAB", Toast.ALERT_TYPE_SUCCESS, true, "0xaaaaff", Toast.GRAVITY_LEFT);

// Use this method to create a custom AlertToast
_ex.ShowCustomAlertToast("MYFLASHLAB", true,bm.bitmapData, bm.bitmapData, bm.bitmapData, 40, 40, 0, 0, 40, 40,"0xaa2500",Toast.GRAVITY_CENTER);

// Use this method to create a toast which supports html as its content
_ex.ShowHtmlToast("

THIS IS A HTML TEXT

", true);
Commercial
3 Comments

Google Plus

Google Plus is a native extension to use the Google+’s +1 button. It allows the developer to customize the button, changing its annotation type, size and the overall look. It’s also possible to¬†decide where to place the button on the screen by specifying x/y coordinates.

The extension has methods to measure the button size, so the application can dynamically adjust the layout to better accommodate the button. After it has been used or is no longer useful, the button can be completely disposed. The extension is compatible with Starling framework.

Sample

// initialize the extension
var _ex:GPlus; = new GPlus();

// add a weblink to receive +1 results
_ex.initializeGPlus("http://www.myappsnippet.com/", 0)

// set the x and y position of the gPlus button
_ex.setGPlusPosition(40, 500);

// set the annotation type of the gPlus button with one of the
// following values: INLINE , BUBBLE , NONE
_ex.annotationType = GPlusEvent.INLINE;

// set the gPlus button size, SMALL , MEDIUM , STANDARD , TALL
_ex.gPlusSize = GPlusEvent.STANDARD;

// to check the gPlus button information you may use gPlusInfo method.
var obj:Object = _ex.gPlusInfo;
for (var name:String in obj) {
    // returns: x , y , width , height , annotationType , size
    trace(name + " = " + obj[name]);
}

// considering that whenever you are interacting with the gPlus button,
// a native dialogs opens, when the focus is returned to the Air app,
// you must call the refresh() so the button will show the changes.
// You simply need to listen to
// NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handleActivate);
// and then call the refresh() method:
// if (_ex){
//  _ex.refresh();
// }

// Remove the button 
_ex.removeGPlus();
Commercial
Comments Off on Google Plus

AS3ATF

AS3ATF is¬†a library to read, write and inspect Adobe’s Texture Format (ATF) files. It has methods to load an ATF file from a ByteArray or to serialize an already loaded file using a custom serializer. The ByteArray serializer is already implemented, so it’s possible to export the ATF file content as a set of raw bytes.

The library also has some helper classes, such as ATFContainer used to encapsulate the ATF data. It provides a set of properties and methods to inspect the file, e.g. minimum player version, is cubic, texture count, etc.

Sample

var data :ByteArray; // TODO: load ATF file to "data"
var container :ATFContainer = ATFContainer.readFromByteArray(data);

String s = "";
s+= "length : "+container.length+"\n";
s+= "format : "+ATFFormat.nameFor(container.format)+"\n";
s+= "can be loaded using loader : "+ATFFormat.canBeLoadedUsingLoader(container.format)+"\n";
s+= "minimum player version : "+ATFFormat.minimumPlayerVersionFor(container.format)+"\n";
s+= "isCube : "+container.isCube+"\n";
s+= "width,height : "+container.width+","+container.height+"\n";
s+= "textureCount : "+container.textureCount+"\n";
s+= "\n";
s+= "Textures:";

if(container.textures) {
    s+=container.textures.toString();
}
2 Comments

FizzX

FizzX is a visual Box2D editor tool. Using the editor a developer no longer needs to manually hand code the creation of Box2D bodies and joints. Instead, by visually drawing it’s possible to dramatically increase productiviy allowing rapid prototyping and easy changes.

Among the available features are the ability to draw bodies, draw joints to connect bodies, automatic polygon triangulation, import images and pair them with bodies and finally a way to export the scene as a JSON structure.

Fizzx

Free
1 Comment

as3filters

as3filters is a library with a¬†variety of filters for image processing. The library works upon a BitmapData, creating a displacement map that will distort that given bitmap. It’s possible to specify a region in the source bitmap to limit the area where the library will act.

After the displacement map is calculated by the library, the developer can apply it to any bitmap. The resulting image will be bitmap distorted by the lib’s displacement map. Some of the available filters are bulge,¬†twirl,¬†squeeze, pinch,¬†photicTunnel, fisheye and¬†strech.

Sample

var bmd:BitmapData = new BitmapData(width, height, true);
var region:Rectangle = new Rectangle(30, 30, 90, 90)
var twirlFilter:DisplacementMapFilter = Filter.twirlFilter(bmd, region);
bmd.draw(video); // video is a bitmap from the camera
bmd.applyFilter(bmd, bmd.rect, new Point(0, 0), twirlFilter);

Via: FlashDaily.net

MIT
1 Comment

Image

Image is a native extension to manipulate image data. Even though the Flash API already has image manipulation methods, the extension uses native code for the image operations, which boosts the application performance significantly.

Some of the features available include the ability to encode a BitmapData structure into a JPG or PNG, as well as the ability to manipulate and apply filters (soon).

Sample

public function encode(bitmapData:BitmapData, encodedData:ByteArray, format:String, quality:Number = 0.8):Boolean;
public static function init(developerKey:String):void;
public function saveBitmapData(bitmapData:BitmapData, filename:String, format:String, quality:Number = 0.8):Boolean;
Commercial
Comments Off on Image

AdMob

ANEAdMob¬†is a native extension for Android to show ads. Among the supported functionality are the ability to¬†show ad,¬†cache interstitial ad,¬†show interstitial ad,¬†hide ad and¬†listen to tap, close, leave, etc. events. When showing an ad, it’s possible to choose its size and location on the screen.

The position of an ad can be customized based on pre-defined constants. A developer can control the vertical and horizontal position of an ad, for instance centralizing it horizontally and pushing it to the bottom of the screen vertically.

Sample

_admob = new AdMob();
_admob.addEventListener(AdEvent.INIT_OK, onEvent);
_admob.addEventListener(AdEvent.INIT_FAIL, onEvent);
_admob.addEventListener(AdEvent.AD_SHOW_OK, onEvent);
_admob.addEventListener(AdEvent.AD_SHOW_FAIL, onEvent);
_admob.addEventListener(AdEvent.PRESENT_SCREEN, onEvent);
_admob.addEventListener(AdEvent.DISMISS_SCREEN, onEvent);
_admob.addEventListener(AdEvent.LEAVE_APPLICATION, onEvent);
_admob.addEventListener(AdEvent.INTERSTITIAL_CACHE_OK, onEvent);
_admob.addEventListener(AdEvent.INTERSTITIAL_CACHE_OK, onEvent);
_admob.addEventListener(AdEvent.INTERSTITIAL_CLOSED, onEvent);
_admob.init("YOUR_PUBLISHER_ID");

protected function onEvent(ae:AdEvent):void {
    trace(ae.type+" "+ae._data);
}

//showing 468x60 ad at the bottom center side of the screen
_admob.show(AdParams.SIZE_IAB_BANNER, AdParams.HALIGN_CENTER, AdParams.VALIGN_BOTTOM);

//caching and showing interstitial ad
_admob.cacheInterstitial();
...
_admob.showInterstitial();
Apache 2.0
11 Comments

ZipManager

ZipManager is a native extension to extract (unzip) zipped files, compress files & folders and download files from Internet on Android devices. It allows the application to zip and unzip files on the sdcard, as wel as receive information of files or folders within a zipped file.

It’s possible to easily download files from the internet and store them at a specific location.¬†When downloading a file several different events are fired to inform¬†about the process. Some information include the size of a file and the amount of data already downloaded.

Sample

// set Extension var
var _ex:ZipManager; 

// initialize the extension
_ex = new ZipManager();

// This method checks whether the zipped file exists in the given address or not.
_ex.existFile("zipFileAddress"); 

// This method returns the zip file data in form of a Json file.
_ex.getFileContentJson("zipFileAddress"); 

// This method returns the zip file data in form of an Array.
_ex.getFileContentArray("zipFileAddress");
Commercial
1 Comment

Flixel Community 2.56 is out!

I am thrilled to announce that Flixel Community 2.56 is out! This is the very first release under the community label. First of all a huge thank you and congratulations to everyone involved! It was a lot of work to gather, discuss and hammer all those open bugs.

Our main goal with this release was to maintain Flixel Community 2.56 as reverse-compatible as possible with the current version of AdamAtomic/Flixel (which is 2.55). We performed several tests to ensure a smooth transition and we hope you won’t need more than a few (or none at all!) tweaks to start using Flixel Community.

From now on we can focus on new and exciting features. There is a lot of discussion regarding the next steps, so stay tuned for developer news right from Flixel Community repository at Github.

flixel flixel community release
7 Comments

Multi Peer Connectivity

ANE-MultiPeerConnectivity is a native extension to detect nearby iOS7 devices and send them messages. The extension has two main parts: an assistant (to help being discovered) and a discovery helper (to help discover). Both assistant and discovery helpers can be started and stopped using a simple call from the extension singleton.

When a device starts a helper, it must specify a service type. That type is a unique identifier, and should be the same for discovery and assistant. It’s also possible to set the peer name, which is the device unique identifier. After the discovery starts, an event is fired for each peer found.

Sample

AirMultiPeerConnectivity.getInstance().startAssistant(serviceType, peerName);
AirMultiPeerConnectivity.getInstance().stopAssistant();
AirMultiPeerConnectivity.getInstance().startDiscovery(serviceType, peerName);
AirMultiPeerConnectivity.getInstance().stopDiscovery();

AirMultiPeerConnectivity.getInstance().addEventListener(AirMultiPeerConnectivityEvent.FOUND_PEER_EVENT, onPeerFound);

private function onPeerFound(event:AirMultiPeerConnectivityEvent):void {
    var peerName:String = event.peerName;
}
Apache 2.0
1 Comment

Win a license for distriqt’s ANE package

distriqt ANE Competition

One of the best ANE packages available out there is the one by distriqt. The package can be used for Android and iOS mobile platforms and contains 21 native extensions. That’s a lot of cool weaponry!¬†The package license includes unlimited use of the extensions for personal or commercial projects, ¬†free updates with new features and improvements and 1 year of email support/assistance relating to the extensions.

The best of all: they are giving away a license! In order to win, all you have to do is follow @distriqt and post a tweet with the hashtag #distriqtANE telling the world what you’d make with the extensions. They will¬†select the most creative idea posted.

The competition will run from the 18th of November 2013 until the 2nd of December 2013, in Australian time (AEST). Hurry up and join the party now!

Competition official link: here.

adobe ane native extension
1 Comment

Google Play Game Services

ANE-Google-Play-Game-Services is a native extension to use Google Play Game services. It provides a set of methods to allow players to use a Google+ account to sign in, which provides the application with the ability to read the player info, such as name and achievements.

The extension has methods to sign in/out, report the completion percentage of an achievement (based on its id) and report a new score (based on the leaderboard id). It’s also possible to show the player’s standard achievements, as well as monitor the authentication process by using events.

Sample

public function startAtLaunch():void;
public function signIn():void;
public function signOut():void;
public function reportAchievement(achievementId:String, percent:Number = 0):void;
public function reportScore(leaderboardId:String, newScore:Number):void;
public function showStandardAchievements():void;
public function getActivePlayerName():String;
Apache 2.0
15 Comments