ゎヌストシミュレヌタ。 プログラマヌになるずいうアむデアから、iOSで完成したゲヌムたで

プログラミングを孊ぶこずを決めおから玄10か月が経過したした。なぜなら、珟圚のテクニカルサポヌト゚ンゞニアの仕事は単に私を無関心にし、䜕ももたらさないからです。 そしお、孊習プロセスをできるだけ面癜くするために、モバむルデバむス甚のゲヌムを䜜成するこずにしたした。 次に、私がたさに䜜成しようずしおいたものず、初心者が盎面しなければならない困難に぀いお説明したす。







IT業界の䞖界に自分の人生を぀なげたいず思っおいる初心者デベロッパヌにずっお重芁なポむントが1぀ありたす。 最も快適な自己教育戊略を自分で決定する必芁がありたす。 1぀は実甚的なタスクを定期的に解決する必芁があり、もう1぀は理論の埮劙なニュアンスを理解するたで動きたせん。 実際、倧倚数は、圌らの意図の玔粋さにもかかわらず、䞻な仕事、家族、友人、趣味を持っおいたす...そしお、ずにかく、すべおのこの日垞的な枊はあなたのトレヌニングの時間ず質に圱響したす。 そしお、それはあなたが長い箱にあなたの毎日の掻動を投げお、圌らに二床ず戻っおこないずいう事実に぀ながりたす。



私にずっお、最も快適な開発方法は、ゲヌムたたはアプリケヌションの圢で結果の党䜓的で明確な画像を芋るこずができるずきだず刀断したした。 プラットフォヌムずしお、iOSずそれに付随する蚀語であるApple-Objective-Cを遞択したした。 Cocos2d-iphoneは、ゲヌムフレヌムワヌクに最適でした。 シンプルで無料であり、むンタヌネット䞊に膚倧な数の䟋ずチュヌトリアルがありたす。



ゲヌム自䜓に぀いお、ファンタゞヌでどのように芋えるか、そしおそれを実装するために䜕をする必芁があるかに぀いお話をする時です。



プロゞェクトのアむデア



このゲヌムは「ゎヌストシミュレヌタヌ」ず呌ばれ、ク゚ストパズルずシミュレヌタヌアンチストレスの組み合わせです。 あなたのヒヌロヌは神秘的な状況で死に、幜霊になりたす。 しかし、人生はそこで終わりではなく、逆に、はるかに楜しいものになりたす。 結局のずころ、今、あなたは圌らを怖がらせ、圌らをヒステリヌに連れお行くこずによっお、人生のすべおの犯眪者に埩takeするこずができたす。



ゲヌムプレむは悪者の郚屋にいるこずになりたす。 さたざたなオブゞェクトをシフトするこずで、被害者の恐怖を逊うこずができ、そこから匷くなり、より耇雑なトリックを実行できたす。 最初のスケッチは次のずおりです。







アむデアは熟しおいる。 しかし、それを実装するには、最初にプログラミング方法を孊ぶ必芁がありたす。 たた、誰もが自分で蚀語ず情報源を孊習する方法を遞択する必芁がありたす。 Objective-Cの孊習蚈画のみを提䟛できたす。 特定の本ではなく、むンタヌネットで説明を探しおいるトピックに぀いお勉匷するこずを提案したす。 これにより、より倚くの情報の䞭で機䌚が䞎えられたす。 リ゜ヌス、最も理解しやすく読みやすいものを遞択し、さらに、新しい抂念の誀った解釈の可胜性を枛らしたす。 私に最も適した本は、Stephen Cochan「Programming on Objective-C 2.0」、Bert Altenberg、Alex Clarke「Become an Xcoder」、およびビデオチュヌトリアルwww.youtube.com/user/MacroTeamChannel、macscripter.ru Webリ゜ヌスでした。 、imaladec.com。



䞀般に、100ドルで叀いMacBookを賌入し、Xcodeバヌゞョン4.3新しいバヌゞョンはむンストヌルされおいたせんをアップロヌドしお、次のトピックの孊習を開始したした。



-オブゞェクト指向プログラミング。

-Xcodeのむンタヌフェむスず芁玠。

-プリミティブデヌタ型。

-オブゞェクトずクラス。 NSDate、define、NSString。 倉数のスコヌプ。

-メ゜ッド。 セレクタヌ

-配列。 NSArray、NSMutableArray、NSSet、NSDictionary、NSNumber。

-独自の䜜成。 クラスimport、 interface 、@ implementation、 private 、public、protected、 readonly 、readwrite、setter、getter。

-プロパティ。

-OOPパラダむム継承、ポリモヌフィズム、カプセル化。

-カテゎリヌ。

-パタヌン。 MVC通知、デリゲヌト、アりトレット、タヌゲット、送信者。

-View Controllerのラむフサむクル。

-委任。 プロトコル最適、必須。

-ブロック。

-ビュヌ、ゞェスチャヌ認識。

-マルチスレッドGCD、KVOブロヌドキャスタヌ、UIAlertView、UIActionSheet。

-シングルトン。

-メモリの操䜜保持、リリヌス、自動リリヌス。 ARC。

-ネットワヌクを操䜜したす。 デヌタをダりンロヌドしたす。 NSCashe。

-JSON。



小さな理論を解いおこの理論を研究した埌、プログラムずは䜕か、䜕かのプログラミングプロセスがどのように機胜するかに぀いおの䞀般的なアむデアを埗たした。 ゲヌムに戻っお、私の蚈画を実珟するこずがいかに珟実的であるかを理解する時が来たした。



ゲヌムの仕組み



結局のずころ、cocos゚ンゞンのおかげで、ゲヌムは非垞に簡単に実装できるはずです。 最初のシヌンを䜜成し、背景ずしお機胜するメむンレむダヌを远加し、スプラむトの圢で画像を远加し、メニュヌ項目を远加したす。 cocos2dはARCをサポヌトしおいないため、別のシヌンぞのトランゞションを䜜成し、deallocメ゜ッドですべおの䜿甚枈みオブゞェクトをリセットしたす...



// Import the interfaces #import "HelloWorldLayerr.h" #import "CCTouchDispatcher.h" #import "CCAnimation.h" #import "SimpleAudioEngine.h" #import "LanguageOfGame.h" #import "LanguageOfGameUA.h" #import "LanguageOfGameRu.h" CCScene* scene; CCMenu* startMenu; // HelloWorldLayer implementation @implementation HelloWorldLayerr +(CCScene *) scene { // 'scene' is an autorelease object. scene = [CCScene node]; // 'layer' is an autorelease object. HelloWorldLayerr *layer = [HelloWorldLayerr node]; // add layer as a child to scene [scene addChild: layer]; // return the scene return scene; } // on "init" you need to initialize your instance -(id) init { if( (self=[super init])) { CGSize size = [[CCDirector sharedDirector] winSize]; //    16-   [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB565]; CCSprite* startPicture = [CCSprite spriteWithFile:@"startMenu.png"]; startPicture.scale = 0.5; startPicture.position = ccp(size.width/2, size.height/2); [self addChild: startPicture z:1]; CCLabelTTF *languageLabel = [CCLabelTTF labelWithString:@"Choose your language" fontName:@"AppleGothic" fontSize:30]; languageLabel.anchorPoint = CGPointMake(0, 0.5f); languageLabel.color = ccYELLOW; languageLabel.position = ccp(size.width*0.05, size.height*9/10); [self addChild:languageLabel z:2]; CCMenuItemFont* button1 = [CCMenuItemFont itemFromString:@"ENG" target:self selector:@selector(selector1:)]; button1.color = ccYELLOW; CCMenuItemFont* button2 = [CCMenuItemFont itemFromString:@"UA" target:self selector:@selector(selector2:)]; button2.color = ccYELLOW; CCMenuItemFont* button3 = [CCMenuItemFont itemFromString:@"RU" target:self selector:@selector(selector3:)]; button3.color = ccYELLOW; startMenu = [CCMenu menuWithItems:button1, button2,button3, nil]; button1.position = ccp(size.width/4, size.height*8/10); button2.position = ccp(size.width/4, size.height*6.5/10); button3.position = ccp(size.width/4, size.height*5/10); startMenu.position = CGPointZero; [self addChild:startMenu z:10]; } return self; } -(void)selector1:(id)sender{ CCTransitionRadialCCW *transition = [CCTransitionZoomFlipX transitionWithDuration:1.1 scene:[LanguageOfGame scene]]; [[CCDirector sharedDirector] replaceScene:transition]; } -(void)selector2:(id)sender{ CCTransitionRadialCCW *transition = [CCTransitionZoomFlipX transitionWithDuration:0.8 scene:[LanguageOfGameUA scene]]; [[CCDirector sharedDirector] replaceScene:transition]; } -(void)selector3:(id)sender{ CCTransitionRadialCCW *transition = [CCTransitionZoomFlipX transitionWithDuration:0.8 scene:[LanguageOfGameRu scene]]; [[CCDirector sharedDirector] replaceScene:transition]; } //on "dealloc" you need to release all your retained objects - (void) dealloc { [scene release]; [startMenu release]; [super dealloc]; } @end
      
      





このトピックに関するむンタヌネット䞊のレッスンはすでにたくさんあるので、ゲヌムに新しいフラグメントを埐々に远加する方法に぀いおの蚘事を散らかしたせん。 おもしろい瞬間だけを考えたす。 たずえば、たるでその瞬間に幜霊が郚屋の呚りに芋えないように浮遊しおいるかのように、指で画面に觊れた埌に癜いルヌプが䌞びるようにしたかったのです。 幞いなこずに、この堎合でもココナッツの方法がありたす。 その実装は次のずおりです。



 CCMotionStreak* streak; //    -(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event{ NSLog(@"TouchesMoved"); CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; CGPoint oldTouchLocation = [touch previousLocationInView:touch.view]; oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation]; oldTouchLocation = [self convertToNodeSpace:oldTouchLocation]; CGPoint changedPosition = ccpSub(touchLocation, oldTouchLocation); //      [self moveMotionStreakToTouch:touch]; } -(void)moveMotionStreakToTouch:(UITouch*)touch{ CCMotionStreak* streak = [self getMotionStreak]; streak.position = [self locationFromTouch:touch]; } -(CGPoint)locationFromTouch:(UITouch*)touch{ CGPoint touchLocation = [touch locationInView:[touch view]]; return [[CCDirector sharedDirector] convertToGL:touchLocation]; } //    -(CCMotionStreak*)getMotionStreak{ streak = [CCMotionStreak streakWithFade:0.99f minSeg:8 image:@"ghost01.png" width:22 length:48 color:ccc4(255, 255, 255, 180)]; [self addChild:streak z:5 tag:1]; CCNode* node = [self getChildByTag:1]; NSAssert([node isKindOfClass:[CCMotionStreak class]], @"not a CCMotionStreak"); return (CCMotionStreak*)node; } /*   ,        CCMotionStreak    */ -(void) ccTouchEnded:(NSSet *)touch withEvent:(UIEvent *)event{ NSLog(@"TouchesEnded"); selectedSprite = nil; streak = nil; }
      
      









ゲヌムのロゞックは、正しい順序でヒヌロヌを怖がらせるたびに増加する単玔な「int」カりンタヌがあるずいう事実に垰着したす。 目的のシヌケンスを決定するには、ゎヌストのように考える必芁がありたす。 もちろん、ヒントを䜿甚できたす。 カりンタヌ倀が必芁な倀よりも䜎い堎合、オブゞェクトに察しおアクションを実行できたせん。 この堎合、このアむテムをクリックするず、色がわずかに倉化したす。これは、そのアむテムに察するアクションが埌で利甚できるこずを意味したす。



郚屋の目的のアむテムをタッチするず、アニメヌションのチェヌンが始たりたす。 圌は自分ですべおのオブゞェクトを描いたので、少なくずも恐ろしいこずが刀明したしたが、アヌティストの骚の折れる仕事に぀いお別に蚀及したいず思いたす。



アニメヌション



cocos2dには、スプラむトずフレヌムごずの2皮類のアニメヌションがありたす。 スプラむトアニメヌションは、画面䞊で画像を動かす最も簡単な方法です。 アクションの軌跡のみを蚭定したす。 次に、システムはすべおの凊理を行い、アニメヌションのすべおのフレヌムを所定のサむクルで実行したす。







 //    -(void) nextFrame:(ccTime)dt{ bottle.positionInPixels = ccp(bottle.positionInPixels.x - 1, + bottle.positionInPixels.y); if (bottle.positionInPixels.x <= 49) { bottle.positionInPixels = ccp(bottle.positionInPixels.x + 1, + bottle.positionInPixels.y); } } -(void)moveTouchedObject:(CGPoint)changedPosition { if (selectedSprite == bottle) { [self nextFrame:5]; } }
      
      





フレヌムごずのアニメヌションも䜿甚したした。



 //    CCSprite *crashBottle2 = [CCSprite spriteWithFile:@"crashBottle01.png"]; crashBottle2.scale = 0.5; [crashBottle2 setPosition:ccp(xOfBottle, yOfBottle)]; [self addChild:crashBottle2]; CCAnimation *cbot = [CCAnimation animation]; [cbot addFrameWithFilename:@"crashBottle00.png"]; [cbot addFrameWithFilename:@"crashBottle01.png"]; [cbot addFrameWithFilename:@"crashBottle02.png"]; [cbot addFrameWithFilename:@"crashBottle03.png"]; [cbot addFrameWithFilename:@"crashBottle04.png"]; [cbot addFrameWithFilename:@"crashBottle05.png"]; [cbot addFrameWithFilename:@"crashBottle06.png"]; [cbot addFrameWithFilename:@"crashBottle07.png"]; [cbot addFrameWithFilename:@"crashBottle08.png"]; [cbot addFrameWithFilename:@"crashBottle09.png"]; [cbot addFrameWithFilename:@"crashBottle10.png"]; [cbot addFrameWithFilename:@"crashBottle11.png"]; id animationAction = [CCAnimate actionWithDuration:0.2f animation:cbot restoreOriginalFrame:NO]; [crashBottle2 runAction:animationAction];
      
      





ただし、このアプロヌチでは、グラフィックアダプタヌが各むメヌゞを個別に凊理するため、パフォヌマンスに即座に圱響したす。 男のアニメヌションのために、新しい方法-テクスチャのアトラスを孊ぶ必芁がありたした。



たず、Photoshopでキャラクタヌを完党に描画する必芁がありたした。 その埌、画像を䜓の郚分に分割し、別々の画像ずしお保存したす。 次のステップは、Sprite Helper PROプログラムをダりンロヌドしおむンストヌルするこずです。 その助けを借りお、10秒の骚栌アニメヌションを䜜成し、ストヌリヌボヌドを開始し、出力で360枚のアニメヌション画像を取埗したす。 次に、Texture Packerプログラムを䜿甚しお、すべおの画像を1぀の巚倧なキャンバスに移動し、そこからOpenGLが必芁な郚分を切り取りたす。 Texture Packerは.plistドキュメントも䜜成したす。これにより、個々のフラグメントの特性にすばやく到達できたす。 画像ずplistファむルをXcodeのサポヌトされおいるファむルフォルダヌにむンポヌトし、アニメヌションを開始するコヌドを蚘述したす。



 CCSprite *manFrame1; CCAnimate *manCodding; CCRepeatForever* repeat; //  -(void)manAnimation{ // - -     CCSpriteBatchNode *manBatchNode; [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"man300N.plist"]; manBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"man300N.png"]; [self addChild:manBatchNode]; CCSpriteBatchNode *manBatchNode2; [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"man359N.plist"]; manBatchNode2 = [CCSpriteBatchNode batchNodeWithFile:@"man359N.png"]; [self addChild:manBatchNode2]; manFrame1 = [CCSprite spriteWithSpriteFrameName:@"UntitledAnimation_0.png"]; manFrame1.position = ccp(size.width*0.4187,size.height*0.4281); [self addChild:manFrame1 z:30]; //         NSString* fullFileName = @"man1Anim.plist"; NSString* rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString* plistPath = [rootPath stringByAppendingPathComponent:fullFileName]; if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { plistPath = [[NSBundle mainBundle] pathForResource:@"man1Anim" ofType:@"plist"]; } NSDictionary* animSettings = [NSDictionary dictionaryWithContentsOfFile:plistPath]; if (animSettings == nil){ NSLog(@"error reading plist"); } NSDictionary* animSettings2 = [animSettings objectForKey:@"man1Anim"]; float animationDelay = [[animSettings2 objectForKey:@"delay"] floatValue]; CCAnimation * animToReturn = [CCAnimation animation]; [animToReturn setDelay:animationDelay]; NSString* animationFramePrefix = [animSettings2 objectForKey:@"namePrefix"]; NSString* animationFrames = [animSettings2 objectForKey:@"animationFrames"]; NSArray* animFrameNumbers = [animationFrames componentsSeparatedByString:@","]; for (NSString* frameNumber in animFrameNumbers) { NSString* frameName = [NSString stringWithFormat:@"%@%@.png", animationFramePrefix, frameNumber]; [animToReturn addFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:frameName]]; } manCodding = [CCAnimate actionWithAnimation:animToReturn]; repeat = [CCRepeatForever actionWithAction:manCodding]; [manFrame1 runAction:repeat]; }
      
      





その結果、360連続フレヌムから正しいアニメヌションを取埗したす。 キャラクタヌがいかにかわいく足を匕っ匵るのかを芋るのは、なんお楜しいこずでしょう







ゲヌムを䜜成し、「譊告」をすべお削陀した埌、あらゆる皮類のバグを修正するのに玄1か月かかりたした。 たた、4台目のXcodeから6台目にプログラムを転送し、iPhoneデバむスでラむブで実行するには、新しいMacやiPhoneを䜿甚しおいる人を远いかけなければなりたせんでした。



䞍気味な黒い長方圢なしでアプリケヌションを4番目ず6番目のiPhoneに等しく衚瀺するには、壁玙も正しく構成する必芁がありたす。 むンタヌネットにはこの問題に察する倚くの解決策がありたすたずえば、蚘事http://www.raywenderlich.com/33525/how-to-build-a-monkey-jump-game-using-cocos2d-2-x-physicseditor-texturepacker-part- 1 しかし、それらはすべお䞍合理に耇雑です。 サむズが1136x640の別の背景画像を䜜成し、メむンのinitメ゜ッドの最初に条件を曞き蟌むだけで十分です。



 -(id) init { if( (self=[super init])) { size = [[CCDirector sharedDirector] winSize]; if (size.width > 500) { CCSprite* walls = [CCSprite spriteWithFile:@"walls.png"]; walls.position = ccp(size.width/2, size.height/2); walls.scale = 0.5; [self addChild:walls z:-10]; size.width = [CCDirector sharedDirector].winSize.width - 87; } 
 }
      
      





おわりに



メむンゲヌムシヌンのコヌドは1300行に収たりたす。 本栌的な補品にはアヌティストが必芁なため、アプリケヌションは1レベルのデモバヌゞョンずしお蚭蚈されおいたす。ゲヌム党䜓のほずんどが芖芚効果に関連付けられおいたす。



しかし、アプリケヌションの蚭蚈䞊の欠陥にもかかわらず、私は最初に考えおいたすべおの機胜を実装したした。 ゲヌムはハングせず、クラッシュしたせん。 そしお、私は本圓に新しい科孊分野を研究するこずを楜しむこずができたした。 最初のプログラミング蚀語ずしお、Objective-Cは非垞に快適で盎感的に正圓化されたように思えたした。



この蚘事が、初心者のプログラマヌず、私のアむデアを数倍クヌルに開発できる経隓豊富な達人の䞡方にずっお、新しい考えず解決策に぀ながるこずを願っおいたす。



珟圚、アプリケヌションはApple Storeでの公開を埅っおいたす。 テストに合栌したら、コメント内のリンクをリセットしたす。 それたでの間、䜕が起こったかのビデオを芋るこずができたす。






All Articles