타입스크립트

    순환 참조

    순환 참조

    옛날에 C++ 공부할 때 경험했던 순환 참조는 위와 같이 두 개의 헤더 파일이 서로를 include 했을 때 발생하는 문제였다. 이런 경우에는 주로 헤더파일 include 없이 참조하려는 클래스를 전방 선언하는 방법으로 해결했다. 최근에 타입스크립트에서도 비슷한 문제를 겪게 되었다. A-Script.ts import { B } from "B-Script"; export class A {} class Main { nodeA: A; constructor() { this.nodeA = new B(); } } B-Script.ts import { A } from "A-Script"; export class B extends A {} 이러한 구조에서 컴파일을 하니 코코스 크리에이터 에디터에서 아래와 같은 에러가 ..

    아주 심플한 가중치 랜덤 뽑기

    아주 심플한 가중치 랜덤 뽑기

    어떤 상자를 열면 A, B, C, D, E 다섯 개의 아이템 중 하나가 나온다. 그리고 이 다섯 개의 아이템이 나올 확률이 각각 다르다면 대부분은 이것을 테이블화시킬 것이다. 하지만 이런식으로 테이블을 만들면 문제가 생긴다. 한 아이템의 확률을 조정하거나, 아이템을 삭제하거나, 새 아이템을 추가하게 된다면 모든 아이템의 확률 총합이 100%가 되지 않게 되면서, 그때마다 나머지 아이템들의 확률도 같이 조정해야 한다. 그래서 가중치라는 게 필요하다. 각 아이템의 가중치를 그 아이템의 부피라고 생각할 수 있다. 그림처럼 일렬로 붙인 다음에 Random pivot 포인터가 왼쪽 끝에서부터 오른쪽 끝까지 왔다 갔다 한다고 가정해보자. 어느 순간에 포인터를 스탑 시키고, 포인터가 어디 위에서 멈췄는지 확인하는 것..

    Call By Sharing

    let array = [0,0,0]; array = []; C#에서는 Array와 List에 Clear 함수가 있지만, 자바스크립트와 타입스크립트에는 존재하지 않는다. 그래서 자바스크립트에서는 배열을 빈 배열로 초기화할 때는 위와 같이 빈 배열 []로 덮어 씌우면 된다. 그동안 위와 같은 방법을 계속 사용하다가 흥미로운 점을 발견했다. onLoad() { let array = [0,0,0]; this.Clear(array); console.log(array); // [0,0,0] } Clear(array: Array) { array = []; } Array 타입은 number와 같은 기본 타입이 아닌 객체 타입이기 때문에 Clear 함수의 매개변수로 전달할 때 Call By Reference (참조 전달..

    함수 리스트 (Delegate)

    유니티에서 옵저버패턴과 delegate를 사용했었던 경험이 몇 번 있었는데, 타입스크립트와 코코스 크리에이터를 사용하는 프로젝트에서도 비슷하게 사용하고 싶은 상황이 생겼다. export class Manager { static delegate1: { [key: string]: any } = {}; // functions 컬렉션 static delegate2: Array = []; // functions 배열 } delegate는 이런 식으로 Dictionary 형태 또는 List 형태로 생성할 수 있다. 아무래도 타입스크립트는 함수와 변수를 다루는 데 있어서 차이가 없다시피 하고 any 타입으로 함수를 지칭할 수 있기 때문에 사용하기 더 간편하다. start() { Manager.delegate1['ju..

    Array 함수 #4. reduce vs.forEach

    1. reduce reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; reduce 함수는 배열을 순회하면서 콜백 함수를 반복 실행하고, 모든 반복의 결과를 하나의 값으로 줄..

    enum 클래스 다루기

    enum 클래스 다루기

    1. enum 클래스 선언 export enum TYPE_TRASH { PAPER, VINYL, PLASTIC, CAN } enum 클래스의 선언과 정의는 C#과 거의 동일하다. enum도 클래스기 때문에 export 키워드를 붙여야 외부 클래스에서 import를 하고서 접근할 수 있다. 2. enum 클래스 사용 var temp = TYPE_TRASH.CAN; enum 클래스의 사용도 C#과 동일하다. cc.log(TYPE_TRASH[0]); // PAPER cc.log(TYPE_TRASH["PLASTIC"]); // 2 타입스크립트에서는 enum 클래스를 좀 더 폭넓게 활용할 수 있다. enum 클래스에 key값과 value값으로 접근해서 각각 value값과 key값을 얻을 수 있다. 3. enum ..

    [예제 게임] GameScene #5 (스프라이트 로드와 교체)

    [예제 게임] GameScene #5 (스프라이트 로드와 교체)

    게임 일시정지 온오프 버튼과 사운드 음소거 온오프 버튼을 만든다. 버튼은 누를 때마다 2장의 스프라이트를 번갈아서 교체하는 Toggle 형식으로 만든다. 오른쪽 상단에 버튼 두 개를 만들어준다. 버튼의 스프라이트 교체는 버튼 컴포넌트의 Transition 속성으로 구현할 수도 있다. 기본 트랜지션 상태는 보다시피 4 종류밖에 제공하지 않는데, 버튼을 누를 때마다 스프라이트를 교체하는 건 이 상태들로 구현할 수 없다. 그래서 트랜지션은 NONE으로 두고서 스크립트로 조작을 한다. @property(cc.Sprite) pauseGameButton:cc.Sprite = null; @property(cc.Sprite) pauseSoundButton:cc.Sprite = null; pauseGameSprite:c..

    [예제 게임] GameScene #4 (오디오 매니저)

    [예제 게임] GameScene #4 (오디오 매니저)

    배경 음악, 물고기 잡았을 때 효과음, 떨어트렸을 때 효과음. 3개를 준비한다. 그리고 씬에 AudioManager 노드를 만들고 AudioSource 컴포넌트를 추가한다. AudioSource와 AudioClip 개념은 유니티와 거의 동일하다. AudioSource 컴포넌트가 붙은 노드는 일종의 MP3 플레이어가 된다. 이번 포스팅에서는 오디오 매니저가 클립 리스트를 가지고 있고 외부에서 오디오 매니저에게 클립의 키 값(음원 이름)을 주고서 재생해달라고 요청하는 방식에 대해 쓰려고 한다. 그리고 재생 요청을 받은 오디오 매니저는 자신이 가지고 있는 오디오 소스로 클립을 재생할 수도 있고 코코스 오디오 엔진에게 클립을 다시 전달해서 엔진이 재생시키도록 할 수 있다. 1. AudioManager const..