아래의 이미지들을 가지고 대전게임에서 나오는 캐릭터와 같은 에니메이션을 간단하게 만들어 보겠습니다. 좌측을 클릭하시면 이미지들을 압축한 파일만 다운로드 받으실 수 있습니다.

사용자 삽입 이미지

사용되는 키는 아래와 같습니다.
  • 위 방향키 - 점프
  • 아래 방향키 - 방어
  • 좌우 방향키 - 이동
  • a, s - 공격

1. 이미지(Costume) 준비

사용자 삽입 이미지
좌측과 같이 각 동작에 필요한 이미지들을 준비합니다. [Paint] 버튼을 눌러 직접 그리거나 [Import] 버튼을 클릭하여 준비된 이미지를 가져 옵니다. 제가 사용한 아래의 파일을 다운로드 받으셔서 사용하셔도 됩니다.




act1, act2는 평상시 동작, act3은 손공격, act4는 발공격, act5는 점프, act6은 방어 동작입니다.


사용자 삽입 이미지
주의 하실 점은 크기가 다른 각 이미지 마다 중심점을 맞추기 위해 모든 코스튬에서 [Edit]를 클릭하여 Paint Editor에서 [+] Set rotation center를 클릭하여 좌측과 같이 좌측 하단에 중심점을 맞추어 줍니다.



2. 변수 생성
변수(Variable)는 말 그대로 변할 수 있는 수입니다. 스크래치에서는 여러 유동적인 값을 저장하기 위해 사용합니다.

사용자 삽입 이미지
이번 장에서는 현재동작과 현재 프레임을 저장하기 위해 'curAction'과 'curFrame' 두개의 변수를 생성합니다. 변수를 생성하기 위해서는 좌측과 같이 Variables 를 클릭하고 [Make a variable]을 클릭합니다.



사용자 삽입 이미지
입력창에 좌측과 같이 curAction을 입력한 후에 하단의 [OK] 버튼을 클릭합니다.

완료되면 다시 [Make a variable]을 클릭해서 curFrame을 입력하고 [OK]버튼을 클릭합니다.





3. 사용자 키입력 처리
각 동작들은 한두개의 차이를 제외하고는 모두 비슷하기 때문에, 여기서는 가장 복잡한 점프 동작만 설명하겠습니다. 다른 동작들은 아래의 전체 스크립트를 참조하시기 바랍니다.

사용자 삽입 이미지
좌측은 위 방향키가 눌러졌을 때, 동작을 지정하는 블록들입니다.

[if <[curAction] = (0)>] 은 현재 동작(curAction)이 공격이나 점프가 아닌 일반 동작(0)일 경우에 실행되도록 합니다.

[set curAction to (1)] 현재 동작(curAction)을 1로 설정해 이제 현재 동작이 일반 동작이 아님을 나타냅니다.

[set curFrame to (20)] 현재 프레임을 20으로 설정합니다. 모든 동작은 40 프레임이 되면 초기화 되는데 20 프레임 동안 점프 동작을 보여주기 위해  (40-20=)20으로 설정합니다.

[change y by (30)] 다른 동작과 달리 점프 동작은 일반 동작 보다 위에 출력해야 하기 때문에 y 값에 30을 더해 30pixel 만큼 위로 올립니다.

[switch to costume [act5]] 현재 동작을 점프 동작(act5)으로 설정합니다.


4. 에니메이션
[forever]로 실행되는 동안 반복되면서 에니메이션을 출력하는 핵심 부분입니다. 한번 반복될 때 마다 프레임을 증가 시키고 현재 상태(curAction, curFrame)에 따른 필요한 작업을 수행합니다.

사용자 삽입 이미지
[if <[curAction] = (0)>] 블록은 현재 동작이 사용자가 동작 키를 입력하지 않은 일반동작(0)일 경우에만 실행됩니다.

현재 프레임이 0~19면 모양을 act1로 설정하고 20 이상이면 act2로 설정합니다. act1과 act2를 반복적으로 보여줌으로서 일반상태의 움직임을 표현합니다.

[change curFrame by (1)] 현재 프레임을 1 증가 시킵니다.

[if <[curFrame] > (40)>] 블록은 현재 프레임이 40보다 클경우 실행되며 각종 변수들과 동작을 초기화 합니다.

[if <(costume #)=(3)>] 현재 이미지가 점프 동작이면
[change y by (-30)]으로 점프시에 30 증가했던 값을 본래 위치로 설정합니다. (저는 코스튬을 몇번 삭제하고 다시 올렸기 때문에 3이지만 등록 순서에 따라 틀릴 수 있습니다. 점프 커스튬의 좌측 상단 숫자를 입력하시면 됩니다.)

[set curAction to (0)] 현재 동작을 일반동작(0)으로 설정합니다.

[set curFrame to (0)] 현재 프레임을(curFrame)을 0으로 만들어 프레임 값이 항상 0~39로 한정되게 합니다.

5. 완료

전체 스크립트는 아래와 같습니다. 조금 복잡하지만 이전 내용과 비슷한 부분이 많고 반복되는 부분을 제외하면 이해할 부분은 많지 않습니다.
사용자 삽입 이미지

웹에서 실행되는 모습과 프로젝트 파일 다운로드는 스크레치 사이트의 제 프로젝트에서 확인하실 수 있습니다.

'프로그래밍 강좌 > 스크래치' 카테고리의 다른 글

4.3 [중급] 피아노 만들기  (6) 2008.05.18
4.2 [중급] 핑퐁 게임  (2) 2008.05.14
3.7 [초급] 다트 게임  (0) 2008.02.12
3.6 [초급] 페인터  (0) 2008.02.11
3.5 [초급] 키보드로 움직이는 우주선  (0) 2008.01.28
AND

오늘 류한석님의 블로그에서 '무료프로젝트관리 도구: OpenProj 1.0'이란 포스팅을 보았습니다. 반가운 소식 하나는 기대를 않했는데 자바 어플리케이션이라 맥에서도 구동이 가능하다는 것입니다. 다운로드 사이트에 가보니 친절하게 맥용으로 dmg 파일이 있어 설치해 보았습니다.

사용자 삽입 이미지

현재 버젼은 1.0 입니다. 보이는 것도 그렇고 사용방법도 MS 프로젝트의 심플 버젼 같습니다. 자바라 구동이 조금 느리고 UI가 아쉽지만 직관적이고 단순한 메뉴와 기본적으로 있을 것은 다 있기 때문에 괜찮은 툴로 보입니다.

사용자 삽입 이미지

사용자 삽입 이미지

한글사용에는 문제가 없지만 종료날짜 설정시 하루 앞서 설정되는 버그가 있는 것 같습니다. 아직 1.0 초기버젼이니 버그도 수정되고 점차 좋아질 것으로 생각되고 기대가 됩니다. 지원 파일은 자체 포멧인 *.pod 파일이외에 MS Project (*.mpp, *.mpx, *.xml), Gnome Planner(*.planner)입니다.

사용자 삽입 이미지
OpenPorj와 유사한 맥 특유의 이쁜 GUI를 가진 OmniPlan도 있지만 유료($149.95)입니다.

Omni는 사이트의 Developer 메뉴에서 맥 개발자를 위해 다양한 프레임워크와 샘플소스를 공개해  놓았으니 참고해 보시면 좋을 것 같습니다.

'개발 툴' 카테고리의 다른 글

OS X에서 Go 설치  (0) 2010.02.27
실버라이트2 둘러보기  (10) 2008.12.16
적당히 참견하는 Xcode  (4) 2008.02.25
OS X의 파이썬  (0) 2008.02.20
Java 교육용 프로그램 Greenfoot  (0) 2007.12.23
AND

Objective-C class의 사용에서 눈여겨 볼만한 점들이 세가지 정도 있었습니다.  바로  Protocol, Category와 NSObject의 poseAsClass입니다.

Protocol 자바, C#의  interface와 유사하며 선언된 메소드들은 프로토콜을 사용하는 클래스에서 반드시 구현되어야 합니다. 사용하는 이유는 C++의 abstract class와 비슷하지만 Objective-C, 자바, C#과 같이 다중상속을 지원하지 않는 언어에서 다중상속의 단점은 버리고 장점은 취하기 위해서입니다. (이에 관한 자세한 설명은 디자인 패턴에 관한 책이나 deadly diamond of death로 구글 검색에서 찾으실 수 있습니다.)

Category는 서브클래스를 구현하지 않더라도 이미 구현되어 있는 클래스에 새로운 메소드들을 추가할 수 있는 방법을 제공합니다. category의 메소드들은 해당 클래스의 변수와 메소드를 사용할 수 있으며 메소드 이름이 같을 경우에는 오버라이드되니 주의하셔야 합니다. Categtory는 서브클래스를 만드는 것 보다 더 간단한 방법으로 문제를 해결할 수 있습니다.

PoseAsClass는 가장 흥미로운 부분입니다.  짧은 제 영어로 번역하자면 '사칭'이 가까운 것 같습니다. 상위 클래스로 선언되었지만 하위 클래스의 PoseAsClass를 이용하면 그 인스턴스는 하위 클래스로 동작하게 됩니다.

아래의 소스를 실행해 보시면 확인해 보실 수 있습니다.

#import <Foundation/Foundation.h>

/** Protocol **/
@protocol MyData
-(void) print;
@end

/** MyNumber class **/
@interface MyNumber: NSObject <MyData>
{
    int number;   
}

-(void) setNumber: (int)n;
-(void) print;
@end

@implementation MyNumber;
-(void) setNumber: (int)n
{
    number = n;
}

-(void) print
{
    NSLog(@"MyNumber:print > %d", number);
}
@end

/** Category **/
@interface MyNumber (NewPrint)
-(void) print;
-(void) printPlus;
@end

@implementation MyNumber (NewPrint)
-(void) print
{
    NSLog(@"NewPrint:print > %d", number);   
}

-(void) printPlus
{
    NSLog(@"NewPrint:printPlus > %d", number + 1);
}
@end

/** Posing **/
@interface MyNumberMinus: MyNumber
{
}
-(void) print;
@end

@implementation MyNumberMinus;
-(void) print
{
    NSLog(@"MyNumberMinus:print > %d", number - 1);
}
@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    [MyNumberMinus poseAsClass: [MyNumber class]];
   
    MyNumber *number = [[MyNumber alloc] init];
   
    [number setNumber: 5];
   
    [number print];
    [number printPlus];
       
    [number release];
   
    [pool release];
    return 0;
}

사용자 삽입 이미지
실행결과는 좌측과 같습니다.


[MyNumberMinus poseAsClass: [MyNumber class]];
이 라인은 MyNumberMinus는 앞으로 MyNumber 클래스로 사칭하고 다닌다는 의미입니다. 그래서 아래의 MyNumber *number = [[MyNumber alloc] init]; 선언은 MyNumberMinus *number = [[MyNumberMinus alloc] init]; 와 동일한 의미로 해석될 수 있습니다. 이 라인을 주석처리하고 빌드 후에 결과를 비교하시면 쉽게 이해하실 수 있습니다.

poseAsClass가 유효하기 위해서는 상위클래스가 생성되기 전에 호출되어야 합니다.

'Xcode 2 > Objective-C' 카테고리의 다른 글

Objective-C 코딩 스타일  (6) 2008.09.25
C/C++ 사용자를 위한 간단한 Objective-C 소개  (17) 2007.05.14
AND