0

我有 2 个类 ThisWillWorkLayer 和 ThisWillWorkScene

ThisWillWorkLayer.m

#import "ThisWillWorkLayer.h"
#import "ThisWillWorkScene.h"


@implementation ThisWillWorkLayer


#define kSwipeScale 0.6

-(void) ccTouchMoved: (UITouch *)touch withEvent: (UIEvent *)event {


    CGPoint touchPoint = [touch locationInView:[touch view]];
    touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint];

    NSLog(@"Touch at x:%d y:%d",(int)touchPoint.x,(int)touchPoint.y);

    [ThisWillWorkScene rotate:touchPoint];
}


@end

每次滑动时都会执行 ccTouchMoved 函数。我的错误在函数的最后一行。 [ThisWillWorkScene rotate:touchPoint];它说旋转功能不存在。但是,如果您查看 ThisWillWorkScene 类,它似乎确实如此

ThisWillWorkScene.h

#import "CC3Scene.h"

/** A sample application-specific CC3Scene subclass.*/
@interface ThisWillWorkScene : CC3Scene {
    CGPoint lastPoint;
    CC3Camera* cam;

}

-(void) rotate: (CGPoint) touchPoint;

@end

ThisWillWorkScene.m

@implementation ThisWillWorkScene


#define kSwipeScale 0.6

-(void) rotate: (CGPoint) touchPoint{

    //CC3Camera* cam = self.activeCamera;

    // Get the direction and length of the movement since the last touch move event, in
    // 2D screen coordinates. The 2D rotation axis is perpendicular to this movement.
    CGPoint swipe2d = ccpSub(touchPoint, lastPoint);
    CGPoint axis2d = ccpPerp(swipe2d);

    // Project the 2D axis into a 3D axis by mapping the 2D X & Y screen coords
    // to the camera's rightDirection and upDirection, respectively.
    CC3Vector axis = CC3VectorAdd(CC3VectorScaleUniform(cam.rightDirection, axis2d.x),
                                  CC3VectorScaleUniform(cam.upDirection, axis2d.y));
    GLfloat angle = ccpLength(swipe2d) * kSwipeScale;

    // Rotate the cube under direct finger control, by directly rotating by the angle
    // and axis determined by the swipe. If the die cube is just to be directly controlled
    // by finger movement, and is not to freewheel, this is all we have to do.
    CC3MeshNode* helloTxt = (CC3MeshNode*)[self getNodeNamed: @"Hello"];
    [helloTxt rotateByAngle: angle aroundAxis: axis];

    lastPoint = touchPoint;

}


@end

所以我的问题是从 ThisWillWorkLayer 中调用旋转函数的正确方法是什么

4

3 回答 3

3

您的rotate:方法是实例方法,而不是方法。要调用实例方法,您需要拥有该对象的实例来调用它。

例如,此代码将适用于您当前的设置:

ThisWillWorkScene *scene = [[ThisWillWorkScene alloc] init]; //Get an instance, you might have to change this
[scene rotate: touchPoint];

如果您希望能够在对象上调用方法(我认为这不是您想要做的),那么您将更改

-(void) rotate: (CGPoint) touchPoint;

+(void) rotate: (CGPoint) touchPoint;
于 2013-06-07T16:32:15.410 回答
3

该方法被声明为实例方法。您需要在ThisWillWorkScene.

如果不需要将其设为实例方法,则将其声明为类方法。

//in .h
+(void) rotate: (CGPoint) touchPoint;// Notice the plus

//in .m
+(void) rotate: (CGPoint) touchPoint{
    //Code
}
于 2013-06-07T16:32:17.393 回答
2

[ThisWillWorkScene rotate:touchPoint]正在尝试在ThisWillWorkScene该类上调用实例方法。为此,您的rotate:方法需要使用+, 作为类方法定义,如下所示:

+ (void) rotate ...

根据您的rotate:方法的内容,它看起来好像是一个类方法。

如果您的意图是使用ThisWillWorkScene该类的实例,那么它看起来像:

ThisWillWorkScene *scene = [[ThisWillWorkScene] alloc] init];
[scene rotate:touchPoint];
于 2013-06-07T16:32:32.940 回答