IPhone Programming Version 2 Created by Nathan Magnus.

103
iPhone Programming Version 2 Created by Nathan Magnus

Transcript of IPhone Programming Version 2 Created by Nathan Magnus.

Page 1: IPhone Programming Version 2 Created by Nathan Magnus.

iPhone Programming

Version 2

Created by Nathan Magnus

Page 2: IPhone Programming Version 2 Created by Nathan Magnus.

Apple

• Your most useful resource is the Apple developer documentation. http://developer.apple.com/

Page 3: IPhone Programming Version 2 Created by Nathan Magnus.

Xcode IDE

• Apple provides an IDE for creating iPhone applications

• Xcode can also be used to create OSX applications

Page 4: IPhone Programming Version 2 Created by Nathan Magnus.

Xcode IDE

• Installation Download from http://

developer.apple.com/iphone/index.action• You will need to create an account if you do not

already have one

Mount by clicking on it in the download directory

Double click on iPhone SDK

Page 5: IPhone Programming Version 2 Created by Nathan Magnus.

iPhone Simulator

• Simulates an iPhone.• Can be rotated by 90° to the right or left

through the “Hardware” menu• Supports multiple touches (option and

option-shift)• Known bugs:

Cannot be rotated upside down When rotated there is a small area that will not

respond to touches

Page 6: IPhone Programming Version 2 Created by Nathan Magnus.

An IPhone Application

• Create an application that loads Google in a UIWebView

– The user enters a URL into the text field and when they click enter on the keyboard the UIWebView loads that address

Page 7: IPhone Programming Version 2 Created by Nathan Magnus.

Creating the Program

• Create a new View-Based application in Xcode– File -> New Project...– Select “View-Based Application” and click

“Choose...”– Name your project “webNav” and save

Page 8: IPhone Programming Version 2 Created by Nathan Magnus.

Program 1

• In the upper pane, double click on webNavViewController.xib– This will open the interface builder (IB)

Page 9: IPhone Programming Version 2 Created by Nathan Magnus.

Program 1

• Ensure the Library window is open (Tools-> Library)

Page 10: IPhone Programming Version 2 Created by Nathan Magnus.

Program 1

– Under Data View drag and drop a “Web View” onto the main view

Page 11: IPhone Programming Version 2 Created by Nathan Magnus.

Program 1

Page 12: IPhone Programming Version 2 Created by Nathan Magnus.

Program 1

• Click on webNavViewController.h in Xcode

Page 13: IPhone Programming Version 2 Created by Nathan Magnus.

• Add the following lines of code– Under “@interface webNavViewController :

UIViewController {“• Add “IBOutlet UIWebView *webView;”

– Under “}” before “@end”• Add “@property (nonatomic, retain) UIWebView

*webView;”

Program 1

Page 14: IPhone Programming Version 2 Created by Nathan Magnus.

• Return to the Interface Builder

• Click on the WebView in the main View

Program 1

Page 15: IPhone Programming Version 2 Created by Nathan Magnus.

• Ensure that the Connections Inspector is open (Tools -> Connections Inspector)

Program 1

Page 16: IPhone Programming Version 2 Created by Nathan Magnus.

• Click on the circle beside “New Referencing Outlet” and drag to “File’s Owner”

Program 1

Page 17: IPhone Programming Version 2 Created by Nathan Magnus.

• Select “webView” from the two options

Program 1

Page 18: IPhone Programming Version 2 Created by Nathan Magnus.

• Save the Interface Builder

• Double Click on webNavViewcontroller.m

Program 1

Page 19: IPhone Programming Version 2 Created by Nathan Magnus.

• Uncomment “-(void)viewDidLoad” function

Program 1

Page 20: IPhone Programming Version 2 Created by Nathan Magnus.

• Under [super viewDidLoad];– Create a NSURL

• NSURL *url = [NSURL URLWithString:@“http://www.google.ca”];

– The “@” makes the following string a NSString

– Create a NSURLRequest• NSURLRequest *request = [NSURLRequest

requestwithURL:url];

– Load the request• [webView loadRequest:request];

Program 1

Page 21: IPhone Programming Version 2 Created by Nathan Magnus.

Program 1

Page 22: IPhone Programming Version 2 Created by Nathan Magnus.

Program 1

• This is what the program should look like

Page 23: IPhone Programming Version 2 Created by Nathan Magnus.

Information

• Files (.m files can be renamed to .mm to allow Objective-C++): ProjectNameAppDelegate (.h and .m) - Creates

the window and view ProjectNameViewController (.h and .m) -

Controls user interaction with the view• viewDidLoad is called when the initial view loads

Page 24: IPhone Programming Version 2 Created by Nathan Magnus.

Create an application that has a UITextField, UILabel, UIButton and UIImageView– Screen begins with an image of a your

handsome/beautiful instructor (or a hated celebrity), a UITextField and a UIButton (with an appropriate title)

– The user enters a phrase into a UITextField. After they are done editing they can click on a UIButton. If the phrase they entered matches a certain phrase then the

image changes to an explosion and a label appears telling the user they just blew up the instructor.

If the phrase does not match, a message telling them to try again should be displayed.

Program 2

Page 25: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

• Steps:1. Find an image of your handsome/beautiful instructor

or a hated celebrity and save it to “Documents”2. Find an image of an explosion and save it to

“Documents”3. Create a new View-Based Application (call it

“Boom”4. Create the Interface using IB

1. Add a UILabel (found in Inputs & Values)2. Add a UIImageView (found in Data Views)3. Add a UITextField (found in Inputs & Values)

– Top half of screen due to onscreen keyboard4. Add a UIButton (found in Inputs & Values)

Page 26: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 27: IPhone Programming Version 2 Created by Nathan Magnus.

• Click on the Attributes Inspector tab (or Tools->Attributes Inspector)

Program 2

Page 28: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

• Select the button and add the title “Check Input”

Page 29: IPhone Programming Version 2 Created by Nathan Magnus.

• Navigate to your saved image using Finder

• Drag and drop your images into the “Resources” group of the Xcode project

Program 2

Page 30: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

• Select “Copy items into destination group’s folder (if needed) and ensure other settings are all defaults then click “Add”

Page 31: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 32: IPhone Programming Version 2 Created by Nathan Magnus.

• Click on the UIImageView in the IB and add your image in the Attributes Inspector

Program 2

Page 33: IPhone Programming Version 2 Created by Nathan Magnus.

• Open the Connection Inspector(Tools->Connections Inspector)

• Select each object on the interface builder (UITextField, UIButton, UIImageView, UILabel), drag to “File’s Owner” and select the appropriate option

• For the UITextField, click on the circle beside “delegate” and drag to “File’s Owner”

Program 2

Page 34: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 35: IPhone Programming Version 2 Created by Nathan Magnus.

• Add to BoomViewController.h– After “@interface BoomViewController :

UIViewController {“IBOutlet UILabel *label;

IBOutlet UITextField *input;

IBOutlet UIImageView *image;

IBOutlet UIButton *button;

Program 2

Page 36: IPhone Programming Version 2 Created by Nathan Magnus.

– After “}” before “@end”@property (nonatomic, retain) UILabel *label;

@property (nonatomic, retain) UITextField *input;

@property (nonatomic, retain) UIImageView *image;

@property (nonatomic, retain) UIButton *button;

-(BOOL)textFieldShouldReturn: (UITextField*)theTextField;

-(void)checkInput;

Program 2

Page 37: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 38: IPhone Programming Version 2 Created by Nathan Magnus.

• In BoomViewController.m– Uncomment the “–(void)viewDidLoad” method– Add after “[super viewDidLoad];”

[label setText:@“Enter the detonation code.”];

[button addTarget:self action:@selector(checkInput) forcontrolEvents:UIControlEventTouchUpInside];

Program 2

Page 39: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 40: IPhone Programming Version 2 Created by Nathan Magnus.

– Add after the “–(void)viewDidLoad” function-(BOOL)textFieldShouldReturn:

(UITextField*)theTextField {

[theTextField resignFirstResponder];

return YES;

}

Program 2

Page 41: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 42: IPhone Programming Version 2 Created by Nathan Magnus.

– Add after the “-(void)viewDidLoad” method-(void)checkInput {

NSString *userInput = [input text];if([userInput compare:@“Boom!”]= =NSOrderedSame){

[label setText:@“Your instructor went BOOM!”];[image setImage:[UIImage

imageNamed:@“explosion.jpg”]];}else{

[label setText:[NSString stringWithCString:“That is not the correct detonation code.”]];

[image setImage:[UIImage imageNamed:@“nathan.jpg”]];}

}

Program 2

Page 43: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 44: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

• Finished Product:

Page 45: IPhone Programming Version 2 Created by Nathan Magnus.

Program 2

Page 46: IPhone Programming Version 2 Created by Nathan Magnus.

NSArray

• Used to hold objects in an array• id is the default object type. All objects (NSUInteger,

NSString, etc) can be passed as an id• Initializing:

+(id)arrayWithObjects:(id)obj1, (id)obj2,…,nil - nil terminated list of objects to be added to the array

• Accessing: -(id)objectAtIndex:(NSUInteger)index - return the id of the

object at the given index

• Functions also exist for sorting, comparing and obtaining information about the array

Page 47: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C

• Variables:

Types include char, int, unsigned, float, double, BOOL

Constants declared using “const” keyword

declared by: type name;Ex) float floatVal; char character;• Conditional structures:

if(condition) { code } else if(condition) { code }

else (condition) { code }

switch (condition) {

case constant: code

break;

default

break;

}

== Equal

<= Less or Equal

>= Greater or Equal

< Less

> Greater

!= Not Equal

Comparison Operators

Page 48: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C

• Loops:

do { code } while(condition);

while(condition) { code }

for(initialize; condition; increment) { code }• Arrays:

Declaration:

• type name[sizeOfArray]; Initialize:

• type name[] = {value1, value2

• name[0]=value1; name[1]=value2;• Pointers:

Objects when using [Object method]; must be pointers or class name Initialize:

• type * name;

• nil/null - indicates no object at pointer but if used will not cause crash

Page 49: IPhone Programming Version 2 Created by Nathan Magnus.

Example of Objective-C

-(void)method{const unsigned loopAmt = 10;printf("Testing: ");for(unsigned i=0; i<loopAmt; i++)printf("%i...", i);

//prints “Testing:0…1…2…3…4…5…6…7…8…9…}

Page 50: IPhone Programming Version 2 Created by Nathan Magnus.

Exercise

1) Create a web navigation application with UITextField and UIWebView

• The user enters a URL into the text field and when they click enter on the keyboard the UIWebView loads that address

2) Create a simple game of Tic Tac Toe• Different status messages should be displayed on

the screen (most likely using a UILabel)

• When a game ends, nothing can be pushed except a button that asks if the user would like to play again

Page 51: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C Classes

Interface declared by “@interface ClassName:SuperClass” and ended by “@end”

SuperClass must always be “Object” or a subclass of “Object” (NSObject for the iPhone)

Implementation declared by “@implementation ClassName”

• All class methods are public• Instance variables are private by default• Classes can be extended with categories (no example

will be given)

Page 52: IPhone Programming Version 2 Created by Nathan Magnus.

Example of Classes

//tempClass inherits from NSObject@interface tempClass : NSObject {@privateint var; //private instance variable

}//function prototypes+(int)staticMethod;-(int)method;@end //end of interface

Page 53: IPhone Programming Version 2 Created by Nathan Magnus.

Example of Classes

@implementation tempClass+(int)staticMethod { var = 200;return var;

}-(int)method {var = 100; //assign a value to varreturn var; //return value of var

}@end

Page 54: IPhone Programming Version 2 Created by Nathan Magnus.

Objects

• Since every object must extend the NSObject class (or a subclass of it) to create a new object call the “alloc” method Ex) tempClass *tc = [tempClass alloc];

• If a method is static, it can be called without allocating the object Ex) [tempClass staticMethod];

Page 55: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C++

• Syntax almost identical to Objective-C

• Allows the use of C++ libraries and functions (ie: <iostream>, <fstream>)

• .h extension for header files and .mm extension for implementation files

Page 56: IPhone Programming Version 2 Created by Nathan Magnus.

Example of Objective-C++

#include <iostream>-(int)getInteger{

return 5;}int aFunction(id this2){

/*print the value returned by the getInteger function of the object passed to the method*/cout << [this2 getInteger];return 10;

}

Page 57: IPhone Programming Version 2 Created by Nathan Magnus.

Info.plst

• Info.plst file contains information about your project Application icon (must be included as a

resource) Main nib file

Page 58: IPhone Programming Version 2 Created by Nathan Magnus.

NSString

• Full list of functions and properties can be found at: “http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html”

• Creating: Add “@” in front of a regular string

ex) @“Hello World!” [NSString stringWithCString:“Hello World!”]; Many other methods including from file and URL

• Methods: length, lowercaseString, uppercaseString, capitalizedString,

compare:(NSString*)aString • NSOrderedAscending, NSOrderedSame,

NSOrderedDescending

Page 59: IPhone Programming Version 2 Created by Nathan Magnus.

Common Information

• hidden - whether the object is visible or not

Ex) label.hidden = NO;• userInteractionEnabled - whether the object will respond to a

touch or not

Ex) label.userInteractionEnabled = YES;• center - CGPoint representing the center of the object (CGPoint

is a struct with x and y fields)

Ex) cout << label.center.x;

Page 60: IPhone Programming Version 2 Created by Nathan Magnus.

UIButton

• Found in IB library under Inputs & Values• Setters:

setBackgroundImage:(UIImage*) forState:(UIControlState)

setImage:(UIImage*) forState:(UIControlState) setTitle:(NSString*) forState:(UIControlState)

• Properties: currentTitle, currentTitleColor, currentImage,

currentBackgroundImage, hidden

Ex) aButton.hidden = YES;

Page 61: IPhone Programming Version 2 Created by Nathan Magnus.

UIImageView

• Found in IB library under Data Views

• Initializers: initWithImage:(UIImage*)

• [UIImage imageNamed:(NSString*)name] is useful

• Properties: image, userInteractionEnabled, hidden

Page 62: IPhone Programming Version 2 Created by Nathan Magnus.

UITextView

• Found in IB library under Data Views• UITextAlignment - UITextAlignmentRight,

UITextAlignmentLeft, UITextAlignmentCenter.• UIColor allows allows for creation of custom

colors as well as presets such as greyColor, redColor, greenColor, etc

• Properties: text, font, textColor, editable, textAlignment, hidden

Page 63: IPhone Programming Version 2 Created by Nathan Magnus.

UITextField

• Found in IB library under Inputs & Values

• Properties: text, font, textColor, textAlignment, hidden

Page 64: IPhone Programming Version 2 Created by Nathan Magnus.

Closing the Keyboard

• Keyboard automatically displays on the lower half of the screen when a field that allows input is touched

• Keyboard does not automatically close Must set the delegate (via the IB connection manager window)

for the textView, textField or other object that brings up the keyboard to “File’s Owner”

//when return is touched on the keyboard, this is called (BOOL)textFieldShouldReturn: (UITextField*)theTextField

{ [theTextField resignFirstResponder]; return YES;

}

Page 65: IPhone Programming Version 2 Created by Nathan Magnus.

UILabel

• Found in IB library under Inputs & Values

• Properties: text, font, textColor, textAlignment, enabled,

adjustsFontSizeToFitWidth, minimumFontSize, numberOfLines, highlightedTextColor, hidden

Page 66: IPhone Programming Version 2 Created by Nathan Magnus.

NSURL/NSURLRequest

• NSURL Functions: URLWithString:(NSString*)string initWithString:(NSString*)string URLWithString:(NSString*)string

relativeToURL:(NSURL*)url initWithString:(NSString*)string

relativeToURL:(NSURL*)url

• NSURLRequest Functions: initWithURL:(NSURL*)url

Page 67: IPhone Programming Version 2 Created by Nathan Magnus.

UIWebView

• Found in IB library under Data Views

• Properties: canGoBack, canGoForward, loading

• Methods: goBack, goForward, stopLoading, reload,

loadRequest:(NSURLRequest*)request

Page 68: IPhone Programming Version 2 Created by Nathan Magnus.

Creation Without IB

All UI Objects can be created without using the IB Create a CGRect variable to hold the object using CGRectMake(x-offset, y-offset, width, height)

Ex) CGRect r = CGRectMake(20.0, 20.0, 100.0, 40.0); Allocate the memory for and initialize the object using

initWithFrame:

Ex) UILabel *label = [[UILabel alloc] initWithFrame:r]; Set object specific properties

Ex) [label setText:@“Label Created”]; Add to the appropriate view

Ex) [self addSubview:label];

Page 69: IPhone Programming Version 2 Created by Nathan Magnus.

Selectors

• Selectors are written into a table and used at runtime to reference a method

• Class methods and instance methods with the same name would be assigned the same selector

The @selector() directive allows the programmer to refer to a compiled selector rather than method name

• To define a selector use SELEx) SEL aSelector = @selector(toSelect);• Other methods can be used to get selector information

NSSelectorFromString(NSString) NSStringFromSelector(SEL)

Page 70: IPhone Programming Version 2 Created by Nathan Magnus.

Selectors

• Methods that use Selectors performSelector:(SEL) performSelector:(SEL) withObject:(id) performSelector:(SEL) withObject:(id)

withObject:(id)

Page 71: IPhone Programming Version 2 Created by Nathan Magnus.

Selector Example

-(void)method2:(int)i int2:(int)j{

//outputs “12” to the debug consolecout << [i intValue] << [j intValue];

}-(void)method{

NSNumber* i = [NSNumber numberWithInt:1];NSNumber* j = [NSNumber numberWithInt:2];SEL s = @selector(method2:int2:);[self performSelector:s withObject:i withObject:j];//outputs “method2:int2:” to debug consolecout << [NSStringFromSelector(s) cString];

}

Page 72: IPhone Programming Version 2 Created by Nathan Magnus.

Add a Target Method

• Can add an action to a UI object when it is touched [backButton addTarget:webView action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];

Page 73: IPhone Programming Version 2 Created by Nathan Magnus.

Multiple Views with IB

Multiple views in Interface Builder can be displayed and hidden by their “hidden” property

Multiple windows can be displayed and hidden by their “hidden” property

Page 74: IPhone Programming Version 2 Created by Nathan Magnus.

Touches

• Four functions can be overwritten (in EAGLView or ProjectNameViewController)

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event - Called when finger(s) touch the display

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event - Called when finger(s) are moved on the display

-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event - Called when fingers(s) are removed from the display

-(void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event - Called if the system interrupts your application

Page 75: IPhone Programming Version 2 Created by Nathan Magnus.

Using Touches

In order for information about multiple touches to be passed, must set “self.multipleTouchEnabled = YES;”

• The function’s parameters can be used to get information about the touches

[[touches allObjects] objectAtIndex:0] - will return the id of the first touch on the display. This id can be used to call the locationInView:self function

which returns a CGPoint struct (holds x and y coordinates)

Page 76: IPhone Programming Version 2 Created by Nathan Magnus.

Example of Multiple Touches

-(void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event{CGPoint touch;int touchCount = [[event allTouches] count];self.multipleTouchEnabled = YES;for(int i=0; i<touchCount; i++){

touch = [[[touches allObjects]objectAtIndex:i] locationInView:self];printf("Touch #%i at (%f,%f)\n", i+1, touch.x, touch.y); }

}

Page 77: IPhone Programming Version 2 Created by Nathan Magnus.

Orientation

• iPhone has built in accelerometer that can be used to determine orientation

• Need to turn orientation notifications on

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

Can access by accessing [UIDevice currentDevice].orientation 0 represents state unknown

(UIDeviceOrientationUnknown) 1 represent upright state in simulator

(UIDeviceOrientationPortrait) 3 represents landscape view with left side down

(UIDeviceOrientationLandscapeLeft) 4 represents landscape view with right side down

(UIDeviceOrientationLandscapeRight)

Page 78: IPhone Programming Version 2 Created by Nathan Magnus.

Exercise

• Create a program that draws 2 shapes. These shapes will move toward the new bottom of the screen if it is rotated.

Page 79: IPhone Programming Version 2 Created by Nathan Magnus.

Exercise

• Create a program that draws a textured shape in the middle of the screen If two fingers are moved in parallel the image

moves in the direction of the fingers’ movement

If two fingers move apart or towards each other the shape is enlarged or shrunk

Page 80: IPhone Programming Version 2 Created by Nathan Magnus.

Exercise

• Create a program that draws a shape. Every 0.2 seconds the object moves to right, left, up or down. Use touch events to control the direction that

the object moves

Page 81: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES Application

• Draw, rotate and move shapes• Change colors and sizes at run-time • Files (.m files can be renamed to .mm to allow Objective-C++)

EAGLView (.h and .m) - Already imports OpenGL ES library• -(void)drawView - is called every

animationInterval seconds• Other Functions already given include startAnimation,

stopAnimation, setAnimationInterval, setAnimationTimer, dealloc, createFramebuffer, destroyFramebuffer and initWithCoder

ProjectNameAppDelegate (.h and .m) - Creates the window and view

Page 82: IPhone Programming Version 2 Created by Nathan Magnus.

NSTimer

• Useful class that is frequently used to call a method periodically based on time

• Methods [NSTimer scheduledTimerWithTimeInterval:(float seconds) target:(id target) selector:@selector(method name) userInfo:nil repeats:(YES or NO)];

Page 83: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES

• Some important OpenGL ES functions glEnable(capability) and glDisable(capability) -

enable or disable the capabilities declared by a constant

• GL_TEXTURE_2D - allow textures to be mapped to 2D objects

• GL_LIGHTING - allow lighting to modify colors

• GL_FOG - blend a fog color into the post texturing color

• GL_BLEND - allows for transparency

Page 84: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES

glClientEnableState(capability) and glClientDisableState(capability) - enable and disable a capability

• GL_VERTEX_POINTER - vertices of an object are defined by an array of points

• GL_COLOR_POINTER - colors at vertices are defined by an array of points

• GL_TEXTURE_COORD_POINTER - map texture coordinates in an array to the texture

Page 85: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES

glTranslatef(x, y, z) - move the object on the coordinate plane by x, y and z

glRotatef(x, y, z) - rotate the object around the line defined by x, y and z

glDrawArrays(mode, first, count)• mode - the way to draw the object

GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_LINE_LOOP, GL_LINES

• first - the element in the array that represents the first point• count - the number of points in the array

Page 86: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES

glBlendFunc(sfactor, dfactor)• sfactor - specifies how RGBA source blending computed (use

GL_SRC_ALPHA)• dfactor - specifies how RGBA destination blending computed

(use GL_ONE_MINUS_SRC_ALPHA) glTexEnvf(target, pname, param) /

glTexEnvi(target,pname,param)• target - specifies the texture environment

(GL_TEXTURE_ENV)• pname - single valued texture environment parameter

(GL_TEXTURE_ENV_MODE)• param - symbolic constant (GL_DECAL)

Page 87: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES

glVertexPointer(dimensions, type, stride, vertexPointer)

glColorPointer(values, type, stride, colorPointer)

glColor4f(red, green, blue, alpha) / glColor4ub(red, green, blue, alpha)

glTexCoordPointer(dimensions, type, texturePointer)

glBindTexture(type, texture)

Page 88: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES

glMatrixMode(type) - the type of view being worked with

• GL_MODELVIEW - Position of the model relative to the screen

• GL_PROJECTION - View seen on the screen

glPushMatrix() - save the current view to a stack glPopMatrix() - retrieve the last view that was pushed

onto the stack glLoadIdentity() - replaces the current matrix with the

identity matrix (resets to defaults)

Page 89: IPhone Programming Version 2 Created by Nathan Magnus.

OpenGL ES

glOrthof(xMin, xMax, yMin, yMax, zMin, zMax) - set up the coordinate plan

• xMin - the lowest x value visible

• xMax - the highest x value visible

• yMin - the lowest y value visible

• yMax - the highest y value visible

• zMin - the lowest z value visible

• zMax - the highest z value visible

Page 90: IPhone Programming Version 2 Created by Nathan Magnus.

Load Textures

-(void)loadTexture:(NSString *)name intoLocation:(GLuint)location {CGImageRef textureImage = [UIImage imageNamed:name].CGImage;if (textureImage == nil) { //If the image doesn’t exist, print an error

NSLog(@"Failed to load texture image");return;

} NSInteger texWidth = CGImageGetWidth(textureImage); //get the widthNSInteger texHeight = CGImageGetHeight(textureImage); //get the heightGLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4);

CGContextRef textureContext = CGBitmapContextCreate(textureData,texWidth, texHeight,8, texWidth * 4, CGImageGetColorSpace (textureImage), kCGImageAlphaPremultipliedLast);CGContextTranslateCTM(textureContext, 0, texHeight);CGContextScaleCTM(textureContext, 1.0, -1.0);CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage);CGContextRelease(textureContext);glBindTexture(GL_TEXTURE_2D, location);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);free(textureData);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

}

Page 91: IPhone Programming Version 2 Created by Nathan Magnus.

glScale

• glScalef(GLfloat x, GLfloat y, GLfloat x)

• glScaled(GLdouble x, GLdouble y, GLdouble z) Scale the current view matrix by x, y and z

Page 92: IPhone Programming Version 2 Created by Nathan Magnus.

Example

float vertices[] ={1, 1,1, 0,0, 0,0, 1};glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glMatrixMode(GL_MODELVIEW);glPushMatrix();glTranslatef(5, 5, 0);glScalef(0.5, 0.5, 0);glVertexPointer(2, GL_FLOAT, 0, vertices);glEnableClientState(GL_VERTEX_ARRAY);glColor4ub(255, 255,51, 128);glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);glPopMatrix();glDisable(GL_BLEND);

Page 93: IPhone Programming Version 2 Created by Nathan Magnus.

Exercise

• Create an application that draws 2 shapes which will bounce off the sides of the screen and each other. Add a texture and vector physics to this shape if you need more of a challenge.

• Create an application that draws stars in the top half of the screen. Each star has a random rotation and location on the

screen. The star will change a combination of size, color, transparency or rotation periodically to simulate twinkling.

Page 94: IPhone Programming Version 2 Created by Nathan Magnus.

Memory Management

If instance created by [Object alloc] message or malloc(size) C function it will not be automatically released. Each of these calls (as well as every time retain is called) increments the retain count.

• Methods of releasing data (releasing the object reduces its retain count)

release – [ObjectVariable release]; autorelease - [ObjectVariable autorelease]; (if makes retain

count 0, ensures object is not going to be referenced. Generally object is released at end of function/current scope)

dealloc() is called when object’s retain count is 0 (similar to C++ destructor) Release all appropriate instance variables in dealloc

Page 95: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C Classes

Interface declared by “@interface ClassName:SuperClass” and ended by “@end”

SuperClass must always be “Object” or a subclass of “Object” (NSObject for the iPhone)

Implementation declared by “@implementation ClassName”

• All class methods are public• Instance variables are private by default• Classes can be extended with categories (example

later)

Page 96: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C

• Used as default language in xcode• Can run almost all c programs• .h extension for header files and .m extension for implementation files• Methods in same class referenced using self (similar to the “this”

keyword in c++)• Syntax:

Default return type is ‘id’

Message: [Object function:arg1 parameter2:arg2]; (similar to Object->function(arg1, arg2);)

-(returnType)function:(type)arg1 parameter2:(type)arg2 { code }

+(returnType)staticFunction:(type)arg1 parameter2:(type)arg2 { code }

Page 97: IPhone Programming Version 2 Created by Nathan Magnus.

Extending Classes

// A class extension@interface tempClass (Category)// New methods- (BOOL) tOrF;- (void) doSomething;@end@implementation tempClass(Category)- (BOOL) tOrF {…}- (void) doSomething{…}@end

Page 98: IPhone Programming Version 2 Created by Nathan Magnus.

Creating an iPhone Project

• “File->New Project…”

• Options we will discuss: OpenGL ES Application View-Based Application Tab Bar Application

Page 99: IPhone Programming Version 2 Created by Nathan Magnus.

Example of Objective-C

- (void)viewDidLoad

{

[super viewDidLoad];

[self fnWithInt];

}

Page 100: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C

• -(void)fnWithInt:(int)i int2:(int)j Method name - “fnWithInt:int2:”

• C can call Objective-C functions and Objective-C can call C functions.

• “self” can not be used from C functions Work around this by creating a global variable or

passing type id

Page 101: IPhone Programming Version 2 Created by Nathan Magnus.

Objective-C Called by C

-(int)getInteger{ return 5;

}int aFunction(id this2){/*print the value returned by the

getInteger function of the object passed to the method*/ printf("%i", [this2 getInteger]); return 10;}

Page 102: IPhone Programming Version 2 Created by Nathan Magnus.

Concepts/Directives

• @synthesize - used to automatically create missing getters (cd) and setters (setCd:) function for an instance variable

• Synthesized variables must have an associated @property ex) @property (retain) UIDevice cd;//creates 2 methods: “cd” and “setCd:(UIDevice*)newDevice”

@synthesize cd;…

//set cd to the current device using the synthesized method

[self setCd:[UIDevice currentDevice]];

Page 103: IPhone Programming Version 2 Created by Nathan Magnus.

@property

@property (parameters) type name: nonatomic - allows more than one thread to access a

getter/setter at a time atomic - only allow one thread to access a getter/setter at a

time (default) retain - setter should use “retain” in the variable assignment

(ex: var1 = [var2 retain];)

• Used for objects assign - setter will assign directly to the variable

• Used for basic variable types readonly - setter will not be generated