Week 3 Wrap-Up

(The capture format was set to FLV in XSplit (instead of MP4) with the highest recording quality (20), but there is still some initial distortion in the video after it was loaded to YouTube)

Touch Up Work in Audacity

Touched up the sound effects in Audacity, to give them the appropriate lengths to be used in the game.  For the buzzer, I trimmed down the hair clipper sound effect to 0.25 seconds.  Not sure why, but I wasn’t able to find a crop function in Audacity.  Therefore, I just had to select the portion of the clip I want to use, copy, then paste it in a new Audacity window.  Next I started looking for a sound to use for the main menu.  The buzzers and rings were too harsh of a sound, so I loaded up my shaken Pepto Bismol sound effect.  After cropping out everything except for one shake of the bottle, I realized that this makes a great menu selection sound.  It actually sounds like muddy boots on a wooden walkway.  For the wire filling sound, I slimmed down the running water clip.  The original sound is a little harsh, so I raised the pitch by 265.  The ice sounds were a little flat, so I increased the speed by 200.  It now sounded like an old fashioned money changer.  With this new sound, I added 2 seconds of silence at the end, and then applied the echo effect (delay 0.5 seconds, decay 0.5).  The spoons sounded good without any modification except for cropping out the rest of the noise.  I’ll use this as either a menu sound or a rank display sound.  The spoon hitting the glass made a good sound, but there was a lot of background static noise in the sound capture.  I used Audacity’s noise removal tool to fix it, but it seems to have raised the pitch of the sound as well.  It still sounded okay, so I’ll probably use that as the sound when an LED is lit.  The CO meter made a nice beeping sound, but it was really loud so I used the normalize effect.  I’m not sure where I will use this sound, but I’ll go ahead and import it into the project for now.  This gives me a total of eight sound effects, which should be enough to get me started.

  

Apparently, the volume of the MediaPlayer object uses a value between 0 and 1, and I incorrectly assumed that it was 0 to 100.  For some reason, the sound when it is played on the PC is much louder than it is on the XBox.  Maybe the XBox (or my television) has sound normalization so it isn’t loud like on the PC.  Setting the MediaPlayer volume to 0.1 makes it sound about right on the PC, which I believe is one tenth of the volume.  I will have to test it on the XBox later to see if that makes it too low to hear on the console.  If it does, then I may have to write some platform specific code to handle the differences between the PC and console.

Ran into a bit of an issue with playing sound effects.  In order to play a sound effect, the current screen must have a handle to the MediaPlayer object, which is only available in the main ResistorGame class.  I don’t want to have to pass a MediaPlayer object to each function on each screen that may want to play a sound effect.  I think I’ll make the sound effects like the screen transition, where the screen will implement a public method which will report whether or not the screen needs a sound effect played.  Then the Resistor game class will query that method on each update, and then play any sound effect that is requested to be played.  I usually don’t write code this way, but I think it may make things cleaner in the end, especially if I decide to write a media handler class.  I created a method called getRequestedSoundEffect in the Screen class and added a protected instance variable called iSoundEffect.  If the ResistorGame calls that method and it returns a value greater than -1, then it will play the sound effect at that index in the sound effect array.  Thefore, any of the subclassed Screen just have to set the iSoundEffect variable to any of the sound effect constants defined in the ResistorGame class.  Amazingly, this worked perfectly the first time that I tested it.  I also discovered that MediaPlayer is not required for playing SoundEffect objects (Songs objects only), but it was good that I implemented it this way, otherwise I would have the same problem with passing the sound effect array around to all of the screens.  Just calling the Play method on the SoundEffect object itself will play the sound.  One drawback is that only one sound effect can be played for each update call, otherwise the previous sound effect(s) ID assigned to the iSoundEffect variable will be lost.  This may be a good thing, because there shouldn’t be too many sounds playing at the same time.  Once scenario that I can imagine is if two LEDs are lit at exactly the same time.  Just playing the sound effect once should be sufficient.

Using Audacity and a short tutorial from eHow, I was able to record my voice for the title screen which I gave a repeating robotic sound.  First, I used the Repeat Effect on the start of the audio clip.  Then I used the Delay Effect with Decay=10, Delay=0.01, and Echos=20.  I repeated that effect about 6 times.  I also made audio clips for “level complete”, “game over”, “S”, “A”, “B”, “C” and applied the same effects.

  

Level Selection Modification

I may have messed up by making the LevelDefinition instance a member of the GameLevel class instead of the ResistorGame class.  The ResistorGame class needs to pass the maximum number of levels to the LevelSelectScreen class.  The maximum number of levels is defined in the LevelDefinition object, so it has to get a reference of that object from GameLevelScreen which is a little messy.  I may have to rework this later.

Sound Effects Added to Game

After updating the game code, I now have sound effects for menu movement, menu selection, wire begins filling, light filled, and light busted.  I had to add an additional variable to keep track of light filled, since this property was never actually tracked.  I added that check to the game win check, since it was already looping through the lights on the board, so if the number of lit lights is greater than the number of lit lights on the previous check, then the lit sound effect is played.  I was happy with all the sound effects, except for the electricity one (originally water running from the faucet).  It still sounded to static-like, and it started to give me a headache after awhile.  Therefore, I replaced it with the phaser sound that I made (also from the water running) which has a much smoother sound.  I also had the Pepto Bismol sound (now named SE_PLOP in the constants) play on each menu movement and the spoon sound (SE_SPOON) played on the selection.  This didn’t sound right because the SE_PLOP was longer than SE_SPOON, so I just switched out the occurrences of those two sounds, which makes it sound much better.  The lit light and light busted sound effects sound great.  I may need some delay or an animation when a light is busted, because the light busted sound effect plays through the game over screen.

Special Cases

While playing the game, I noticed a special case that may need to be handled.  If a wire is placed next to two (or more) filled wires (or other pieces), I believe it just takes the Elex value of the first one in the if/elseif statement.  I should calculate the highest of all the neighbors, and assign the new wire the highest value of all the adjacent pieces.

Another thing that had been bothering me is that I thought that the time statistic was proportional to the pieces used statistic, which would make it somewhat redundant.  However, through testing I found that it is possible to get a S rank in time and a C rank in pieces by quickly spamming wire pieces.  This is a good thing, which prevents someone from getting the best possible grade by quickly spamming pieces.  The inverse is also true, where someone can get an S rank in pieces but a C rank in time.  Just take a long time laying down the pieces in the shortest path.

 

 

 

Weather Lab

Play online

Weather lab simulation with various devices showing the current status of the selected location.

  • Wind vane – shows the direction that the wind is blowing
  • Anomemeter – spinning cups show wind speed
  • Thermometers – circular and vertical with rising mercury
  • Sunrise and sunset detected for current location, with environmental lighting directed based on current sun position.
  • Rain and thunder sound effects
  • Clocks displaying current local time

Formerly Turn Back the Clocks

Turn Back the Clocks is a series of games that I have developed for the 0h (Zero Hour) game jam.  The objective of the game jam is to develop a game during the autumn time change, so development starts at 2am and ends at the same time, 2am.  For the last two games, I have improved upon the game after the competition is over.

Turn Back the Clocks

This was the original Turn Back the Clocks game for 0hgame jam 2013.  The was no real objective, but you could move around the hands of the clock with the arrow keys.

Turn Back the Clocks

 

Released

Weapons and Armor

Added new Weapon and Armor classes.  The Weapon class contains an attack value, recoil rate, shot distance, and a List of Sockets.  The Armor class contains a defense value and a List of Sockets.  I have subclassed Armor has for each body location, which are head, hands, body, and feet.  These subclasses currently don’t have any unique properties which may be bad coding style, but I think it is better than having a “type” value in the Armor class.  Plus, it opens the possibility for adding unique characteristics for each armor type.  I also made sure that the instance variables in the Armor class are set to protected so that those are accessible to the subclasses.  The EquippedSockets class has constants for the body parts, but I’m planning to remove the EquippedSockets class once the new Armor system is implemented.  Both the Weapon and Armor classes have an ID variable, which will make it easier for reading and writing save game files.  A cost variable is also included in both Weapon and Armor, which determines how much it costs to buy or sell the item.  The Player class now has a List of Weapons and a List of Armor that the player has acquired.

I also created an EquipmentCatalog class which contains instances of every Weapon and Armor in the game.  When a new weapon or armor is acquired, I’ll probably just clone one of the objects in the Catalog and assign it to the player.  I could have the player’s acquired Weapon and Armor Lists point to references in the Catalog, but that won’t allow the equipment to have unique properties like a Socket list.  I may also want to add a durability value that would be unique to an item instance, which decreases the cost value of the weapon.  Also included in the EquipmentCatalog class is a method to return random Weapons and Armor.  In the future, I’ll probably add parameters so that a random item can be generated within a specified level range for enemy drops.

Currently, I’m using the SI metric prefixes for the names of the weapons and armor.  I’m not that creative, and these names may actually teach the player something educational.  To keep things simple, I’m going to display item properties graphically as bars (or something similar) instead of raw integers.  Therefore, the first weapon will have one bar for attack, recoil rate, and distance.  The next weapon will have two bars for attack.  I may mix up some of the weapon statistics so that each excels in one of the three statistics.  There may also be a bonus for equipping all weapons and armor in the same level series.

While the weapon’s first name will determine the level and attack value, the weapon’s second name will describe the other attributes.  For instance, “Blaster” will be a balanced weapon, “Zapper” will have a higher recoil rate but lower distance, and “Ray” will have low recoil rate and high shot distance.

I also extracted out the socket information into its own class.  Previously, all of the socket information was contained in the EquippedSockets class, but that only allowed one socket to be equipped to each body part.  For the Weapon and Armor classes, I added a variable that tracks the maximum number of sockets that can be equipped on that equipment, and the actual Socket instances are kept in a List for each piece of equipment.  The new Socket class only contains the socket ID, name, and type (body location).

The Collectible class has also be subclassed with CollectibleWeapon and CollectibleArmor classes.  These classes serve the same purpose as Collectible, which is a collectible item on the game screen.  However, the subclass contains one additional instance variable which is a Weapon or Armor object.  When the player collides with the collectible, that item will be added to the player’s weapon or armor List.

Modified the enemy death code, so that a new Collectible is instantiated at the location of the enemy.  The enemy calls the dropItem method on the room object, which takes the drop location as parameters.  The dropItem method uses the random methods in the catalog to get a reference to a random item, which is assigned to the collectible.  Then it adds that collectible to the room’s collectible list.  In the future, I would like to have the defeated enemy determine which item is dropped.  One decision I had to make is the location of the EquipmentCatalog.  The room does not have any references to anything outside of itself, however it needs a reference to the EquipmentCatalog to assign to the Collectible that the enemy drops.  I am now creating a new instance of EquipmentCatalog in the dropItem method, but that will very wasteful of memory since it will need to be cleaned up every time an item is dropped.  I will have to think about this some more.  The EquipmentCatalog may need to be a static class, but I currently have all of the Weapons and Armor defined in dynamic Lists in the Catalog constructor, which may not be allowed in a static class.  I haven’t created graphics for weapon and armor drops yet, so I’m using the standard money drop shaded green for weapons and blue for armor.  The name of the item appears above the collectible on the game screen.  On the equipment screen, the list of all acquired weapons and armor are displayed.  However, I have not implemented the ability to equip those items yet.

Aside from the equipment changes, I added a boolean in the room class that determines if the lights are on in the room.  Only rooms with this value are drawn dark with the radiant value.  There is a slight glitch here, because once the player crosses the screen boundary the whole screen turns dark (including the portion of the previous room that was lit).  I will need to resolve this later to give it a gradual transition from light to dark.