Minor reorg of unit crap.
authordsc <david.schoonover@gmail.com>
Mon, 6 Jun 2011 08:38:55 +0000 (01:38 -0700)
committerdsc <david.schoonover@gmail.com>
Mon, 6 Jun 2011 08:38:55 +0000 (01:38 -0700)
32 files changed:
src/Tanks.h
src/TanksMacros.h
src/game/QQGame.h
src/game/QQGame.mm
src/game/QQThing.h
src/game/ability/QQStats.h [moved from src/game/ability/QQStat.h with 100% similarity]
src/game/ability/QQStats.mm [moved from src/game/ability/QQStat.mm with 100% similarity]
src/game/actor/QQActors.h [deleted file]
src/game/actor/QQIUnit.h [deleted file]
src/game/unit/QQActor.h [moved from src/game/actor/QQActor.h with 93% similarity]
src/game/unit/QQActor.mm [moved from src/game/actor/QQActor.mm with 89% similarity]
src/game/unit/QQActorDelegate.h [moved from src/game/actor/QQActorDelegate.h with 100% similarity]
src/game/unit/QQActors.h [new file with mode: 0644]
src/game/unit/QQBullet.h [moved from src/game/actor/bullet/QQBullet.h with 85% similarity]
src/game/unit/QQBullet.mm [moved from src/game/actor/bullet/QQBullet.mm with 100% similarity]
src/game/unit/QQTank.h [moved from src/game/actor/unit/QQTank.h with 84% similarity]
src/game/unit/QQTank.mm [moved from src/game/actor/unit/QQTank.mm with 98% similarity]
src/game/unit/QQUnit.h [moved from src/game/actor/QQUnit.h with 89% similarity]
src/game/unit/QQUnit.mm [moved from src/game/actor/QQUnit.mm with 98% similarity]
src/physics/QQWorld.h
src/physics/event/QQContactNotification.h
src/physics/event/QQPhysicalEvents.mm
src/qq/event/QQNotification.h [moved from src/qq/QQNotification.h with 100% similarity]
src/qq/event/QQNotification.mm [moved from src/qq/QQNotification.mm with 98% similarity]
src/qq/event/QQNotificationCenter.h [moved from src/qq/QQNotificationCenter.h with 94% similarity]
src/qq/event/QQNotificationCenter.mm [moved from src/qq/QQNotificationCenter.mm with 98% similarity]
src/qq/event/QQNotificationProxy.h [moved from src/qq/QQNotificationProxy.h with 92% similarity]
src/qq/event/QQNotificationProxy.mm [moved from src/qq/QQNotificationProxy.mm with 98% similarity]
src/qq/event/QQNotifier.h [moved from src/qq/QQNotifier.h with 95% similarity]
src/qq/event/QQNotifiers.h [moved from src/qq/QQNotifiers.h with 94% similarity]
src/qq/event/QQObservable.h [moved from src/qq/QQObservable.h with 100% similarity]
tanks.xcodeproj/project.pbxproj

index 6a4d3c0..a2a448b 100644 (file)
@@ -1,9 +1,14 @@
 #ifndef TANKS_H
 #define TANKS_H
 
+#ifdef DEBUG
+#define TANKS_DEBUG_LOG 1
+#else
 #define TANKS_DEBUG_LOG 0
+#endif // DEBUG
 
-#endif
+#endif // TANKS_H
 
 #import "TanksMacros.h"
+#import "qq/NSSet+QQExtensions.h"
 #import "render/QQSparrowExtensions.h"
index e85b6b2..b36a57c 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef TANKS_MACROS_H
 #define TANKS_MACROS_H
 
-#define qqBoolToString(__val) ((__val)?("YES"):("NO"))
+#define b2s(__val) ((__val)?("YES"):("NO"))
 
 
 #endif
\ No newline at end of file
index 1c5e0a4..f69644d 100644 (file)
@@ -1,19 +1,21 @@
 #import "Sparrow.h"
 
-#import "qq/QQNotificationCenter.h"
+#import "qq/event/QQNotificationCenter.h"
+
 #import "physics/QQWorld.h"
 #import "physics/debug/QQPhysicsDebugView.h"
+
 #import "game/QQGameTime.h"
-#import "game/actor/QQActor.h"
+#import "game/unit/QQActor.h"
 #import "game/map/QQLevel.h"
 
 
+
 @interface QQGame : QQNotificationCenter <QQGameTime> {
 @private
     float _now;
     float _elapsed;
     long  _ticks;
-    long  _realtime;
     
     BOOL _running;
     BOOL _debugDrawingEnabled;
 @property (nonatomic, readonly, retain) NSSet* actors;
 
 
-- (void) tick;
+- (void) tick:(float)elapsed;
 
+/** Alerts the game to a new actor.  */
 - (QQGame*) addActor:(QQActor*)actor;
-// - (QQGame*) addActorAndShape:(QQActor*)actor;
 - (QQGame*) removeActor:(QQActor*)actor;
-- (QQGame*) destroyActor:(QQActor*)actor;
 
+/** Starts/unpauses the game. */
 - (void) start;
+
+/** Pauses the game. */
 - (void) stop;
 
 
index 1a06899..ad60683 100644 (file)
@@ -1,16 +1,11 @@
 #import <Box2D/Box2D.h>
 
 #import "Tanks.h"
-#import "qq/NSSet+QQExtensions.h"
 #import "game/QQGame.h"
-#import "game/actor/QQActors.h"
+#import "game/unit/QQActors.h"
 #import "physics/event/QQContactNotification.h"
 
 
-static QQGame* _CurrentGame = NULL;
-
-
-
 @interface QQGame ()
 @property (nonatomic, readwrite, retain) NSSet* actors;
 
@@ -19,8 +14,17 @@ static QQGame* _CurrentGame = NULL;
 @end
 
 
+static QQGame* _CurrentGame = NULL;
+
 @implementation QQGame
 
++ (QQGame*) current {
+    if (!_CurrentGame)
+        [[[QQGame alloc] init]  // init assigns to singleton, but singleton is a weakref,
+         autorelease];       // XXX: so game will still be released if not retained
+    return _CurrentGame;
+}
+
 - (id) init {
     if (_CurrentGame) {
         [self release];
@@ -32,6 +36,8 @@ static QQGame* _CurrentGame = NULL;
     }
     
     if ( (self = [super init]) ){
+        // We set the singleton here, in init, in case someone referenced during initialization
+        // asks for the current game (causing a loop).
         _CurrentGame = self;
         _now = 0;
         _ticks = 0;
@@ -64,7 +70,9 @@ static QQGame* _CurrentGame = NULL;
         [[[QQTank alloc] initAtX:wMax/6 y:hMax/6 width:50 height:50 color:0xFF0071] autorelease];
         [[[QQUnit alloc] initAtX:wMax/3 y:hMax/2 width:50 height:50 color:0x4596FF] autorelease];
         
+#if TANKS_DEBUG_LOG
         [_stage addEventListener:@selector(logEvent:) atObject:self forType:SP_EVENT_TYPE_ANY];
+#endif
     }
     return self;
 }
@@ -117,7 +125,22 @@ static QQGame* _CurrentGame = NULL;
 
 /// methods
 
+- (void) tick:(float)elapsed {
+    if (!self.isPaused) return;
+    _ticks++;
+    _elapsed  = elapsed;
+    _now     += elapsed;
+    
+    for (QQActor* actor in self.actors)
+        [actor tick];
+    [self.world step];
+    for (QQActor* actor in self.actors)
+        [actor draw];
+}
+
 - (QQGame*) addActor:(QQActor*)actor {
+    // Create a new copy of the mutated set on change to avoid the need to copy
+    // on every iteration, which happens WAAAY more often
     self.actors = [self.actors setByAddingObject:actor];
 //    if (actor.isActive)
 //        _awake = [_awake setByAddingObject:actor];
@@ -129,6 +152,8 @@ static QQGame* _CurrentGame = NULL;
 }
 
 - (QQGame*) removeActor:(QQActor*)actor {
+    // Create a new copy of the mutated set on change to avoid the need to copy
+    // on every iteration, which happens WAAAY more often
     self.actors = [self.actors setByRemovingObject:actor];
 //    if (actor.isActive)
 //        _awake = [_awake setByRemovingObject:actor];
@@ -136,58 +161,27 @@ static QQGame* _CurrentGame = NULL;
 //        _units = [_units   setByRemovingObject:actor];
 //    if ([actor isKindOfClass:[QQBullet class]])
 //        _bullets = [_bullets setByRemovingObject:actor];
-    return self;
-}
-
-- (QQGame*) destroyActor:(QQActor*)actor {
     [_world destroy:actor];
-    return [self removeActor:actor];
-}
-
-
-- (void) tick {
-#if TANKS_DEBUG_LOG
-    if ((_ticks % 100) == 0) {
-        NSLog(@"[%ld] Time passed since last 100 frames: %f", _ticks, _elapsed);
-        for (QQActor* actor in self.actors) {
-            b2Vec2 v = actor.body->GetLinearVelocity();
-            NSLog(@"[%@ impulse:(%f,%f)]", actor, v.x,v.y);
-        }
-    }
-#endif
-    
-    for (QQActor* actor in self.actors)
-        [actor tick];
-    [self.world step];
-    for (QQActor* actor in self.actors)
-        if (!actor.dead) [actor draw];
+    return self;
 }
 
-
 - (void) start {
-    if (!_running) {
-        _running = YES;
-        [_stage addEventListener:@selector(onEnterFrame:) atObject:self forType:SP_EVENT_TYPE_ENTER_FRAME];
-    }
+    if (_running) return;
+    _running = YES;
+    [_stage addEventListener:@selector(onEnterFrame:) atObject:self forType:SP_EVENT_TYPE_ENTER_FRAME];
 }
 
 - (void) stop {
-    if (_running) {
-        [_stage removeEventListener:@selector(onEnterFrame:) atObject:self forType:SP_EVENT_TYPE_ENTER_FRAME];
-        _running = NO;
-    }
+    if (!_running) return;
+    [_stage removeEventListener:@selector(onEnterFrame:) atObject:self forType:SP_EVENT_TYPE_ENTER_FRAME];
+    _running = NO;
 }
 
 
 /// event handlers
 
 - (void) onEnterFrame:(SPEnterFrameEvent*)event {
-    if (_running) {
-        _ticks++;
-        _elapsed = event.passedTime;
-        _now += _elapsed; 
-        [self tick];
-    }
+    [self tick:event.passedTime];
 }
 
 - (void) onCollide:(QQContactNotification*)msg {
@@ -195,23 +189,17 @@ static QQGame* _CurrentGame = NULL;
 }
 
 - (void) logEvent:(SPEvent*)evt {
+    // ignore enter-frame events, as they happen constantly
     if ([evt.type isEqualToString:SP_EVENT_TYPE_ENTER_FRAME]) return;
     NSLog(@"%@", evt);
 }
 
+
 - (NSString*) description {
-    return [NSString stringWithFormat:@"<%@: %x> {running=%s, #actors=%i, time={now=%f, elapsed=%f, ticks=%l}}",
-            [self class], (long)self, qqBoolToString(self.isPaused), [self.actors count],
+    return [NSString stringWithFormat:@"<%@: %p> {running=%s, #actors=%i, time={now=%f, elapsed=%f, ticks=%l}}",
+            [self class], (long)self, b2s(self.isPaused), [self.actors count],
             self.now, self.elapsed, self.ticks];
 }
 
 
-+ (QQGame*) current {
-    if (!_CurrentGame)
-        [[[QQGame alloc] init]  // init assigns to singleton, but singleton is a weakref,
-            autorelease];       // XXX: so game will still be released if not retained...
-    return _CurrentGame;
-}
-
-
 @end
\ No newline at end of file
index e10aa65..8ee089f 100644 (file)
@@ -1,4 +1,4 @@
-#import "qq/QQObservable.h"
+#import "qq/event/QQObservable.h"
 
 @class QQGame;
 @class QQWorld;
diff --git a/src/game/actor/QQActors.h b/src/game/actor/QQActors.h
deleted file mode 100644 (file)
index f7bad80..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#import "game/actor/QQActor.h"
-#import "game/actor/QQActorDelegate.h"
-#import "game/actor/QQUnit.h"
-#import "game/actor/bullet/QQBullet.h"
-#import "game/actor/unit/QQTank.h"
diff --git a/src/game/actor/QQIUnit.h b/src/game/actor/QQIUnit.h
deleted file mode 100644 (file)
index 15878ea..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#import "game/actor/QQActor.h"
-#import "game/QQThing.h"
-
-
-@protocol QQUnit <QQThing>
-
-@property (nonatomic, readonly) BOOL canAttack;
-
-- (void) attackTarget:(QQActor*)actor;
-- (void) attackToward:(CGPoint)point;
-- (void) attackTowardX:(float)x y:(float)y;
-
-
-@end
-
-//typedef id<QQUnit> QQUnit;
similarity index 93%
rename from src/game/actor/QQActor.h
rename to src/game/unit/QQActor.h
index 4eaaf09..b5dc695 100644 (file)
@@ -1,11 +1,11 @@
 #include <Box2D/Box2D.h>
 
-#import "qq/QQNotificationProxy.h"
+#import "qq/event/QQNotificationProxy.h"
 #import "game/QQThing.h"
 #import "game/QQActive.h"
 #import "game/QQPhysical.h"
 #import "game/QQDisplayable.h"
-#import "game/actor/QQActorDelegate.h"
+#import "game/unit/QQActorDelegate.h"
 #import "physics/QQWorld.h"
 
 @class QQGame;
similarity index 89%
rename from src/game/actor/QQActor.mm
rename to src/game/unit/QQActor.mm
index 241226b..8421992 100644 (file)
 /// methods
 
 - (void) destroy {
-    NSLog(@"retainCount=%i", [self retainCount]);
-    if (!self.dead) {
-        _dead = YES;
-        self.shape = nil;
-        [self.game destroyActor:self];
-        NSLog(@"%@ \v\tretainCount=%i \v\tgame=%@", self, [self retainCount], self.game);
-    }
+    if (self.dead) return;
+    
+    _dead = YES;
+    self.shape = nil;
+    [self.game removeActor:self];
 }
 
 - (void) tick {
-    if (!self.dead) {
-        [self.cooldowns makeObjectsPerformSelector:@selector(tick:)withObject:self.game.time];
-        if (self.isActive) [self act];
-    }
+    if (self.dead) return;
+    
+    [self.cooldowns makeObjectsPerformSelector:@selector(tick:) withObject:self.game.time];
+    if (self.isActive)
+        [self act];
 }
 
 - (void) act {}
 }
 
 - (void) draw {
+    if (self.dead) return;
+    
     [self updateShape];
 }
 
diff --git a/src/game/unit/QQActors.h b/src/game/unit/QQActors.h
new file mode 100644 (file)
index 0000000..1bb6ca8
--- /dev/null
@@ -0,0 +1,5 @@
+#import "game/unit/QQActor.h"
+#import "game/unit/QQActorDelegate.h"
+#import "game/unit/QQUnit.h"
+#import "game/unit/QQBullet.h"
+#import "game/unit/QQTank.h"
similarity index 85%
rename from src/game/actor/bullet/QQBullet.h
rename to src/game/unit/QQBullet.h
index 4a61675..b4a6241 100644 (file)
@@ -1,4 +1,4 @@
-#import "game/actor/QQUnit.h"
+#import "game/unit/QQUnit.h"
 
 
 @interface QQBullet : QQUnit {
similarity index 84%
rename from src/game/actor/unit/QQTank.h
rename to src/game/unit/QQTank.h
index ee8c4c1..c4c5971 100644 (file)
@@ -1,4 +1,4 @@
-#import "game/actor/QQUnit.h"
+#import "game/unit/QQUnit.h"
 #import "game/ability/QQCooldown.h"
 
 @interface QQTank : QQUnit {
similarity index 98%
rename from src/game/actor/unit/QQTank.mm
rename to src/game/unit/QQTank.mm
index 4b2622b..edd130a 100644 (file)
@@ -1,7 +1,7 @@
 #import "QQTank.h"
 #import "render/QQSparrowExtensions.h"
 #import "game/QQGame.h"
-#import "game/actor/bullet/QQBullet.h"
+#import "game/unit/QQBullet.h"
 
 
 // private interface
similarity index 89%
rename from src/game/actor/QQUnit.h
rename to src/game/unit/QQUnit.h
index e963b45..6fdee22 100644 (file)
@@ -2,8 +2,8 @@
 #import "Sparrow.h"
 
 #import "physics/QQWorld.h"
-#import "game/actor/QQActor.h"
-#import "game/actor/QQActorDelegate.h"
+#import "game/unit/QQActor.h"
+#import "game/unit/QQActorDelegate.h"
 #import "render/QQSparrowExtensions.h"
 
 
similarity index 98%
rename from src/game/actor/QQUnit.mm
rename to src/game/unit/QQUnit.mm
index f68c5fc..0959cfb 100644 (file)
@@ -1,7 +1,7 @@
 #include <Box2D/Box2D.h>
 #import "Sparrow.h"
 
-#import "game/actor/QQUnit.h"
+#import "game/unit/QQUnit.h"
 #import "game/QQGame.h"
 #import "render/QQSparrowExtensions.h"
 
index 3b47e73..54bf6c9 100644 (file)
@@ -1,6 +1,6 @@
 #include <Box2D/Box2D.h>
-#import "qq/QQNotifier.h"
-#import "qq/QQNotificationProxy.h"
+#import "qq/event/QQNotifier.h"
+#import "qq/event/QQNotificationProxy.h"
 #import "physics/event/QQPhysicalEvents.h"
 #import "physics/debug/QQGLESDebugDraw.h"
 #import "game/QQPhysical.h"
index 4c173f3..b7a815c 100644 (file)
@@ -1,6 +1,7 @@
-#include "qq/QQNotification.h"
 #include <Box2D/Box2D.h>
-#include "game/actor/QQActor.h"
+
+#import "qq/event/QQNotification.h"
+#import "game/unit/QQActor.h"
 
 
 @interface QQContactNotification : QQNotification {
@@ -8,10 +9,6 @@
     b2Contact* _contact;
 }
 
-- (id) initWithName:(NSString*)name contact:(b2Contact*)contact;
-- (id) initWithName:(NSString*)name object:(id)obj contact:(b2Contact*)contact;
-- (id) initWithName:(NSString*)name object:(id)obj userInfo:(NSDictionary*)info contact:(b2Contact*)contact;
-
 @property (nonatomic, readonly) b2Contact* contact;
 
 @property (nonatomic, readonly) QQActor* actorA;
 @property (nonatomic, readonly) b2Body* bodyB;
 
 
+- (id) initWithName:(NSString*)name contact:(b2Contact*)contact;
+- (id) initWithName:(NSString*)name object:(id)obj contact:(b2Contact*)contact;
+- (id) initWithName:(NSString*)name object:(id)obj userInfo:(NSDictionary*)info contact:(b2Contact*)contact;
+
+
 + (QQContactNotification*) notification:(NSString*)name contact:(b2Contact*)contact;
 + (QQContactNotification*) notification:(NSString*)name object:(id)obj contact:(b2Contact*)contact;
 + (QQContactNotification*) notification:(NSString*)name object:(id)obj userInfo:(NSDictionary*)info contact:(b2Contact*)contact;
index 6d722f0..bfba110 100644 (file)
@@ -1,4 +1,4 @@
-#include "QQPhysicalEvents.h"
+#import "QQPhysicalEvents.h"
 
 
 void QQContactListener::BeginContact(b2Contact* contact) {
similarity index 98%
rename from src/qq/QQNotification.mm
rename to src/qq/event/QQNotification.mm
index e4b2448..d72e3f4 100644 (file)
@@ -1,4 +1,4 @@
-#include "qq/QQNotification.h"
+#import "qq/event/QQNotification.h"
 
 
 @implementation QQNotification
similarity index 94%
rename from src/qq/QQNotificationCenter.h
rename to src/qq/event/QQNotificationCenter.h
index 65c60ec..661d909 100644 (file)
@@ -1,4 +1,4 @@
-#import "qq/QQNotifier.h"
+#import "qq/event/QQNotifier.h"
 
 @interface QQNotificationCenter : NSNotificationCenter <QQObservableNotifier> {
 @private
similarity index 98%
rename from src/qq/QQNotificationCenter.mm
rename to src/qq/event/QQNotificationCenter.mm
index 232c794..64e5703 100644 (file)
@@ -1,4 +1,4 @@
-#import "qq/QQNotificationCenter.h"
+#import "qq/event/QQNotificationCenter.h"
 
 
 @implementation QQNotificationCenter
similarity index 92%
rename from src/qq/QQNotificationProxy.h
rename to src/qq/event/QQNotificationProxy.h
index 4b99c54..0030b68 100644 (file)
@@ -1,4 +1,4 @@
-#import "qq/QQNotifier.h"
+#import "qq/event/QQNotifier.h"
 
 /**
  * Proxies all QQObservableNotifier calls to another QQObservableNotifier.
similarity index 98%
rename from src/qq/QQNotificationProxy.mm
rename to src/qq/event/QQNotificationProxy.mm
index 39b4697..3d2c3ee 100644 (file)
@@ -1,4 +1,4 @@
-#import "qq/QQNotificationProxy.h"
+#import "qq/event/QQNotificationProxy.h"
 
 
 @implementation QQNotificationProxy
similarity index 95%
rename from src/qq/QQNotifier.h
rename to src/qq/event/QQNotifier.h
index 1ca2a5d..445d501 100644 (file)
@@ -1,4 +1,4 @@
-#import "qq/QQObservable.h"
+#import "qq/event/QQObservable.h"
 
 
 @protocol QQNotifier
similarity index 94%
rename from src/qq/QQNotifiers.h
rename to src/qq/event/QQNotifiers.h
index f36c283..8eeab9a 100644 (file)
@@ -1,6 +1,10 @@
-/**
- * Various macros relating to notification dispatch.
- */
+#import "qq/event/QQObservable.h"
+#import "qq/event/QQNotifier.h"
+#import "qq/event/QQNotification.h"
+#import "qq/event/QQNotificationCenter.h"
+#import "qq/event/QQNotificationProxy.h"
+
+
 
 /**
  * As a QQNotificationProxy, but via encapsulation.
index 79377d3..8bd63cc 100644 (file)
                492D80CC138B231B0042D918 /* QQPhysical.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D80CB138B231B0042D918 /* QQPhysical.h */; };
                492D80E4138BA4910042D918 /* QQCooldown.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D80DE138BA4910042D918 /* QQCooldown.h */; };
                492D80E5138BA4910042D918 /* QQCooldown.mm in Sources */ = {isa = PBXBuildFile; fileRef = 492D80DF138BA4910042D918 /* QQCooldown.mm */; };
-               492D80EB138BA4B40042D918 /* QQTank.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D80E9138BA4B40042D918 /* QQTank.h */; };
-               492D80EC138BA4B40042D918 /* QQTank.mm in Sources */ = {isa = PBXBuildFile; fileRef = 492D80EA138BA4B40042D918 /* QQTank.mm */; };
-               492D80F0138BA4BC0042D918 /* QQBullet.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D80EE138BA4BC0042D918 /* QQBullet.h */; };
-               492D80F1138BA4BC0042D918 /* QQBullet.mm in Sources */ = {isa = PBXBuildFile; fileRef = 492D80EF138BA4BC0042D918 /* QQBullet.mm */; };
                492D80F3138BA4CE0042D918 /* QQThing.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D80F2138BA4CE0042D918 /* QQThing.h */; };
-               492D80FD138BCA840042D918 /* QQUnit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 492D80FC138BCA840042D918 /* QQUnit.mm */; };
-               492D80FF138BCC9F0042D918 /* QQActorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D80FE138BCC9F0042D918 /* QQActorDelegate.h */; };
                492D810C138C07540042D918 /* BEParallaxSprite.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D8101138C07540042D918 /* BEParallaxSprite.h */; };
                492D810D138C07540042D918 /* BEParallaxSprite.m in Sources */ = {isa = PBXBuildFile; fileRef = 492D8102138C07540042D918 /* BEParallaxSprite.m */; };
                492D810E138C07540042D918 /* SHCircle.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D8103138C07540042D918 /* SHCircle.h */; };
                492D8115138C07540042D918 /* SXFPSMeter.h in Headers */ = {isa = PBXBuildFile; fileRef = 492D810A138C07540042D918 /* SXFPSMeter.h */; };
                492D8116138C07540042D918 /* SXFPSMeter.m in Sources */ = {isa = PBXBuildFile; fileRef = 492D810B138C07540042D918 /* SXFPSMeter.m */; };
                494DE9971376927C00FDB3D7 /* libBox2D.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 494DE9961376927C00FDB3D7 /* libBox2D.a */; };
-               4978AD0E1395E5CE00930447 /* QQActors.h in Headers */ = {isa = PBXBuildFile; fileRef = 4978AD0D1395E5CE00930447 /* QQActors.h */; };
                4978AD141396139100930447 /* Tanks.h in Headers */ = {isa = PBXBuildFile; fileRef = 4978AD131396139100930447 /* Tanks.h */; };
                4978AD1A1396302300930447 /* QQContactNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 4978AD161396302300930447 /* QQContactNotification.h */; };
                4978AD1B1396302300930447 /* QQContactNotification.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4978AD171396302300930447 /* QQContactNotification.mm */; };
                4978AD1C1396302300930447 /* QQPhysicalEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = 4978AD181396302300930447 /* QQPhysicalEvents.h */; };
                4978AD1D1396302300930447 /* QQPhysicalEvents.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4978AD191396302300930447 /* QQPhysicalEvents.mm */; };
-               4978AD251396302F00930447 /* QQNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 4978AD1F1396302F00930447 /* QQNotification.h */; };
-               4978AD261396302F00930447 /* QQNotification.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4978AD201396302F00930447 /* QQNotification.mm */; };
-               4978AD271396302F00930447 /* QQNotifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 4978AD211396302F00930447 /* QQNotifier.h */; };
-               4978AD2A1396302F00930447 /* QQObservable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4978AD241396302F00930447 /* QQObservable.h */; };
                4995ABB213816CCE00334646 /* QQGame.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E834A513812427007A6598 /* QQGame.h */; };
-               4995ABB313816CD400334646 /* QQUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E834A213812427007A6598 /* QQUnit.h */; };
                4995ABF91381C46B00334646 /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 4995ABCA1381C46B00334646 /* Icon-iPad.png */; };
                4995ABFA1381C46B00334646 /* Icon-iPhone.png in Resources */ = {isa = PBXBuildFile; fileRef = 4995ABCB1381C46B00334646 /* Icon-iPhone.png */; };
                4995AC261381C5ED00334646 /* Icon-iPhone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4995ABCC1381C46B00334646 /* Icon-iPhone@2x.png */; };
                49966919136930E8006E8125 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966914136930E8006E8125 /* OpenAL.framework */; };
                4996691A136930E8006E8125 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966915136930E8006E8125 /* OpenGLES.framework */; };
                4996691B136930E8006E8125 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49966916136930E8006E8125 /* QuartzCore.framework */; };
-               499D6A9C1399BFB8008E4C0D /* QQNotificationCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 499D6A981399BFB8008E4C0D /* QQNotificationCenter.h */; };
-               499D6A9D1399BFB8008E4C0D /* QQNotificationCenter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499D6A991399BFB8008E4C0D /* QQNotificationCenter.mm */; };
-               499D6A9E1399BFB8008E4C0D /* QQNotificationProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 499D6A9A1399BFB8008E4C0D /* QQNotificationProxy.h */; };
-               499D6A9F1399BFB8008E4C0D /* QQNotificationProxy.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499D6A9B1399BFB8008E4C0D /* QQNotificationProxy.mm */; };
+               499F65C9139CBC0C00309DE4 /* QQNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65C0139CBC0C00309DE4 /* QQNotification.h */; };
+               499F65CA139CBC0C00309DE4 /* QQNotification.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F65C1139CBC0C00309DE4 /* QQNotification.mm */; };
+               499F65CB139CBC0C00309DE4 /* QQNotificationCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65C2139CBC0C00309DE4 /* QQNotificationCenter.h */; };
+               499F65CC139CBC0C00309DE4 /* QQNotificationCenter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F65C3139CBC0C00309DE4 /* QQNotificationCenter.mm */; };
+               499F65CD139CBC0C00309DE4 /* QQNotificationProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65C4139CBC0C00309DE4 /* QQNotificationProxy.h */; };
+               499F65CE139CBC0C00309DE4 /* QQNotificationProxy.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F65C5139CBC0C00309DE4 /* QQNotificationProxy.mm */; };
+               499F65CF139CBC0C00309DE4 /* QQNotifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65C6139CBC0C00309DE4 /* QQNotifier.h */; };
+               499F65D0139CBC0C00309DE4 /* QQNotifiers.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65C7139CBC0C00309DE4 /* QQNotifiers.h */; };
+               499F65D1139CBC0C00309DE4 /* QQObservable.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65C8139CBC0C00309DE4 /* QQObservable.h */; };
+               499F65E1139CBCBA00309DE4 /* QQActor.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65D7139CBCBA00309DE4 /* QQActor.h */; };
+               499F65E2139CBCBA00309DE4 /* QQActor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F65D8139CBCBA00309DE4 /* QQActor.mm */; };
+               499F65E3139CBCBA00309DE4 /* QQActorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65D9139CBCBA00309DE4 /* QQActorDelegate.h */; };
+               499F65E4139CBCBA00309DE4 /* QQActors.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65DA139CBCBA00309DE4 /* QQActors.h */; };
+               499F65E5139CBCBA00309DE4 /* QQBullet.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65DB139CBCBA00309DE4 /* QQBullet.h */; };
+               499F65E6139CBCBA00309DE4 /* QQBullet.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F65DC139CBCBA00309DE4 /* QQBullet.mm */; };
+               499F65E7139CBCBA00309DE4 /* QQTank.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65DD139CBCBA00309DE4 /* QQTank.h */; };
+               499F65E8139CBCBA00309DE4 /* QQTank.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F65DE139CBCBA00309DE4 /* QQTank.mm */; };
+               499F65E9139CBCBA00309DE4 /* QQUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65DF139CBCBA00309DE4 /* QQUnit.h */; };
+               499F65EA139CBCBA00309DE4 /* QQUnit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F65E0139CBCBA00309DE4 /* QQUnit.mm */; };
+               499F65EC139CBCC000309DE4 /* QQGameTime.h in Headers */ = {isa = PBXBuildFile; fileRef = 499F65EB139CBCC000309DE4 /* QQGameTime.h */; };
                49D8645D1392DB2800BC341C /* QQShape.h in Headers */ = {isa = PBXBuildFile; fileRef = 49D8645B1392DB2800BC341C /* QQShape.h */; };
                49D8645E1392DB2800BC341C /* QQShape.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49D8645C1392DB2800BC341C /* QQShape.mm */; };
                49DA67D4137847A7004841E9 /* QQWorld.h in Headers */ = {isa = PBXBuildFile; fileRef = 49DA67D2137847A7004841E9 /* QQWorld.h */; };
@@ -66,8 +70,6 @@
                49E3C5D3139A73E700A3958A /* NSSet+QQExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49E3C5D1139A73E700A3958A /* NSSet+QQExtensions.mm */; };
                49E67E11139B341600DDFC07 /* TanksMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E67E10139B341600DDFC07 /* TanksMacros.h */; };
                49E834A713812427007A6598 /* QQActive.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E8349E13812427007A6598 /* QQActive.h */; };
-               49E834A813812427007A6598 /* QQActor.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E834A013812427007A6598 /* QQActor.h */; };
-               49E834A913812427007A6598 /* QQActor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49E834A113812427007A6598 /* QQActor.mm */; };
                49E834AC13812427007A6598 /* QQDisplayable.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E834A413812427007A6598 /* QQDisplayable.h */; };
                49E834AE13812427007A6598 /* QQGame.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49E834A613812427007A6598 /* QQGame.mm */; };
                49E834BE13812555007A6598 /* QQAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E834B013812555007A6598 /* QQAppDelegate.h */; };
                492D80CB138B231B0042D918 /* QQPhysical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QQPhysical.h; path = src/game/QQPhysical.h; sourceTree = SOURCE_ROOT; };
                492D80DE138BA4910042D918 /* QQCooldown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQCooldown.h; sourceTree = "<group>"; };
                492D80DF138BA4910042D918 /* QQCooldown.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQCooldown.mm; sourceTree = "<group>"; };
-               492D80E9138BA4B40042D918 /* QQTank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQTank.h; sourceTree = "<group>"; };
-               492D80EA138BA4B40042D918 /* QQTank.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQTank.mm; sourceTree = "<group>"; };
-               492D80EE138BA4BC0042D918 /* QQBullet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQBullet.h; sourceTree = "<group>"; };
-               492D80EF138BA4BC0042D918 /* QQBullet.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQBullet.mm; sourceTree = "<group>"; };
                492D80F2138BA4CE0042D918 /* QQThing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQThing.h; sourceTree = "<group>"; };
-               492D80FC138BCA840042D918 /* QQUnit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQUnit.mm; sourceTree = "<group>"; };
-               492D80FE138BCC9F0042D918 /* QQActorDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQActorDelegate.h; sourceTree = "<group>"; };
                492D8101138C07540042D918 /* BEParallaxSprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BEParallaxSprite.h; sourceTree = "<group>"; };
                492D8102138C07540042D918 /* BEParallaxSprite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BEParallaxSprite.m; sourceTree = "<group>"; };
                492D8103138C07540042D918 /* SHCircle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SHCircle.h; sourceTree = "<group>"; };
                492D810A138C07540042D918 /* SXFPSMeter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXFPSMeter.h; sourceTree = "<group>"; };
                492D810B138C07540042D918 /* SXFPSMeter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXFPSMeter.m; sourceTree = "<group>"; };
                494DE9961376927C00FDB3D7 /* libBox2D.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libBox2D.a; sourceTree = SOURCE_ROOT; };
-               4978AD0D1395E5CE00930447 /* QQActors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQActors.h; sourceTree = "<group>"; };
                4978AD131396139100930447 /* Tanks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tanks.h; sourceTree = "<group>"; };
                4978AD161396302300930447 /* QQContactNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQContactNotification.h; sourceTree = "<group>"; };
                4978AD171396302300930447 /* QQContactNotification.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQContactNotification.mm; sourceTree = "<group>"; };
                4978AD181396302300930447 /* QQPhysicalEvents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQPhysicalEvents.h; sourceTree = "<group>"; };
                4978AD191396302300930447 /* QQPhysicalEvents.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQPhysicalEvents.mm; sourceTree = "<group>"; };
-               4978AD1F1396302F00930447 /* QQNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotification.h; sourceTree = "<group>"; };
-               4978AD201396302F00930447 /* QQNotification.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQNotification.mm; sourceTree = "<group>"; };
-               4978AD211396302F00930447 /* QQNotifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotifier.h; sourceTree = "<group>"; };
-               4978AD241396302F00930447 /* QQObservable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQObservable.h; sourceTree = "<group>"; };
                4995ABCA1381C46B00334646 /* Icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-iPad.png"; sourceTree = "<group>"; };
                4995ABCB1381C46B00334646 /* Icon-iPhone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-iPhone.png"; sourceTree = "<group>"; };
                4995ABCC1381C46B00334646 /* Icon-iPhone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-iPhone@2x.png"; sourceTree = "<group>"; };
                49966914136930E8006E8125 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; };
                49966915136930E8006E8125 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
                49966916136930E8006E8125 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
-               499D6A981399BFB8008E4C0D /* QQNotificationCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotificationCenter.h; sourceTree = "<group>"; };
-               499D6A991399BFB8008E4C0D /* QQNotificationCenter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQNotificationCenter.mm; sourceTree = "<group>"; };
-               499D6A9A1399BFB8008E4C0D /* QQNotificationProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotificationProxy.h; sourceTree = "<group>"; };
-               499D6A9B1399BFB8008E4C0D /* QQNotificationProxy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQNotificationProxy.mm; sourceTree = "<group>"; };
+               499F65C0139CBC0C00309DE4 /* QQNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotification.h; sourceTree = "<group>"; };
+               499F65C1139CBC0C00309DE4 /* QQNotification.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQNotification.mm; sourceTree = "<group>"; };
+               499F65C2139CBC0C00309DE4 /* QQNotificationCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotificationCenter.h; sourceTree = "<group>"; };
+               499F65C3139CBC0C00309DE4 /* QQNotificationCenter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQNotificationCenter.mm; sourceTree = "<group>"; };
+               499F65C4139CBC0C00309DE4 /* QQNotificationProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotificationProxy.h; sourceTree = "<group>"; };
+               499F65C5139CBC0C00309DE4 /* QQNotificationProxy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQNotificationProxy.mm; sourceTree = "<group>"; };
+               499F65C6139CBC0C00309DE4 /* QQNotifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotifier.h; sourceTree = "<group>"; };
+               499F65C7139CBC0C00309DE4 /* QQNotifiers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQNotifiers.h; sourceTree = "<group>"; };
+               499F65C8139CBC0C00309DE4 /* QQObservable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQObservable.h; sourceTree = "<group>"; };
+               499F65D7139CBCBA00309DE4 /* QQActor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQActor.h; sourceTree = "<group>"; };
+               499F65D8139CBCBA00309DE4 /* QQActor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQActor.mm; sourceTree = "<group>"; };
+               499F65D9139CBCBA00309DE4 /* QQActorDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQActorDelegate.h; sourceTree = "<group>"; };
+               499F65DA139CBCBA00309DE4 /* QQActors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQActors.h; sourceTree = "<group>"; };
+               499F65DB139CBCBA00309DE4 /* QQBullet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQBullet.h; sourceTree = "<group>"; };
+               499F65DC139CBCBA00309DE4 /* QQBullet.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQBullet.mm; sourceTree = "<group>"; };
+               499F65DD139CBCBA00309DE4 /* QQTank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQTank.h; sourceTree = "<group>"; };
+               499F65DE139CBCBA00309DE4 /* QQTank.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQTank.mm; sourceTree = "<group>"; };
+               499F65DF139CBCBA00309DE4 /* QQUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQUnit.h; sourceTree = "<group>"; };
+               499F65E0139CBCBA00309DE4 /* QQUnit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQUnit.mm; sourceTree = "<group>"; };
+               499F65EB139CBCC000309DE4 /* QQGameTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQGameTime.h; sourceTree = "<group>"; };
                49D8645B1392DB2800BC341C /* QQShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQShape.h; sourceTree = "<group>"; };
                49D8645C1392DB2800BC341C /* QQShape.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQShape.mm; sourceTree = "<group>"; };
                49DA67D2137847A7004841E9 /* QQWorld.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQWorld.h; sourceTree = "<group>"; };
                49E3C5D1139A73E700A3958A /* NSSet+QQExtensions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSSet+QQExtensions.mm"; sourceTree = "<group>"; };
                49E67E10139B341600DDFC07 /* TanksMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TanksMacros.h; sourceTree = "<group>"; };
                49E8349E13812427007A6598 /* QQActive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQActive.h; sourceTree = "<group>"; };
-               49E834A013812427007A6598 /* QQActor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQActor.h; sourceTree = "<group>"; };
-               49E834A113812427007A6598 /* QQActor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQActor.mm; sourceTree = "<group>"; };
-               49E834A213812427007A6598 /* QQUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQUnit.h; sourceTree = "<group>"; };
                49E834A413812427007A6598 /* QQDisplayable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQDisplayable.h; sourceTree = "<group>"; };
                49E834A513812427007A6598 /* QQGame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QQGame.h; sourceTree = "<group>"; };
                49E834A613812427007A6598 /* QQGame.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QQGame.mm; sourceTree = "<group>"; };
                        path = ability;
                        sourceTree = "<group>";
                };
-               492D80E8138BA4B40042D918 /* unit */ = {
-                       isa = PBXGroup;
-                       children = (
-                               492D80E9138BA4B40042D918 /* QQTank.h */,
-                               492D80EA138BA4B40042D918 /* QQTank.mm */,
-                       );
-                       path = unit;
-                       sourceTree = "<group>";
-               };
-               492D80ED138BA4BC0042D918 /* bullet */ = {
-                       isa = PBXGroup;
-                       children = (
-                               492D80EE138BA4BC0042D918 /* QQBullet.h */,
-                               492D80EF138BA4BC0042D918 /* QQBullet.mm */,
-                       );
-                       path = bullet;
-                       sourceTree = "<group>";
-               };
                492D8100138C07540042D918 /* Extras */ = {
                        isa = PBXGroup;
                        children = (
                4978AD1E1396302E00930447 /* qq */ = {
                        isa = PBXGroup;
                        children = (
+                               499F65BF139CBC0C00309DE4 /* event */,
                                49E3C5D0139A73E700A3958A /* NSSet+QQExtensions.h */,
                                49E3C5D1139A73E700A3958A /* NSSet+QQExtensions.mm */,
-                               499D6A981399BFB8008E4C0D /* QQNotificationCenter.h */,
-                               499D6A991399BFB8008E4C0D /* QQNotificationCenter.mm */,
-                               499D6A9A1399BFB8008E4C0D /* QQNotificationProxy.h */,
-                               499D6A9B1399BFB8008E4C0D /* QQNotificationProxy.mm */,
-                               4978AD1F1396302F00930447 /* QQNotification.h */,
-                               4978AD201396302F00930447 /* QQNotification.mm */,
-                               4978AD211396302F00930447 /* QQNotifier.h */,
-                               4978AD241396302F00930447 /* QQObservable.h */,
                        );
                        path = qq;
                        sourceTree = "<group>";
                        name = Frameworks;
                        sourceTree = "<group>";
                };
+               499F65BF139CBC0C00309DE4 /* event */ = {
+                       isa = PBXGroup;
+                       children = (
+                               499F65C0139CBC0C00309DE4 /* QQNotification.h */,
+                               499F65C1139CBC0C00309DE4 /* QQNotification.mm */,
+                               499F65C2139CBC0C00309DE4 /* QQNotificationCenter.h */,
+                               499F65C3139CBC0C00309DE4 /* QQNotificationCenter.mm */,
+                               499F65C4139CBC0C00309DE4 /* QQNotificationProxy.h */,
+                               499F65C5139CBC0C00309DE4 /* QQNotificationProxy.mm */,
+                               499F65C6139CBC0C00309DE4 /* QQNotifier.h */,
+                               499F65C7139CBC0C00309DE4 /* QQNotifiers.h */,
+                               499F65C8139CBC0C00309DE4 /* QQObservable.h */,
+                       );
+                       path = event;
+                       sourceTree = "<group>";
+               };
+               499F65D6139CBCBA00309DE4 /* unit */ = {
+                       isa = PBXGroup;
+                       children = (
+                               499F65D7139CBCBA00309DE4 /* QQActor.h */,
+                               499F65D8139CBCBA00309DE4 /* QQActor.mm */,
+                               499F65D9139CBCBA00309DE4 /* QQActorDelegate.h */,
+                               499F65DA139CBCBA00309DE4 /* QQActors.h */,
+                               499F65DB139CBCBA00309DE4 /* QQBullet.h */,
+                               499F65DC139CBCBA00309DE4 /* QQBullet.mm */,
+                               499F65DD139CBCBA00309DE4 /* QQTank.h */,
+                               499F65DE139CBCBA00309DE4 /* QQTank.mm */,
+                               499F65DF139CBCBA00309DE4 /* QQUnit.h */,
+                               499F65E0139CBCBA00309DE4 /* QQUnit.mm */,
+                       );
+                       path = unit;
+                       sourceTree = "<group>";
+               };
                49E8349D13812427007A6598 /* game */ = {
                        isa = PBXGroup;
                        children = (
+                               499F65D6139CBCBA00309DE4 /* unit */,
                                49193BEE139280180005B3DD /* map */,
                                492D80DB138BA4910042D918 /* ability */,
-                               49E8349F13812427007A6598 /* actor */,
                                492D80F2138BA4CE0042D918 /* QQThing.h */,
                                49E8349E13812427007A6598 /* QQActive.h */,
                                49E834A413812427007A6598 /* QQDisplayable.h */,
                                492D80CB138B231B0042D918 /* QQPhysical.h */,
+                               499F65EB139CBCC000309DE4 /* QQGameTime.h */,
                                49E834A513812427007A6598 /* QQGame.h */,
                                49E834A613812427007A6598 /* QQGame.mm */,
                        );
                        path = game;
                        sourceTree = "<group>";
                };
-               49E8349F13812427007A6598 /* actor */ = {
-                       isa = PBXGroup;
-                       children = (
-                               492D80ED138BA4BC0042D918 /* bullet */,
-                               492D80E8138BA4B40042D918 /* unit */,
-                               4978AD0D1395E5CE00930447 /* QQActors.h */,
-                               492D80FE138BCC9F0042D918 /* QQActorDelegate.h */,
-                               49E834A013812427007A6598 /* QQActor.h */,
-                               49E834A113812427007A6598 /* QQActor.mm */,
-                               49E834A213812427007A6598 /* QQUnit.h */,
-                               492D80FC138BCA840042D918 /* QQUnit.mm */,
-                       );
-                       path = actor;
-                       sourceTree = "<group>";
-               };
                49E834AF13812555007A6598 /* ui */ = {
                        isa = PBXGroup;
                        children = (
                49F2D9AE13764666000B6B8C /* src */ = {
                        isa = PBXGroup;
                        children = (
-                               4978AD1E1396302E00930447 /* qq */,
                                49F2D9B313764666000B6B8C /* render */,
                                49E834AF13812555007A6598 /* ui */,
+                               4978AD1E1396302E00930447 /* qq */,
                                49F2D9B113764666000B6B8C /* physics */,
                                49E8349D13812427007A6598 /* game */,
                                49F2D9B013764666000B6B8C /* main.mm */,
                                49F2D9B213764666000B6B8C /* prefix.pch */,
-                               4978AD131396139100930447 /* Tanks.h */,
                                49E67E10139B341600DDFC07 /* TanksMacros.h */,
+                               4978AD131396139100930447 /* Tanks.h */,
                        );
                        path = src;
                        sourceTree = "<group>";
                                49DA67D4137847A7004841E9 /* QQWorld.h in Headers */,
                                4B8B2A50137D098500CA4076 /* QQAnimationContainer.h in Headers */,
                                49E834A713812427007A6598 /* QQActive.h in Headers */,
-                               49E834A813812427007A6598 /* QQActor.h in Headers */,
                                49E834AC13812427007A6598 /* QQDisplayable.h in Headers */,
                                4995ABB213816CCE00334646 /* QQGame.h in Headers */,
-                               4995ABB313816CD400334646 /* QQUnit.h in Headers */,
                                49E834BE13812555007A6598 /* QQAppDelegate.h in Headers */,
                                49E834C013812555007A6598 /* QQAppDelegate_iPad.h in Headers */,
                                49E834C313812555007A6598 /* QQAppDelegate_iPhone.h in Headers */,
                                49E834D3138166A6007A6598 /* QQSparrowExtensions.h in Headers */,
                                492D80CC138B231B0042D918 /* QQPhysical.h in Headers */,
                                492D80E4138BA4910042D918 /* QQCooldown.h in Headers */,
-                               492D80EB138BA4B40042D918 /* QQTank.h in Headers */,
-                               492D80F0138BA4BC0042D918 /* QQBullet.h in Headers */,
                                492D80F3138BA4CE0042D918 /* QQThing.h in Headers */,
-                               492D80FF138BCC9F0042D918 /* QQActorDelegate.h in Headers */,
                                49193BF5139280180005B3DD /* QQLevel.h in Headers */,
                                49D8645D1392DB2800BC341C /* QQShape.h in Headers */,
-                               4978AD0E1395E5CE00930447 /* QQActors.h in Headers */,
                                4978AD141396139100930447 /* Tanks.h in Headers */,
                                4978AD1A1396302300930447 /* QQContactNotification.h in Headers */,
                                4978AD1C1396302300930447 /* QQPhysicalEvents.h in Headers */,
-                               4978AD251396302F00930447 /* QQNotification.h in Headers */,
-                               4978AD271396302F00930447 /* QQNotifier.h in Headers */,
-                               4978AD2A1396302F00930447 /* QQObservable.h in Headers */,
-                               499D6A9C1399BFB8008E4C0D /* QQNotificationCenter.h in Headers */,
-                               499D6A9E1399BFB8008E4C0D /* QQNotificationProxy.h in Headers */,
                                49E3C5D2139A73E700A3958A /* NSSet+QQExtensions.h in Headers */,
                                49E67E11139B341600DDFC07 /* TanksMacros.h in Headers */,
+                               499F65C9139CBC0C00309DE4 /* QQNotification.h in Headers */,
+                               499F65CB139CBC0C00309DE4 /* QQNotificationCenter.h in Headers */,
+                               499F65CD139CBC0C00309DE4 /* QQNotificationProxy.h in Headers */,
+                               499F65CF139CBC0C00309DE4 /* QQNotifier.h in Headers */,
+                               499F65D0139CBC0C00309DE4 /* QQNotifiers.h in Headers */,
+                               499F65D1139CBC0C00309DE4 /* QQObservable.h in Headers */,
+                               499F65E1139CBCBA00309DE4 /* QQActor.h in Headers */,
+                               499F65E3139CBCBA00309DE4 /* QQActorDelegate.h in Headers */,
+                               499F65E4139CBCBA00309DE4 /* QQActors.h in Headers */,
+                               499F65E5139CBCBA00309DE4 /* QQBullet.h in Headers */,
+                               499F65E7139CBCBA00309DE4 /* QQTank.h in Headers */,
+                               499F65E9139CBCBA00309DE4 /* QQUnit.h in Headers */,
+                               499F65EC139CBCC000309DE4 /* QQGameTime.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                4B91A15A138F644000EF4D7C /* QQPhysicsDebugView.mm in Sources */,
                                49DA67D5137847A7004841E9 /* QQWorld.mm in Sources */,
                                4B8B2A51137D098500CA4076 /* QQAnimationContainer.mm in Sources */,
-                               49E834A913812427007A6598 /* QQActor.mm in Sources */,
                                49E834AE13812427007A6598 /* QQGame.mm in Sources */,
                                49E834BF13812555007A6598 /* QQAppDelegate.mm in Sources */,
                                49E834C113812555007A6598 /* QQAppDelegate_iPad.mm in Sources */,
                                49E834C713812555007A6598 /* QQViewport.mm in Sources */,
                                49E834D4138166A6007A6598 /* QQSparrowExtensions.mm in Sources */,
                                492D80E5138BA4910042D918 /* QQCooldown.mm in Sources */,
-                               492D80EC138BA4B40042D918 /* QQTank.mm in Sources */,
-                               492D80F1138BA4BC0042D918 /* QQBullet.mm in Sources */,
-                               492D80FD138BCA840042D918 /* QQUnit.mm in Sources */,
                                49193BF6139280180005B3DD /* QQLevel.mm in Sources */,
                                49F2D9C413764666000B6B8C /* main.mm in Sources */,
                                49D8645E1392DB2800BC341C /* QQShape.mm in Sources */,
                                4978AD1B1396302300930447 /* QQContactNotification.mm in Sources */,
                                4978AD1D1396302300930447 /* QQPhysicalEvents.mm in Sources */,
-                               4978AD261396302F00930447 /* QQNotification.mm in Sources */,
-                               499D6A9D1399BFB8008E4C0D /* QQNotificationCenter.mm in Sources */,
-                               499D6A9F1399BFB8008E4C0D /* QQNotificationProxy.mm in Sources */,
                                49E3C5D3139A73E700A3958A /* NSSet+QQExtensions.mm in Sources */,
+                               499F65CA139CBC0C00309DE4 /* QQNotification.mm in Sources */,
+                               499F65CC139CBC0C00309DE4 /* QQNotificationCenter.mm in Sources */,
+                               499F65CE139CBC0C00309DE4 /* QQNotificationProxy.mm in Sources */,
+                               499F65E2139CBCBA00309DE4 /* QQActor.mm in Sources */,
+                               499F65E6139CBCBA00309DE4 /* QQBullet.mm in Sources */,
+                               499F65E8139CBCBA00309DE4 /* QQTank.mm in Sources */,
+                               499F65EA139CBCBA00309DE4 /* QQUnit.mm in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };