코코스 크리에이터

    Layout Update

    Layout Update

    위와 같은 구조에서 Layout 노드에 아이템을 추가/삭제할 때마다 Layout 노드의 사이즈도 유동적으로 변한다. 아이템 간의 padding(간격)과 레이아웃에 속해 있는 아이템들의 넓이들을 모두 더한 값을 자동으로 계산한다. 그러나 스크립트에서 아이템을 추가했을 때는 자동으로 계산이 되지 않는다. let width1 = this.testLayout.node.width; // 391.48 let newLabel = cc.instantiate(this.testLayout.node.children[0]); newLabel.setParent(this.testLayout.node); let width2 = this.testLayout.node.width; // 391.48 실제로 위의 코드를 디버깅해보면 레이..

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

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

    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,..

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

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

    클릭(터치) 입력을 받으려면 그 입력을 감지할 노드(유니티로 치면 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..