射击目标 - Cocos2D

时间:2011-03-22 07:25:48

标签: cocos2d-iphone

我正在浏览tutorial  它引导我们创建一个用户可以拍摄忍者的简单游戏 在教程中,射击射弹已经实施为:

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  

// Choose one of the touches to work with  
UITouch *touch = [touches anyObject];  
CGPoint location = [touch locationInView:[touch view]];  
location = [[CCDirector sharedDirector] convertToGL:location];  

// Set up initial location of projectile  
CGSize winSize = [[CCDirector sharedDirector] winSize];  
CCSprite *projectile = [CCSprite spriteWithFile:@"Projectile.png"   
rect:CGRectMake(0, 0, 20, 20)];  
projectile.position = ccp(20, winSize.height/2);  

// Determine offset of location to projectile  
int offX = location.x - projectile.position.x;  
int offY = location.y - projectile.position.y;  

// Bail out if we are shooting down or backwards  
if (offX <= 0) return;  

// Ok to add now - we've double checked position  
[self addChild:projectile];  

// Determine where we wish to shoot the projectile to  
int realX = winSize.width + (projectile.contentSize.width/2);  
float ratio = (float) offY / (float) offX;  
int realY = (realX * ratio) + projectile.position.y;  
CGPoint realDest = ccp(realX, realY);  

// Determine the length of how far we're shooting  
int offRealX = realX - projectile.position.x;  
int offRealY = realY - projectile.position.y;  
float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));  
float velocity = 480/1; // 480pixels/1sec  
float realMoveDuration = length/velocity;  

// Move projectile to actual endpoint  
[projectile runAction:[CCSequence actions:  
[CCMoveTo actionWithDuration:realMoveDuration position:realDest],  
[CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)],  
nil]];  

}  

这一部分令人困惑的是比率的计算及其目的。为什么我们必须在上述情况下计算比率或让我这样说,比率意味着什么?

的问候,

1 个答案:

答案 0 :(得分:2)

如果你看一下教程中的图表,它可能有助于清理一些事情。基本上,当用户触摸屏幕时,您将获得触摸发生位置{x,y}。你也有忍者的位置。 使用这些点之间的偏移(xoffyoff),您可以创建一个直角三角形,它给出两点之间的总距离(作为其斜边)。您可以使用毕达哥拉斯定理来计算它。

然而;在这种情况下,触摸点不用于“目标值” - 相反,目标是忍者星应该在触摸方向上飞出,并继续移动直到它离开屏幕。

(通常情况下,您可以计算触摸和忍者位置之间的差异作为向量,但我认为教程正在尝试引入Cocos2D函数,因此保持简单)。

由于Ray想在忍者星精灵上使用CCMoveTo,他无法直接提供矢量/速度,因此必须提供一个独特的端点。然后,星形精灵将以直线移动,直到达到这一点。

因此,在这种情况下,比率是较小三角形的宽度与较小三角形(触摸的忍者)的高度的比率。当他将射弹的目标x位置移动到屏幕边缘时

int realX = winSize.width + (projectile.contentSize.width/2);

为了确保星星能够从屏幕上射击,他可以使用相同的比率来确保目标的y位置与飞行路径保持相同角度所需的距离一样远/向上。