2011-03-22 71 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