From: dsc Date: Fri, 24 Jun 2011 07:25:09 +0000 (-0700) Subject: Collisions and bullets now work with cocos. X-Git-Url: http://git.less.ly:3516/?a=commitdiff_plain;h=HEAD;p=tanks-ios.git Collisions and bullets now work with cocos. --- diff --git a/src/Tanks.h b/src/Tanks.h index 347f4fa..c59482e 100644 --- a/src/Tanks.h +++ b/src/Tanks.h @@ -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 diff --git a/src/TanksMacros.h b/src/TanksMacros.h index c6bc397..b66018c 100644 --- a/src/TanksMacros.h +++ b/src/TanksMacros.h @@ -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 diff --git a/src/game/QQGame.mm b/src/game/QQGame.mm index 9ec8eb7..a8f6890 100644 --- a/src/game/QQGame.mm +++ b/src/game/QQGame.mm @@ -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); diff --git a/src/game/unit/QQActor.mm b/src/game/unit/QQActor.mm index 3119650..6a00e92 100644 --- a/src/game/unit/QQActor.mm +++ b/src/game/unit/QQActor.mm @@ -104,7 +104,7 @@ } - (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(); diff --git a/src/game/unit/QQBullet.mm b/src/game/unit/QQBullet.mm index fec3aeb..2e0a10c 100644 --- a/src/game/unit/QQBullet.mm +++ b/src/game/unit/QQBullet.mm @@ -1,3 +1,4 @@ +#import "cocos2d.h" #import #import "QQBullet.h" @@ -16,11 +17,11 @@ - (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); } diff --git a/src/game/unit/QQPlayer.h b/src/game/unit/QQPlayer.h index 0316255..7dbb65b 100644 --- a/src/game/unit/QQPlayer.h +++ b/src/game/unit/QQPlayer.h @@ -1,6 +1,8 @@ +#import "cocos2d.h" +#import "Tanks.h" #import "game/unit/QQUnit.h" -@interface QQPlayer : QQUnit { +@interface QQPlayer : QQUnit { } diff --git a/src/game/unit/QQPlayer.mm b/src/game/unit/QQPlayer.mm index 589186c..7263121 100644 --- a/src/game/unit/QQPlayer.mm +++ b/src/game/unit/QQPlayer.mm @@ -4,10 +4,6 @@ #import "game/unit/QQBullet.h" -// private interface -@interface QQPlayer () -- (void) onTouch:(SPTouchEvent*)event; -@end @@ -16,68 +12,80 @@ - (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]; diff --git a/src/game/unit/QQUnit.mm b/src/game/unit/QQUnit.mm index ba8af21..fe1d002 100644 --- a/src/game/unit/QQUnit.mm +++ b/src/game/unit/QQUnit.mm @@ -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]; } @@ -111,26 +111,39 @@ - (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 diff --git a/src/physics/QQPhysics.h b/src/physics/QQPhysics.h index 459f73a..226c036 100644 --- a/src/physics/QQPhysics.h +++ b/src/physics/QQPhysics.h @@ -1,4 +1,6 @@ #include -#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]; } + + diff --git a/src/qq/util/QQLogging.mm b/src/qq/util/QQLogging.mm index d5729fc..17e0403 100644 --- a/src/qq/util/QQLogging.mm +++ b/src/qq/util/QQLogging.mm @@ -1,4 +1,7 @@ #import "qq/util/QQLogging.h" +#import + + // 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) \ diff --git a/src/ui/game/QQViewportLayer.mm b/src/ui/game/QQViewportLayer.mm index cfcf441..946f2f8 100644 --- a/src/ui/game/QQViewportLayer.mm +++ b/src/ui/game/QQViewportLayer.mm @@ -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); } diff --git a/tanks.xcodeproj/project.pbxproj b/tanks.xcodeproj/project.pbxproj index 2335528..1d89c8c 100644 --- a/tanks.xcodeproj/project.pbxproj +++ b/tanks.xcodeproj/project.pbxproj @@ -217,6 +217,7 @@ 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 */; }; @@ -1226,10 +1227,10 @@ 4978AD1E1396302E00930447 /* qq */, 49F2D9B113764666000B6B8C /* physics */, 49E8349D13812427007A6598 /* game */, - 49F2D9B213764666000B6B8C /* prefix.pch */, 49E67E10139B341600DDFC07 /* TanksMacros.h */, 4978AD131396139100930447 /* Tanks.h */, 49F2D9B013764666000B6B8C /* main.mm */, + 49F2D9B213764666000B6B8C /* prefix.pch */, ); path = src; sourceTree = ""; @@ -1629,6 +1630,7 @@ 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 */,