æãåèªããHabralyudiãžã®ãæšæ¶ïŒ
å°ãåãæ°ããä»äºãæ¢ããŠããéã«ã
ZeptoLabããéåžžã«èå³æ·±ããã¹ãã¿ã¹ã¯ã
åãåããŸãããCocos2dãBox2dãªã©ã®ãµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããã«ãã€ãŸããã¯ãªãŒã³ãªã
OpenGLã§iOSåãã®ã¢ã«ã«ãã€ããäœæã
ãŸã ãããã¯ç§ã«ãšã£ãŠéåžžã«èå³æ·±ãããã§ããã ãšããã§ãHabréã§ã®ãã®ã¿ã¹ã¯ã«ã€ããŠ
㯠ããã§ã«
å ±åã ãããã«
å ±åäŒãæºåããŸããã ã ãããç§ã¯éåœã«ææŠããã°ã©ãã£ã«ã«ã¢ãŒãã§Vasikã䜿ã£ãŠåŠæ ¡ã§ç·Žç¿ããåŸã«åããŠgamedevãåãäžããŸããïŒ
OpenGLã®ç¥èã¯ãã§ã«ããçšåºŠãããŸããããéåžžã«è¡šé¢çãªããšãæ確ã«ããŸãã ç§ãã¡ã¯ããããã»ãšãã©ãŸã£ãããªãã£ããšèšãããšãã§ããŸããç§ã¯ãã¥ãŒããŒããšã¯äœããç¥ã£ãŠããŠãããã«ããã€ãã®ã¹ãã©ã€ãããããŸããå€æãããªãã¯ã¹ããããŸã...ãããã£ãŠããã®èšäºã¯ã
çŽç²ãªOpenGLã§iOSçšã®ã·ã³ãã«ãªã²ãŒã ãæžãæ¹æ³åœŒãç¥ããã«ã ãããããããã¯é·ãããŸãã
äžè¬çã«ãã10æéã®éçºãšã2æéã®èªæžã§ãããã©ã®ããã«è¡ã£ããã«èå³ãããå Žåã¯ãç«ããé¡ãããŸãã ïŒæ³šæïŒããããã®ã³ãŒãïŒå°ããªåçïŒæåŸã«githubãšãªã©ãã¯ã¹ãããªãžã®ãªã³ã¯ïŒïŒ
æ£çŽã«ãªããŸãã Image_to_attract_attentionâ¢ã¯ãç§ã«èµ·ãã£ãããšã®ã¹ã¯ãªãŒã³ã·ã§ããã§ã¯ãããŸããã ãããŠããããç§ã«èµ·ãã£ãããšã§ãïŒ
ãã®ããŸãããèš±ããŠãã ãããã§ãããªãã¯ç§ã®èšäºã«ãŸã èå³ããããŸãããïŒ ïŒ
æ°ãããã¯ãããžãŒã䜿çšããããã°ã©ã ã®äœæã¯ã©ã®ããã«éå§ããŸããïŒ ããã§ããããã¥ã¡ã³ããäŸãèšäºãèªãããšããïŒãŸããããªãã®ç®ã®åã®ãããªãã®ã§ãïŒã Googleã«æ°å座ã£ãåŸã
çŽ æŽãããèšäºãçºèŠãããŸããïŒèè
Ray WenderlichïŒãç°¡åãªããã¡ããäœæããããã»ã¹ã詳现ã«èª¿ã¹ãŸããã ããã§ãå¿
èŠã«å¿ããŠãç§ã®èšäºãéããŠRayã®èšäºãèªã¿å§ããããšãã§ããŸããããŸã ã¢ã«ã«ãã€ããšæ¯åœèªã§ã®èª¬æã®ããã«æ¥ã人ã®ããã«ã話ãç¶ããŸãã
æåã«ãã²ãŒã çšã®ç©ºã®ãããžã§ã¯ããäœæããŸãã Xcodeã§ã[
ãã¡ã€ã« ]
-> [æ°èŠ ]
-> [ãããžã§ã¯ã... ]ãã¯ãªãã¯ãã
iOSãã³ãã¬ãŒã
->ã¢ããªã±ãŒã·ã§ã³-> OpenGLã²ãŒã ãéžæããŸãã å人çã«ã¯ãARCã䜿çšããStoryBoardã䜿çšããªããããžã§ã¯ããéžæããŸããããèªè
ã®çãããã奜ããªããã«èªç±ã«å®è¡ã§ããŸãã ããŠããããžã§ã¯ããäœæãããŸãããããã«[å®è¡]ãæŒããŠãå転ãããã¥ãŒãã楜ããããšãã§ããŸãã ããããããã¯ãŸãã«ç§ãã¡ãããããããšã§ã¯ãªãã®ã§ããã³ãã¬ãŒããæ¿å
¥ããã»ãšãã©ãã¹ãŠãåé€ããå¿
èŠãªãã®ã ããæ®ããŸãã ãŸããè¿œå ãããã·ã§ãŒããŒãåé€ããViewController.mãããã¹ãŠã®åæãš
interface ViewController ()
åããã°ããŒãã«å€æ°ãåé€ã
loadShaders, compileShader:type:file:, linkProgram:, validateProgram:
ã·ã§ãŒããŒã¯äœ¿çšããŸããã ãã¡ãããæ¹æ³ãšçç±ãããã£ãŠããã°äœ¿çšã§ããŸãããç§ã¯ãããæ°ã«ããŸããã§ãã=ïŒã
次ã«ãæ®ãã®ãã¹ãŠã®ã¡ãœããããäœåãªãã®ããã¹ãŠæšãŠãŸãã
setupGL
ãš
tearDownGL
ãèŠãŠã¿ãŸãããã
- (void)setupGL { [EAGLContextsetCurrentContext:self.context]; self.effect = [[GLKBaseEffectalloc] init]; } - (void)tearDownGL { [EAGLContextsetCurrentContext:self.context]; self.effect = nil; }
次ã ããªããã£ãã¢ãŒããã¯ãã£ã§ããªããã£ãã²ãŒã ãäœæãããããViewControllerã§ã²ãŒã å
šäœãå¶åŸ¡ã§ããŸãã å奜çãªæ¹æ³ã§ã¯ãç¹å®ã®GameControllerãäœæããããããã¹ãŠã®æ©èœãå²ãåœãŠãå¿
èŠããããŸãããä»ã®ãšããã¯ç®¡çããŸãã ãããã£ãŠãViewControllerã«ãã®ãããªããããã£ãšã¡ãœãããè¿œå ããŸãã
#define kGameStateNone 0 #define kGameStateLose 1 #define kGameStateWon 2 @property (assign) int gameState; // see kGameState... @property (assign) BOOL gameRunning; - (void)loadBricks; - (void)startGame; - (void)endGameWithWin:(BOOL)win;
圌ãã責任ãè² ããã®-ãããŠãã³ã¡ã³ãã¯æ確ã§ã¯ãããŸããã ããŠãä»ãã²ãŒã ã®ããžãã¯ãããæ£ç¢ºã«ã¯ããã°ã©ã ã®ããžãã¯ã«ã€ããŠèãããšãã§ãã äœãã©ã®ããã«è¡ããŸããïŒ ã©ã®ãªããžã§ã¯ãããããŸããïŒ ããã®ããã«äœãããå¿
èŠããããŸããïŒ
ããããã®è³ªåãã¯ãã ããããåçŽãªèãïŒããã³ããã€ãã®
ã¹ãã©ã€ãããããšããç¥èïŒã䜿çšããŠããã®ã¢ãã«ã«å°éããŸãããã¬ãŒã€ãŒãå¶åŸ¡ãããããããããããç Žå£ããå¿
èŠãããã¬ã³ã¬ãããããã¹ãŠãè·³ãè¿ããŠã¬ã³ã¬ãç Žå£ããããŒã«ããããŸãã ããã«ãèæ¯ããããã¡ãã¥ãŒããããŸã-ã²ãŒã ãèµ·åããŠããã®çµæïŒåã¡è² ãïŒã確èªã§ããŸãã ç»é¢ã«è¡šç€ºããããã¹ãŠã®ãã®ã¯ãã·ã¹ãã ã®ãŠã£ã³ããŠãªã©ãã¬ã³ããªã³ã°ã®åºæ¬ãªããžã§ã¯ãã§ããã¹ãã©ã€ãã䜿çšããŠæç»ãããŸãã ããŠããŸãã¯ãŠã£ã³ããŠå
ã®ãã¿ã³ã 座æšããµã€ãºãæç»ããç»åãªã©ãããŸããŸãªå±æ§ãèšå®ã§ããŸãã ä»åŸãåãã®é床ãšæ¹åãè¿œå ããŸãã ããŠããããã®ããããã£ãçšæããXcodeã§âNã倧èã«æŒããŠãã ããïŒ
NSObjectããç¶æ¿ããæ°ããã¯ã©ã¹ãäœæããŠãGameSpriteãšåŒã³ãŸãããã ãããŠããã®ãããªããããã£ãšã¡ãœãããè¿œå ããŸãïŒ
@interface GameSprite : NSObject - (id)initWithTexture:(GLKTextureInfo *)textureInfo effect:(GLKBaseEffect *)effect; - (id)initWithImage:(UIImage *)image effect:(GLKBaseEffect *)effect; - (void)render; - (void)update:(float)dt; - (CGRect)boundingRect; @property (assign) GLKVector2 position; @property (assign) CGSize contentSize; @property (assign) GLKVector2 moveVelocity; // points/sec @end
å®éã«ã¯ãç»åãŸãã¯ãã¯ã¹ãã£ã«åºã¥ããŠã¹ãã©ã€ããäœæããããããæç»ããæéã«å¿ããŠæŽæ°ããå¢çç·ãååŸããããšãã§ããŸãã ãŸãããã®äœçœ®ããµã€ãºãé床ãå°ããŠååŸããŸãã ããããã¹ãã©ã€ãã®å®è£
ã§ã¯ã楜ãã¿ãå§ãŸããŸãïŒ é ç¹ãšåè§åœ¢ãå¿
èŠã§ãã ããã¯äœã§ãã åçŽãªå Žåãé ç¹ã¯ç©ºéå
ã®ãã€ã³ãã§ãããã¯ã¯ããã¯4ã€ã®é ç¹ã®ã³ã¬ã¯ã·ã§ã³ã§ãã ããã«ãVertextã«ã¯ãã¹ãã©ã€ãèªäœãšãã®ãã¯ã¹ãã£ã®2ã€ã®ãã€ã³ããå®éã«å«ãŸããŠããŸãã 察å¿ããæ§é ã宣èšããŸãã
typedef struct { CGPoint geometryVertex; CGPoint textureVertex; } TexturedVertex; typedef struct { TexturedVertex bl; TexturedVertex br; TexturedVertex tl; TexturedVertex tr; } TexturedQuad;
ãã®å Žåã次ã®æ©èœãèæ
®ããå¿
èŠããããŸãããã¯ã¹ãã£åº§æšã¯æ£èŠåãããŸããã€ãŸããåžžã«0ã1ã®ç¯å²ã§å€åããŸããã¹ãã©ã€ãã§ãã¯ã¹ãã£ãæç»ããã«ã¯ãã®ã¯ã¯ãããå¿
èŠãªã®ã§ãGameSpriteã¯ã©ã¹ã§ã¯ãã®ãããªãã©ã€ããŒãããããã£ã宣èšããŸãïŒ
@interface GameSprite() @property (strong) GLKBaseEffect *effect; @property (assign) TexturedQuad quad; @property (strong) GLKTextureInfo *textureInfo; - (void)initQuadAndSize; @end
ãããã£ãŠãå¹æãããããã¯ã¹ãã£æ
å ±ã¯åãæ¹æ³ã§ããããã£ã«æ ŒçŽãããŸããããããªãã¯ã§ã¯ãããŸããã ããŠãã¹ãã©ã€ãã®åæåã®å®è£
ãéå§ã§ããŸãã
- (id)initWithTexture:(GLKTextureInfo *)textureInfo effect:(GLKBaseEffect *)effect { if ((self = [super init])) { self.effect = effect; self.textureInfo = textureInfo; if (self.textureInfo == nil) { NSLog(@"Error loading texture! Texture info is nil!"); return nil; } [self initQuadAndSize]; } return self; } - (id)initWithImage:(UIImage *)image effect:(GLKBaseEffect *)effect { if ((self = [super init])) { self.effect = effect; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], GLKTextureLoaderOriginBottomLeft, nil]; NSError *error; self.textureInfo = [GLKTextureLoader textureWithCGImage:image.CGImage options:options error:&error]; if (self.textureInfo == nil) { NSLog(@"Error loading image: %@", [error localizedDescription]); return nil; } [self initQuadAndSize]; } return self; } - (void)initQuadAndSize { 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; }
ããªãããŒãªããšã¯ãããŸãããç»åãããã¯ã¹ãã£ãå²ãåœãŠããèªã¿èŸŒãã ããã¯ã¯ãããå²ãåœãŠãã ãã§ãã ããã§ã¯ã4ã€ã®é ç¹ã®ããããã«ã€ããŠããžãªã¡ããªãšãã¯ã¹ãã£ã®åº§æšãç°ãªãåäœã§èšå®ãããŠããããšãããããŸãã
ããã§ã¯ãæãèå³æ·±ãéšåã«ç§»ããŸããã-ã¹ãã©ã€ãã®ã¬ã³ããªã³ã°ã§ãããã®ããã«
render
ã¡ãœããã責任ãè² ããŸãïŒ
- (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); }
ããã§ããšãã§ã¯ããä»ããŠã¬ã³ããªã³ã°ããããã®ãã¯ã¹ãã£ãæºåãïŒå€æè¡åã«ã€ããŠ-å°ãåŸã§ããã®è¡ãèªããŸã§ïŒãå¿
èŠãªOpenGLãã©ã¡ãŒã¿ãŒïŒäœçœ®ãšãã¯ã¹ãã£ïŒããªã³ã«ããå·§åŠãªå€æã䜿çšããŠã¯ã¯ãããOpenGLã«è»¢éããæåŸã«æç»ããŸãïŒ ãã¹ãŠã¯åçŽã«æããŸããããããã®è¡ãè¡ãããšã®è©³çŽ°ãªèª¬æã¯ãã®èšäºã®ç¯å²ãè¶
ããŠããŸããèªè
ã®
ã¿ãªãã ãããã¥ã¡ã³ããŒã·ã§ã³ïŒ
glVertexAttribPointerããã³
glDrawArrays ïŒã«ãéãããŸãã
次ã«ã座æšãå転ãã¹ã±ãŒãªã³ã°ãªã©ã®ãã¹ãŠã«è²¬ä»»ãæã€å€æãããªãã¯ã¹ã«ç®ãåããŸãã ããããä»ã®ãšããã¯ãã¹ãã©ã€ããéåå Žã®ç®çã®éšåã«ç§»åããã ãã§ããã®ã§ãå§ããŸãããã
- (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; }
ããã§ãããã¹ãŠãç°¡åã§ããIdentityãããªãã¯ã¹ïŒäœãããªãIDãããªãã¯ã¹ïŒãååŸããself.positionã®åº§æšã®åç¹ãå€æããŠãããã¹ãã©ã€ãã®äžå€®ã«ç§»åããŸãã ããã¯ãã¹ãã©ã€ãã®æãæäœãããšãã«éåžžã«äŸ¿å©ã§ãã
update:
çšã®ã¹ã¿ããäœæããããæåã®ã¹ãã©ã€ããäœæãããªãœãŒã¹ããç»åãããŒãã§ããŸãã ãããŠãViewControllerã§ãããæããŸãïŒ
- (void)viewDidLoad { [super viewDidLoad]; self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; if (!self.context) { NSLog(@"Failed to create ES context"); } [self setupGL]; GLKView *view = (GLKView *)self.view; view.context = self.context; GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, 320, 0, 480, -1024, 1024); self.effect.transform.projectionMatrix = projectionMatrix;
ãŸããæªããªãïŒ çŸåšãç§ãã¡ã®ç«¶æå Žã«1ã€ã®çµµãæãããŠããŸãã ã¯ããç§ãã¡ã¯å人ã«é»è©±ããŠãã»ãšãã©ã²ãŒã ãæžããããšãèªæ
¢ã§ããŸãïŒ =ïŒ
ããããå®éã«ã¯ãåã¶ã«ã¯ææå°æ©ã§ãã ãŸã 1ã€ã®ã¹ãã©ã€ããããã移åããŸããã ãšããããå®å
šã«åé€ããŠãããšãã°ãäžè¬çã«å¿
èŠãªã¹ãã©ã€ããç¹å®ãããªã©ãäœãé¢çœãããšãããŸãã ãŸããå°ãã 第äºã«ãããŒã«ã 第äžã«ãã¬ã³ã¬çšã®ã¹ãã©ã€ãã®æã ä»ã«äœãïŒ ããããã£ãšèæ¯ã ãããŠãŸã-ã¡ãã¥ãŒïŒ ãããŠããããè¡ãæ¹æ³ã¯ïŒ æãããããã®ã¹ãã©ã€ãããåã£ããç¢æçšã®ã¹ãã©ã€ããã倱ããããç¢æçšã®ã¹ãã©ã€ãããäºæžããšããç¢æçšã®ã¹ãã©ã€ãããåçããã¿ã³çšã®ã¹ãã©ã€ãã ãŸãããã¹ãŠãããã§ãããµpheã ããã§ã¯ãã³ã³ãããŒã©ã®ããããã£ãèšå®ããŸãããã
@property (strong, nonatomic) GameSprite *playerBat; @property (strong, nonatomic) GameSprite *ball; @property (strong, nonatomic) GameSprite *background; @property (strong, nonatomic) GameSprite *menuDimmer; @property (strong, nonatomic) GameSprite *menuCaption; @property (strong, nonatomic) GameSprite *menuCaptionWon; @property (strong, nonatomic) GameSprite *menuCaptionLose; @property (strong, nonatomic) GameSprite *menuStartButton; @property (strong, nonatomic) NSMutableArray *bricks;
ããããã¹ãŠã®èŠçŽ ã«ã€ããŠãgimp / photoshop / otherã§é©åãªãµã€ãºã®ç»åãäœæããŸãã ã¬ã³ã¬ã®ãµã€ãºã50x10ãã¯ã»ã«ã«ããŠã¿ãŸãããã ããŒã«ãåŒãããšãã§ããŸããããããäžã§èŠã€ããããšãã§ããŸãããå®éã«ãã£ãŠã¿ãŸããã åå¿
ãžã¥ãã¢ã¯èæ¯ãæäŒããŸããïŒãããŠãã¡ãªã¿ã«ãç§ã¯å®å
šã«ãµãã«ãŒã®ããŒããèããŸããïŒããç§ã¯ããã€ãã®ã¬ã³ã¬ãšå°ãèªåèªèº«ãæããŸããã ãã¹ãŠã®ã¹ãã©ã€ãã®åæåã³ãŒããå®å
šã«æäŸããããã§ã¯ãããŸãããããã¯ãã§ã«äžããããŠãããã®ãšåäžã§ããã座æšã®ã¿ãç°ãªããŸãã ããããã¬ã³ã¬ãã©ããããïŒ ãããã®å Žæã¯ã©ããããããããŸã£ããããŒãã³ãŒãã«ãªããããªãã§ãããïŒ ãããŠããŸã ã¬ãã«ãäžãããå Žåã¯ïŒ ãããã®ã¬ãã«ãä¿åãããç¬èªã®ãã¡ã€ã«åœ¢åŒãèããŠã¿ãŸãããã ç§ã®åœ¢åŒã¯éåžžã«ã·ã³ãã«ã«ãªããŸããããæ³ååãèªç±ã«èªç±ã«çºæ®ã§ããŸãã ã ãããããã«ç§ã®æåã®ïŒãããŠä»ã®ãšããå¯äžã®ïŒã¬ãã«ã®ãã¡ã€ã«ããããŸãïŒ
101101 111111 010010 111111 000000 111111
圢åŒã¯èªæã®ããã§ãããïŒ 0-ã¬ã³ã¬ãªãã1-ããã 2çªç®ã®ã¿ã€ãã®ã¬ã³ã¬ãäœæããå Žåã¯ã2ã3ã4ãªã©ã®æ°åãå
¥åããŸãã ããããããã¯å°æ¥ã®ããã«çãã§ãã ããªãã¯ããŒãæ©èœãéåžžã«æ確ã§ãã
- (void)loadBricks {
ããŠãä»ãã¬ã³ã¬ãç©ã¿ãŸããã ããªãã¯ç§ãã¡ã®ã²ãŒã ãå®è¡ããã¬ã³ã¬ãããããããŒã«ããããŠããããã¹ãŠãèæ¯ã®èæ¯ãšç
§ããåãããŠè³è³ããããšãã§ããŸãã ãããããããã¯è¡šç€ºãããŸãã
glkView:drawInRect:
ã¬ã³ããªã³ã°ãè¿œå ããã®ãå¿ããŠã
glkView:drawInRect:
ã¬ã³ããªã³ã°ãé çªã«è¿œå ããŸããæåã«èæ¯ã次ã«ãããã次ã«ãã¹ãŠã®ã¬ã³ã¬ãæåŸã«ããŒã«ãè¿œå ããŸãã ãããŠä»ãããªãã¯è³è³ããããšãã§ããŸãïŒ =ïŒ
ããããã©ã®ããã«ïŒ ããŒã«ãåããªãã®ã¯ãªãã§ããïŒ ããã¯çµµã§ã¯ãªããããã¯ã²ãŒã ã§ããã€ãŸããããŒã«ã¯ã©ããã«é£ã°ãªããã°ãªããŸããïŒ ããŒã«ãé£ã°ãã«ã¯ãé床ãèšå®ããå¿
èŠããããŸãããŸããã¹ãã©ã€ãã¡ãœããã®
update:
ã§ããã®é床ãèæ
®ããŠåº§æšãå€æŽããå¿
èŠããããŸãã
- (void)update:(float)dt { GLKVector2 curMove = GLKVector2MultiplyScalar(self.moveVelocity, dt); self.position = GLKVector2Add(self.position, curMove); }
ãŸããViewControllerã®
update
ã¡ãœããã§ã¯ãããŒã«ã®ã¹ãã©ã€ããæŽæ°ããå¿
èŠããããŸãã
[self.ball update:self.timeSinceLastUpdate];
ããã§ã
startGame
ããŒã«ããŒã以å€ã®é床ã«èšå®ã§ããŸããããŒã«ãé£ã¶ããã«ãªããŸãã
- (void)startGame { self.gameRunning = YES; self.gameState = kGameStateNone; [selfloadBricks]; self.ball.position = GLKVector2Make(160, 80); self.ball.moveVelocity = GLKVector2Make(120, 240); }
ããŠãä»åºŠã¯
viewDidLoad
ãã®ã¡ãœãããåŒã³åºããŸããã-ãããŠããŒã«ã¯é£ã¶ã§ãããã-ããã«ç»é¢ããé£ã³åºããŸãã ããŒããæ²ããïŒ ããŠãè¡çªãšããŒã«ãšå£ã®è¡çªã®åŠçãæ€èšãå§ããŸãã æ¢è£œã®
update
æ¹æ³ã§ãããŒã«ãšå£ã®è¡çªãè¿œå ããŸãã
ããžãã¯ã¯åçŽã§ããã£ãŽãã¡ããªãŒããå¿
èŠãããŸãããå·Šå³ã®å£ãšè¡çªãããšãé床ã®æ°Žå¹³æåãå転ãããäžéšã®å£ãšåçŽæåãå転ãããŸãã å
¥å°è§ã¯åå°è§ãšåãã§ããã€ãŸããç©çæ³åãå®ãããŠããŸãã ããŠãäžã®å¢çãè¶ãããšããæ倱ãæ°ããŸãã ããã ã¡ãªã¿ã«ãããŒã«ã®äœçœ®ããä¿®æ£ãããŠããã©ã°ãåé¿ããŸãã
çºå°ïŒ ããŒã«ã¯å³ã®å£ããäžããè·³ãè¿ããŸãã-ãããŠãç§ãã¡ã¯ãããç¥ããŸããã§ããããè² ããŸããã ããæªããªãïŒ ããã§ããããããè·³ãè¿ãå¿
èŠããããŸããã¢ã«ã«ãã€ãã§æ
£ç¿çã§ããããã«ãå
¥å°è§ã¯åžžã«åå°è§ãšçãããªããšã¯éããŸãããããã¯ãããŒã«ããããã®ã©ãã«èœã¡ããã«ãã£ãŠç°ãªããŸãã ãã®ãŸãã«è§åºŠãèšç®ããããã«ãäžè§æ³ã¯ãã§ã«ããã§é©çšå¯èœã§ãïŒ
ååã«ããªããã£ãã ãããä»ã楜ããéšåãå§ãŸããŸããã¬ã³ã¬ãšã®è¡çªã®å®çŸ©ããããã®ç Žå£ãããŒã«ã®ãªããŠã³ãã
ããã§ãããžãã¯ã¯ããå·§åŠã§ãïŒã©ã¡ãã®åŽã§ããŒã«ãããªãã¯ã«åœãã£ãããå€æããããã«å¿ããŠé床ã®å¿
èŠãªã³ã³ããŒãã³ããå€æŽããããªãã¯ã«å£ããããŒã¯ãä»ããŸãã ããŠãå£ãããã®ããã¹ãŠåé€ããæ®ã£ãŠãããã®ããªããã°ã²ãŒã ãçµäºããåã¡ãŸããïŒ
ããŠãã²ãŒã ãéå§ããŠãããŒã«ãã©ã®ããã«ãžã£ã³ãããã¬ã³ã¬ãå£ãã...ãèŠãããšãã§ããŸãã ã³ãŠã¢ãªãããŸããããããå¶åŸ¡ããå¿
èŠããããŸããïŒ ç§ã¯ã³ãŠã¢ãªãå¶åŸ¡ããæãç°¡åãªæ¹æ³ãéžæããŸããããè³ãã«ãã®äžã®å Žæãå²ãåœãŠã芪æã§ãã©ãã°ã§ããŸãã ãããã®äœçœ®ãå€æŽããã«ã¯ãæãæŒãããåããããããã€ãã³ããåãåãå¿
èŠããããŸãããã®ããã«ã¯ããžã§ã¹ãã£ãŒèªèæ©èœãå¿
èŠã§ãã ããããã€ã³ã¹ããŒã«ããŸãã
- (void)viewDidLoad {
ããŠãããªãã¯éã¶æºåãã§ããŠããŸããïŒ ç«ã¡äžãããã¹ãŠã®ã¬ã³ã¬ãå£ããŸããïŒ ããã§ã¯ã次ã¯äœã§ããïŒ ãã¬ãŒã€ãŒã«èªåã®åŽåã®çµæã瀺ãå¿
èŠãããããããã£ãŠã¡ãã¥ãŒã衚瀺ããå¿
èŠããããŸãã éåžžãGameSpriteããç¶æ¿ãããGameSceneã¯ã©ã¹ã䜿çšããŠå®è£
ããããã®ãããªãã®ã®ããã«å¥ã
ã®ã·ãŒã³ãäœæãããŸãããã³ãŒããã§ããã ãåçŽã«ããããšã¯é¿ããŸããã ãããã£ãŠãã¡ãã¥ãŒã¯ç°ãªãã¹ãã©ã€ãããçµã¿ç«ãŠãããŸãã ãŸãã
glkView:drawInRect:
ã²ãŒã ã®ç¶æ
ã確èªããå¿
èŠãªãã¹ãŠãã¬ã³ããªã³ã°ããå¿
èŠããããŸãã
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { glClearColor(1.f, 1.f, 1.f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); [self.background render]; [self.playerBat render]; for (GameSprite *brick in self.bricks) { [brick render]; } [self.ball render]; if (!self.gameRunning) { [self.menuDimmer render]; [self.menuStartButton render]; switch (self.gameState) { case kGameStateWon: [self.menuCaptionWon render]; break; case kGameStateLose: [self.menuCaptionLose render]; break; case kGameStateNone: default: [self.menuCaption render]; break; } } }
ããã§ãããã¹ãŠãéåžžã«ã·ã³ãã«ã§ãããã³ã¡ã³ãããããããŸããã ãplayããã¿ã³ã®ã¯ãªãã¯ãåŠçããããã«æ®ããŸããããã¯ã
handleTapGestureFrom:
ã«ãelseããããã¯ã
handleTapGestureFrom:
ããŸãã
else if (CGRectContainsPoint(self.menuStartButton.boundingRect, touchLocation)) { [self startGame]; }
ããã ãã§ãïŒ , , ! â ! , , OpenGL!
, . , , ,
. ( , ? , )
, . , , , , , . , , Game Center, iCloud, Facebook/Twitter, , . App Store, , .
PS : . ZeptoLab, OpenGL . : , , . , , ! , , .