我在下面有一个图层HelloWorldLayer
,其中touch可以在任何地方使用,但我希望它只在触摸图层中的精灵时才能工作 - turtle
。
如果我尝试将self.isTouchEnabled = YES;
添加到CCTurtle
图层上,则说明
在对象类型CCTurtle上找不到属性
isTouchEnabled
我的输出如下:
2013-01-08 20:30:14.767 FlashToCocosARC [6746:d503] cocos2d:deallocing
2013-01-08 20:30:15.245 FlashToCocosARC [6746:d503]播放动画2
这是我的HelloWorldLayer代码:
#import "HelloWorldLayer.h"
#import "CCTurtle.h"
@implementation HelloWorldLayer
+(CCScene *) scene
{
CCScene *scene = [CCScene node];
HelloWorldLayer *layer = [HelloWorldLayer node];
[scene addChild: layer];
return scene;
}
-(id) init
{
if( (self=[super init])) {
turtle= [[CCTurtle alloc] init];
[turtle setPosition:ccp(300, 100)];
[self addChild:turtle];
///addChild:child z:z tag:aTag;
self.isTouchEnabled = YES;
turtle. tag=4;
//
}
return self;
}
//- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//{
// // Processing all touches for multi-touch support
// UITouch *touch = [touches anyObject];
// if ([[touch view] isKindOfClass:[turtle class]]) {
// NSLog(@"[touch view].tag = %d", [touch view].tag);
// [self toggleTurtle];
// }
//}
-(BOOL)containsTouch:(UITouch *)touch {
CGRect r=[turtle textureRect];
CGPoint p=[turtle convertTouchToNodeSpace:touch];
return CGRectContainsPoint(r, p );
}
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//////GENERAL TOUCH SCREEN
for (UITouch *touch in touches) {
CGPoint touchLocation = [touch locationInView:[touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
[self toggleTurtle];
/////
}
}
-(void) toggleTurtle
{
NSLog(@"playing walk animation2");
[turtle playAnimation:@"walk_in" loop:NO wait:YES];
}
@end
// hello world.h
#import "cocos2d.h"
#import "CCTurtle.h"
@interface HelloWorldLayer : CCLayer
{
CCTurtle *turtle;
}
+(CCScene *) scene;
@end
// CCturtle
#import <Foundation/Foundation.h>
#import "FTCCharacter.h"
@interface CCTurtle : FTCCharacter <FTCCharacterDelegate, CCTargetedTouchDelegate>
{
}
@end
我正在使用Cocos2D cocos2d v1.0.1(已启用arch),并正在ipad 4.3模拟器上进行测试。 感谢Natalie
我试图将触摸直接放入ccturtle.m中,因此它可以使用CCTargetedTouchDelegate处理自己的触摸,但是使用
CCturtle ///我将文件更改为此尝试以不同方式查找触摸区域...
- (CGRect)rect
{
CGSize s = [self.texture contentSize];
return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}
-(BOOL) didTouch: (UITouch*)touch {
return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
//return CGRectContainsPoint( [self rect], [self convertTouchToNodeSpaceAR: touch] );
}
-(BOOL) ccTouchBegan:(UITouch*)touch withEvent: (UIEvent*)event {
NSLog(@"attempting touch.");
if([self didTouch: touch]) {
return [self tsTouchBegan:touch withEvent: event];
}
return NO;
}
但仍然无法编译仍然会返回错误“属性'是TouchEnabled'未找到对象类型'CCTurtle *'
我真的不确定我能做些什么才能让它立即运行...并且真的需要让它工作(我想我可以制作隐形按钮,但是能够正确找到ccturtle会更好了解我做错了什么......希望有人能帮忙
答案 0 :(得分:1)
首先,我无法看到调用containsTouch:
方法的任何地方。这里有几个建议:
使用boundingBox
代替textureRect
来获取节点的本地矩形(在本例中为乌龟)。或者只是将containsTouch:
方法替换为您的乌龟类以填充此类。例如,如果您想让乌龟的触摸区域更大/更小,这可能会有所帮助。你只需要改变你的龟类中的一个小方法。
在ccTouchesBegan:withEvent:
方法中,只需检查每只乌龟是否被此触碰击中。然后,例如,您可以创建字典,将触摸作为键,将相应的乌龟数组作为值。然后你只需要在ccTouchesMoved:withEvent:
方法中更新所有海龟位置以移动触摸,并从ccTouchesEnded:withEvent:
和ccTouchCancelled:withEvent:方法中删除字典中的这些海龟数组。
答案 1 :(得分:0)
如果希望CCTurtle对象接受目标触摸,可以通过指定它符合CCTargetedTouchDelegate协议来实现。在你的CCTurtle @interface中,你声明它是这样的:
@interface CCTurtle : CCNode <CCTargetedTouchDelegate>
然后在实现中,告诉它接受触摸并实现ccTouch方法:
@implementation CCTurtle
-(id) init {
.
.
[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:1 swallowsTouches:YES];
return self;
}
-(void) onExit {
[[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
}
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
if (CGRectContainsPoint([self boundingBox], location] {
// some code here
}
}
-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { // code here }
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { // code here}
-(void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event { // code here}
答案 2 :(得分:0)
感谢Prototypical,问题解决了, 虽然CCTurtle是一个带有精灵类型的图层,但它是嵌套的精灵 这意味着cocos2d在为我创建正确的边界框时遇到了问题 “包含触摸方法”
所以有了一点魔力,他将“get full bounding box”方法与包含触摸方法相结合,以考虑精灵的子项,现在代码依赖于碰撞检测来处理触摸。 目前我很乐意为他回报一些漂亮的图标
但是想对所有有帮助的人表示感谢,并希望这个方法对于遇到同样问题的人来说非常方便!