[alienbloodbath commit] r65 - in trunk: content_package editor src/android/com/abb

1 view
Skip to first unread message

codesite...@google.com

unread,
Dec 28, 2008, 6:11:02 PM12/28/08
to alien-blood-b...@googlegroups.com
Author: matt.burkhart
Date: Sun Dec 28 13:52:58 2008
New Revision: 65

Added:
trunk/editor/trigger_editor.glade
Modified:
trunk/content_package/jump.humanoid.animation
trunk/content_package/run.humanoid.animation
trunk/content_package/stand.humanoid.animation
trunk/editor/editor.py
trunk/src/android/com/abb/ArticulatedEntity.java
trunk/src/android/com/abb/Content.java
trunk/src/android/com/abb/Enemy.java
trunk/src/android/com/abb/GameState.java
trunk/src/android/com/abb/Map.java

Log:
• Updated avatar run animation and added more animation format parser
checks.
• Added vibration on death.
• Added ability to create map triggers in the level editor by
right-clicking.
• Level editor now loads last opened tiles and level file automatically on
start-up.
• Started enemy file parsing code. This breaks enemy spawning for now.


Modified: trunk/content_package/jump.humanoid.animation
==============================================================================
--- trunk/content_package/jump.humanoid.animation (original)
+++ trunk/content_package/jump.humanoid.animation Sun Dec 28 13:52:58 2008
@@ -1,4 +1,4 @@
-offsey_x -50
+offset_x -50
offset_y -20

root 0.0 0

Modified: trunk/content_package/run.humanoid.animation
==============================================================================
--- trunk/content_package/run.humanoid.animation (original)
+++ trunk/content_package/run.humanoid.animation Sun Dec 28 13:52:58 2008
@@ -1,4 +1,4 @@
-offsey_x 0
+offset_x 0
offset_y 0

root 0.0 0
@@ -31,17 +31,17 @@
shoulder_l 1.0 200
shoulder_l 2.0 190

-arm_r 0.0 -120
-arm_r 1.0 -100
-arm_r 2.0 -120
-
-arm_l 0.0 150
-arm_l 1.0 130
-arm_l 2.0 150
+arm_r 0.0 -100
+arm_r 1.0 -120
+arm_r 2.0 -100
+
+arm_l 0.0 130
+arm_l 1.0 150
+arm_l 2.0 130

farm_r 0.0 -110
farm_l 0.0 -80

-head 0.0 0
-head 1.0 20
-head 2.0 0
+head 0.0 10
+head 1.0 25
+head 2.0 10

Modified: trunk/content_package/stand.humanoid.animation
==============================================================================
--- trunk/content_package/stand.humanoid.animation (original)
+++ trunk/content_package/stand.humanoid.animation Sun Dec 28 13:52:58 2008
@@ -1,4 +1,4 @@
-offsey_x 0
+offset_x 0
offset_y 0

root 0.0 0

Modified: trunk/editor/editor.py
==============================================================================
--- trunk/editor/editor.py (original)
+++ trunk/editor/editor.py Sun Dec 28 13:52:58 2008
@@ -1,56 +1,112 @@
#!/usr/bin/python

-import os, sys, gtk, gtk.glade, pygtk, gobject, thread, gtk.gdk, cairo
+import cairo, gobject, gtk, gtk.gdk, gtk.glade, os, pygtk, re, sys, thread


+BRUSHES_ZOOM = 0.5
+DOWN_KEY = 65364
+INITIAL_ZOOM = 0.5
+LEFT_KEY = 65361
LEVEL_WIDTH = 100
LEVEL_HEIGHT = 100
-BRUSHES_ZOOM = 0.5
-TILE_SIZE = 64
-SCROLL_STEP = TILE_SIZE
-ZOOM_STEP = 0.25
-MIN_ZOOM = 0.25
MAX_ZOOM = 4
-LEFT_KEY = 65361
-UP_KEY = 65362
+MIN_ZOOM = 0.25
RIGHT_KEY = 65363
-DOWN_KEY = 65364
+SCROLL_STEP = 64
+SETTINGS_DIR = os.getenv("HOME") + '/.abb_editor'
+LAST_BRUSH_PATH = SETTINGS_DIR + '/last_brush.txt'
+LAST_LEVEL_PATH = SETTINGS_DIR + '/last_level.txt'
+TILE_SIZE = 64
+UP_KEY = 65362
+ZOOM_STEP = 0.25
+
+
+class TriggerEditorWindow:
+ def __init__(self, parent_window, triggers_array, trigger_index):
+ self._parent_window = parent_window
+ self._triggers_array = triggers_array
+ self._trigger_index = trigger_index
+ self._gladefile = (
+ os.path.join(os.path.dirname(__file__), 'trigger_editor.glade'))
+ self._tree = gtk.glade.XML(self._gladefile)
+
+ # Set up the initial trigger text.
+ self._entry = self._tree.get_widget('entry')
+ trigger_text = self._triggers_array[self._trigger_index]
+ if trigger_text:
+ self._entry.set_text(trigger_text)
+
+ # Connect window signals.
+ self._window = self._tree.get_widget('window')
+ signals = { 'on_entry_changed' : self.EntryChangedEvent,
+ 'on_entry_focus_out_event' : self.LoseFocusEvent,
+ 'on_window_key_press_event' : self.KeyPressEvent }
+ self._tree.signal_autoconnect(signals)
+
+ def DestroyWindow(self):
+ self._window.destroy()
+ self._parent_window.queue_draw()
+
+ def EntryChangedEvent(self, widget):
+ trigger_text = widget.get_text()
+ if trigger_text == '':
+ trigger_text = None
+ self._triggers_array[self._trigger_index] = trigger_text
+
+ def LoseFocusEvent(self, widget, event):
+ self.DestroyWindow()
+
+ def KeyPressEvent(self, widget, event):
+ if event.keyval == 65293 or event.keyval == 65307: # Escape or enter
key.
+ self.DestroyWindow()


-class GTKWindow:
+class EditorWindow:
def __init__(self):
- # Set the Glade file.
self.gladefile =
os.path.join(os.path.dirname(__file__), 'editor.glade')
- self.wTree = gtk.glade.XML(self.gladefile)
+ self.tree = gtk.glade.XML(self.gladefile)

# Connect window signals.
- self.window = self.wTree.get_widget('window')
+ self.window = self.tree.get_widget('window')
if (self.window):
self.window.connect("destroy", gtk.main_quit)
- self.brushes_widget = self.wTree.get_widget('brushes')
- self.tiles_widget = self.wTree.get_widget('tiles')
+ self.brushes_widget = self.tree.get_widget('brushes')
+ self.tiles_widget = self.tree.get_widget('tiles')

signals = { 'on_brushes_expose_event' : self.BrushesExposeEvent,
'on_tiles_expose_event' : self.TilesExposeEvent,
'on_quit_menuitem_activate' : gtk.main_quit,
- 'on_menuitem_loadlevel_activate' : self.LoadLevel,
- 'on_menuitem_loadbrushes_activate' : self.LoadBrushes,
- 'on_menuitem_savelevel_activate' : self.SaveLevel,
+ 'on_menuitem_loadlevel_activate' : self.LoadLevelMenu,
+ 'on_menuitem_loadbrushes_activate' : self.LoadBrushesMenu,
+ 'on_menuitem_savelevel_activate' : self.SaveLevelMenu,
'on_brushes_button_press_event' : self.BrushesClickEvent,
'on_tiles_button_press_event' : self.TilesClickEvent,
'on_tiles_scroll_event' : self.TilesScrollEvent,
'on_window_key_press_event' : self.TilesKeyEvent }
- self.wTree.signal_autoconnect(signals)
+ self.tree.signal_autoconnect(signals)

# Misc editor state initialization.
self._tiles = []
for n in xrange(0, LEVEL_WIDTH * LEVEL_HEIGHT):
self._tiles.append(0)
+ self._triggers = []
+ for n in xrange(0, LEVEL_WIDTH * LEVEL_HEIGHT):
+ self._triggers.append(None)
self._brushes_surface = None
self._selected_brush = 0
self._view_x = 0
self._view_y = 0
- self._view_zoom = 1.0
+ self._view_zoom = INITIAL_ZOOM
+
+ # Load last opened files
+ if os.path.exists(LAST_BRUSH_PATH):
+ file_path = open(LAST_BRUSH_PATH).readlines()[0].strip()
+ if os.path.exists(file_path):
+ self.LoadBrushesFromFile(file_path)
+ if os.path.exists(LAST_LEVEL_PATH):
+ file_path = open(LAST_LEVEL_PATH).readlines()[0].strip()
+ if os.path.exists(file_path):
+ self.LoadLevelFromFile(file_path)

def WorldToWindow(self, world_x, world_y):
window_x = world_x * self._view_zoom - self._view_x
@@ -68,25 +124,59 @@
return -1
return LEVEL_HEIGHT * int(world_x / TILE_SIZE) + int(world_y /
TILE_SIZE)

- def LoadLevel(self, widget):
+ def LoadLevelFromFile(self, file_path):
+ assert 0 == os.system('mkdir -p %s' % SETTINGS_DIR)
+ open(LAST_LEVEL_PATH, 'w').write(file_path)
+
+ level_lines = open(file_path).readlines()
+ raw_tiles = level_lines[0].strip()
+ for tile in xrange(LEVEL_WIDTH * LEVEL_HEIGHT):
+ self._tiles[tile] = ord(raw_tiles[tile]) - ord('a')
+ trigger_re = re.compile('(\\d+),(\\d+),"([^"]+)"')
+ for raw_trigger in level_lines[1:]:
+ match = trigger_re.match(raw_trigger.strip())
+ assert match
+ x = int(match.group(1))
+ y = int(match.group(2))
+ trigger = match.group(3)
+ trigger_index = LEVEL_HEIGHT * x + y
+ self._triggers[trigger_index] = trigger
+
+ self.window.queue_draw()
+
+ def LoadLevelMenu(self, widget):
file_path = self.ChooseOpenFile()
if file_path:
- raw_tiles = open(file_path).read()
- for tile in xrange(LEVEL_WIDTH * LEVEL_HEIGHT):
- self._tiles[tile] = ord(raw_tiles[tile]) - ord('a')
- self.window.queue_draw()
+ self.LoadLevelFromFile(file_path)
+
+ def LoadBrushesFromFile(self, file_path):
+ assert 0 == os.system('mkdir -p %s' % SETTINGS_DIR)
+ open(LAST_BRUSH_PATH, 'w').write(file_path)
+
+ self._brushes_surface = cairo.ImageSurface.create_from_png(file_path)
+ self.window.queue_draw()

- def LoadBrushes(self, widget):
+ def LoadBrushesMenu(self, widget):
file_path = self.ChooseOpenFile()
if file_path:
- self._brushes_surface = cairo.ImageSurface.create_from_png(file_path)
- self.window.queue_draw()
+ self.LoadBrusheFromFile(file_path)

- def SaveLevel(self, widget):
+ def SaveLevelMenu(self, widget):
file_path = self.ChooseSaveFile()
+
+ assert 0 == os.system('mkdir -p %s' % SETTINGS_DIR)
+ open(LAST_LEVEL_PATH, 'w').write(file_path)
+
if file_path:
level_string = map(lambda tile : '%c' % (tile + ord('a')),
self._tiles)
- open(file_path, "w").write(''.join(level_string))
+ level_file = open(file_path, 'w')
+ level_file.write(''.join(level_string))
+ for x in xrange(0, LEVEL_WIDTH):
+ for y in xrange(0, LEVEL_HEIGHT):
+ index = LEVEL_HEIGHT * x + y
+ trigger_string = self._triggers[index];
+ if trigger_string:
+ level_file.write('\n%d,%d,"%s"' % (x, y, trigger_string))

def BrushesClickEvent(self, widget, event):
self._selected_brush = int(event.y / BRUSHES_ZOOM / TILE_SIZE)
@@ -95,7 +185,7 @@
def BrushesExposeEvent(self, widget, event):
# Documentation for drawing using Cairo was found on:
#
http://www.pygtk.org/articles/cairo-pygtk-widgets/cairo-pygtk-widgets.htm
- # Cairo within Python documenation was found on:
+ # Cairo within Python documentation was found on:
# http://www.cairographics.org/pycairo
if self._brushes_surface:
cairo_context = widget.window.cairo_create()
@@ -114,12 +204,21 @@
return False

def TilesClickEvent(self, widget, event):
+ if not self._brushes_surface:
+ return
+
world_x, world_y = self.WindowToWorld(event.x, event.y)
tile_index = self.WorldToTileIndex(world_x, world_y)
if tile_index == -1:
return # Map tile out of bounds.
- self._tiles[tile_index] = self._selected_brush
- self.window.queue_draw()
+ if event.button == 1: # Left click.
+ self._tiles[tile_index] = self._selected_brush
+ self._triggers[tile_index] = None
+ self.window.queue_draw()
+ elif event.button == 3: # Right click.
+ trigger_editor_window = (
+ TriggerEditorWindow(self.window, self._triggers, tile_index))
+ self.window.queue_draw()

def TilesKeyEvent(self, widget, event):
if event.keyval == LEFT_KEY:
@@ -168,22 +267,39 @@
window_x, window_y = self.WorldToWindow(tile_x, tile_y)
cairo_context.identity_matrix()
cairo_context.reset_clip()
- cairo_context.rectangle(window_x, window_y, zoomed_tile_size,
zoomed_tile_size)
+ cairo_context.rectangle(
+ window_x, window_y, zoomed_tile_size, zoomed_tile_size)
cairo_context.set_source_rgba(0, 0, 0, 1)
cairo_context.fill()

tile_id = self._tiles[tile_index]
- if tile_id == 0:
- y += zoomed_tile_size
- continue # Map tile not visible.
+ trigger = self._triggers[tile_index]
+
+ if tile_id != 0:
+ cairo_context.save()
+ cairo_context.rectangle(
+ window_x, window_y, zoomed_tile_size, zoomed_tile_size)
+ cairo_context.clip()
+ cairo_context.translate(window_x, window_y);
+ cairo_context.scale(self._view_zoom, self._view_zoom)
+ cairo_context.translate(0, -TILE_SIZE * tile_id)
+ cairo_context.set_source(brushes_pattern)
+ cairo_context.paint()
+ cairo_context.restore()
+
+ if trigger != None:
+ half_tile_size = TILE_SIZE / 2
+ cairo_context.save()
+ cairo_context.translate(window_x, window_y)
+ cairo_context.scale(self._view_zoom, self._view_zoom)
+ cairo_context.translate(half_tile_size, half_tile_size)
+ cairo_context.arc(
+ 0.0, 0.0, half_tile_size - 10, 0.0, 2.0 * 3.1415926)
+ cairo_context.set_source_rgba(1, 1, 0.5, 0.7)
+ cairo_context.set_line_width(3)
+ cairo_context.stroke()
+ cairo_context.restore()

- cairo_context.rectangle(window_x, window_y, zoomed_tile_size,
zoomed_tile_size)
- cairo_context.clip()
- cairo_context.scale(self._view_zoom, self._view_zoom)
- cairo_context.translate(
- window_x / self._view_zoom, window_y / self._view_zoom -
TILE_SIZE * tile_id)
- cairo_context.set_source(brushes_pattern)
- cairo_context.paint()
y += zoomed_tile_size
x += zoomed_tile_size
y = 0
@@ -192,13 +308,14 @@
cairo_context.select_font_face("Sans")
cairo_context.set_font_size(18)
cairo_context.move_to(event.area.width / 2, event.area.height / 2)
- cairo_context.show_text("No Tile Set Loaded")
+ cairo_context.show_text("No tile set loaded.")
return False

def ChooseOpenFile(self):
chooser = gtk.FileChooserDialog(
- title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN,
- buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
gtk.RESPONSE_OK))
+ title = None,action=gtk.FILE_CHOOSER_ACTION_OPEN,
+ buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
+ gtk.RESPONSE_OK))
response = chooser.run()
result = None
if response == gtk.RESPONSE_OK:
@@ -208,8 +325,9 @@

def ChooseSaveFile(self):
chooser = gtk.FileChooserDialog(
- title=None,action=gtk.FILE_CHOOSER_ACTION_SAVE,
- buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE,
gtk.RESPONSE_OK))
+ title = None,action=gtk.FILE_CHOOSER_ACTION_SAVE,
+ buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE,
+ gtk.RESPONSE_OK))
response = chooser.run()
result = None
if response == gtk.RESPONSE_OK:
@@ -220,5 +338,5 @@

if __name__ == "__main__":
gobject.threads_init()
- gtk_window = GTKWindow()
+ editor_window = EditorWindow()
gtk.main()

Added: trunk/editor/trigger_editor.glade
==============================================================================
--- (empty file)
+++ trunk/editor/trigger_editor.glade Sun Dec 28 13:52:58 2008
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.5 on Sun Dec 28 00:20:56 2008 -->
+<glade-interface>
+ <widget class="GtkWindow" id="window">
+ <property name="width_request">512</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Trigger Editor</property>
+ <property name="resizable">False</property>
+ <property name="window_position">GTK_WIN_POS_MOUSE</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_POPUP_MENU</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="urgency_hint">True</property>
+ <property name="decorated">False</property>
+ <property name="deletable">False</property>
+ <signal name="key_press_event" handler="on_window_key_press_event"/>
+ <child>
+ <widget class="GtkVBox" id="vbox">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Tile trigger
(&lt;b&gt;Enter text and press Return&lt;/b&gt;)</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry">
+ <property name="height_request">0</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_length">2048</property>
+ <property name="truncate_multiline">True</property>
+ <signal name="changed" handler="on_entry_changed"/>
+ <signal name="focus_out_event"
handler="on_entry_focus_out_event"/>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</glade-interface>

Modified: trunk/src/android/com/abb/ArticulatedEntity.java
==============================================================================
--- trunk/src/android/com/abb/ArticulatedEntity.java (original)
+++ trunk/src/android/com/abb/ArticulatedEntity.java Sun Dec 28 13:52:58
2008
@@ -55,9 +55,9 @@
String[] tokens = Content.readFileTokens(file_path);

final int kLineTokenCount = 6;
- Assert.assertTrue("Articulated entity file empty.", tokens.length > 0);
+ Assert.assertTrue("Articulated entity file empty.", tokens.length > 1);
Assert.assertEquals("Articulated entity file improperly formatted.",
- tokens.length % kLineTokenCount, 1);
+ (tokens.length - 1) % kLineTokenCount, 0);

mImageUri = Uri.parse(tokens[0]);

@@ -229,9 +229,13 @@
String[] tokens = Content.readFileTokens(file_path);

final int kLineTokenCount = 3;
- Assert.assertTrue("Animation file empty.", tokens.length > 0);
+ Assert.assertTrue("Animation file empty.", tokens.length > 4);
Assert.assertEquals("Animation improperly formatted: " +
uri.toString(),
(tokens.length - 4) % kLineTokenCount, 0);
+ Assert.assertEquals("Expected offset_x specification in animation
file.",
+ tokens[0], "offset_x");
+ Assert.assertEquals("Expected offset_y specification in animation
file.",
+ tokens[2], "offset_y");

mOffsetX = Float.parseFloat(tokens[1]);
mOffsetY = Float.parseFloat(tokens[3]);

Modified: trunk/src/android/com/abb/Content.java
==============================================================================
--- trunk/src/android/com/abb/Content.java (original)
+++ trunk/src/android/com/abb/Content.java Sun Dec 28 13:52:58 2008
@@ -23,6 +23,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
+import java.util.TreeMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import junit.framework.Assert;
@@ -174,6 +175,45 @@
Assert.fail("Could not read file: " + file_path + ": " +
ex.toString());
}
return new String[0];
+ }
+
+ /** Utility method to parse a set of key value tokens (as generated by
+ * readFileTokens(...) for example) and to insert the key value pairs
into a
+ * map. Only values with keys already present in the map are accepted and
+ * types are checked. The map may not be changed if no key / value pairs
are
+ * present to it is expected to contain value defaults. */
+ static public TreeMap<String, Object> mergeKeyValueTokensWithMap(
+ String[] tokens, TreeMap<String, Object> map) {
+ Assert.assertEquals("Expected an even number of key-values in tokens.",
+ tokens.length % 2, 0);
+
+ for (int key = 0; key < tokens.length; key += 2) {
+ String key_string = tokens[key];
+ String value_string = tokens[key + 1];
+ Assert.assertTrue("Unknown key name: " + key_string,
+ map.containsKey(key_string));
+
+ Object default_value = map.get(key_string);
+ if (default_value instanceof String) {
+ map.put(key_string, value_string);
+ } else if (default_value instanceof Integer) {
+ try {
+ map.put(key_string, new Integer(value_string));
+ } catch (NumberFormatException ex) {
+ Assert.fail("Error, expected Integer: " + ex.toString());
+ }
+ } else if (default_value instanceof Float) {
+ try {
+ map.put(key_string, new Float(value_string));
+ } catch (NumberFormatException ex) {
+ Assert.fail("Error, expected Float: " + ex.toString());
+ }
+ } else {
+ Assert.fail("Unsupported value type: " +
+ default_value.getClass().getName());
+ }
+ }
+ return map;
}

static private char[] toPrimative(ArrayList<Character> array_list) {

Modified: trunk/src/android/com/abb/Enemy.java
==============================================================================
--- trunk/src/android/com/abb/Enemy.java (original)
+++ trunk/src/android/com/abb/Enemy.java Sun Dec 28 13:52:58 2008
@@ -12,26 +12,31 @@
package android.com.abb;

import android.graphics.Rect;
+import android.net.Uri;
+import android.util.Log;
import android.view.KeyEvent;
import java.lang.Math;
+import java.util.TreeMap;
+import junit.framework.Assert;


-public class Enemy extends Entity {
+public class Enemy extends ArticulatedEntity {
public Enemy(Entity target) {
super();
mTarget = target;
- radius = kRadius;
+ radius = kDefaultRadius;
sprite_rect =
new Rect(0, kSpriteBase, kSpriteWidth, kSpriteBase +
kSpriteHeight);
}

public void step(float time_step) {
super.step(time_step);
- ddy = kGravity;
+
+ ddy = mGravity;

// If we have moved close enough to our target, mark it dead.
- if (Math.abs(mTarget.x - x) < kRadius &&
- Math.abs(mTarget.y - y) < kRadius) {
+ if (Math.abs(mTarget.x - x) < radius &&
+ Math.abs(mTarget.y - y) < radius) {
mTarget.alive = false;
}

@@ -54,12 +59,38 @@
sprite_rect.bottom = kSpriteBase + kSpriteHeight * (sprite_offset + 1);
}

+ public void loadFromUri(Uri uri) {
+ TreeMap<String, Object> enemy_parameters = new TreeMap<String,
Object>();
+ enemy_parameters.put(kParameterEntity, "none");
+ enemy_parameters.put(kParameterGravity, new Float(kDefaultGravity));
+ enemy_parameters.put(kParameterLife, new Float(kDefaultLife));
+ enemy_parameters.put(kParameterRadius, new Float(kDefaultRadius));
+
+ String file_path = Content.getTemporaryFilePath(uri);
+ String[] tokens = Content.readFileTokens(file_path);
+ Content.mergeKeyValueTokensWithMap(tokens, enemy_parameters);
+
+ mGravity =
((Float)enemy_parameters.get(kParameterGravity)).floatValue();
+ mLife = ((Float)enemy_parameters.get(kParameterLife)).floatValue();
+ radius = ((Float)enemy_parameters.get(kParameterRadius)).floatValue();
+
+ String entity = (String)enemy_parameters.get(kParameterEntity);
+ loadFromUri(Uri.parse(entity));
+ }
+
+ private float mGravity;
+ private float mLife;
private Entity mTarget;

private static final float kAcceleration = 40.0f;
- private static final float kGravity = 100.0f;
+ private static final float kDefaultGravity = 100.0f;
+ private static final float kDefaultLife = 1.0f;
+ private static final float kDefaultRadius = 20.0f;
private static final float kJumpVelocity = 100.0f;
- private static final float kRadius = 20.0f;
+ private static final String kParameterEntity = "entity";
+ private static final String kParameterGravity = "gravity";
+ private static final String kParameterLife = "life";
+ private static final String kParameterRadius = "radius";
private static final int kSpriteBase = 0;
private static final int kSpriteWidth = 64;
private static final int kSpriteHeight = 64;

Modified: trunk/src/android/com/abb/GameState.java
==============================================================================
--- trunk/src/android/com/abb/GameState.java (original)
+++ trunk/src/android/com/abb/GameState.java Sun Dec 28 13:52:58 2008
@@ -112,6 +112,7 @@
}
} else {
if (mDeathTimer == kDeathTimer) {
+ mVibrator.vibrate(400); // Milliseconds.
for (int n = 0; n < 2 * kBloodBathSize; n++) {
createBloodParticle(
avatar.x, avatar.y,

Modified: trunk/src/android/com/abb/Map.java
==============================================================================
--- trunk/src/android/com/abb/Map.java (original)
+++ trunk/src/android/com/abb/Map.java Sun Dec 28 13:52:58 2008
@@ -100,15 +100,17 @@
}

public void loadLevelFromFile(String file_path) {
- if (file_path == null)
- Log.e("Map::loadLevelFromFile", "Invalid null argument.");
- try {
- FileReader level_reader = new FileReader(new File(file_path));
- mTiles = new char[kMapWidth * kMapHeight];
- level_reader.read(mTiles, 0, kMapWidth * kMapHeight);
- loadLevelFromArray(decodeArray(mTiles));
- } catch (IOException ex) {
- Log.e("Map::loadLevelFromFile", "Cannot find: " + file_path, ex);
+ Assert.assertNotNull(
+ "Map::loadLevelFromFile: Invalid null argument.", file_path);
+
+ String[] level_tokens = Content.readFileTokens(file_path);
+ Assert.assertTrue("Level file empty.", level_tokens.length > 0);
+ char[] raw_tiles = level_tokens[0].toCharArray();
+ Assert.assertEquals("Invalid level tile count.",
+ raw_tiles.length, kMapHeight * kMapWidth);
+ loadLevelFromArray(decodeArray(raw_tiles));
+ for (int trigger = 1; trigger < level_tokens.length; ++trigger) {
+ // TODO(burkhart): Parse level triggers.
}
}

Reply all
Reply to author
Forward
0 new messages