Cocos2d iphone 射击目标-Cocos2D

Cocos2d iphone 射击目标-Cocos2D,cocos2d-iphone,Cocos2d Iphone,我正在经历 这将指导我们创建一个简单的游戏,用户可以在其中射击忍者。 在本教程中,射弹的实现如下: - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { // Choose one of the touches to work with UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:[to

我正在经历 这将指导我们创建一个简单的游戏,用户可以在其中射击忍者。
在本教程中,射弹的实现如下:

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

}  
-(void)cctouchsesended:(NSSet*)接触事件:(UIEvent*)事件{
//选择要使用的触摸之一
UITouch*touch=[触摸任何对象];
CGPoint location=[touch locationInView:[touch view]];
location=[[CCDirector sharedDirector]convertToGL:location];
//设置投射物的初始位置
CGSize winSize=[[CCDirector sharedDirector]winSize];
CCSprite*Sprojection=[CCSprite spriteWithFile:@“sprojecte.png”
rect:CGRectMake(0,0,20,20)];
射弹位置=ccp(20,winSize高度/2);
//确定位置对射弹的偏移量
int offX=位置.x-投射物.position.x;
int offY=位置.y-投射物.position.y;
//如果我们正在向下射击或向后射击,请救出

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

然而,在这种情况下,触摸点不用于“目的地值”——而是目标是忍者之星应该沿着触摸的方向飞出,并继续移动直到离开屏幕

(通常,您会将触摸和忍者位置之间的差异作为向量进行计算,但我认为本教程试图引入Cocos2D函数,以便使其更简单)

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

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

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


为了确保星星从屏幕上发射出去,他可以使用相同的比率来确保目标的y位置尽可能地向上/向下,以使飞行路径保持在相同的角度。

你说得绝对正确,达夫林。谢谢你的回答。上述代码的底线是获得投射物(武器)的位置将移动。虽然该点可能不在屏幕上。在这种情况下,从内存中释放投射物以避免内存泄漏也很重要。您好,在上述主题上,您如何更改它以使用户可以向各个方向开火?我的意思是,当用户触到左侧/向下/向上时,投射物不仅会在右侧射击在当前的接触?谢谢