开发者

No touches being triggered!

OK, I guess my previous question wasn't in detail. I'm providing more details.

Before posting full source code I have to ask if my question: My question is Why the following program doesn't call touchesBegan, touchesMoved and touchesEnded? It used to work in previous iOS SDK. My current xcode version is 3.2.5

One comment: The following code dose call all touches if you run it against iPad Simulator. So that's very odd why iPhone simulator and the actual device don't respond to the problem.

main.m

#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
    [pool release];
    return retVal;
}

AppDelegate.h

#import <UIKit/UIKit.h>
@class GLView;

@interface AppDelegate : NSObject <UIApplicationDelegate> 
{
    UIWindow*   mp_window;
    GLView*     mp_viewController;
}

@end

AppDelegate.mm

#import "AppDelegate.h"
#import "GLView.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    CGRect screenBounds = [[UIScreen mainScreen] bounds];

    mp开发者_Go百科_window = [[UIWindow alloc] initWithFrame: screenBounds];
    mp_viewController = [[GLView alloc] initWithFrame: screenBounds];   


    [mp_window addSubview: mp_viewController];
    [mp_window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{}

- (void)applicationDidBecomeActive:(UIApplication *)application
{}

- (void)applicationWillTerminate:(UIApplication *)application
{}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Handle any background procedures not related to animation here.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Handle any foreground procedures not related to animation here.
}

- (void)dealloc
{
    [mp_viewController release];
    [mp_window release];

    [super dealloc];
}

@end

GLView.h

#import <OpenGLES/EAGL.h>
#import <QuartzCore/QuartzCore.h>

@interface GLView : UIView <UIAccelerometerDelegate>
{
@private
    EAGLContext*        mp_context;
}

- (void) gameLoop;

- (void) drawView: (float) interpolation;

- (void)touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event;
- (void)touchesMoved: (NSSet*) touches withEvent: (UIEvent*) event;
- (void)touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event;

- (void)accelerometer: (UIAccelerometer *) accelerometer 
        didAccelerate: (UIAcceleration *) acceleration;

@end

GLView.mm

#import "GLView.h"
#import <OpenGLES/ES2/gl.h>

@implementation GLView

+ (Class) layerClass
{
    return [CAEAGLLayer class];
}

- (id) initWithFrame: (CGRect) frame
{
    if (self = [super initWithFrame: frame]) 
    {
        CAEAGLLayer* eaglLayer = (CAEAGLLayer*) super.layer; 
        eaglLayer.opaque = YES; 

        EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES1;
        mp_context = [[EAGLContext alloc] initWithAPI: api];

        if (!mp_context || ![EAGLContext setCurrentContext: mp_context]) 
        {
            [self release];
            return nil;
        }

        [mp_context renderbufferStorage: GL_RENDERBUFFER 
                           fromDrawable: eaglLayer];

        //TODO: to setup the size of frame for render
        //////

        //acc
        [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(0.1f)];
        [[UIAccelerometer sharedAccelerometer] setDelegate:self];

        //multi - touch
        [self setUserInteractionEnabled:YES];
        [self setMultipleTouchEnabled:YES];


        [self performSelectorOnMainThread:@selector(gameLoop) 
                               withObject:nil waitUntilDone:NO];
    }

    return self;
}

- (void) gameLoop
{   
    while(1)
    {
            //Get all touches
        while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 
                     0.002f, 
                     TRUE) == kCFRunLoopRunHandledSource);
            //render scene
            [drawView 1.0f];
    }
}

- (void) drawView: (float) interpolation
{
    //TODO: adding render image here
    //NSLog(@"Render: %f", interpolation);
    [mp_context presentRenderbuffer: GL_RENDERBUFFER];
}

- (void) dealloc
{

    if ([EAGLContext currentContext] == mp_context)
        [EAGLContext setCurrentContext: nil];


    [mp_context release]; 
    //TODO: relese all objects here
    [super dealloc];    
}

- (void)touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event 
{
    int hash;
    CGPoint points;
    for(UITouch * touch in touches)
    {
        hash = [touch hash];
        points = [touch locationInView: self];
        NSLog(@"Touch Began: %d, %f, %f", hash, points.x, points.y);
    }
}


- (void)touchesMoved: (NSSet*) touches withEvent: (UIEvent*) event 
{
    int hash;
    CGPoint points;
    for(UITouch * touch in touches)
    {
        hash = [touch hash];
        points = [touch locationInView: self];
        NSLog(@"Touch Moved: %d, %f, %f", hash, points.x, points.y);
    }
}


- (void)touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event 
{
    int hash;
    CGPoint points;
    for(UITouch * touch in touches)
    {
        hash = [touch hash];
        points = [touch locationInView: self];
        NSLog(@"Touch Ended: %d, %f, %f", hash, points.x, points.y);
    }
}

- (void) accelerometer: (UIAccelerometer *) accelerometer 
         didAccelerate: (UIAcceleration *) acceleration 
{
    NSLog(@"Accelerometer: (%f, %f, %f)", 
          acceleration.x, 
          acceleration.y, 
          acceleration.z );
}

@end

This is only a test case. my main concern is why with new SDK, touches won't be called? Please don't tell me I have to use NSTimer or other timers. I did work before I install the new SDK. I'm just wondering if anyone can see any problem in that source code other than that.

Thanks, Memphis


I don't know with certainty what your problem is. I do note, however, that you don't have a view controller--while your UIApplicationDelegate subclass has a mp_viewController member, it's a UIView instead of a UIViewController. It is possible that this is the source of your problem.

I suggest adding a UIViewController associated with your view and assigning it to the application delegate's rootViewController property.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜