겨울팥죽 여름빙수
article thumbnail
c# 다각형 충돌체크

게임을 만들다보면 미사일과 캐릭터 같이, 오브젝트간 간 충돌 체크를 하게 된다. 원과 원, 직사각형과 원, 직사각형과 직사각형 등은 비교적 쉽게 확인이 가능하지만, 다각형 충돌체크는 방법이 쉽게 떠오르지 않는다. 여기서 다각형은 볼록한 다각형을 뜻하고, 이때 어떻게 충돌체크를 하는지 알아보자. 1. 원리 두 다각형 충돌 체크를 하는 방법은 의외로 간단하다. (1). 두 다각형의 한 변을 선택하고, (2). 선택한 변의 수직인 벡터로 두 다각형을 정사영 한다. (정사영이란, 도형의 각 점에서 한 평면에 내린 수선의 발이 그리는 도형) (3). 모든 변의 수직인 벡터로 정사영 해보고, 이때 하나라도, 안 겹치는 부분이 있으면 있으면 충돌하지 않는다. 글로 보면 이해하기 어려우니 그림 예제를 보자. 위 왼쪽 ..

Mysql, Select결과를 Update 문에 반영하기

게임 운영을 하다보면, 질의 결과를 Update해야 하는 경우가 있다. 이때 문제는 Mysql과 다른 db 프레임워크의 질의 방법이 다르다. 1. 일반적인 Update문 일반적인 Update문은 아래와 같은 방식을 아래와 같은 방식이다. UPDATE [테이블명] SET [필드명 = 새로운 값] WHERE [조건문] 2. Select 결과와 Join 앞서 말한 것 처럼, Mysql과 다른 DB프레임워크의 방식이 다르다. Mssql 버전 UPDATE [테이블A] SET [테이블A].필드 = [테이블B].필드 FROM [테이블A],[테이블B] WHERE [테이블A].id = [테이블B].id Mysql 버전 UPDATE [테이블A],[Select 질의] B SET [테이블A].필드 = B.필드 WHERE [테..

Mysql, Percentage 질의 구현하기

게임 운영 시, 매 시즌 상위 랭커에서 보상을 지급 하는 경우가 있다. 이때, mysql 질의를 통해 상위 % 랭커를 검색해야 한다. mysql 8.0부터는 [RANK / DENSE_RANK / PERCENT_RANK / ROW_NUMBER] 함수를 제공하지만, 그 이전 버전에서는 사용 할 수 없다. 우선 내가 쓰는 UserPoint의 테이블 구조이다. id season point play_count 1 2 1000 10 2 2 1001 10 여기서 point 내림차순으로 %를 구한다. 아래 코드는 mysql 8.0 이전 버전에서 상위 % 랭커를 찾을 때 쓰는 질의 예제 이다. INSERT INTO UserMail (user_id, mail_type, reward_type, data_id, count, ..

게임 서버 DB설계 시, Tips

1. 로직 작업과 DB작업을 분리 시키자 게임의 로직과 DB 작업 부분을 별도의 모듈로 분리 시키는 것이, 추후 유지보수 할 때 훠얼씬 편하다. DB작업은 어쨌든 파일 처리에 해당하기 때문에, 느린 작업에 속한다. 클라이언트와의 빠른 응답을 위해선, 요청 후 응답을 받는 구조로 설계하는 것이 좋다. 최근에는 [로비], [인게임], [db] 별로 서버를 따로 두는 경우가 많다. 2. DB간 join은 피하자 db간 join은(테이블 조인은 ok) 성능이 좋지 않다. 차라리 코드 상에서 질의를 여러 번 하는 것이 좋다. DB간 연관관계를 적게 적용할 수록, 운영 시 편하다. 3. 테이블 독립성 한 테이블에 많은 데이터를 무리하게 담는 것보다, 테이블을 쪼개는 것이 좋다. 추후 운영 시, 수정하기 편하다. 4..

c# 싱글톤 제네릭 클래스

프로그래밍을 하다보면 가장 많이 쓰이는 것이 아마 싱글톤 패턴 일 것이다. 싱글톤을 만드는 방법은 다양한데, 클래스마다 그것을 구현 해 주기는 귀찮다. Java같은 경우 Enum타입으로 만들면 싱클톤이 되어서 편한데, c#같은 경우에는 그런 방법이 되지 않는다. 그나마 편하게 싱글톤 클래스를 만들고 사용하기 위한 방법은 제네릭을 이용하는 것이다. 1. c# 제네릭 싱클톤 클래스 using System; public class Singleton where T : Singleton, new() { static T mInstnace; public static T Instance { get { if(mInstnace == null) { mInstnace = new T(); mInstnace.init(); } r..

article thumbnail
파이썬으로 구글 스프레드시트 다운받고, Json으로 변경하기

보통 게임 밸런스 데이터를 엑셀로 관리하는 경우가 많다. [미니난투 온라인]의 경우 구글 스프레드 시트에서 밸러스 데이터를 작성하고 관리한다. 새 밸런스 데이터로 적용하려고 할 때, 구글 스프레트 시트를 엑셀로 변경해서 다운받고, 이걸 다시 json으로 변경 후, 서버를 빌드한다. 미니난투 온라인 - Google Play 앱 [ 게임 소개 ] 미니난투 온라인은 실시간으로 다른 유저들 대결을 할 수 있는 공간입니다. 전략적으로 장비를 선택해, PvP 전투를 준비하세요. 현재 개인전, 팀전이 준비 돼 있습니다.(추후 새로운 모드 업데이트 예정) [ 핵심 컨텐츠 ] - 미니난투 : 6명이서 개인전 난투. - 팀전 : 3:3 전투 - 장비 : 무기, 방어구, 신발, 악세서리 - 아이템 : 포션, 폭탄, 토템 등..

c# 실시간 게임 서버 만들기 3 - 서버

미니난투 온라인 - Google Play 앱 [ 게임 소개 ] 미니난투 온라인은 실시간으로 다른 유저들 대결을 할 수 있는 공간입니다. 전략적으로 장비를 선택해, PvP 전투를 준비하세요. 현재 개인전, 팀전이 준비 돼 있습니다.(추후 새로운 모드 업데이트 예정) [ 핵심 컨텐츠 ] - 미니난투 : 6명이서 개인전 난투. - 팀전 : 3:3 전투 - 장비 : 무기, 방어구, 신발, 악세서리 - 아이템 : 포션, 폭탄, 토템 등 [ 전략요소 ] - 장비마다 스킬이 포함 돼 있어, 전략적으로 전투를 할 play.google.com 지난 포스팅에서 패킷을 만들고, 클라이언트에서 패킷을 전송하는 것에 대해 살펴봤다. 이번에는 서버에서 그 패킷을 받아 응답하는 것을 하려고 한다. 2019/12/17 - [게임을 ..

c# 실시간 게임 서버 만들기 2 - 클라이언트

미니난투 온라인 - Google Play 앱 [ 게임 소개 ] 미니난투 온라인은 실시간으로 다른 유저들 대결을 할 수 있는 공간입니다. 전략적으로 장비를 선택해, PvP 전투를 준비하세요. 현재 개인전, 팀전이 준비 돼 있습니다.(추후 새로운 모드 업데이트 예정) [ 핵심 컨텐츠 ] - 미니난투 : 6명이서 개인전 난투. - 팀전 : 3:3 전투 - 장비 : 무기, 방어구, 신발, 악세서리 - 아이템 : 포션, 폭탄, 토템 등 [ 전략요소 ] - 장비마다 스킬이 포함 돼 있어, 전략적으로 전투를 할 play.google.com 지난 포스팅에 서버 간 통신을 위한 패킷에 대해 설명했다. 2019/12/17 - [프로그래밍/C# 서버] - c# 실시간 소켓 서버 만들기 1 - 패킷 이번 포스팅에서는 클리이언..

c# 실시간 게임 서버 만들기 1 - 패킷

미니난투 온라인 - Google Play 앱 [ 게임 소개 ] 미니난투 온라인은 실시간으로 다른 유저들 대결을 할 수 있는 공간입니다. 전략적으로 장비를 선택해, PvP 전투를 준비하세요. 현재 개인전, 팀전이 준비 돼 있습니다.(추후 새로운 모드 업데이트 예정) [ 핵심 컨텐츠 ] - 미니난투 : 6명이서 개인전 난투. - 팀전 : 3:3 전투 - 장비 : 무기, 방어구, 신발, 악세서리 - 아이템 : 포션, 폭탄, 토템 등 [ 전략요소 ] - 장비마다 스킬이 포함 돼 있어, 전략적으로 전투를 할 play.google.com 누군가와 실시간으로 채팅을 하거나, 게임을 하기 위해서는 데이터를 서로 주고 받아야 한다. 주로 tcp나 udp 프로토콜을 이용해 네트워크 라이브러리로 데이터를 주고 받는다. 여기..

article thumbnail
c# 서버 로그 log4net 사용방법

게임을 운여하다 보면 사용자의 로그를 기록해야 하는 경우가 있다. 결제라든가, 상품을 언제 얻었는 지 등등 이때 DB로 로그를 남지는 방법도 있지만, 텍스트 파일로 저장하게끔 할 수도 있다. 이때 log4net이라는 c#용 로그 라이브러리가 있어서 소개하려한다. log4net은 비동기 로그 라이브러리로, 시간별, 날짜별 로그를 저장할 수 있게 도와준다. 1. log4net.dll 설치 log4net을 사용하기 위해서, dll을 설치해야 하는데, 최근에는 Nuget Manager에 올라와 있다. 구글링 안해도 되서 편하니 비주얼 스튜디오 사용하길 권한다. 2. LogConfig.xml 설정 프로젝트에 LogConfig.xml을 생성하고 아래와 같이 적는다. 3. 초기화 및 사용 log4net을 사용하기 위..