Никаких прикосновений срабатывает! - PullRequest
1 голос
/ 14 декабря 2010

ОК, я думаю, мой предыдущий вопрос не был подробно. Я предоставляю более подробную информацию.

Перед публикацией полного исходного кода я должен спросить, есть ли мой вопрос: Мой вопрос: почему следующая программа не вызывает прикосновения Beg, touchesMoved и touchesEnded? Раньше работал в предыдущем iOS SDK. Моя текущая версия xcode - 3.2.5

Один комментарий: следующий код дозирует все касания, если вы запускаете его на iPad Simulator. Поэтому очень странно, почему симулятор iPhone и само устройство не отвечают на проблему.

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_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

Это всего лишь контрольный пример. моя главная проблема в том, почему с новым SDK касания не будут вызываться? Пожалуйста, не говорите мне, что я должен использовать NSTimer или другие таймеры. Я работал, прежде чем установить новый SDK. Мне просто интересно, если кто-нибудь может увидеть какие-либо проблемы в этом исходном коде, кроме этого.

Спасибо, Мемфис

1 Ответ

0 голосов
/ 14 декабря 2010

Я не знаю точно, в чем ваша проблема. Однако я отмечаю, что у вас нет контроллера представления - хотя ваш подкласс UIApplicationDelegate имеет член mp_viewController, это UIView вместо UIViewController. Вполне возможно, что это источник вашей проблемы.

Я предлагаю добавить UIViewController, связанный с вашим представлением, и назначить его свойству rootViewController делегата приложения.

...