gpt4 book ai didi

objective-c - 在 Cocos2d 中处理双击

转载 作者:行者123 更新时间:2023-11-29 04:58:50 28 4
gpt4 key购买 nike

这个问题太原始了,但我在过去的 8 个小时里一直在尝试,它正在消耗我的精力(还有信心水平:))

在我的类里面,我注册了“定向触摸”。

  [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:YES];

我想检查用户是否执行单击或双击。在 ccTouchBegan 方法中,首先使用 singleTap 获取触摸,然后使用 doubleTap 获取触摸。我在 Cocos2d 论坛之一中找到了一个非常有趣的解决方案。 (我现在找不到它..)

解决方案是这样的。

switch (touch.tapCount) {
case 2:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleSingleTouch:) object:singleTouchLocation];
// Handle Double Touch here
break;
case 1:


self.singleTapLocation = ccp(location.x,location.y);
self.singleTouchLocation = touch;

[self performSelector:@selector(handleSingleTouch:) withObject:touch afterDelay:0.3
];



break;
}

一切看起来都运行良好。本质上,您可以安排一个带有延迟的单点触摸处理程序,并查看它是否实际上是双击。如果是双击,则取消单击处理程序并执行双击逻辑。

但我的问题是,在单点触摸处理程序 (handleSingleTouch) 中,我将 CCSprite 添加到 UI。这个 Action 是行不通的。没有添加 Sprite 。 (虽然调用了该方法。)。事实上,这是有效的,如果我没有延迟地调用选择器,但有延迟,则不会添加 Sprite 。

我不是 Objective C 专家,所以,如果问题太原始,我深表歉意。

编辑1:原始thread .

编辑2:发布handleSingleTouch..仅相关代码。

-(void) handleSingleTouch:(UITouch * ) touch  {

CGPoint location = [touch locationInView: [touch view]];
CGPoint glLocation = [MainSceneLayer locationFromTouch:touch];
//Single tap
CCLOG(@"Single tap: Adding marker image");


if(zoomedOut) {

CGPoint globalCoordinates = [quadConvertor convertLocalToGlobal:location
inActiveQuadrant:activeQuadrant];



if( [self isTouchValidForSelectedItem:globalCoordinates] == Matched) {
[self addMarkerImages:glLocation];
} else if([self isTouchValidForSelectedItem:globalCoordinates] == NotMatched) {
[missedLabel stopAllActions];

for (ImageQuadrants* quad in quadrants) {
if(quad.quadrantNumber == activeQuadrant) {

missedLabel.position = ccp((quad.center.x * -1)+glLocation.x , (quad.center.y * -1)+glLocation.y);

//markers.position = ccp((quad.center.x * -1)+touchPosition.x , 320);


}

}


id blinkAction = [CCBlink actionWithDuration:1 blinks:3];
id makeInvible = [CCCallFunc actionWithTarget:self selector:@selector(makeInvisible:)];



id seq = [CCSequence actions:blinkAction, makeInvible, nil];

[missedLabel runAction:seq];

} else {

[alreadyAccountedLabel stopAllActions];

for (ImageQuadrants* quad in quadrants) {
if(quad.quadrantNumber == activeQuadrant) {

alreadyAccountedLabel.position = ccp((quad.center.x * -1)+glLocation.x , (quad.center.y * -1)+glLocation.y);

//markers.position = ccp((quad.center.x * -1)+touchPosition.x , 320);


}

}


id blinkAction = [CCBlink actionWithDuration:1 blinks:3];
id makeInvible = [CCCallFunc actionWithTarget:self selector:@selector(makeInvisible1:)];



id seq = [CCSequence actions:blinkAction, makeInvible, nil];

[alreadyAccountedLabel runAction:seq];


}

}


swipeStartPoint = [touch locationInView:touch.view];


}

最佳答案

我不知道这是否只是您问题中的拼写错误,但您的延迟方法都是错误的。没有 withDelay: 参数。它应该看起来像这样:

[self performSelector:@selector(handleSingleTouch:) withObject:touch afterDelay:0.1];

编辑:

因为您的问题很可能是触摸丢失。在调用延迟方法之前尝试[touch keep]。另一种方法是更改​​ handleSingleTouch: 方法以采用两个 float x 和 y 或 CCPoint 作为参数,而不是 UITouch。然后,您在延迟方法之前创建 float 并将它们传递到延迟方法中。这样您也可以避免因保留触摸而导致内存泄漏,因为很可能在调用延迟方法后无法释放它。

希望这有帮助

关于objective-c - 在 Cocos2d 中处理双击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7405904/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com