Monday, 6 April 2015
New Uploads
Let me have any feedback on the game you care to send me.
Some of the style of the Java code is, I confess, rather untidy. It's been through quite a number of different generations of compilers and build engines since its first origination in 1993, and I'm tidying it up as I go along.
Android Studio: Don't do it this way, do it that way.
Me: Oh, get a grip. It works, doesn't it?
Sunday, 22 February 2015
Timing of the Loop
Pretty soon, I'll have to implement a "disable touch response" system, so that the user can't do anything during an animation that has to run to completion.
Thursday, 19 February 2015
Using a Rocket
Back to the drawing board...
Saturday, 14 February 2015
Multiple Sprite Interaction
Monday, 9 February 2015
Problems with Conditions that Affect Multiple Sprites
The particular case is when the rocket launcher already has a rocket in it, and the user tries to put a second rocket in the launcher.
Later still: A new test version of Jade is available via the link in the left hand column.
Furniture Sprites
Though Furniture sprites are INACTIVE (i.e. don't react to touch or collision), they sometimes have to be moved to and from Limbo, so their 'home' scene and location are remembered. Initially, I set up special variables to remember these, but it occurs to me that I could use a single Dropzone for the purpose. Saves coding.
Thursday, 5 February 2015
Re: Switches, Conditional Scenes and Use of Inventory
I had thought I might have to implement a new class - Switches - to enable recognition of new conditions (e.g. Rocket already fired) and to give a handle to Save and Restart. However, I am now sure that Sprites themselves will be sufficient, either by detecting the the presence or position of a Sprite, or by creating a Zombie Sprite whose Position data can be used to indicate a state. The Zombie would be saved and restored like a carryable or movable Sprite. The Zombies would be in the Limbo scene (which is unreachable by players), and would never need to be drawn in real play, though inspection by developers of the Limbo scene would aid debugging..
Conditional Scenes:
I have now implemented a function in JadeData that inspects every destination scene before a scene switch, and changes the destination scene according to current game conditions.
Use of Inventory
Hitherto, if a carried sprite was dropped, and there was no specific dropzone on that scene, it was dropped into Inventory. I'm changing this so that Inventory drops only occur if there's a specific location in Inventory specified in the sprite dropzones. Otherwise, no drop will take place.
Sunday, 25 January 2015
Progress
Now need to design the code to allow change of Exit as a result of user action. For example, if the candle is present, the cave backgrounds are illuminated, so the destination screen might be different. Or to have the junk present. Also necessary to record the change so that a runtime save / restore can recreate the changes.
Thursday, 5 December 2013
Bug Fix
Fixed a bug whereby if a sprite was dropped on a page with no valid position so that it went to the inventory in the position of the inventory exit, then it couldn't be picked up!
Wednesday, 4 December 2013
Incredible time gap...
I built another test version which you can load from this handy link.
I was dissatisfied with the re-rendering engine in android java, so I built a version that only does a few sizes of playfield. It needs work, but it's viable.
Sunday, 28 October 2012
Another Idle Month
I'm now ready to start setting up a more satisfactory demo version with some interesting action, so I'll be working in Povray a lot - a condition that isn't conducive to much reporting from me.
I'd like again to appeal to anyone who wants to collaborate on the Povray side. I'd be delighted to share the load and the credit with you.
Meanwhile, and this is the problem with me, I've seen another possible use of the Jade engine and I keep thinking about that instead of getting on with what I should be doing!
(below) Junk sprite with bluescreening.
Tuesday, 18 September 2012
Example Game
This is a "game" with just six scenes, and very little to do except pick up a candle and drop it, but the music and sound effects are there, and the options.
Try it if you dare. Actually it is very benign as alpha versions go. Other than its own running space and private data, it only uses the media player, and surrenders or pauses that whenever it loses focus.
It works for me on my Android Xoom, but I'm interested in the behaviour of other platforms.
From left to right the options are Quit, Restore, Save, Music On/Off, Inventory, Pause.
Double tap to pick up and drop the candle.
Sparing no expense, the source is also available at the same address.
http://amazonsystems.phpzilla.net
Monday, 17 September 2012
New Touch protocol in place
The next activity is definitely the prototype game. I've got all the elements I need in the engine now, I think. I just have to use these capabilities to write an acceptable mini game.
I've been a little disappointed by the appearance of some of my backgrounds on the Xoom. I'll experiment with less compressed jpg files.
Friday, 7 September 2012
Jade Sound
package uk.co.amazonsystems.jade;
import java.util.ArrayList;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.media.AudioManager;
public class JadeSound
{
// This class handles all sounds. There are two sound sources. Use soundpool for short
// transient sounds. A single soundpool does all the sounds.
// For background music and ambient sound, Use MediaPlayer. Each sound is a new mediaplayer.
// Only one sound can be running at a time. All such sounds are looped.
public static final int OK_SOUND = 0;
public static final int BAD_SOUND = 1;
public static final int NOSUCH_SOUND = 2;
public static final int BAD_PLAY = 3;
private SoundPool soundpool = null;
private static int CHANNS = 4; // Sound Channels
private String soundName; // current ambient sound name
private int [] SFX = new int[CHANNS]; // Stream IDs
private int priority = 1;
private int soundid[]; // Sound IDs
private Context thiscontext;
private MediaPlayer mp;
private ArrayList soundfiles;
private int buggins;
private boolean soundstate = true;
// Initialise
public JadeSound(Context JadeContext, ArrayList SFXFiles)
{
thiscontext = JadeContext;
soundfiles = SFXFiles;
if (soundpool != null) soundpool.release();
soundpool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
int temp = soundfiles.size();
soundid = new int [temp];
for (int ii = 0; ii < temp; ii++)
{
int resid = getRaw(thiscontext, soundfiles.get(ii));
if (resid == 0)
{
soundid[ii] = 0;
}
else
{
soundid[ii] = soundpool.load(thiscontext, resid, priority);
}
}
for (int ii = 0; ii < CHANNS; ii++)
{
SFX[ii] = -1;
}
buggins = 0;
}
public int playSFX(String name)
{
return playSFX(name, 0);
}
public int playSFX(String name, int Loop)
{
int index = soundfiles.indexOf(name);
if (index == -1)
{
return NOSUCH_SOUND;
}
else
{
soundpool.stop(SFX[buggins]);
if (soundid[index] != 0)
{
int reply = soundpool.play(soundid[index], 1, 1, priority, Loop, 1);
if (reply == 0) return BAD_PLAY;
SFX[buggins] = reply;
buggins++;
if (buggins >= CHANNS)
{
buggins = 0;
}
}
else return BAD_SOUND;
}
return OK_SOUND;
}
public int playAmbient(String name)
{
// if the same sound name, just exit immediately
// we use the same mp we used last time, and keep playing the same song
if (soundName != null)
{
if (soundName.equals(name))
{
return OK_SOUND;
}
}
// if the media player still in use, reset it, release it and null it
if (mp != null)
{
mp.reset();
mp.release();
mp = null;
}
// remember the new sound name for next call
soundName = name;
// find the sound file in raw
int resid = getRaw(thiscontext, name);
// if it's not there, return
if (resid == 0)
{
return BAD_SOUND;
}
// Finally, create a media player
mp = MediaPlayer.create(thiscontext, resid);
// if it doesn't work, return
if (mp == null) return BAD_SOUND;
// Ambient always loops
mp.setLooping(true);
// start the playback
mp.start();
// if the song flag is false, pause it
// we may have to start it later
if (!getSoundState())
pauseAmbient();
return OK_SOUND;
}
public void pauseAmbient()
{
if (mp != null)
{
mp.pause();
}
}
public void resumeAmbient()
{
if (getSoundState())
{
if (mp != null)
{
mp.start();
}
}
}
public void pauseAll()
{
if (soundpool != null) soundpool.autoPause();
pauseAmbient();
}
public void resumeAll()
{
if (soundpool != null) soundpool.autoResume();
resumeAmbient();
}
public void closeSound()
{
if (soundpool != null)
{
soundpool.release();
soundpool = null;
}
if (mp != null)
{
mp.reset();
mp.release();
mp = null;
}
}
public void setSoundState(boolean state)
{
soundstate = state;
}
public boolean getSoundState()
{
return soundstate;
}
// Helper method that translates a filename in res/raw to a resource id
public static int getRaw(Context context, String name)
{
return context.getResources().getIdentifier(name,
"raw", context.getPackageName());
}
}
Saturday, 28 July 2012
A Hesitation
I still have to sort out Music/Sound Effects. I'm also uncomfortable with the feel of long press as I've implemented it, so I'll have another go at that when I return.
Monday, 23 July 2012
Music Design Unsuccessful
I note a lot of such mysterious problems on Stackoverflow, and I may change policy here.
Also, I think it should have been a class rather than a method, and I'll re-write it like that. I may also have to use the MediaPlayer for longer music and the Soundpool just for immediate sound effects. We'll see. MediaPlayer is facility-rich, but seems rather complex to use.
Wednesday, 18 July 2012
Music Design Revised
Friday, 13 July 2012
Some Progress and a Design for Music and SFX
I realised I hadn't accounted for save and restore of holdable items. If it's already held, then all we need remember is the sprite that's being held. This can be achieved at the top level, where the player's current location is remembered. If, however, the sprite has been picked up and dropped away from its home screen, then the scene and x y have to be remembered. Code to do this is in test.
Design for Music and SFX:
It's currently my plan to use the SoundPool facility. This allows you to store a number of sound files with the application and also allows several channels to play at once. In this case, I would use one channel for the theme music or soundscape (e.g. birdsong, waves, wind etc.) of each scene, and another two for individual sound effects.
I think I can put this in a thread, which first loads the sounds, then is wakened up every 200 ms, say, which checks a variable in JadeView for each of the sound channels. Once it has started the channel, it sets the variable to "done". It can then see the next sound request when "done" is replaced. If the soundscape is unaltered, it just continues to play.
Tuesday, 10 July 2012
More on Cursors and Pick up & Drop





I implemented Pick up & Drop using (as recommended by Android Developers) Long Press, rather than Double Click, which I had planned. So far, the Long Press seems too short at 384ms. It will be tuned.
I went for the complicated option - a gettable sprite that is also animated and scaled. That bit works fine
Monday, 2 July 2012
Cursor Implemented
- Default - blank
- The four direction pointers
- The crosshairs
- The Hand - indicating something that can be operated or picked up.
- Picking up and dropping items
- Music and sounds. Probably using SoundPool.
- Putting a Beta version together








