我正在制作一款游戏,玩家画一条线,然后精灵应该跟随并在其上运行。我有一个可变数组和一个效果很好的绘制方法。但我无法找到移动精灵的方法。我尝试了不同的方法,但我无法让迭代器工作。
它应该通过遍历数组来工作。其中填充了先前存储的 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));
}
我之前做过这个,通过(到目前为止你所拥有的)创建一个数组 我的屏幕上有多个精灵,所以我也有 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)
。
按照延迟时间运行动作即可!
在数组或列表中记录路径的位置,并迭代它以沿着路径移动精灵。我在一个游戏中这样做是为了在玩家身后创建粒子轨迹。我使用了大小为 20 的数组,并按一定时间间隔对其进行迭代,用我的角色位置更新迭代器位置处的数组,然后将粒子效果移动到迭代器位置处数组中存储的位置加 1。
您需要使用起始位置为数组播种,以便没有空值,并且当您位于数组末尾时,您需要一个特殊情况,因为您不想从中读取越界位置,而是从 0 位置读取代码。