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.
精彩评论