NSMutableDictionary writeToFile: atomically: – Example

invader – 00 기획

이 예제는 facebook의 게임/앱 스터디 그룹을 위해 작성 되었습니다.

교육용 예제로 스패이스 인베이더와 비슷한 게임을 만들어 보기로 하겠습니다.

Space Invaders – Wikipedia, the free encyclopedia

저작권문제

기존에 있는 게임을 소위 말하는 벤치마크 대상으로 했기 때문에(정확히는 베끼는 것을 보고 벤치마크라고 부르는 것이 널리 사용되는게 현실) 라이센스 문제를 생각하지 않을 수 없는데, 스패이스인베이더의 저작권은 스퀘어에닉스(TAITO)가 가지고 있고 어페럴 포함 함부로 만들 수 없도록 되어 있습니다. 하지만 여기서는 상용화까지 가지 않을 것이기 그대로 베낀다고 하기 보다는 대강 비슷한 게임을 만드는 것이니 문제는 되지 않을 것이라고 봅니다. 만약 진짜로 무언가를 만든다면 처음 기획 들어가기 전에 아이디어 단계에서 이 문제가 검토가 반드시 되어야 하겠습니다.

게임 구성

  1. 화면은 포트레이트로
  2. 10개 씩 5줄의 인베이더가 화면 좌측끝에서 우측끝으로 1줄 내려가서 다시 좌측 끝으로 지그재그로 이동. 5줄 인베이더 중에 제일 가장자리 1열 이 없어지면 1캐릭터 길이 만큼 더 움직인다는 것 구현을 고려 해야 . (인베이더를 잡을 수록 움직임이 점점 빨라지는 건 일단 빼기로…)
  3. 인베이더 중 일부은 시간차를 두고 미사일 투하
  4. 게임 화면 최하단에 플레이어는 좌우로 이동 미사일 발사
  5. 발사한 미사일을 인베이더가 맞으면 스코어 +10 해당 인베이더는 화면에서 사라짐
  6. 플레이어 바로 앞에 방어구조물. 구조물은 한 덩어리가 아니라 2*3 블록
  7. 방어구조물 인베이더, 플레이어가 발사 한 미사일에 맞으면 손상 – 다시 맞으면 파괴
  8. 파괴 된 구조물은 허공으로 판정
  9. 인베이더가 전멸하면 게임오버 (다음스테이지는 일단 고려하지 않음)
  10. 인베이더가 구조물 보다 아래로 내려오거나 플레이어가 미사일에 맞으면 게임오버 (목숨은 1대)
  11. 화면 제일 위를 가로질러 날라가는 보너스 UFO는 삭제

 추가 아이디어

  1.  fps에서의 스트릭 킬 보너스 같이 탄을 낭비하지 않고 연속으로 격파하면 추가 점수를 주는 요소

개발 프레임워크

여기 까지 생각 했다면 이제 어떻게 현실화 할 것인가? 라는 문턱을 맞닥들이게 됩니다. 특히 지금 우리처럼 경험이 없다면 가지고 있는 지식(기술)을 어떻게 쓸 수 있는지 얼마나 시간과 노력이 필요한지 가늠하기도 힘들지만 그런 수고를 경험한 선배들이 만들어 놓은 결과를 오픈소스라는 방법으로 공개한 좋은 예가 앵그리버드 등 유명한 게임을 만드는데 사용 된 box2d라는 물리엔진도 포함 되어 있는 등 유용한 프레임웍인 cocos2d 를 소개 합니다. 원래는 python으로 만들어졌던 것이 플레시, iOS(Objective-C)로 포팅 되었습니다. 플레시 게임을 만들던 사람들이 iOS 개발에 많이 전환하게 된 계기가 되기도 했다고 합니다.

디자인

  1. 인베이더 스프라이트 펼친형태, 움추린형태 2개
  2. 플레이어 스프라이트 1개
  3. 플레이어의 미사일 1개, 인베이더의 미사일 1개 – 서로 다른 색으로
  4. 방어구조물 2*3 = 6개 + 위치별로 손상된 조각 각 1개
  5. 점수 표시는 내장 폰트 이용
  6. 폭파되는 그림
  7. 발사되는 뿅 소리 2가지 하고 폭파되는 펑 소리 1가지
  • 사실 초기 단계에서 디자인은 기획과 개발 과정을 명확하게 하는데 아주 중요한 역할을 하기도 하지만
  • 프로토타입 형태로 만드는데는 형태, 크기 정도만으로 프로그래밍과 작동 되는 것을 보여 주는 것은 가능 함
  • 디자인은 조작 인터페이스 뿐만아니라 사용자 경험에 가장 직접적으로 영향을 줌
  • 디자인 결과물은 굳이 판매하지 않더라도 “완성” 단계까지 올려놓는 역할

cocos2d CCMenu CCMenuItemImage

[code language=”objc”]
CCMenuItemImage *redButton = [CCMenuItemImage itemFromNormalImage:@"redbtn.png" selectedImage:@"redbtn_pushed.png" target:self selector:@selector(timerGo:)];
CCMenu *menu =  [CCMenu menuWithItems:redButton, nil];
menu.position = ccp(370,175);
[self addChild:menu];
[/code]