Cocos Creator

    좌표계 (월드 스페이스와 로컬 스페이스)

    좌표계 (월드 스페이스와 로컬 스페이스)

    1. 좌표계 유니티에 월드 스페이스(World Space)와 로컬 스페이스(Local Space) 개념이 있듯이 코코스 크리에이터에도 월드 좌표계(World Coordinate)와 로컬 좌표계(Local Coordinate)가 있다. 이는 공식 레퍼런스 사이트에서의 명칭이며 실제로 API 함수들의 이름을 보면 월드 스페이스(World Space)와 노드 스페이스(Node Space)라고 부른다. (공식 레퍼런스 링크 https://docs.cocos.com/creator/manual/en/concepts/scene/coord.html) 동일한 오브젝트를 기준으로 월드 스페이스에서의 포지션을 월드 포지션, 로컬 스페이스에서의 포지션을 로컬 포지션이라고 부른다. 월드 포지션은 전체 3D 월드의 원점(0,0,..

    [2.4.5 버그] cc.lerp

    [2.4.5 버그] cc.lerp

    let unit = cc.lerp(this.layoutOldPos, -targetDistance, this.timeStack * moveSpeed); 원래 노드의 이동은 tween을 이용해서 처리하는 편인데, tween은 노드의 active가 꺼지면 작동을 멈추기 때문에 lerp를 쓰는 것으로 선회했다. 그런데 왠걸? 에디터에서 디버깅까지 다 마치고 뽑은 빌드에서 cc.lerp를 찾을 수 없다는 에러가 나왔다. 'cc.lerp not a function' 키워드로 구글링해봤지만 원인을 찾을 수 없었다. * @param {Number} a number A * @param {Number} b number B * @param {Number} r ratio between 0 and 1 * @function * ..

    클릭(터치)한 지점의 좌표 구하기

    클릭(터치)한 지점의 좌표 구하기

    클릭(터치) 입력을 받으려면 그 입력을 감지할 노드(유니티로 치면 Collider)와 클릭 이벤트 리스너가 있어야 한다. 화면 어느 곳을 눌러도 클릭 이벤트가 발생되려면 노드 사이즈는 언제나 화면(Screen) 사이즈와 동일해야 한다. 이는 Widget 컴포넌트를 붙이거나 스크립트에서 처리를 해줘야 한다. onLoad(){ this.touchScreen = this.node.getChildByName("TouchScreen"); // 터치 입력을 받을 스크린 사이즈의 노드 this.centerPin = this.node.getChildByName("CenterPin"); // 터치 포인트와 비교할 또 다른 포인트 this.touchScreen.on("touchend", function(event) { t..

    ParticleSystem, Animation 재시작

    ParticleSystem, Animation 재시작

    Fx/effect_smoke에 파티클 컴포넌트가 붙어있다. 그리고 effect_smoke 파티클은 Loop가 해제돼있어서 한 번만 재생되고 Play On Awake 옵션으로 인해 노드가 활성화될 때 재생된다. 위와 같은 상황에서 effect_smoke 노드 또는 부모 노드인 Fx를 껐다가 다시 키면 effect_smoke는 이전 상태(이전 frame)를 이어서 재생한다. 노드가 꺼졌을 때 stop이 아니라 resume인 것이다. 이러한 성질은 cc.ParticleSystem 뿐만 아니라 cc.Animation에도 동일하게 적용된다. 유니티의의 경우 오브젝트를 껐다 켰을 때 Animation을 다시 처음부터 재생한다. 코코스와 유니티의 차이다. 어떤 이펙트를 껐다가 다시 켰을 때는 처음부터 다시 재생하도록..

    일정시간 동안 숫자 증가시키는 UI

    일정시간 동안 숫자 증가시키는 UI

    보통 이러한 기능은 타겟으로 하는 라벨만 다를 뿐, 여러 클래스에서 사용할 가능성이 높다. /** * @param subject 스케쥴러를 실행할 주체 * @param start 시작 값 * @param add 시작 값에 추가할 변화 값 * @param duration 지속시간 * @param label 타겟 라벨 * @returns 스케쥴러 */ public static MoneyCounter(subject:any, start:number, add:number, duration:number, label:cc.Label){ let time = 0; // 누적 시간 let current = 0; // 누적 시간에 따른 현재 값 let counter = function() { time += cc.direct..

    실시간 시간 표시 (Timer)

    실시간 시간 표시 (Timer)

    1. 로컬 타임 update(dt:number){ let today = new Date(); let year = today.getFullYear(); let month = ('0' + (today.getMonth() + 1)).slice(-2); let day = ('0' + today.getDate()).slice(-2); let hours = ('0' + today.getHours()).slice(-2); let minutes = ('0' + today.getMinutes()).slice(-2); let seconds = ('0' + today.getSeconds()).slice(-2); this.label.string = day + '/' + month + '/' + year + '\n' + hou..

    [2.4.5 버그] cc.tween repeatForever

    [2.4.5 버그] cc.tween repeatForever

    this.infiniteRotate = cc.tween(this.wheel).delay(0.8).by(0.4, { angle : -360 }).repeatForever().start(); 0.8초의 첫 대기시간을 가진 뒤, 0.4초동안 360도 회전하는 동작을 무한히 반복하는 코드다. 크리에이터 버전 2.4.5에서 잘 작동하던 코드가 2.4.8 버전업 하고나서 문제가 생겼다. [Action update]. override me 라는 로그가 계속 찍히면서 오브젝트가 회전하지 않았다. 구글링 결과 확실히 버전과 연관이 있는 버그였다. https://forum.cocos.org/t/2-1-2-tween-repeatforever/80820 (중국어 답변을 구글 번역기로 돌림) 여러 차례 이 글을 읽어본 결과. ..

    비동기 함수 실행 방법들

    유니티에서 Update를 쓰지 않고 코루틴만을 사용해 비동기식 프로그래밍을 주로 하다보니 코코스 크리에이터에서도 그러한 스타일을 유지하고 싶었다. 그리고 현재까지는 세 가지의 방법을 사용해봤다. 개념 설명까지 하기에는 많이 복잡해서 더 공부해야되서 사용법만 간단하게 정리해본다. 아래 방법들은 주로 어떤 노드의 상태 변화나 연출 등에 사용해봤고 큰 문제를 겪진 않았다. 파일 입출력이나 서버로부터 패킷 대기와 같은 상황들에서는 좀 더 까다롭게 접근할 필요가 있다. 1. async, await async Test(){ await this.Sleep(2000); console.log("2초 지났음"); } Sleep(ms : number){ return new Promise(resolve => setTimeou..