MENU

Blog

Data Elements: vsm_blog5.aspx

For SuperRetro16 Users

Posted by SuperRetro16 Team on Thursday, April 16, 2015 at 10:23 AM
Posted Under: General

Unfortunately, because the SuperRetro16 app was suspended from the Google Play Store, we are attempting to upgrade all those users to the full version of SuperRetro16 Lite. To download SuperRetro16 Lite, click this link from your device and press Install. https://play.google.com/store/apps/details?id=com.bubblezapgames.supergnes_lite

Once installed, if you had the most recent version of SuperRetro16, the process is automatic and you should receive a message that says, “Congratulations on upgrading!” And should have complete access to all the emulator’s features!

If you are having any difficulties, or the Lite app does not unlock (this means that you are unable to load an unlimited number of save states, only use 1 cheat at a time, etc.) automatically please contact us at contact@superretro16.com with the subject line “SuperRetro16 app failed to upgrade.”

Thank you all for your time and support, and we apologize for any inconvenience!

Hind Strike has Struck!

Posted by SuperRetro16 Team on Tuesday, April 07, 2015 at 1:41 PM
Posted Under: General

An all-new SNES game from the developers of Classic Kong has launched! Pilot the premiere Soviet Hind helicopter through 9 action-packed missions! Classic 16-bit mode 7 graphics, control schemes for both classic game consoles or mobile devices and punishing difficulty make this game a brand new way to enjoy a slice of gaming history!

Developed in-house by BubbleZap, Hindstrike is only available for the SuperRetro16 emulator!

Clarifications

Posted by SuperRetro16 Team on Friday, December 19, 2014 at 10:42 AM
Posted Under:

We apologize for any confusion the two apps have caused! Check out the previous post for why we created a new and Legacy app.

To clarify: There is *no* reason for anyone who currently uses SuperLegacy16 to purchase SuperRetro16! These apps will now, and for the life of the products, have the same functionality. Both apps will always have full customer support and both will receive all future updates. You will not get any different user experience using one app or another.

As a small recap, SuperRetro16 was created because due to a policy notice violation our old app (SuperLegacy16) was de-listed from all Google charts. That app will never be allowed to be advertised or featured again. Because of this we had to create the new app, in a new listing. Google doesn’t allow for two apps to have the same name, hence SuperLegacy16! Again, both apps will receive all future updates and always be fully supported.

Hope that helps, but please reach out to us by e-mail at contact@superretro16.com with any questions.

Working toward compliance

Posted by SuperRetro16 Team on Thursday, December 18, 2014 at 11:45 AM
Posted Under:

We’re listening to all our users, listening to Google, and always working, working, working! Some changes you may have noticed after the last update are the logo change to a more classic look (hopefully a little more recognizable for all our long-time users) and, thanks to all of you, the return of cover art! Additionally, we now have a brand new feature; the ability to set a screenshot automatically to cover art! For those that hadn’t set their own art this can be done by long-pressing on a game in the main menu and choosing “Select Image.” The new feature is the ability to set a screenshot to cover art automatically. You can do this by pressing “Screenshot” from the in-game menu and then selecting “Cover Art.”

On the subject of new, there’s another important announcement; SuperRetro16 full version will become SuperLegacy16, and this will be our legacy product. There will still be FULL support for the app, both customer service and through continued updates. In fact, for those of you who have already purchased the full version of the app, other than another name change you shouldn’t notice any difference whatsoever.

The reason for this Legacy product is a little more complex; our best understanding is that when we received our policy violation notice our app became ineligible to be on any form of chart or listing in the Google Play Store. This means that the only way people can find and purchase our app is by searching for it (or searching for a SNES emulator). Through talking with Google, it sounds like the only way to resolve this is by releasing a new instance of our app. To reiterate, SuperLegacy16 and SuperRetro16 are the same application, and there won’t be any difference in functionality between them.

Once again, thanks for all your support, feedback and great ideas. We’re working hard to try and get more great features out that you folks want while still meeting Google Play Stores terms & services. We’ll keep working as hard as we can to make sure you’re getting the best emulator possible!

Google Policy Violation Notice

Posted by SuperRetro16 Team on Friday, December 05, 2014 at 2:11 PM
Posted Under:

Many of you folks will probably have already noticed some significant changes to our emulator. The short explanation for why we made them is that we received a Google Play Store policy violation notice. We'd seen our app disappear from all charts a couple weeks ago and reached out to them to find out what was going on! Thanks to all of you and your support, we've consistently been very high in the Google Play Store Arcade games charts (what we're saying is that you're all amazing, and thank you) and suddenly we were nowhere to be found. On December 3 we found out the reason why: we'd been found to be in violation of Google Play's terms of service and received an e-mail from them stating that.

This meant we had to make a lot of changes, and quickly. Some of those included changing the name and logo of our emulator, so let's all give a big welcome to SuperRetro16: (still) the premiere SNES emulator!

We also needed to remove the cover art feature to comply with the notice, but we're working to try and find a way to allow users to add their own cover art while still being in full compliance with Google's policies. 

Additionally we had to change how SuperRetro16 allows users to search for games from inside the app. It will now take you to a Google search rather than directly to ROM sites.

Finally, we'd like to again say thank you. Thank you to all of you for supporting us, helping us and sticking with us for all the years. We love the SNES, we love classic games, but most of all we love being a part of a community of people who share all those passions. Thank you for giving us the opportunity to do that.

Shaders have landed!

Posted by SuperRetro16 Team on Wednesday, February 20, 2013 at 6:13 PM
Posted Under: General

Good news everyone! The latest SuperGNES update includes support for shaders! We provide a CRT and grayscale shader by default, with support for your own. We are using OpenGL ES for the backend, so bear that in mind. Our shaders are based on the XmlShaderFormat. We support the <vertex> and <fragment> tags, and we pass rubyTextureSize, rubyOutputSize, and rubyInputSize. We additionally pass in the time as a uniform float to the fragment shader, which represents the current millisecond. This is used to achieve the vertical animation effect in the "Scanline" version of our CRT shader. The <name>, <notes>, and <version> tags are all required. Below is our default shader, which passes the image through unaltered. Place your custom shaders (ending in .xml) in the following path: /sdcard/supergnes/shaders/ You will need to create the supergnes/shaders/ folders yourself.

<?xml version="1.0" encoding="UTF-8"?>
<shader>
<name>SuperGNES Default Shader</name>
<notes>Extraordinarily ordinary!</notes>
<version>1</version>
<fragment><![CDATA[
precision mediump float;
uniform sampler2D u_Texture;
varying vec2 v_TexCoordinate;
void main() {
	gl_FragColor = texture2D(u_Texture, v_TexCoordinate);
}
]]></fragment>
<vertex><![CDATA[
attribute vec4 a_Position;
attribute vec2 a_TexCoordinate;
varying vec2 v_TexCoordinate;
void main() {
	v_TexCoordinate = a_TexCoordinate;
	gl_Position = a_Position;
}
]]></vertex>
</shader>

Please download our preset shaders from within SuperGNES under the Video FX setting. To learn more about GL Shaders check out https://www.google.com/search?q=glsl+es+shader+tutorial

Android iCADE and 8-Bitty Support

Posted by on Friday, November 30, 2012 at 12:14 PM
Posted Under: Development

We recently received a number of requests to add support for the iCADE 8-Bitty and iCADE Arcade Cabinet controllers to SuperGNES. After playing with the devices and looking at the documentation we thought it would be a relatively easy to integrate. However, there are a few caveats to these devices and there are no Android-specific support libraries available.

The first thing to note is that unlike most Bluetooth game controllers, the iCade products function as virtual Bluetooth keyboards. The second thing noted is the odd key event model. Pressing a button down produces two Android KeyEvents and releasing produces yet another two. For example, pressing down the "Start" key fires the key events U down, U up and releasing the button fires events F down and F up. This is unfortunate because it means the events need to be interpreted instead taken at face value.

The solution we came up with was to detect the presence of a paired iCade device and translate the incoming key events into game controller key events. To accomplish this we override the dispatchKeyEvent method in Activity. Once in place the iCade "Start" button now registers as the Android KeyEvent.KEYCODE_BUTTON_START key instead of the keys U and F. Check out the code example below to see how you can integrate iCade support into your Android apps. You can download the iCade support code here.

Activity Example Code:

public class BaseActivity extends Activity
{
	private boolean iCadeEnabled = false;

	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		detectiCade();
	}

	private boolean detectiCade()
	{
		Set pairedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();

		Iterator iter = pairedDevices.iterator();
		while (iter.hasNext())
		{
			BluetoothDevice bd = iter.next();
			if( iCade.isBluetoothNameiCade( bd.getName() ) )
				iCadeEnabled = true;
		}
	}

	public boolean dispatchKeyEvent(KeyEvent event)
	{
		if ( iCadeEnabled )
		{
			event = iCade.dispatchKeyEvent(event);
			if (event == null ) return true;
		}

		return super.dispatchKeyEvent(event);
	}
}

SuperGNES Tutorial Video

Posted by on Thursday, October 04, 2012 at 3:30 PM
Posted Under: General
This is a quick tutorial for SuperGNES so you can quickly find answers to the most common questions.

New Classic Kong SNES Game

Posted by SuperRetro16 Team on Tuesday, August 07, 2012 at 12:14 PM
Posted Under: General

Bubble Zap Games is proud to release Classic Kong, a faithful recreation of a classic title for the SNES. Yes, an actual new SNES rom. It's free of copy-protection and free of charge, and we've even released the source code for you hobbyist types. Special thanks to Shiru for his hard work as lead developer. Update: Second release! Because of the great response and requests for more content we've now added the pie factory level plus some more extras. Check out the code, or just download the rom! Contact us with feedback or questions. Game on!

 

Creating Controller Themes

Posted by SuperRetro16 Team on Tuesday, January 17, 2012 at 9:09 PM
Posted Under: General

As of SuperGNES version 1.2.21 support for theme-able controllers skins has been implemented. Coming soon is the feature to add user created controller skins. So you can make any theme you can think of! I wanted to make this blog post available first so users can prepare for creating their own controller skins. So lets take a look at one of the SuperGNES controller skins.

This is the default transparent controller skin that comes with SuperGNES. Controllers skins are simply PNG images with extra information embedded in them describing different regions of the controls.  You can see from the image elements like the D-Pad and Button Pad. There are action elements that depict the buttons pressed down. Embedding the information in the image makes it easy to share and distribute.

Now lets take a look at the meta information embedded in the image. Inside is the comment text (or PNG tEXtComment ) which contains a structured JSON string. This string holds the controllers name, background color and a list of graphics regions called elements. Each element defines it's own region, id and button type. Formatted below is the actual JSON string for reference.

Here is a hexadecimal dump of the image header.
89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00 00 02 39 00 00 00 ae  08 06 00 00 00 d4 17 1c  |...9............|
bf 00 00 00 01 73 52 47  42 00 ae ce 1c e9 00 00  |.....sRGB.......|
04 6d 74 45 58 74 43 6f  6d 6d 65 6e 74 00 7b 22  |.mtEXtComment.{"|
6e 61 6d 65 22 3a 22 54  72 61 6e 73 70 61 72 65  |name":"Transpare|
...
...
{
// Controller name displayed
"name": "Transparent Default",  

// Background Color see http://developer.android.com/reference/android/graphics/Color.html
"backgroundColor": "#00000000", 

    // Element regions
    "elements": [
         // First element object
        {
            // Unique Element id
            "id": "dpad",

            // Element Type (supported values: dpad, buttonpad, ltrig, rtrig, start, select, menu, abutton, bbutton, xbutton, ybutton)
            "type": "dpad",

            // Rectangular region of graphic
            "staticBounds": {
                "bottom": 141,
                "left": 0,
                "right": 141,
                "top": 0
            },

            // Rectangular region of graphic when pressed
            "activeBounds": {
                "bottom": 141,
                "left": 143,
                "right": 284,
                "top": 0
            }
        },

        // More elements ...
        {
            "activeBounds": {
                "bottom": 141,
                "left": 428,
                "right": 569,
                "top": 0
            },
            "type": "buttonpad",
            "id": "buttonpad",
            "staticBounds": {
                "bottom": 141,
                "left": 286,
                "right": 427,
                "top": 0
            }
        },
        {
            "activeBounds": {
                "bottom": 173,
                "left": 47,
                "right": 93,
                "top": 142
            },
            "type": "ltrig",
            "id": "ltrig",
            "staticBounds": {
                "bottom": 173,
                "left": 0,
                "right": 46,
                "top": 142
            }
        },
        {
            "activeBounds": {
                "bottom": 173,
                "left": 141,
                "right": 187,
                "top": 142
            },
            "type": "rtrig",
            "id": "rtrig",
            "staticBounds": {
                "bottom": 173,
                "left": 94,
                "right": 140,
                "top": 142
            }
        },
        {
            "activeBounds": {
                "bottom": 173,
                "left": 188,
                "right": 250,
                "top": 142
            },
            "type": "menu",
            "id": "menu",
            "staticBounds": {
                "bottom": 173,
                "left": 188,
                "right": 250,
                "top": 142
            }
        },
        {
            "activeBounds": {
                "bottom": 173,
                "left": 251,
                "right": 324,
                "top": 142
            },
            "type": "start",
            "id": "start",
            "staticBounds": {
                "bottom": 173,
                "left": 251,
                "right": 324,
                "top": 142
            }
        },
        {
            "activeBounds": {
                "bottom": 173,
                "left": 325,
                "right": 404,
                "top": 142
            },
            "type": "select",
            "id": "select",
            "staticBounds": {
                "bottom": 173,
                "left": 325,
                "right": 404,
                "top": 142
            }
        }
    ]
}

You can simply download the image above and replace it with your own graphics if you stay within the same regions and use an image editor that preserve image comments. Beyond that you need to understand how the JSON format and element regions work. Each element has a staticBounds property. This consist of four other properties left, right, top and bottom that define the boundary of the control element. To visualize how these relate take a look at the box model below. In addition there is the activeBounds property defining the image pressed or activated state. This allows for an animated interaction. The activeBounds and staticBounds bounds must have the same width and height to be considered valid. If you don't want to create the active graphics simply set the activeBounds to the same coordinates as the staticBounds. Each element must be set a type such as dpad, buttonpad, ltrig, rtrig, start, select, menu, abutton, bbutton, xbutton or ybutton. The dpad and buttonpad types are unique as they require the bounds to be perfectly square for calculating touch regions. It's recommended to use the buttonpad instead of using each abutton, bbutton, xbutton or ybutton. Finally give each element it's own unique identifier. Included below is the Java classes matching with the JSON string for use inside SuperGNES. This is mainly provided for easy reference.

package com.bubblezapgames.supergnes.touchcontrol;

import android.graphics.Rect;

public class ControllerGraphic
{
	// Controller name displayed
	public String name;

	// Background Color see http://developer.android.com/reference/android/graphics/Color.html
	public String backgroundColor;

	// Element regions
	public ControllerGraphicElement elements[];
}

public class ControllerGraphicElement
{
	// Unique Element id
 	public String id;

	// Element Type (supported values: dpad, buttonpad, ltrig, rtrig, start, select, menu, abutton, bbutton, xbutton, ybutton)
 	public String type;

	// Rectangular region of graphic
  	public Rect staticBounds;

	// Rectangular region of graphic when pressed
 	public Rect activeBounds;
}

// No copyright reserved. Public Domain

So now you have an idea of the format of a SuperGNES controller use a photo editing program to create the graphics for your controls. For help inserting comments into images, Gimp has a handy option for doing so. Go to Menu, Image, Image Properties and click on the Comment tab. Also make sure you save your controllers in PNG format and check the "Save comment" option. Gimp

Thanks for checking out this blog entry. Look for future releases of SuperGNES with full support and a new controller gallery area here on supergnes.com. Update: With SuperGNES release 1.4.2  user provided controller skins are now fully supported. Simply create the directory "supergnes/controllers" in the root of your device's external storage and copy your PNG  controller image into that directory. Your custom controller skin should appear in the controller layout editor. Check the logcat messages on your device for debugging help.