본문 바로가기

프로그래밍/Game Dev16

[Phaser] 미니맵 미니맵 생성 코드 미니맵 뒤에 처리를 하기 위한 사각형을 만들어주고 있다. 실제 맵 크기의 0.1을 곱하여 적절하게 나오도록 값을 설정해준다. (비율은 개발하는 환경에 맞추어 변경되어야 한다. mapWidth, mapHeight 값도 마찬가지) // 미니맵 추가 let { width, height } = this.game.canvas; // offset 0.5, leftTop을 기준으로 배치한다. this.minimapBackground = this.add .rectangle( parseInt(this.mapWidth * 0.05 + width - this.mapWidth * 0.1) - 4, parseInt(this.mapHeight * 0.05 + height - this.mapHeight * 0.1.. 2023. 10. 4.
[Phaser] Toast 메시지 채팅으로 입력한 데이터를 Toast 형태로 출력해준다. 미리 Text와 graphics 객체를 만들어서 Container로 묶어준다. createMessageContainer() { // 메시지 컨테이너를 생성한다. 세부 설정은 하지 않음 this.messageWidth = 0; this.messageHeight = 0; this.messagePadding = 2; // positions are relative to the container this.messageRect = this.add.graphics(); this.messageText = this.add .text(this.messagePadding, this.messagePadding, "") .setFont("10px") .setColor("#.. 2023. 10. 4.
[Phaser] UI Text, Camera, Switching Scene UI Text 장면에서 text를 추가한다. scrollFactor를 1로 주면 카메라의 좌표에 영향을 받게 된다. (World 상에 출력하고 싶다면 1) createTextInfo() { this.posText = this.add .text(8, 8, "", { font: "16px", fill: "#000000", }) .setScrollFactor(0) .setDepth(100); } 플레이어의 x, y 좌표와 fps 정보를 출력한다. updateTextInfo() { this.posText.setText( `x: ${Math.round(this.player.x)}\ny: ${Math.round( this.player.y )}\nfps: ${Math.round(this.game.loop.actual.. 2023. 10. 3.
[Phaser] Pixel bleeding 이슈 타일맵 기반으로 개발을 하다보면 타일에 없는 격자가 생기는 이슈가 발생한다. Pixel bleeding 현상이라고 하는데 타일맵의 크기를 늘려서 돌출 시키는 형태로 변경하면 사라진다. https://github.com/sporadic-labs/tile-extruder 이쪽에서 tile-extruder를 설치하고 기존에 처리하던 타일맵을 돌려준다. 그러면 각 타일의 크기가 2px씩 증가되어 타일맵 이미지가 형성이 되는데, 기존에 처리하던 Tiled 프로젝트가 있다면 이미지를 수정해주어야 한다. 나의 경우 32 x 32 타일맵을 사용하고 있었고, 돌출한 이후에는 34 x 34 형태가 되었다. 상단의 tileset 탭에서 속성을 누르고 image를 다시 잡아준다. (34 x 34로 추가한다.) => 타일셋에서.. 2023. 10. 2.
[Phaser] Animation, TileMap Phaser Make your first game(https://phaser.io/tutorials/making-your-first-phaser-3-game/part1) Tutorials, Samples - Official Sample과 참고자료들 처음 게임 만드는 예제는 정말 강추한다. Phaser 애니메이션 처리 방식 Phaser의 애니메이션은 이미지를 넣고 소스상에서 애니메이션을 만드는 방식도 가능하고, json으로 아틀라스 이미지의 offset 정보와 animation 정보(FPS, 참조 image 등)를 처리하는 형태도 가능하다. Atlas 애니메이션 편집 툴(Frame 정보 json으로 뽑기, 애니메이션 정보 json으로 뽑기) https://gammafp.com/tool/atlas-packe.. 2023. 9. 28.
[Node.js] 간단한 멀티 슈팅게임 소스 분석 크리스코스 유튜브의 멀티플레이어 게임 소스를 분석했다. https://github.com/chriscourses/multiplayer-game 게임 상의 로직은 각도로 총알 쏘는 슈팅게임인데, Node.js 기반에서 동작하는 멀티플레이 게임이다. 서버단에서 총알 리스트와 플레이어 리스트를 가지고 있고 일정 tick마다 update를 클라에게 내려준다. 클라는 해당 데이터를 받아 플레이어와 총알을 그린다. 서버쪽 데이터를 보고 없는 데이터는 생성, 있었으면 업데이트, 클라에서 있던 것이 없어졌으면 삭제 총알은 이렇게 처리하고 플레이어는 점수판에 대한 갱신도 추가적으로 해주고 있다. 또한 서버는 플레이어와 총알의 충돌 처리도 동시에 진행하는데 충돌이 일어난 경우, 서버의 플레이어 리스트에서 제거하고 총알도 .. 2023. 9. 26.
[C#] Thread Local Storage 쓰레드는 힙 영역과 데이터 영역을 공유한다. Thread마다 가질 수 있는 공유한 영역을 만드려면 Thread Local Storage(TLS) 를 사용하면 된다. 다음 예제는 TLS로 생성한 영역에 이름을 넣고 출력하는 예제이다. Sleep을 걸어서 다른 쓰레드가 값을 건드리는지 확실하게 체크한다. class ThreadProgram { static ThreadLocal ThreadName = new ThreadLocal(); //static string ThreadName; static void WhoAmI() { ThreadName.Value = $"My name is {Thread.CurrentThread.ManagedThreadId}"; Thread.Sleep(1000); Console.Writ.. 2023. 8. 28.
[C#] AutoResetEvent AutoResetEvent는 키를 얻고 문을 닫는(다른 스레드 접근 불가) 처리를 자동으로 진행해준다. class Lock { // 문을 닫는 행위를 자동으로 해준다. 커널 단위의 실행. SpinLock은 커널에 요청하지 않음 AutoResetEvent _available = new AutoResetEvent(true); public void Acquire() { _available.WaitOne(); // 입장 시도 } public void Release() { _available.Set(); // flag = true } } class ThreadProgram { static int _num = 0; static Lock _lock = new Lock(); static void Thread_1() {.. 2023. 8. 26.
[C#] SpinLock 키를 가진 사람은 하나이고 화장실에 들어가서 문을 잠근다. 볼일을 보고 나가면서 키를 두고 나간다. 다음 코드는 SpinLock이 제대로 동작하지 않는 코드이다. class SpinLock { volatile bool _locked = false; public void Acquire() { while (_locked) { // 잠김이 풀릴 때까지 기다린다. } _locked = true; } public void Release() { _locked = false; } } class ThreadProgram { static int _num = 0; static SpinLock _lock = new SpinLock(); static void Thread_1() { for (int i = 0; i 우선순위가 .. 2023. 8. 26.
[C#] Interlocked 원자성이란? 어떠한 동작이 한번에 일어나야 하는 것을 의미한다. 예시) 돈을 송금하는 상황 1. 돈을 내 계좌에서 줄인다. 2. 상대 계좌에 돈을 늘린다. 만약 1번까지만 성공하고, 2번에서 문제가 생겼다면? 원자성을 보장하지 않는 것이다. 이를 막기 위해 Interlocked 함수를 이용한다. 다음 코드는 쓰레드를 실행시켜 공유 변수인 number에 접근하는 예제이다. 0이 나오지 않는다. class ThreadProgram { static int number = 0; static void Thread_1() { for (int i = 0; i 2023. 8. 26.