Collision Detection in Cocos2d game?(Cocos2d 游戏中的碰撞检测?)
问题描述
我正在尝试通过以下方式检测两个精灵的碰撞...但是当我尝试运行游戏时没有发生碰撞......什么我可能做错了吗?
i am trying to detect Collision of two sprites in the following way...but when i try to run the game no collision takes place.... what am i possibly doing wrong??
- (void)update:(ccTime)dt {
CGRect projectileRect = CGRectMake(projectile.position.x - (projectile.contentSize.width/2),
projectile.position.y - (projectile.contentSize.height/2),
projectile.contentSize.width,
projectile.contentSize.height);
//CGRectMake(0,220,320,50);
CGRect targetRects = CGRectMake(_monkey.position.x - (_monkey.contentSize.width/2),
_monkey.position.y - (_monkey.contentSize.height/2),
_monkey.contentSize.width,
_monkey.contentSize.height);
if (CGRectIntersectsRect(projectileRect, targetRects)) {
NSLog(@"ha ha Collision detected");
}
}
projectile 精灵从屏幕顶部到底部动画,monkey 精灵在底部从左到右动画 弹丸穿过猴子,但日志确实不被叫???
projectile sprite is animating from top of screen to the bottom and monkey sprite is animating from left to right at the bottom the projectile goes through the monkey but the log does not get called???
- (void)update:(ccTime)dt {
CGRect projectileRect = [projectile boundingBox];
CGRect targetRects = [_monkey boundingBox];
if (CGRectIntersectsRect(projectileRect, targetRects))
{
NSLog(@"ha ha Collision detected");
}
CGRect projectileRects = CGRectMake(projectile.position.x - (projectile.contentSize.width/2),
projectile.position.y - (projectile.contentSize.height/2),
projectile.contentSize.width,
projectile.contentSize.height);
CGRect targetRect = CGRectMake(_monkey.position.x - (_monkey.contentSize.width/2),
_monkey.position.y - (_monkey.contentSize.height/2),
_monkey.contentSize.width,
_monkey.contentSize.height);
if (CGRectIntersectsRect(projectileRects, targetRect)) {
NSLog(@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
}
}
-(void)spriteMoveFinished:(id)sender {
-(void)spriteMoveFinished:(id)sender {
//NSLog(@"spriteMoveFinished");
CCSprite *sprite = (CCSprite *)sender;
[self removeChild:sprite cleanup:YES];
if (sprite.tag == 1) {
[_targets removeObject:sprite];
} else if (sprite.tag == 2) {
[_projectiles removeObject:sprite];
}
}
-(void)addTarget {
-(void)addTarget {
projectile = [CCSprite spriteWithFile:@"egg.png" rect:CGRectMake(0, 0, 10, 10)];
projectile.position = ccp(_bear.position.x,_bear.position.y-20);
projectile.tag=2;
[self addChild:projectile];
CGPoint realDest = ccp(_bear.position.x, _bear.position.y - 380);
int minDuration = 2.0;
int maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (arc4random() % rangeDuration) + minDuration;
// Move projectile to actual endpoint
[projectile runAction:[CCSequence actions:
[CCMoveTo actionWithDuration:actualDuration position:realDest],
[CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)],
nil]];
// Add to projectiles array
projectile.tag = 2;
[_projectiles addObject:projectile];
}
-(void) registerWithTouchDispatcher
{
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
if(CGRectContainsPoint(CGRectMake(0,0,320,50),touchLocation))
{
if (![_walkMonkey isDone]) {
[_monkey runAction:_walkMonkey];
}
}
else {
}
return YES;
}
-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
if(CGRectContainsPoint(CGRectMake(0,0,320,50),touchLocation))
{
[_monkey stopAction:_walkMonkey];
}
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];
CGPoint translation = ccpSub(touchLocation, oldTouchLocation);
if (translation.x > 3) {
_monkey.flipX=YES;
}
else if (translation.x < -3){
_monkey.flipX=NO;
}
if(CGRectContainsPoint(CGRectMake(40,0,240,50),touchLocation))
{
CGPoint newPos = ccpAdd(translation,_monkey.position);
if(newPos.x >= 320 || newPos.x <= 20)
{
NSLog(@"monkey not walking");
}
else {
newPos.y = 100;
_monkey.position = newPos;
}
}
}
推荐答案
你应该使用内置功能:
CGRect projectileRect = [projectile boundingBox];
CGRect targetRects = [_monkey boundingBox];
if (CGRectIntersectsRect(projectileRect, targetRects))
{
NSLog(@"ha ha Collision detected");
}
boundingBox 方法考虑了更多的事情,例如,如果节点相对于其父节点定位.
The boundingBox method takes a couple more things into account, for example if the node is positioned relative to its parent.
另外请注意,在 Objective-C 中使用下划线作为变量前缀被认为是不好的做法.Apple 为其内部库保留带有前导下划线的变量名称.如果确实需要对实例变量进行分类,一种常见的方法是在它们后面加上下划线.
Also note that prefixing variables with an underscore is considered bad practice in Objective-C. Apple reserves variable names with leading underscores for their internal libraries. If you really need to classify instance variables, one common way is to suffix them with an underscore.
这篇关于Cocos2d 游戏中的碰撞检测?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Cocos2d 游戏中的碰撞检测?
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- Android viewpager检测滑动超出范围 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01