coolsharp의 놀이터

    /**
    * FileName : AtlasTest.java
    * Comment : 비트맵 폰트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 19.
    */
    static class LabelAtlasTest extends AtlasDemo {
        float time;

        /**
         * Constructor
         */
        public LabelAtlasTest() {
            super();
           
            // 123 Test라는 기본 텍스트에 tuffy_bold_italic-charmap_s.png라는 비트맵 폰트 파일을 대입한 라벨 생성함
            // 폰트당 크기는 넓이 48, 높이 64
            CCLabelAtlas label1 = CCLabelAtlas.label("123 Test", "tuffy_bold_italic-charmap.png", 48, 64, ' ');
            addChild(label1, 0, kTagSprite1);
            label1.setPosition(CGPoint.ccp(10, 100));
            // 이렇게 투명도를 지정할 수 있음
            label1.setOpacity(200);

            CCLabelAtlas label2 = CCLabelAtlas.label("0123456789", "tuffy_bold_italic-charmap.png", 48, 64, ' ');
            addChild(label2, 0, kTagSprite2);
            label2.setPosition(CGPoint.ccp(10, 200));
            label2.setOpacity(32);

            schedule(new UpdateCallback() {

                @Override
                public void update(float d) {
                    step(d);
                }
            });
        }

        public void step(float dt) {
            time += dt;
            String string = CCFormatter.format("%2.2f Test", time);
            CCLabelAtlas label1 = (CCLabelAtlas) getChildByTag(kTagSprite1);
            label1.setString(string);

            CCLabelAtlas label2 = (CCLabelAtlas) getChildByTag(kTagSprite2);
            label2.setString(CCFormatter.format("%d Time", (int)time));
        }

        @Override
        public String title() {
            return "CCLabelAtlas LabelAtlasTest";
        }

        public String subtitle() {
            return "Updating label should be fast";
        }
    }

Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : 돌아온 길을 다시 돌아가라
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionReverse extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            alignSpritesLeft(1);

            // 2초동안 오른쪽으로 300만큼 50높이로 4번 뛰어라.
            CCJumpBy jump = CCJumpBy.action(2, CGPoint.ccp(300, 0), 50, 4);
            // 온길로 돌아가라.
            CCSequence action = CCSequence.actions(jump, jump.reverse());

            grossini.runAction(action);
        }

        public String title() {
            return "Reverse an action";
        }
    }
Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : 지지지 않는 무한 반복
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionRepeatForever extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            centerSprites(1);

            // 1초 딜레이 후 콜백 호출
            CCSequence action = CCSequence.actions(CCDelayTime.action(1), CCCallFuncN.action(this, "repeatForever"));

            grossini.runAction(action);
        }

        /**
        * Comment : 무한 반복
        * @version : 1.0
        * @tags : @param sender
        * @date : 2011. 10. 18.
        */
        public void repeatForever(Object sender) {
            // 1초동안 360동 회전 무한 반복
            CCRepeatForever repeat = CCRepeatForever.action(CCRotateBy.action(1.0f, 360));

            ((CCNode) sender).runAction(repeat);
        }

        public String title() {
            return "CallFuncN + RepeatForever";
        }
    }

Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : CSpawn 테스트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionSpawn extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            alignSpritesLeft(1);

            // 이것은 구미호 재주넘기
            // 2초동안 300px만큼 왼쪽으로 50 높이로 4번 뛰면서 동시에 2초동안 720도 재주넘기를 하여
            CCAction action = CCSpawn.actions(CCJumpBy.action(2, CGPoint.ccp(300, 0), 50, 4), CCRotateBy.action(2, 720));

            grossini.runAction(action);
        }

        public String title() {
            return "Spawn: Jump + Rotate";
        }
    }

Posted by coolsharp

cocos2d for android - callback

2011. 10. 18. 19:45 : 개발
    /**
    * FileName : ActionsTest.java
    * Comment : 콜백 테스트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionSequence2 extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            alignSpritesLeft(1);

            // 보이지 않게 설정
            grossini.setVisible(false);

            // 200, 200에 위치하고 보인 후 100 만큼 오른쪽으로 이동
            CCSequence action = CCSequence.actions(CCPlace.action(CGPoint.ccp(200, 200)), CCShow.action(), CCMoveBy.action(1, CGPoint.ccp(100, 0)),
                    CCCallFunc.action(this, "callback1"), CCCallFuncN.action(this, "callback2"), CCCallFuncND.action(this, "callback3", Float.valueOf(1.0f)));

            grossini.runAction(action);
        }

        public void callback1() {
            CGSize s = CCDirector.sharedDirector().winSize();
            CCLabel label = CCLabel.makeLabel("callback 1 called", "DroidSans", 16);
            label.setPosition(CGPoint.ccp(s.width / 4 * 1, s.height / 2));

            addChild(label);
        }

        public void callback2(Object sender) {
            CGSize s = CCDirector.sharedDirector().winSize();
            CCLabel label = CCLabel.makeLabel("callback 2 called", "DroidSans", 16);
            label.setPosition(CGPoint.ccp(s.width / 4 * 2, s.height / 2));

            addChild(label);
        }

        public void callback3(Object sender, Object data) {
            CGSize s = CCDirector.sharedDirector().winSize();
            CCLabel label = CCLabel.makeLabel("callback 3 called", "DroidSans", 16);
            label.setPosition(CGPoint.ccp(s.width / 4 * 3, s.height / 2));

            addChild(label);
        }

        public String title() {
            return "Sequence of InstantActions";
        }
    }

Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : 액션 테스트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionSequence extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            alignSpritesLeft(1);

            // 2초동안 240, 0까지 이동하고 동시에 2초동안 540도 회전(구미호같이?)
            CCSequence action = CCSequence.actions(CCMoveBy.action(2, CGPoint.ccp(240, 0)), CCRotateBy.action(2, 540));

            // 액션 지정
            grossini.runAction(action);
        }

        public String title() {
            return "Sequence: Move + Rotate";
        }
    }

Posted by coolsharp

cocos2d for android - animation

2011. 10. 18. 18:58 : 개발
    /**
    * FileName : ActionsTest.java
    * Comment : 애니메이션
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionAnimate extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            centerSprites(1);

            // 애니메이션 생성
            CCAnimation animation = CCAnimation.animation("dance");
            // 그림 로드 하면서 대입
            for (int i = 1; i < 15; i++)
                animation.addFrame(String.format("grossini_dance_%02d.png", i));

            // 3초간 애니메이션 진행
            CCAnimate action = CCAnimate.action(3, animation, false);
            CCAnimate action_back = action.reverse();

            grossini.runAction(CCSequence.actions(action, action_back));
        }

        public String title() {
            return "Animation";
        }
    }

Posted by coolsharp

cocos2d for android - Tint

2011. 10. 18. 18:57 : 개발
    /**
    * FileName : ActionsTest.java
    * Comment : 농도를 변경
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionTint extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            centerSprites(2);

            // To는 절대적으로 rgb에 맞는 농도가 변경되고 By는 현재의 값에서 rgb가 추가되어 색상이 변경
            // R값 255, B값 255로 농도 변경
            CCTintTo action1 = CCTintTo.action(2, ccColor3B.ccc3(255, 0, 255));
            // R값 -127, G값 -255, B값 -127로 농도 변경
            CCTintBy action2 = CCTintBy.action(2, ccColor3B.ccc3(-127, -255, -127));
            // 거꾸로
            CCTintBy action2Back = action2.reverse();

            tamara.runAction(action1);
            kathia.runAction(CCSequence.actions(action2, action2Back));
        }

        public String title() {
            return "TintTo / TintBy";
        }
    }

Posted by coolsharp

cocos2d for android - 곡선

2011. 10. 18. 18:51 : 개발
    /**
    * FileName : ActionsTest.java
    * Comment : 베이지 곡선 그리기
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionBezier extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            // 윈도우 크기 얻기
            CGSize s = CCDirector.sharedDirector().winSize();


            // sprite 1
            // Bezier 설정 객체 생성


            // http://en.wikipedia.org/wiki/User_talk:Twirlip 그림 3번 항목 참조
            // 그림에 보면 P0, P1, P2, P3가 있음
            // 현재 위치가 P0, controlPoint_1가 P1, controlPoint_2가 P2, endPosition가 P3
            CCBezierConfig bezier = new CCBezierConfig();
            // 첫번째 포인트 지정
            bezier.controlPoint_1 = CGPoint.ccp(0, s.height / 2);
            // 두번째 포인트 지정
            bezier.controlPoint_2 = CGPoint.ccp(300, -s.height / 2);
            // 종점 포인트 지정
            bezier.endPosition = CGPoint.ccp(300, 100);

            // Bezier 객체 생성
            // 3초간 위 설정대로 진행
            CCBezierBy bezierForward = CCBezierBy.action(3, bezier);
            // 역 방향 진행
            CCBezierBy bezierBack = bezierForward.reverse();
            // 액션 시퀀스 생성
            CCSequence seq = CCSequence.actions(bezierForward, bezierBack);
            // 무판 반복 rep 생성
            CCRepeatForever rep = CCRepeatForever.action(seq);

            // sprite 2
            // 현재 위치 지정
            tamara.setPosition(CGPoint.ccp(200, 160));
            CCBezierConfig bezier2 = new CCBezierConfig();
            bezier2.controlPoint_1 = CGPoint.ccp(100, s.height / 2);
            bezier2.controlPoint_2 = CGPoint.ccp(200, -s.height / 2);
            bezier2.endPosition = CGPoint.ccp(240, 160);

            CCBezierTo bezierTo1 = CCBezierTo.action(2, bezier2);

            // sprite 3
            kathia.setPosition(CGPoint.ccp(400, 160));
            CCBezierTo bezierTo2 = CCBezierTo.action(2, bezier2);

            grossini.runAction(rep);
            tamara.runAction(bezierTo1);
            kathia.runAction(bezierTo2);
        }

        public String title() {
            return "BezierBy / BezierTo";
        }
    }
Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : 액션 테스트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionJump extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            // 통통 튀기
            // CCJumpTo와 CCJumpBy로 Jump를 설정할 수 있는데 To와 By의 차이점은 각각 position에 대한
            // 값의 절대적 상대적 차이로 설정된다. 즉, JumpTo는 절대적으로 설정한 position 위치로 Jump를 하면서
            // 이동을 하는데 JumpBy는 현재 위치에서 position으로 설정된 값만큼을 더한 위치로 Jump하면서 이동
            // 2초동안 300, 300의 위치로 높이는 50픽셀로 4번의 점프를 하면서 이동
            CCJumpTo actionTo = CCJumpTo.action(2, CGPoint.ccp(300, 300), 50, 4);
            // 2초동안 현재 위치에서 가로로만 300픽셀을 더한 위치로 높이는 50픽셀로 4번 점프를 하면서 이동
            CCJumpBy actionBy = CCJumpBy.action(2, CGPoint.ccp(300, 0), 50, 4);
            // 거꾸로
            CCJumpBy actionByBack = actionBy.reverse();
            // 2초동안 현재 위치에서 높이는 50픽셀로 4번 점프
            CCJumpBy actionUp = CCJumpBy.action(2, CGPoint.ccp(0, 0), 50, 4);

            tamara.runAction(actionTo);
            grossini.runAction(CCRepeatForever.action(CCSequence.actions(actionBy, actionByBack)));
            // 이놈은 무제한 액션이다 계속 반복을 하며 멈추지 않는다.
            kathia.runAction(CCRepeatForever.action(actionUp));
        }

        public String title() {
            return "JumpTo / JumpBy";
        }
    }

Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : 크기 조절 데모
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionScale extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            centerSprites(3);

            // 2초간 0.5배 축소
            CCScaleTo actionTo = CCScaleTo.action(2, 0.5f);
            // 2초간 2배 확대
            CCScaleBy actionBy = CCScaleBy.action(2, 2);
            // 2초간 넓이 0.25배 축소, 높이 4.5배 늘림
            CCScaleBy actionBy2 = CCScaleBy.action(2, 0.25f, 4.5f);
            // 2배 확대된 것을 원상복구
            CCScaleBy actionByBack = actionBy.reverse();

            // 2초간 0.5배 축소
            tamara.runAction(actionTo);
            // 2초간 2배 확대 후 2초간 원상 복구
            grossini.runAction(CCSequence.actions(actionBy, actionByBack));
            // 2초간 넓이 0.25배 축소, 높이 4.5배 늘림
            kathia.runAction(CCSequence.actions(actionBy2, actionBy2.reverse()));
        }

        public String title() {
            return "ScaleTo / ScaleBy";
        }

    }

Posted by coolsharp

cocos2d for android - 회전

2011. 10. 18. 18:46 : 개발
    /**
    * FileName : ActionsTest.java
    * Comment : 회전 테스트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionRotate extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            centerSprites(3);

            // 2초간 시계방향 45도 회전
            CCRotateTo actionTo = CCRotateTo.action(2, 45);
            // 2초가 반시계 방향 45도 회전
            CCRotateTo actionTo2 = CCRotateTo.action(2, -45);
            // 2초간 0도로 회전
            CCRotateTo actionTo0 = CCRotateTo.action(2, 0);
            // 2초간 시계방향으로 45도 회전 한 다음 다시 2초간 0도로 복귀
            tamara.runAction(CCSequence.actions(actionTo, actionTo0));

            // 2초간 시계방향으로 360도 회전
            CCRotateBy actionBy = CCRotateBy.action(2, 360);
            // 2초간 반시계방향으로 360도 회전
            CCRotateBy actionByBack = actionBy.reverse();
            // 2초간 시계방향으로 360도 회전 한 다음 다시 2초간 반시계방향으로 360도 회전
            grossini.runAction(CCSequence.actions(actionBy, actionByBack));

            // 2초간 반시계 방향으로 45도 회전 한다음 다시 2초간 0도로 복귀
            kathia.runAction(CCSequence.actions(actionTo2, actionTo0.copy()));
        }

        public String title() {
            return "RotateTo / RotateBy";
        }

    }

Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : 이동 테스트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionMove extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            centerSprites(3);

            // 사이즈 객체 생성(윈도우 크기 가져오기)
            CGSize s = CCDirector.sharedDirector().winSize();

            // Move 액션 객체 생성하며 값 지정(윈도우 넓이-40만큼, 윈도우 높이-40만큼)
            CCMoveTo actionTo = CCMoveTo.action(2, CGPoint.ccp(s.width - 40, s.height - 40));

            // 이동 객체 생성하며 값 지정(80, 80)만큼
            CCMoveBy actionBy = CCMoveBy.action(2, CGPoint.ccp(80, 80));
            // 이동 객체 생성(actionBy의 반대로 설정)
            CCMoveBy actionByBack = actionBy.reverse();

            // 액션 시작
            tamara.runAction(actionTo);
            grossini.runAction(CCSequence.actions(actionBy, actionByBack));
            kathia.runAction(CCMoveTo.action(1, CGPoint.ccp(40, 40)));
        }

        public String title() {
            return "MoveTo / MoveBy";
        }
    }

Posted by coolsharp
    /**
    * FileName : ActionsTest.java
    * Comment : 사용자 변형 테스트
    * @version : 1.0
    * @author : coolsharp
    * @date : 2011. 10. 18.
    */
    static class ActionManual extends ActionDemo {
        public void onEnter() {
            super.onEnter();

            CGSize s = CCDirector.sharedDirector().winSize();

            // 크기 지정
            tamara.setScaleX(1.0f);
            tamara.setScaleY(1.0f);
            tamara.setPosition(CGPoint.ccp(100, 70));
            // 투명도 지정
            tamara.setOpacity(228);

            // 회전
            grossini.setRotation(180);
            // 위치 지정
            grossini.setPosition(CGPoint.ccp(s.width / 2, s.height / 2));
            // 채널 색상 지정
            grossini.setColor(ccColor3B.ccc3(255, 0, 0));

            // 위치 지정
            kathia.setPosition(CGPoint.ccp(s.width - 100, s.height / 2));
            // 채널 색상 지정
            kathia.setColor(ccColor3B.ccBLUE);
        }

        public String title() {
            return "Manual Transformation";
        }
    }

Posted by coolsharp

cocos2d for android - Remove

2011. 10. 18. 18:42 : 개발
/**
* FileName : RemoveTest.java
* Comment : Move 콜백 객체 배우자
* @version : 1.0
* @author : coolsharp
* @date : 2011. 10. 18.
*/
public class RemoveTest extends com.coolsharp.test.game.ActionManager.ActionManagerDemo {
    public RemoveTest() {
        super();

        // 이동 객체 생성
        CCMoveBy move = CCMoveBy.action(5, CGPoint.ccp(200, 0));

        // 콜백 객체 생성
        CCCallFunc callback = CCCallFunc.action(this, "stopAction");

        // 시퀀스 액션 등록(이동 객체를 콜백으로 등록)
        CCSequence sequence = CCSequence.actions(move, callback);
        // 시퀀스 객체를 나중에 찾아 써야 하므로 이름표 지정
        sequence.setTag(com.coolsharp.test.coolsharp_cocos2d_test_Activity.kTagSequence);

        CCSprite child = CCSprite.sprite("grossini.png");
        child.setPosition(CGPoint.ccp(200, 200));
        this.addChild(child, 1, com.coolsharp.test.coolsharp_cocos2d_test_Activity.kTagGrossini);

        // 시퀀스 액션 시작
        child.runAction(sequence);
    }

    public void stopAction() {
        Log.i("coolsharp", "SA");
//        CCNode sprite = getChildByTag(com.coolsharp.test.coolsharp_cocos2d_test_Activity.kTagGrossini);
//        sprite.stopAction(com.coolsharp.test.coolsharp_cocos2d_test_Activity.kTagSequence);
    }

    public String title() {
        return "Remove Test";
    }

    public String subtitle() {
        return "Should not crash. Testing issue #841";
    }

Posted by coolsharp

cocos2d for android - Pause

2011. 10. 18. 18:40 : 개발
/**
* FileName : PauseTest.java
* Comment : 일시 정지 테스트
* @version : 1.0
* @author : coolsharp
* @date : 2011. 10. 18.
*/
public class PauseTest extends com.coolsharp.test.game.ActionManager.ActionManagerDemo {
    /**
     * 생성자
     */
    public PauseTest() {
        super();
    }

    /**
    * Comment : 진입
    * @version : 1.0
    * @tags :
    * @date : 2011. 10. 18.
    * @see org.cocos2d.layers.CCLayer#onEnter()
    */
    public void onEnter() {
        super.onEnter();

        Log.i("coolsharp", "onEnter");

        CCSprite grossini = CCSprite.sprite("grossini.png");

        // 자식을 추가
        addChild(grossini, 0, com.coolsharp.test.coolsharp_cocos2d_test_Activity.kTagGrossini);

        grossini.setPosition(CGPoint.ccp(200, 200));

        // 이동 명령 1.0초동안 150, 0 으로 이동
        // 이전 처럼 바로 runAction이 아님 점의 유의
        CCAction action = CCMoveBy.action(1.0f, CGPoint.ccp(150, 0));

        // Action Maanger에 Action 일시 정지 상태로 등록함
        CCActionManager.sharedManager().addAction(action, grossini, true);

        // 이 스케쥴을 3초 후로 지정
        this.schedule("unpause", 3);
    }

    public void unpause(float dt) {
        // 스케쥴 해지
        unschedule("unpause");
        CCNode node = getChildByTag(com.coolsharp.test.coolsharp_cocos2d_test_Activity.kTagGrossini);
        // 노드 인덱스로 노드 가져옴(모든 객체의 선조는 CCNode임)
        CCActionManager.sharedManager().resume(node);
        // 진행
    }

    @Override
    public String title() {
        return "Pause Test";
    }

    public String subtitle() {
        return "After 3 seconds grossini should move";
    }
}

Posted by coolsharp

cocos2d for android - CrashTest

2011. 10. 18. 18:38 : 개발
/**
* FileName : CrashTest.java
* Comment : 액션 매니저 데모
* @version : 1.0
* @author : coolsharp
* @date : 2011. 10. 18.
*/
public class CrashTest extends com.coolsharp.test.game.ActionManager.ActionManagerDemo {
    /**
     * Crash 테스트
     */
    public CrashTest() {
        super();

        // CCSprite 생성
        CCSprite grossini = CCSprite.sprite("grossini.png");
        // 위치 지정
        grossini.setPosition(CGPoint.ccp(200, 200));
        // 자식으로 추가
        addChild(grossini);

        // 1.5초 동안 360도 각도를 틀음
        grossini.runAction(CCRotateBy.action(1.5f, 360));
        // 1.5초의 딜레이, 1.5초의 페이드아웃, 1.5초의 페이드인, 1.5초의 페이드아웃, 1.5초의 페이드
        grossini.runAction(CCSequence.actions(CCDelayTime.action(1.5f), CCFadeOut.action(1.5f), CCFadeIn.action(1.5f), CCFadeOut.action(1.5f), CCFadeIn.action(1.5f)));

        // 1.5초 후 홀로 소멸됨
        // 소멸되면서 같은 이름의 함수 호출
        this.runAction(CCSequence.actions(CCDelayTime.action(1.4f), CCCallFunc.action(this, "removeFunc")));

    }

    /**
    * Comment : 자기 자신을 죽이고 다른 넘을 호출하는 함수
    * @version : 1.0
    * @tags :
    * @date : 2011. 10. 18.
    */
    public void removeFunc() {
        // 부모를 얻은 후 자기 자신을 소멸함
        this.getParent().removeChild(this, true);
        // 선조 클레스에서 선언된 다음 레이어 호출
        this.nextCallback(null);
    }

    /**
    * Comment : 윈래 기본 타이틀을 오버라이딩 함
    * @version : 1.0
    * @tags : @return
    * @date : 2011. 10. 18.
    * @see com.coolsharp.test.game.ActionManager.ActionManagerDemo#title()
    */
    @Override
    public String title() {
        return "Test 1. Should not crash";
    }

    /**
    * Comment : 서브 타이틀 오버라이딩
    * @version : 1.0
    * @tags : @return
    * @date : 2011. 10. 18.
    * @see com.coolsharp.test.game.ActionManager.ActionManagerDemo#subtitle()
    */
    @Override
    public String subtitle() {
        return "한글 테스트";
    }
}

Posted by coolsharp

cocos2d for android 개발

2011. 10. 18. 18:35 : 개발
제가 어제부터 게임 프로그래머의 길에 접어 들었습니다.

오늘부터 학습 내용을 하나씩하나씩 블로그에 올릴 예정 입니다.

Posted by coolsharp