如何让精灵跟随轨迹?

问题描述 投票:0回答:2

我正在制作一款游戏,玩家画一条线,然后精灵应该跟随并在其上运行。我有一个可变数组和一个效果很好的绘制方法。但我无法找到移动精灵的方法。我尝试了不同的方法,但我无法让迭代器工作。

它应该通过遍历数组来工作。其中填充了先前存储的 CGPoint 位置。我尝试在

ccTouchedEnded
中移动精灵,但它突出显示
[toucharray objectAtIndex:0]
并说

将“id”传递给不兼容类型“CGPoint”(又名“struct CGPoint”)的参数

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  { 
    //remove objects each time the player makes a new path
    [toucharray removeAllObjects];
}

-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  {    
    UITouch *touch = [ touches anyObject];
    CGPoint new_location = [touch locationInView: [touch view]];
    new_location = [[CCDirector sharedDirector] convertToGL:new_location];

    CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
    oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
    oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];

    // add touches to the touch array 
   [toucharray addObject:NSStringFromCGPoint(new_location)];
    [toucharray addObject:NSStringFromCGPoint(oldTouchLocation)];

}

-(void)draw
{
    glEnable(GL_LINE_SMOOTH);

    for(int i = 0; i < [toucharray count]; i+=2)
    {
        CGPoint start = CGPointFromString([toucharray objectAtIndex:i]);
        CGPoint end = CGPointFromString([toucharray objectAtIndex:i+1]);
        ccDrawLine(start, end);
    }
}

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

  // here is the line I can't get to work to move the sprite

 _sprite.position = ccpAdd(ccpMult([toucharray objectAtIndex:0], progress),         ccpMult([toucharray objectAtIndex:0+1], 1-progress));

}
objective-c cocos2d-iphone touches
2个回答
2
投票

我之前做过这个,通过(到目前为止你所拥有的)创建一个数组 我的屏幕上有多个精灵,所以我也有 1 个定义“触摸精灵”

  • ontouchstart
    空数组并添加第一个点(起点)+将TouchedSprite设置为最接近起点的Sprite)
  • ontouchmove
    将点添加到数组
  • ontouchend
    (通过动作在精灵上运行数组(稍后再回到那个)

我遇到了一些问题,(1) 我一次只能控制 1 个精灵,(2) 绘制的线有太多点。

问题 1 的解决方案:

创建精灵的子类对象并像这样创建你的精灵。在该对象中创建一个数组(使其可通过 @property 和 @synthesize 访问),该数组将允许您放置绘制的路径点。同时创建一个名为“runPathAction”的公共方法。

因此,在 TouchStart 上,您将清理数组并设置所选的 spriteObject。 OnTouchMove 添加项目,OntouchEnd 将所选 spriteObject 的数组设置为本地数组,然后运行“runPathAction”方法。 (您可以将其传递给方法,但我喜欢这样做,以防万一我想访问数组)

问题 2 的解决方案:

我发现画线可以创造很多点。因此,我创建了一个名为“CanDraw”的布尔运算符和一个时间间隔为 0.1(您可以使用它)的时间表,并将 canDraw 设置为 YES 的方法。然后在 onTouchMove 中检查

canDraw == YES
,添加该点并设置
canDraw=NO;

这样您将有 0.1 秒的时间间隔来添加积分。不要忘记删除 TouchEnd 上的日程!

现在如何运行操作:

您需要稳定的速度,因此您需要设置一个速度变量。 遍历点数组并计算每个点之间的距离以创建总距离。 (PS 不要忘记第一个品脱是从数组中的 CurrentLocation 到 Point0)。

当您获得总距离后,您可以算出您应该在每一步的操作中设置多少延迟时间。 (如果你不这样做,你不知道延迟时间,如果你解决这个问题,你会得到奇怪的运动)。

创建一个方法,并检查数组的“计数”。如果计数 = 0 返回; (完成!进行清理或其他操作),否则运行一个动作序列,该动作序列最后会调用自身。 (计数检查将处理“中断”。

抓取数组中的 1 个项目

CGPoint p = (objectAtIndex:0);
并从数组中删除该项目
(removeAtIndex:0)

按照延迟时间运行动作即可!


1
投票

在数组或列表中记录路径的位置,并迭代它以沿着路径移动精灵。我在一个游戏中这样做是为了在玩家身后创建粒子轨迹。我使用了大小为 20 的数组,并按一定时间间隔对其进行迭代,用我的角色位置更新迭代器位置处的数组,然后将粒子效果移动到迭代器位置处数组中存储的位置加 1。

您需要使用起始位置为数组播种,以便没有空值,并且当您位于数组末尾时,您需要一个特殊情况,因为您不想从中读取越界位置,而是从 0 位置读取代码。

© www.soinside.com 2019 - 2024. All rights reserved.