Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- iOS OpenGL 2D rotating images (not screen)
- self.effect.transform.modelviewMatrix = GLKMatrix4Rotate(self.effect.transform.modelviewMatrix, radians(10), 0, 0, -1);
- //
- // SGGViewController.m
- // SimpleGLKitGame
- //
- // Created by Ray Wenderlich on 1/30/12.
- // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
- //
- #import "SGGViewController.h"
- #import "SGGSprite.h"
- @interface SGGViewController ()
- @property (strong, nonatomic) EAGLContext *context;
- @property (strong) GLKBaseEffect * effect;
- @property (strong) SGGSprite * player;
- @property (strong) NSMutableArray * children;
- @property (assign) float timeSinceLastSpawn;
- @end
- @implementation SGGViewController
- @synthesize effect = _effect;
- @synthesize context = _context;
- @synthesize player = _player;
- @synthesize children = _children;
- @synthesize timeSinceLastSpawn = _timeSinceLastSpawn;
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
- if (!self.context) {
- NSLog(@"Failed to create ES context");
- }
- GLKView *view = (GLKView *)self.view;
- view.context = self.context;
- [EAGLContext setCurrentContext:self.context];
- self.effect = [[GLKBaseEffect alloc] init];
- GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, 1024, 0, 768, -1, 1);
- self.effect.transform.projectionMatrix = projectionMatrix;
- self.player = [[SGGSprite alloc] initWithFile:@"2.png" effect:self.effect];
- self.player.position = GLKVector2Make(self.player.contentSize.width/2, 160);
- self.children = [NSMutableArray array];
- [self.children addObject:self.player];
- }
- - (void)addTarget {
- SGGSprite * target = [[SGGSprite alloc] initWithFile:@"Target.png" effect:self.effect];
- [self.children addObject:target];
- int minY = target.contentSize.height/2;
- int maxY = 320 - target.contentSize.height/2;
- int rangeY = maxY - minY;
- int actualY = (arc4random() % rangeY) + minY;
- target.position = GLKVector2Make(480 + (target.contentSize.width/2), actualY);
- int minVelocity = 480.0/4.0;
- int maxVelocity = 480.0/2.0;
- int rangeVelocity = maxVelocity - minVelocity;
- int actualVelocity = (arc4random() % rangeVelocity) + minVelocity;
- target.moveVelocity = GLKVector2Make(-actualVelocity, 0);
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- return UIInterfaceOrientationIsLandscape(interfaceOrientation);
- }
- #pragma mark - GLKViewDelegate
- static inline double radians (double degrees) {return degrees * M_PI/180;}
- - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
- glClearColor(1, 1, 1, 1);
- glClear(GL_COLOR_BUFFER_BIT);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- for (SGGSprite * sprite in self.children) {
- [sprite render];
- }
- }
- - (void)update {
- self.timeSinceLastSpawn += self.timeSinceLastUpdate;
- if (self.timeSinceLastSpawn > 1.0) {
- self.timeSinceLastSpawn = 0;
- [self addTarget];
- }
- for (SGGSprite * sprite in self.children) {
- [sprite update:self.timeSinceLastUpdate];
- }
- }
- @end
- //
- // SGGSprite.m
- // SimpleGLKitGame
- //
- // Created by Ray Wenderlich on 1/30/12.
- // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
- //
- #import "SGGSprite.h"
- typedef struct {
- CGPoint geometryVertex;
- CGPoint textureVertex;
- } TexturedVertex;
- typedef struct {
- TexturedVertex bl;
- TexturedVertex br;
- TexturedVertex tl;
- TexturedVertex tr;
- } TexturedQuad;
- @interface SGGSprite()
- @property (strong) GLKBaseEffect * effect;
- @property (assign) TexturedQuad quad;
- @property (strong) GLKTextureInfo * textureInfo;
- @end
- @implementation SGGSprite
- @synthesize position = _position;
- @synthesize contentSize = _contentSize;
- @synthesize effect = _effect;
- @synthesize quad = _quad;
- @synthesize textureInfo = _textureInfo;
- @synthesize moveVelocity = _moveVelocity;
- - (id)initWithFile:(NSString *)fileName effect:(GLKBaseEffect *)effect {
- if ((self = [super init])) {
- self.effect = effect;
- NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithBool:YES],
- GLKTextureLoaderOriginBottomLeft,
- nil];
- NSError * error;
- NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
- self.textureInfo = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error];
- if (self.textureInfo == nil) {
- NSLog(@"Error loading file: %@", [error localizedDescription]);
- return nil;
- }
- self.contentSize = CGSizeMake(self.textureInfo.width, self.textureInfo.height);
- TexturedQuad newQuad;
- newQuad.bl.geometryVertex = CGPointMake(0, 0);
- newQuad.br.geometryVertex = CGPointMake(self.textureInfo.width, 0);
- newQuad.tl.geometryVertex = CGPointMake(0, self.textureInfo.height);
- newQuad.tr.geometryVertex = CGPointMake(self.textureInfo.width, self.textureInfo.height);
- newQuad.bl.textureVertex = CGPointMake(0, 0);
- newQuad.br.textureVertex = CGPointMake(1, 0);
- newQuad.tl.textureVertex = CGPointMake(0, 1);
- newQuad.tr.textureVertex = CGPointMake(1, 1);
- self.quad = newQuad;
- }
- return self;
- }
- - (GLKMatrix4) modelMatrix {
- GLKMatrix4 modelMatrix = GLKMatrix4Identity;
- modelMatrix = GLKMatrix4Translate(modelMatrix, self.position.x, self.position.y, 0);
- modelMatrix = GLKMatrix4Translate(modelMatrix, -self.contentSize.width/2, -self.contentSize.height/2, 0);
- return modelMatrix;
- }
- static inline double radians (double degrees) {return degrees * M_PI/180;}
- - (void)render {
- self.effect.texture2d0.name = self.textureInfo.name;
- self.effect.texture2d0.enabled = YES;
- self.effect.transform.modelviewMatrix = self.modelMatrix;
- [self.effect prepareToDraw];
- long offset = (long)&_quad;
- glEnableVertexAttribArray(GLKVertexAttribPosition);
- glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
- glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex)));
- glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex)));
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- }
- - (void)update:(float)dt {
- GLKVector2 curMove = GLKVector2MultiplyScalar(self.moveVelocity, dt);
- self.position = GLKVector2Add(self.position, curMove);
- }
- @end
Add Comment
Please, Sign In to add comment