// 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
#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
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);
}
- (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();
+#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;
b2FixtureDef fix;
fix.shape = &circle;
fix.restitution = 1.0f;
- fix.density = 0.1f;
+ fix.density = 1.0f;
fix.userData = self;
self.body->CreateFixture(&fix);
}
+#import "cocos2d.h"
+#import "Tanks.h"
#import "game/unit/QQUnit.h"
-@interface QQPlayer : QQUnit {
+@interface QQPlayer : QQUnit <CCStandardTouchDelegate> {
}
#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];
@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
#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]; }
+
+
#import "qq/util/QQLogging.h"
+#import <Box2D/Box2D.h>
+
+
// Copyright (c) 2008-2010, Vincent Gable.
// http://vincentgable.com
//
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);
}
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) \
- (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);
}
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 */,