Collisions and bullets now work with cocos. cocos master
authordsc <david.schoonover@gmail.com>
Fri, 24 Jun 2011 07:25:09 +0000 (00:25 -0700)
committerdsc <david.schoonover@gmail.com>
Fri, 24 Jun 2011 07:25:09 +0000 (00:25 -0700)
12 files changed:
src/Tanks.h
src/TanksMacros.h
src/game/QQGame.mm
src/game/unit/QQActor.mm
src/game/unit/QQBullet.mm
src/game/unit/QQPlayer.h
src/game/unit/QQPlayer.mm
src/game/unit/QQUnit.mm
src/physics/QQPhysics.h
src/qq/util/QQLogging.mm
src/ui/game/QQViewportLayer.mm
tanks.xcodeproj/project.pbxproj

index 347f4fa..c59482e 100644 (file)
@@ -9,7 +9,7 @@
 // and is optimized for objects of 1x1 metre. Therefore it makes sense
 // to define the ratio so that your most common object type is 1x1 metre.
 #define PIXELS_PER_METER 32.0f
-
+#define METERS_PER_PIXEL 0.03125f
 
 
 #ifdef DEBUG
index c6bc397..b66018c 100644 (file)
@@ -9,10 +9,21 @@
 
 #define v2p(__vec)          (ccp( (__vec).x, (__vec).y ))
 #define p2v(__pt)           (Vec( (__pt).x, (__pt).y ))
-#define p2v2(__pt)          (b2Vec2( (__pt).x, (__pt).y ))
 
 #define deg2rad(__theta)    ((__theta) * 0.01745329252f)   // PI / 180
 #define rad2deg(__theta)    ((__theta) * 57.29577951f)     // PI * 180
 
+// #define touch2p(__touch)    (ccpMult([[CCDirector sharedDirector] convertToGL:[(__touch) locationInView: [(__touch) view]]], METERS_PER_PIXEL))
+
+#import "cocos2d.h"
+
+static inline CGPoint touch2p(UITouch* touch) {
+    CGPoint p = [[CCDirector sharedDirector] convertToGL:[touch locationInView: [touch view]]];
+    p.x *= METERS_PER_PIXEL;
+    p.y *= METERS_PER_PIXEL;
+    return p;
+}
+
+
 
 #endif
\ No newline at end of file
index 9ec8eb7..a8f6890 100644 (file)
@@ -59,7 +59,8 @@ static QQGame* _CurrentGame = NULL;
         CGSize frame = [CCDirector sharedDirector].winSize;
         float wMax = frame.width  / PIXELS_PER_METER;
         float hMax = frame.height / PIXELS_PER_METER;
-        // [[[QQPlayer alloc] initNamed:@"Pink" atX:wMax/6 y:hMax/6 width:32 height:32 color:0xFF0071] autorelease];
+        QQPlayer* p = [[[QQPlayer alloc] initAtX:wMax/6 y:hMax/6 width:32 height:32 color:0xFF0071] autorelease];
+        QQLog(p);
         QQUnit* u = [[[QQUnit alloc] initAtX:wMax/3 y:hMax/2 width:32 height:32 color:0x4596FF] autorelease];
         QQLog(u);
         
index 3119650..6a00e92 100644 (file)
 }
 - (void) updateShapeX:(float)x y:(float)y rotation:(float)r {
     [self updateShapeX:x y:y];
-    self.shape.rotation = -1 * CC_RADIANS_TO_DEGREES(r);
+    self.shape.rotation = -1 * rad2deg(r);
 }
 - (void) updateShape {
     b2Transform trans = self.body->GetTransform();
index fec3aeb..2e0a10c 100644 (file)
@@ -1,3 +1,4 @@
+#import "cocos2d.h"
 #import <Box2D/Box2D.h>
 
 #import "QQBullet.h"
 - (id) init:(QQUnit*)owner at:(Vec)pos {
     if ((self = [super initAt:pos])){
         _owner = owner;
-        _speed = 50.0f;
+        _speed = 1.0f;
         
 //        float px = PIXELS_PER_METER;
-        float radius = 0.5f;
-        CCSprite* shape = [CCSprite spriteWithFile:@"circle-32x32-white.png"];
+        float radius = 0.25f;
+        CCNode* shape = self.shape = [CCSprite spriteWithFile:@"circle-32x32-white.png"];
         // shape.color = hex2color(color);
         shape.scaleX = 2*radius;
         shape.scaleY = 2*radius;
@@ -30,7 +31,7 @@
         b2FixtureDef fix;
         fix.shape = &circle;
         fix.restitution = 1.0f;
-        fix.density = 0.1f;
+        fix.density = 1.0f;
         fix.userData = self;
         self.body->CreateFixture(&fix);
     }
index 0316255..7dbb65b 100644 (file)
@@ -1,6 +1,8 @@
+#import "cocos2d.h"
+#import "Tanks.h"
 #import "game/unit/QQUnit.h"
 
-@interface QQPlayer : QQUnit {
+@interface QQPlayer : QQUnit <CCStandardTouchDelegate> {
     
 }
 
index 589186c..7263121 100644 (file)
@@ -4,10 +4,6 @@
 #import "game/unit/QQBullet.h"
 
 
-// private interface
-@interface QQPlayer ()
-- (void) onTouch:(SPTouchEvent*)event;
-@end
 
 
 
 
 - (id) initAtX:(float)x y:(float)y withShape:(CCNode*)shape {
     if ((self = [super initAtX:x y:y withShape:shape])){
-        [self.shape addEventListener:@selector(onSelfTouch:) atObject:self forType:SP_EVENT_TYPE_TOUCH];
-        [self.game.stage addEventListener:@selector(attackOnTouch:) atObject:self forType:SP_EVENT_TYPE_TOUCH];
+        [[CCTouchDispatcher sharedDispatcher] addStandardDelegate:self priority:0];
     }
     return self;
 }
 
 - (void) dealloc {
-    [self.game.stage removeEventListener:@selector(onTouch:) atObject:self forType:SP_EVENT_TYPE_TOUCH];
+    [[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
     [super dealloc];
 }
 
-- (void) onSelfTouch:(SPTouchEvent*)event {
-    SPTouch* touch = [[event touchesWithTarget:(SPDisplayObject*)self.shape] anyObject];
-    NSLog(@">>>>> onSelfTouch! <<<<< \v\ttouch=%@ \v\tevent=%@ \v\tshape=%@ \v\tstage=%@\v", touch, event, self.shape, self.game.stage);
-}
 
-- (void) onTouch:(SPTouchEvent*)event {
-    SPTouch* touch = [[event touchesWithTarget:(SPDisplayObject*)self.game.stage] anyObject];
-    NSString* msg = [NSString stringWithFormat:@"onTouch! \vtouch=%@\v", touch];
-    msg = [msg stringByAppendingFormat:@"\t- %@\v", self.shape];
-    msg = [msg stringByAppendingFormat:@"\t- %@\v", self.game.stage];
-//    SPDisplayObject* obj = self.shape;
-//    do {
-//        msg = [msg stringByAppendingFormat:@"\t- %@\v", obj];
-//    } while ((obj = obj.parent));
-    NSLog(@"%@", msg);
-}
+/// Standard Touch Delegate: (all optional)
+// - (void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
+// - (void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
+// - (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
+// - (void) ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
 
-- (void) attackOnTouch:(SPTouchEvent*)event {
-    NSLog(@"onTouch: \v\t%@ \v\t%@", self, event);
-    SPTouch* touch = [[event touchesWithTarget:(SPDisplayObject*)self.game.stage] anyObject];
-    if (touch && [self.attackCooldown activate]) {
-        // [self attackToward:[[touch locationInSpace:self.shape.parent] scaleBy:1.0f/PIXELS_PER_METER]];
-        
-        // Touch's normal vector in local coords (rel unit origin)
-        SPPoint* normVec = [[[touch locationInSpace:self.shape.parent] subtractPoint:self.shape.position] normalize];
-        
-        // Bullet starting position
-        float offset = 7.5f + fmaxf(self.shape.width, self.shape.height) * 1.41421356237f; // bullet_radius + tank_diagonal_length
-        SPPoint* start = [[self.shape.position addPoint:[normVec scaleBy:offset]] scaleBy:1.0f/PIXELS_PER_METER];
-        QQBullet* bullet = [[[QQBullet alloc] init:self x:start.x y:start.y] autorelease];
-        
-        // Bullet impulse vector
-        SPPoint* imp = [normVec scaleBy:50];
-        [bullet applyLinearImpulseX:imp.x y:imp.y];
-        // NSLog(@"[%@ pos:(%f,%f) impulse:(%f,%f)]", bullet, bullet.x,bullet.y, imp.x,imp.y);
-    }
-}
+/// Targeted Touch Delegate:
+// - (void) registerWithTouchDispatcher {
+//     [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
+// }
+// - (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
+// touch updates (optional):
+// - (void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
+// - (void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
+// - (void) ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;
 
-- (void) _moveOnTouch:(SPTouchEvent*)event {
-    SPTouch* touch = [[event touchesWithTarget:self.shape.parent] anyObject];
-    if (touch) {
-        SPPoint* touchPosition = [touch locationInSpace:self.shape.parent];
-        float x = self.shape.x = touchPosition.x - self.shape.width / 2.0f;
-        float y = self.shape.y = touchPosition.y - self.shape.height / 2.0f;
-        
-        float px = PIXELS_PER_METER;
-        [self setPositionX:x/px y:y/px];
-        // self.body->SetTransform(b2Vec2(x/px, y/px), self.body->GetAngle());
+- (void) ccTouchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
+    for (UITouch* touch in touches) {
+        // CGPoint p = [[CCDirector sharedDirector] convertToGL:[touch locationInView: [touch view]]];
+        [self attackTowardPoint:touch2p(touch)];
     }
 }
 
+
+
+// - (void) onSelfTouch:(SPTouchEvent*)event {
+//     SPTouch* touch = [[event touchesWithTarget:(SPDisplayObject*)self.shape] anyObject];
+//     NSLog(@">>>>> onSelfTouch! <<<<< \v\ttouch=%@ \v\tevent=%@ \v\tshape=%@ \v\tstage=%@\v", touch, event, self.shape, self.game.stage);
+// }
+// 
+// - (void) onTouch:(SPTouchEvent*)event {
+//     SPTouch* touch = [[event touchesWithTarget:(SPDisplayObject*)self.game.stage] anyObject];
+//     NSString* msg = [NSString stringWithFormat:@"onTouch! \vtouch=%@\v", touch];
+//     msg = [msg stringByAppendingFormat:@"\t- %@\v", self.shape];
+//     msg = [msg stringByAppendingFormat:@"\t- %@\v", self.game.stage];
+// //    SPDisplayObject* obj = self.shape;
+// //    do {
+// //        msg = [msg stringByAppendingFormat:@"\t- %@\v", obj];
+// //    } while ((obj = obj.parent));
+//     NSLog(@"%@", msg);
+// }
+// 
+// - (void) attackOnTouch:(SPTouchEvent*)event {
+//     NSLog(@"onTouch: \v\t%@ \v\t%@", self, event);
+//     SPTouch* touch = [[event touchesWithTarget:(SPDisplayObject*)self.game.stage] anyObject];
+//     if (touch && [self.attackCooldown activate]) {
+//         // [self attackToward:[[touch locationInSpace:self.shape.parent] scaleBy:1.0f/PIXELS_PER_METER]];
+//         
+//         // Touch's normal vector in local coords (rel unit origin)
+//         SPPoint* normVec = [[[touch locationInSpace:self.shape.parent] subtractPoint:self.shape.position] normalize];
+//         
+//         // Bullet starting position
+//         float offset = 7.5f + fmaxf(self.shape.width, self.shape.height) * 1.41421356237f; // bullet_radius + tank_diagonal_length
+//         SPPoint* start = [[self.shape.position addPoint:[normVec scaleBy:offset]] scaleBy:1.0f/PIXELS_PER_METER];
+//         QQBullet* bullet = [[[QQBullet alloc] init:self x:start.x y:start.y] autorelease];
+//         
+//         // Bullet impulse vector
+//         SPPoint* imp = [normVec scaleBy:50];
+//         [bullet applyLinearImpulseX:imp.x y:imp.y];
+//         // NSLog(@"[%@ pos:(%f,%f) impulse:(%f,%f)]", bullet, bullet.x,bullet.y, imp.x,imp.y);
+//     }
+// }
+
 // - (NSString*) description {
 //     return [NSString stringWithFormat:@"%@ bounds=%@",
 //             [super description], self.bounds];
index ba8af21..fe1d002 100644 (file)
@@ -62,9 +62,9 @@
 @synthesize shape = _shape;
 
 - (float) shapeCenterX {            return self.shape.anchorPoint.x; }
-- (void) setShapeCenterX:(float)x { self.shape.anchorPoint.x = x; }
+- (void)  setShapeCenterX:(float)x { self.shape.anchorPoint.x = x; }
 - (float) shapeCenterY {            return self.shape.anchorPoint.y; }
-- (void) setShapeCenterY:(float)y { self.shape.anchorPoint.y = y; }
+- (void)  setShapeCenterY:(float)y { self.shape.anchorPoint.y = y; }
 
 - (QQCooldown*) attackCooldown { return [self.cooldowns objectForKey:kCooldownAttack]; }
 - (void) setAttackCooldown:(QQCooldown*)newAttackCooldown { [self.cooldowns setObject:newAttackCooldown forKey:kCooldownAttack]; }
 - (QQBullet*) attackTowardPoint:(CGPoint)target {
     return [self attackToward:p2v(target)];
 }
-- (QQBullet*) attackToward:(Vec)target {
+- (QQBullet*) attackToward:(Vec)t {
+    QQLog(t);
     Vec pos = self.position;
+    QQLog(pos);
     
     // Touch's normal vector in local coords (rel unit origin)
-    Vec norm = -pos;
-    norm += target;
+    Vec norm = Vec(t.x-pos.x, t.y-pos.y);
     norm.Normalize();
     
     // Bullet starting position
-    float offset = 0.5f + MAX(self.shape.width, self.shape.height) * SQRT_TWO; // bullet_radius + tank_diagonal_length
-    Vec start = pos.Clone();
-    start += norm;
+    float offset = 0.01f + MAX(self.shape.width, self.shape.height) * SQRT_TWO; // bullet_radius + tank_diagonal_length
+    Vec start = norm.Clone();
     start *= offset;
+    start += pos;
     QQBullet* bullet = [[[QQBullet alloc] init:self x:start.x y:start.y towardX:norm.x y:norm.y] autorelease];
     
     // Bullet impulse vector
-    NSLog(@"[%@ pos:(%f,%f) impulse:(%f,%f)]", bullet, bullet.x,bullet.y, norm.x*50,norm.y*50);
+    NSLog(@"[%@ pos:(%f,%f) impulse:(%f,%f)]", bullet, bullet.x,bullet.y, norm.x*bullet.speed,norm.y*bullet.speed);
     return bullet;
 }
 
 
+//         // Touch's normal vector in local coords (rel unit origin)
+//         SPPoint* normVec = [[[touch locationInSpace:self.shape.parent] subtractPoint:self.shape.position] normalize];
+//         
+//         // Bullet starting position
+//         float offset = 7.5f + fmaxf(self.shape.width, self.shape.height) * 1.41421356237f; // bullet_radius + tank_diagonal_length
+//         SPPoint* start = [[self.shape.position addPoint:[normVec scaleBy:offset]] scaleBy:1.0f/PIXELS_PER_METER];
+//         QQBullet* bullet = [[[QQBullet alloc] init:self x:start.x y:start.y] autorelease];
+//         
+//         // Bullet impulse vector
+//         SPPoint* imp = [normVec scaleBy:50];
+//         [bullet applyLinearImpulseX:imp.x y:imp.y];
+//         // NSLog(@"[%@ pos:(%f,%f) impulse:(%f,%f)]", bullet, bullet.x,bullet.y, imp.x,imp.y);
 
 @end
index 459f73a..226c036 100644 (file)
@@ -1,4 +1,6 @@
 #include <Box2D/Box2D.h>
-#import "Sparrow.h"
 
-(CGPoint) CGPointFromB2Vec2(const b2Vec2 vec){ return CGPointMake(vec.x, vec.y); }
+
+NSString* NSStringFromB2Vec2(b2Vec2 vec) { return [NSString stringWithFormat:@"(%f,%f)", vec.x, vec.y]; }
+
+
index d5729fc..17e0403 100644 (file)
@@ -1,4 +1,7 @@
 #import "qq/util/QQLogging.h"
+#import <Box2D/Box2D.h>
+
+
 // Copyright (c) 2008-2010, Vincent Gable.
 // http://vincentgable.com
 //
@@ -38,6 +41,18 @@ static NSString* StringFromNSDecimalWithCurrentLocal(NSDecimal dcm) {
     return NSDecimalString(&dcm, [NSLocale currentLocale]);
 }
 
+// *** Tanks Additions *** //
+
+NSString* NSStringFromB2Vec2(b2Vec2 vec) {
+    return [NSString stringWithFormat:@"(%f,%f)", vec.x, vec.y];
+}
+
+
+
+
+
+// ***
+
 NSString* VTPG_DDToStringFromTypeAndValue(const char* typeCode, void* value) {
     return VTPG_DDToStringFromTypeAndValue(typeCode, (const void*)value);
 }
@@ -61,6 +76,7 @@ NSString* VTPG_DDToStringFromTypeAndValue(const char* typeCode, const void* valu
     IF_TYPE_MATCHES_INTERPRET_WITH(SEL,NSStringFromSelector);
     IF_TYPE_MATCHES_INTERPRET_WITH(BOOL,VTPGStringFromBoolOrCharValue);
     IF_TYPE_MATCHES_INTERPRET_WITH(NSDecimal,StringFromNSDecimalWithCurrentLocal);
+    IF_TYPE_MATCHES_INTERPRET_WITH(b2Vec2,NSStringFromB2Vec2);
     
     #define IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(typeToMatch,formatString) \
         if (strcmp(typeCode, @encode(typeToMatch)) == 0) \
index cfcf441..946f2f8 100644 (file)
@@ -25,9 +25,9 @@
 
 
 - (void) ccTouchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
-    for (UITouch* touch in touches){
+    for (UITouch* touch in touches) {
         CGPoint p = [touch locationInView: [touch view]];
-        QQLog(p);
+        // QQLog(p);
         CGPoint glP = [[CCDirector sharedDirector] convertToGL: p];
         QQLog(glP);
     }
index 2335528..1d89c8c 100644 (file)
                49507BCB13B4527200DB5F57 /* QQLogging.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49507BC813B4527200DB5F57 /* QQLogging.mm */; };
                49507BCE13B45E7600DB5F57 /* QQViewportLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 49507BCC13B45E7600DB5F57 /* QQViewportLayer.h */; };
                49507BCF13B45E7600DB5F57 /* QQViewportLayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 49507BCD13B45E7600DB5F57 /* QQViewportLayer.mm */; };
+               49507BD013B4675800DB5F57 /* QQPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 499F6602139D181400309DE4 /* QQPlayer.mm */; };
                496984B013A78BB50098352E /* pink.png in Resources */ = {isa = PBXBuildFile; fileRef = 496984AF13A78BB50098352E /* pink.png */; };
                496984B213A78CA90098352E /* white.png in Resources */ = {isa = PBXBuildFile; fileRef = 496984B113A78CA90098352E /* white.png */; };
                496984B513A78D1E0098352E /* 1x1-trans.png in Resources */ = {isa = PBXBuildFile; fileRef = 496984B313A78D1E0098352E /* 1x1-trans.png */; };
                                4978AD1E1396302E00930447 /* qq */,
                                49F2D9B113764666000B6B8C /* physics */,
                                49E8349D13812427007A6598 /* game */,
-                               49F2D9B213764666000B6B8C /* prefix.pch */,
                                49E67E10139B341600DDFC07 /* TanksMacros.h */,
                                4978AD131396139100930447 /* Tanks.h */,
                                49F2D9B013764666000B6B8C /* main.mm */,
+                               49F2D9B213764666000B6B8C /* prefix.pch */,
                        );
                        path = src;
                        sourceTree = "<group>";
                                4B91A15A138F644000EF4D7C /* QQPhysicsDebugView.mm in Sources */,
                                49DA67D5137847A7004841E9 /* QQWorld.mm in Sources */,
                                49E834AE13812427007A6598 /* QQGame.mm in Sources */,
+                               49507BD013B4675800DB5F57 /* QQPlayer.mm in Sources */,
                                49E834BF13812555007A6598 /* QQAppDelegate.mm in Sources */,
                                49E834C113812555007A6598 /* QQAppDelegate_iPad.mm in Sources */,
                                49E834C413812555007A6598 /* QQAppDelegate_iPhone.mm in Sources */,