2010. 1. 4. 02:01


 *실행파일 재 업로드.(소스도 재 업로드)
게임 쪽 버그와 한/영 자동 변경 부분을 수정하였습니다.
압축 푸실 때 반드시 \settings 폴더와 \wav 폴더도 실행파일과 같은 폴더에
압축풀어주셔야 원활하게 실행됩니다. (Window XP가 아닌 경우 .NET Framework이 설치되어 있어야 정상적으로 동작합니다.)
 
*버그 수정사항
아이템 상태변화 체크해서 작동 안 하게(done)
Bomb Item(반경 변경, done)
타자게임 GameOver 시 textBox enable false(done)
단문연습, 장문연습, 타자게임 한/영 모드 변환(done)
게임 중 메뉴 전환시 timer 중지(done)
게임 다시 하기. (done)
게임 중 포즈 기능(done)

------------------------------------------------------------------------------------

장장 6개월이 걸렸다. ㅠ.ㅠ
C#을 공부하면서 처음으로 프로그램 다운 프로그램을 만들어 보겠다고 시작한 것이 타자 프로그램이었다.

처음은 단문연습을 위한 기본이 되는 TextBox를 만들어 입력을 받아서 Keyboard Event 들을 처리하는 함수들을
Test하는데 많은 시간을 들였다. 영문은 쉬웠는데 문제는 역시나 한글이었다. 조합형이 뭔지 완성형이 뭔지도 모르는
상황에서 한글입력을 원활히 받기 위한 무언가가 필요했다.

기본적으로 영문은 치는대로 입력을 받을 수 있는데 반해 한글은 조합되기를 기다려 다음글자로 넘어가는지라 Event 를
처리하기 위해서는 KeyUp/KeyDown으로는 안 되고 KeyPressed Event를 써야 한다. 이것을 확인하는데 2주가 걸렸다.
(띄엄띄엄 만지다 보니 막히면 덮어놓고 생각날때 꺼내보느라 더 시간이 오래 걸린 듯 하다.)

어느덧 2개월이 지나고 그 간에 샛길로 새서 한글 자, 모 분리하는 방법에 대한 것도 실험에 들어가고 소스보고 테스트하고 하는데 시간이 지나갔다.

글쇠연습부분을 만지기 시작했다. 자판을 LeftTop, MiddleTop, RightTop 이런 식으로 9개로 분리를 하고,
각 KeyBlock에 대해 한 글자 반복, 순차반복, 조합반복 등의 내용으로 구성을 했다. 나중에 마무리단계에서 밝혀졌지만
영문에선 별 중요하지도 않던 것이 또 한글에서 발목을 잡았다.

예를 들면, 'ㅅ'과 'ㅛ'는 같은 KeyBlock에 속해있지만, TextBox에서 입력은 '쇼'로 입력되기 때문에 ㅅㅛ 를 연습하려면
따로 분리시켜서 입력받을 수 있어야 한다는 것. 약간 다른 문제로 'ㄱㅅ'를 'ㄳ'로 입력받으면 안된다는 것 등의 문제가
나를 괴롭혔다. 결국 마무리 단계에서 이를 지원하지 말자는 황당한 결론을 내 버리고 한 문자 글쇠연습만 하는 것으로 합리화를 시켜버렸다. (이 걸 놓고 계속 씨름하다가는 프로그램이 네버엔딩이 될 것 같았고, 무엇보다 새해가 되기전에
마무리해야 된다는 압박감이 들었다.)

기본적인 타자연습 부분이 한 축이었다면, 또 한가지 큰 축은 타자게임이었다.
게임이랄 것도 없지만 너무나 밋밋하지 않기 위해서 약간의 애니메이션 다운 모습을 보이려니 시간이 괘 걸린거 같다.

먼저 워드리스트 만들기.
단어 리스트로부터 화면에 배치시키는 작업에 Collision Detection 따위가 들어갈 줄은 미처 생각지 못한 부분이었다.
첨에 단어들을 Random으로 발생시키니 마구 겹쳐버리지 않았던가!
단어들을 순차적으로 나오게 하고 해당 단어를 Typing하면 사라지게 한 다음에는 무언가 Effect가 필요했다.
단어를 치면 바로 없어지는게 아니라 별이 발사되고, 반짝이 단어는 폭탄이 되거나 독약이 되거나 하는 등의 Effect를
구현하는 부분이 처음인지라 시간이 걸렸다.

마지막으로 색깔을 입히는 부분에서 또 한 달 가량이 소요됐다.
각 화면을 정리하고 메인화면부터 각각의 화면에 어울리는 이미지를 입히고 아이콘을 배치하는 부분은 내가 잘 할수 있는 부분도 아닌지라 노가다성 작업이 주를 이뤘다. 특히 게임과 문장을 Clear했을 때 나는 Wav 파일을 찾기 위해서 내가
한 노력을 내가 생각해도 눈물겨울 정도다. 구글링으로 공짜 wav file들을 찾아서 하나하나 들어보고 다음까페에 가입하여 wav file set을 받아서 천가지 사운드를 일일히 확인해 보고 선별하고(마음에 드는 효과음을 찾는 것이 이렇게 힘든
줄 몰랐다.)하는 작업이 필요했다.

아이콘은 iconspedia 에서 꽤 근사하고 멋진 아이콘들을 찾을 수 있었다. 메인 화면 디자인도 처음에는 아이스링크였으나 아이콘들을 배치하다가 깔끔한 방향으로 변경되었다. 머리 속에 처음에 그린 것을 표현하는 것이 상당히 힘들다.;;
또 한가지 어려웠던 것은 사운드를 비동기적으로 재생하는 것이었다. c#에서 재공하는 함수들로는 구현이 잘 안되어서
WinAPI 제공함수를 사용했다.

어찌됐든 c#으로 만든 첫번재 프로그램은 이렇게 탄생됐다. 아직 beta 버전으로 밖에 소개할 수 없지만,
나중에 ? 시간이 허락한다면 정식 버전으로 만들어 보고 싶다.

첨부로 실행 프로그램과 소스파일을 올린다.
날카로운 지적 대 환영이다.









Posted by Actruce
Cocoa Programming for MAC OS X 라는 책으로 문법 사항을 공부중입니다.
진도가 팍팍 나가지는 못하고;; 찔끔찔끔 이런 것도 있네 하면서 나가고 있습니다.

먼저 이번 장의 주제는 alloc 과 init 입니다. 그리고 NSObject의 isa에 관한 것입니다.
XCode의 방대한 메뉴얼에 금새 질려 버렸는데, 마음을 다 잡고 모르는 것이 있으면 성급하지 않게 익히며 나가
보려고 하고 있습니다.

초기화하는 거겠지라고 생각했는데 역시 C에 대해서 잘 모르니 개념적으로 헷갈리는 부분이 많아서 한번 정리하고
넘어가는 것이 좋을 거 같습니다.

1. alloc : 어느 레퍼런스에서  malloc 기능을 수행한다고 나와있는데  malloc 이라기 보단 생성자에 가깝습니다.
Objective-C 문법은

Object *obj;
obj = [Object alloc];
형태입니다.

2. init : XCode Help를 찾아보면 alloc과 같이 쓰이며, alloc 대신 자식 클래스에서 override 해서 사용하는 용도로
쓰이며, 단순히 init을 사용할 경우, self를 리턴한다고 되어 있습니다. 제가 이해하기로는 alloc과 달리 객체 instance를
초기화하기 위한 용도로 Open해 놓은 기능이라고 생각합니다.

alloc과 init을 보통은 같은 줄에 사용하여,

Object *obj = [[Object alloc] init];
과 같이 사용한다고 합니다.

초기화 관련해서는 추후 사례들이 생기면 덧 붙이도록 하겠습니다.

3. isa
XCode Help의 정의를 그대로 인용하면

The isa pointer, as the name suggests, points to the object’s class, which is an object in its own right (see Figure 2-1) and is compiled from the class definition. The class object maintains a dispatch table consisting essentially of pointers to the methods it implements; it also holds a pointer to its superclass, which has its own dispatch table and superclass pointer. Through this chain of references, an object has access to the method implementations of its class and all its superclasses (as well as all inherited public and protected instance variables). The isa pointer is critical to the message-dispatch mechanism and to the dynamism of Cocoa objects.

일단  isa는  pointer다. is a 라고 생각하면, 객체를 정의하는 pointer?
아직 개념이 잡히질 않는다.

naver 를 검색해봤다.

http://blog.naver.com/semigifn?Redirect=Log&logNo=10627140

에서 다음과 같은 해설을 찾을 수 있었다.

"모든 사용가능한 오브젝트는 isa라는 인스턴스 변수를 가지는데 이것은 오브젝트의 클래스(클래스 오브젝트 또는 그냥 클래스라고 지칭한다. - 소스코드에서의 클래스를 말한는것과는 조금 다르다)를 알려준다. 이것은 런타임 시스템에서 각각의 오브젝트가 무엇으로부터 인스턴스화 되었는지 알려주는 역할을 한다. 이것으로 실행시간에 다이나믹 타이핑을 지원한다."
[출처] Objective-C 기초|작성자 semigifn

Cocoa Programming 책에서는 
"isa는 객제를 생성하는 클래스 구조체를 가리키는 포인터로, ...
 isa가 가리키는 클래스 구조체에는 클래스의 인스턴스 변수 유형과 이름, 그리고 클래스 메서드들의 구현이 들어있으며,
 또한 수퍼클래스의 클래스 구조체를 가리키는 포인터도 있다. "

라고 되어 있다. 내가 해석하기로 NSObject를 상속받는 서브 클래스는 isa 를 인스턴스 변수로 가지고 isa 가 이 객체의 Type를 표현하는 클래스 구조체를 포인트 한다. 이 클래스 구조체를 통해서 인스턴스 변수 유형과 이름 클래스 메서드의
구현, 그리고 수퍼클래스를 지칭하는 포인터에 접근할 수 있다고 생각한다.

*여기서 잠깐.
클래스 메서드는 무엇이고, 인스턴스 메서드는 무엇인가?
일단 이렇게 이해 하겠다.

클래스 메서드 : 클래스의 인스턴스화 없이 실행되는 메서드
인스턴스 메서드 : 반드시 인스턴스화된 객체에서 실행되는 메서드

이건 뭐  Static 이냐 Non-Static 과 차이가 없지 않은가? 흠흠...;;

Posted by Actruce
Screen Shot 기능을 알고 난 뒤 넘 재밌어서, 마구 찍어본 Austin Power Gold Member Intro 사진들입니다.
정말 영국식 섹스 코미디의 전형인 그래도 재밌는 영화로 기억됩니다. ㅋㅋ 비욘세도 나오죠.


Posted by Actruce
이전버튼 1 2 이전버튼