분류 전체보기 81

Node.js 서버 user, dungeon 관리 작성 - 최종프로젝트 2

1. 최종프로젝트 1에서 일부러 class와 session 관리를 어떻게 하고 있는지 보여주지 않았습니다.위의 이유에 대해서는 할말이 정말 많지만 이미 망가져버린 코드 구조의 흐름을 보여주고 싶지도 않았지만 일단, 누군가 진지하게 읽을 수 있으니 간단하게 설명하며 보여드리겠습니다.2. user.class유저 클래스에서는 로그인한 유저들을 관리하기 위해서 필요한 정보를 객체화 해서 관리하기 위해 만들었습니다.const { TOWN_SPAWN_TRANSFORMS } = configs;class User { #pingQueue = []; #intervalId = null; constructor(socket) { this.socket = socket; this.id = socket.id; ..

TIL 2024.12.17

Node.js 서버 GetSkill.Handler 작성 - 최종프로젝트 1

글을 쓰기에 앞서 4주동안 열심히 스파르타 코딩 클럽에서 최종프로젝트를 하던 나의 조가 해체가 되었다.그렇게 튜터님들과 팀원들의 노력으로 다른 조에 병합하게 되었고, 그곳의 서버에 무언가 데이터를 싸버린 것을 본 저는 핸들러가 제대로 동작할 수 있게 노력을 하였습니다.1. 프로토 메세지를 확인message SkillInfo { int32 skillId = 1; // 스킬 ID float damageRate = 2; // 스킬 계수 float coolTime = 3; // 스킬 쿨타임}message C_GetSkill { int32 skillId = 1; // 장착된 스킬 ID int32 itemInstanceId = 2; // 고유 아이템 ID int32 slotIndex = 3; ..

TIL 2024.12.17

자원 전쟁 (서버) 프로젝트 - 용광로 만들기 2탄

2탄을 만든 이유:1. 동기화 기준의 불명확성서버와 클라이언트 간 용광로 상태를 동기화하는 명확한 기준이 부재클라이언트간 독립적으로 계산할 수 있는 데이터를 제공하지 않고, 서버와 클라간에 시간을 주기적으로 서버에서 받아야만 정상 동작으로 설계 2. SRP 위반GameManager에 용광로 관련 연산 로직을 포함, 단일 책임 원칙을 지키지 못함.GameManager의 역할이 비대해지며 코드 가독성과 유지보수성에 부정적인 영향을 미침.개선 방법:1. 동기화 방식 개선멀티플레이 환경에서 모든 클라이언트가 동일한 상태를 유지할 수 있도록 설계 변경.서버 시간과 클라이언트 시간을 계산해 동기화하는 대신, 용광로 상태가 변경될 때마다 서버에서 시뮬레이션을 수행하여 연산 결과를 클라이언트에 전송.클라이언트는 수신된..

TIL 2024.12.05

자원 전쟁 (서버) 프로젝트 - 용광로 만들기 1탄

작성 이유 이번 프로젝트에서 여러 담당을 맡았던 도중에 용광로 핸들러를 마무리 작업을 하던 도중에 문제가 생겼다.문제는 내가 설계한 대로 하면 클라랑 서버랑 계속 시간을 비교해서 동기화를 서로 해줘야하는 작업이 있어야한다.다시 말하자면 현재 값을 계속 클라한테 보내줘야 하는데 멀티 게임 특성상, 클라 끼리 계산을 해줄 수 있는걸 보내줬어야 한다.만약에 서버랑 클라랑 주기적으로 동일한 시간을 계산 할 수 있는 걸 받을 수 있다면 문제 없는 코드이지만 우리는 현재 클라에게 부담을 주지 않게 모든걸 계산해서 다 줘야한다.설계요약 설계 흐름 Furnace Class: 용광로의 상태와 진행도를 관리. Team Class: 각 팀마다 Furnace를 포함하여 용광로 상태를 관리. FurnaceSyncManager:..

TIL 2024.12.05

C# .csv파일 변환 방법과 예시

글의 목적  .csv 파일을 읽어서 데이터를 클래스나 다른 형태로 활용하는 방법은 다양한 언어와 라이브러리에서 가능합니다. 여기서는 C#에서 .csv 파일을 읽고 데이터를 클래스에 매핑하는 예제를 소개하겠습니다. 1. .csv 파일 분석ItemCode,Name,ItemType,Prefab# This file contains item data for the game# ItemType :# 0 = Material# 1 = Equipment# 2 = Junk1000,Wood,0,Wood1001,SolidWood,0,SolidWood1010,Iron,0,Iron1011,Steel,0,Steel1100,Garbage,2,Garbage각 줄의 역할:1번째 줄 (헤더):ItemCode, Name, ItemType, ..

TIL 2024.11.26

Class와 Structure의 차이점 및 사용 목적

1. 공통점Class와 Structure는 둘 다 데이터를 저장하고, 데이터를 처리하는 로직을 포함할 수 있는 프로그래밍 언어의 데이터 구조입니다.둘 다 멤버 변수(필드), 메서드, 생성자 등을 가질 수 있습니다.객체 지향 프로그래밍(OOP)에서 객체를 정의하기 위해 사용됩니다.2. 차이점타입classstructure기본 설계 목적참조형(Reference Type)값형(Value Type)메모리 할당 방식힙(Heap)스택(Stack) (일반적으로)상속상속 가능상속 불가기본 값 전달 방식참조 전달값 복사 전달기본 생성자 지원기본 생성자가 있음명시적으로 생성자 작성 필요디폴트 값null (참조 없음)초기화되지 않은 상태에서는 사용 불가GC의 영향가비지 컬렉터가 메모리 관리자동으로 스택에서 제거됨 3. 주요 ..

TIL 2024.11.26

자원 전쟁 프로젝트 ProtoBuf 구분 기준

우리가 서버에서 사용할 message를 모아둔 .proto 메시지를 SessionServer, GameServer, 그리고 공용으로 나누기 위해서는 각 서버의 역할과 메시지의 사용 목적에 따라 구분해야 합니다. 아래는 메시지를 나누는 기준과 구체적인 분류입니다.구분 기준SessionServer:사용자 인증, 토큰 관리, 대기실 매칭 등 사용자 관리와 세션 관련 로직을 처리.로그인, 회원가입, 토큰 갱신 등의 메시지가 여기에 해당.GameServer:게임 플레이와 관련된 실시간 데이터 동기화와 게임 상태 관리를 처리.플레이어 동기화, 게임 상태, 유닛 상태, 액션 관련 메시지가 여기에 해당.대기실에 관한것 부터 이제 GameServer에 해당.공용:SessionServer와 GameServer 모두에서 사..

TIL 2024.11.15

Tower Defense Online Project 트러블 슈팅 - 5

게임 종료 후 인터벌 매니저가 남아 발생하는 오류게임이 끝나도 인터벌 매니저를 종료하지 않아서 그랬다.따라서 clearAll을 추가함. endGameHandler.jsconst user = gameSession.getUser(socket.uuid);const intervalManager = user.getIntervalManager();intervalManager.clearAll(); // 인터벌 메니저 클리어 그래도 동일하게 오류가 발생했다. 나가는 사람은 두 사람인데 한 사람이 일방적으로 세션을 먼저 종료하고 나갔기 때문에마지막에 문닫는 사람이 게임 세션을 종료시켜야함.const user = gameSession.getUser(socket.uuid);const intervalManager = user..

TIL 2024.11.12

Tower Defense Online Project 트러블 슈팅 - 4

한판 한 뒤 끝내면 서버 에러socket.id = 게임 세션 ID (애당초 socket.id에 무언갈 담으려한 우리의 잘못 나중에 코드 보고 놀란 우리 모두들)게임 세션 id를 가지고 있는 경우에 onEnd 이벤트가 발생하면 상태동기화를 해제하고 게임세션을 제거하려고함. -> 이 기능이 오류남.게임을 한판 한 경우 게임 세션 ID가 남아 있어 상태동기화 해제 및 게임세션 제거 동작을 하기 때문에 오류가 발생. endGame.handler.js에서 게임이 끝났을 때 소켓에 저장된 세션ID를 없애려고했음. socket.id = null; // 세션ID 초기화 endGame.handler.js에서 게임이 끝났을 때 소켓에 저장된 세션ID를 없애려고했음, 하지만 클라이언트에게 특별히 응답을 주는 내용이 없기 때..

TIL 2024.11.12

Tower Defense Online Project 트러블 슈팅 - 3

상대 게임 탈주시 상태동기화 인터벌이 날뛰는 문제user 클래스 안에서 intervalManager가 상태동기화를 일정 주기로 관리해주고 있음.현재 onEnd 이벤트에서 누군가 한명이 꺼지면 게임세션을 날려버림.그래서 남은 사람 intervalManager가 혼자 갈길을 잃은 것. 수정 전 onEnd 이벤트 한 명만 나가도 게임세션이 삭제됨.export const onEnd = (socket) => async () => { await removeUser(socket); // 매칭 돌려 유저 세션에 등록된 경우 유저 세션에서 제거 if (socket.id && ) { removeGameSession(socket.id); } else { } console.log('클라이언트 연결이 종료되었습니..

TIL 2024.11.12