2011-03-22 64 views
0

我正在通过tutorial 指导我们创建一个简单的游戏,用户可以在其中拍摄忍者。
在本教程中拍摄弹丸,已经实现follws:拍摄目标 - Cocos2D

- (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]]; 

} 

所有什么是混淆了有关这部分比例的计算及其purpose.Why我们要计算在上述情况下的比例还是让我这样说,比例是什么意思?

问候,

回答

2

如果你看一下在教程中的图表它可能会帮助你弄明白了一点。基本上,当用户触摸屏幕时,触摸发生的位置就是{x,y}。你也有忍者的位置。 使用这些点之间的偏移量(xoffyoff),可以创建一个直角三角形,该三角形给出两点之间的总距离(如其斜边)。你可以使用毕达哥拉斯定理来计算这个。

但是;在这种情况下,触摸点不用于“目的地值” - 相反,目标是忍者之星应该沿着触摸方向飞出,并继续移动,直到它离开屏幕。 (通常情况下,你可以计算触摸和忍者位置之间的差异作为一个向量,但我认为本教程试图引入Cocos2D函数,因此保持简单)。由于Ray想在忍者之星精灵上使用CCMoveTo,他不能直接提供向量/速度,所以必须给出一个独特的终点。然后这个星体精灵将直线移动直到达到这一点。

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

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

,以保证星将拍摄关闭屏幕,他可以使用相同的比例,以确保目标的y轴位置尽可能向上/因为它需要在飞行路线上保持相同的角度。

+0

你是完全正确的Davbryn。感谢您的回答。上面的代码的底线是要让点到达抛射物(武器)的位置。尽管点可能不在屏幕上。同样在这种情况下,从内存中释放弹丸非常重要,以避免内存泄漏。 – Nitish 2011-03-22 10:15:27

+0

美好的一天,关于上述话题,你如何改变它,使用户可以在各个方向上开枪?我的意思不只是在右侧,当用户触摸左侧/向下/向上时,射弹将在当前触摸上射击?谢谢 – NoobMe 2012-01-10 01:40:05