분류 전체보기 32

게임 수학 (2) 벡터 스칼라

벡터: 평면에서 시각적으로 의미 있는 물체를 생성하려면 평면을 구성하는 원소를 정의해야한다. 이것을 벡터라고 한다. 데카르트 좌표계: 직선의 수 집합을 수직으로 배치해 평면을 표기하는 방식곱집합의 원어: 데카르트 곱->수평으로 배치한 첫 번째 실수 집합의 미지수를 x, 수직으로 배치한 두 번째 실수 집합의 미지수를 y로 표기하고 원점을 기준으로 x축의 오른편, y축의 위편을 양의 영역을 나타낸다.->데카르트 좌표계의 한 원소는 곱집합과 동일하게 순서쌍으로 표현하며 좌표라고 부른다(coordinate) 벡터 공간: 두 개 이상의 실수를 곱집합으로 묶어 형성된 집합을 공리적 집합론의 관점에서 규정한 것벡터: 벡터 공간의 원소->공리적 집합론의 관점에서 특정한 수 집합을 지칭하지 않고 연산이 갖는 성질만 다루..

게임수학 2024.09.03

게임 수학 (1) 수와 집합

집합: 서로 구분되는 원소로 구성된 묶음 -> 소박한 집합론-> 자연수 N, 정수 Z, 유리수 U, 무리수, 실수 R, 복소수 C, 사원수 H공리: 명제 중에서 증명할 필요가 없는 기본명제->공리를 기반으로 대상을 구분하는 집합론->공리적 집합론이항 연산: 두개의 원소를 사용해 새로운 원소를 만들어냄-> 닫혀있다: 같은 집합에 속한 두 수를 투입한 이항 연산의 결과가 항상 투입한 집합에 속한다면...교환법칙: 임의의 두 수 A,B를 연산할 때 순서에 관게없이 항상 동일한 결과가 나올때A+B = B+A, A*B= B*A결합법칙: 연산이 두번이상 연속될때 앞의 연산을 먼저 계산한 결과와 뒤의 연산을 계산한 결과가 같은 성질(a+b)+C = A+(B+C), (A*B)*C= A*(B*C)분배법칙: (1) A*(..

게임수학 2024.08.28

개발일지 <2024.03.19>

언리얼엔진으로 투기장 RPG 게임을 만들려다가 혼자서 만들기엔 기간 부족과 비용이 많이 들 거 같아 계획서를 찢어버리고 처음에 할려 했던 공포 게임으로 노선을 잡았다. 2층 규모의 폐쇠적인 집 배경이라 현재 에셋들은 이미 구한 상태고 사운드와 애니메이션 관련해서만 에셋을 구하면 될거같다. 차차 개발하면서 필요할때 구매하는 걸로 하고 현재 귀신 모델링, 소량의 애니메이션은 구한 상태이다. 현재 요구사항 분석서 및 개발 계획서는 작성 하였고, 집 도면도 그려놨다. 다음달 중순 전까지 배경을 완성하는것이 목표이다. 꾸미는건 자신 없지만 공포게임 분위기에 가장 필요한 것이 배경이므로.. 열심히 작업해야겠다.

C++ 개인 필기(15완) 복사

클래스 객체 생성시에 Warrior W -> 기본생성자 호출 Warrior W1=W ->만듦과 동시에 복사 (복사 생성자) Warrior W2 ->기본 W2=W -> 복사대입연산자 복사 생성자 + 복사 대입 연산자 -> 컴파일러가 암시적으로 만들어줌 (메모리에 있는 데이터 그대로 복사) class Warrior{ public: Sword SW; ->포인터로 하지 않을시 워리어와 검이 서로 일치하여 생성, 소멸이 같이됨. } 생명 주기 관리가 어려워진다. (클래스 내에 다른 클래스를 가질땐 포인터나, 참조 값 추천) 복사 생성자, 복사 대입 연산자 -> 주소값 즉 메모리 자체를 그대로 복사 (얕은 복사) 멤버 데이터를 비트열 단위로 복사 (메모리영역 그대로 복사) 포인터 주소값 -> 주소값을 복사 -> 동..

c++ 2024.03.04

C++ 개인 필기(14) 변환

타입 변환 유형(비트열 재구성 여부) 1. 값 타입 변환 (의미를 유지하기 위해, 원본 객체와 다른 비트열 재구성) int a=123456789 //2의 보수 float b= (float)a //부동소수점 ->1.234567e ... -> 메모리에 다른 값 구성 (비트열 재구성) 2. 참조 타입 변환 (비트열을 재구성 하지 않고 관점만 바꾸는것) int a= 123456789 ->메모리의 데이터는 같지만 (관점만 바뀌어) float b= (float)a ->엉뚱한 값 구성 ->참조 타입 변환은 포인터 타입 변환과 동일한 룰을 같는다. 안전도 분류 (1) 안전한 변환 특징) 의미가 항상 100프로 완전히 일치하는 경우 같은 타입이면서 크지만 더 큰 가방으로 이동 작은 가방 -> 큰 가방 good (업캐스팅..

c++ 2024.02.26

언리얼엔진5 C++로 정복하기(8) 객체들에게 왜 대부분 포인터가 붙을까?

언리얼엔진5 에서 c++로 코딩하다보면 헤더파일부분에서 객체를 선언할때 대부분 포인터가 붙는걸 알 수 있는데 왜 그럴까..? 언리얼 객체 관리 시스템과 관련이 있는데, UGameplayStatics나 USoundBase, UCameraComponent 와 같은 것들은 언리얼 엔진의 엑터나 엑터 컴포넌트와 같은 게임 오브젝트들로 이들은 동적으로 생성되고 관리된다.. 게임 오브젝트들은 실행 시간동안 생성되고 파괴될 수 있는데, 포인터를 사용하여 이러한 객체에 대한 참조를 유연하게 할당하고 해제할 수 가 있다. 그리고 성능 최적화 부분에서 객체는 크기가 크고 복잡한데 객체 자체를 값으로 전달하는 것보다 포인터를 전달하는것이 훨씬더 효율적인데, 포인터를 사용하면 객체의 실제 데이터를 복사할 필요 없이 객체에 접..

언리얼 엔진 5 2024.02.20

언리얼엔진5 C++로 정복하기(7) 델리게이트, 인라인

언리얼 엔진에서 델리게이트는 특정 이벤트나 상황이 발생했을때 호출될 함수들의 리스트를 관리한다. 델리게이트는 발생하는 함수들을 등록하여 이벤트 발생 시 등록된 모든 함수를 호출한다. 언리얼엔진에서는 델리게이트를 사용한다면 AddDynamic 함수를 사용하는데 이것은 언리얼 엔진의 멀티캐스트 델리게이트에 함수를 동적으로 바인딩하기 위해 사용되는 매크로이다. 함수를 AddDynamic을 사용하여 델리게이트를 바인딩 할려면 그 함수는 UFUNCITON() 매크로를 사용하여 언리얼 엔진의 리플렉션 시스템에 등록해야한다. 왜냐면 AddDynamic()이 런타임에 함수를 델리게이트에서 바인딩 하기 때문.. 언리얼로 코딩을 하다보면 가끔 FORCEINLINE 을 함수 선언 앞에 붙일때가 있다. 컴파일러에게 특정 함수..

언리얼 엔진 5 2024.02.19

C++ 개인 필기(13) 동적 할당

HEAP -> 필요할대만 사용, 필요없으면 반낪 생성, 소멸시점 관리 동적 할당 : malloc, free / new, delete, /new[], delete[] //유저 영역 (메모장 or 게임)(독립적 실행) //커널영역 (운영체제의 핵심코드 실행) //유저 영역 [ ] malloc(sizeof(void ))를 통해 메모리 낭비 해결 ->메모리 할당 후 시작 주소를 가리키는 포인터를 반환 (메모리 부족시 NULL) void * ->포인터는 포인터, 포인터를 타고가면 뭐가 있는지 모르니깐 너가 적당히 변환해서 사용해라 -> Warrior *w1=(Warrior)ptr; w1->xx 처럼 할당 malloc/free 세트 ->free(ptr) 하지 않을 시에 메모리 누수 힙 오버 플로우->유효한 힙 범위..

c++ 2024.02.14

C++ 개인 필기(12) static

struct vs class c++ 에서 struct, class 는 종이 한장 차이 struct는 기본 접근 지정자= public, class 는 private 왜? c++은 c언어에서 파생되어 발전해서 호환성을 지키기 위해서.. struct는 그냥 구조체(데이터 묶음) 표현 class 객체 지향 프로그래밍의 특징 static 변수 -> 정적=고정된, 공통적으로 모든 객체가 같은 값을 가지면.. warrior, attack=1 static int attack; ->클래스 밖에 빼는 느낌 (전역 변수) AActor::attack=1; -> 외부선언 누구나 동일한 공격을 가진다. -> warrior 클래스의 종속적 함수에 static일때 초기화 하면 .data, 안하면 .bss 영역 static -> 생명..

c++ 2024.02.13

C++ 개인 필기(11) 클래스의 연산자

Class Position 이 있을때 Position pos3 = pos1 + pos2 -> 어떻게 해야할까? 연산자 vs 함수 -> 연산자는 피연산자의 개수/타입 고정 연산자 오버로딩 이란? 우리만의 클래스에 pos1+pos2 와 같은 연산자를 지원하게 만들고 싶을때 사용 1. 연산자 함수 정의 ->함수도 멤버함수와 전역함수가 있는 것처럼 연산자 함수도 2가지 방식 존재 pos1+pos2 만들기 Postion operator+() { Position pos , x=x1+x2, y=y1+y2, return pos;} pos3= pos1+pos2 == pos3=pos.operator+(pos2) 멤버 연산자 함수 a op b 형태에서 왼쪽을 기준으로 실행 (a가 클래스여야 가능 , a 를 기준 피연산자라함..

c++ 2024.02.07

C++ 개인 필기(10) 초기화 리스트

변수 초기화를 해야하는 이유 -> 초기화를 안하면 쓰레기값이 들어가기 때문 초기화 방법 1. 생성자 내에서 2. c++11 방법 -> 선언과 동시에 초기화 3. 초기화 리스트 ->선처리 영역에서 초기화 클래스 생성시 Warrior() 1순서 Warrior(AActor) 2순서 ~Warrior() 포함관계 -> 초기화 리스트를 사용해야 기타 생성자만 실행된다. 즉 초기화 리스트가 더 좋다. 정의함과 동시에 초기화가 필요한 경우 (참조, const) ->초기화 리스트에서 실행

c++ 2024.02.06

언리얼엔진5 C++로 정복하기(6) 적 타격

적을 타격하는 기능에 대해 간략히 알아보자 takedamage 나 onhit 내장함수도 있지만 박스 트레이서로 타격을 해보자플레이어가 들 무기 cpp파일에 오버랩 함수를 정의하자. (매개변수는 프리미티브 헤더파일에 매개변수가 작성되있어 복사 하여 붙여넣으면 된다.)무기에 박스 콜라이더 컴포넌트를 추가하고 UFUNCTION으로 정의하여 박스 오버랩 함수를 AddDynamic 으로 불러오자 (델리게이트 바인딩)자신의 무기 부분에 무기 칼날의 시작 부분을 BoxTraceStart로 지정 무기 칼날의 끝부분을 BoxTraceEnd 로 지정을 하고 TArray라는 동적 배열을 이용해 무기를 들고있는 자신은 오버랩 액터로서 제외하고 한번 맞은 대상은 배열에 추가해 투히트가 안되도록 반복문을 사용한다. 다음 UKis..

언리얼 엔진 5 2024.02.05

언리얼엔진5 C++로 정복하기(5) 몽타주(Monatage) 애니메이션

마우스 좌클릭을 눌렀을때 공격하는 애니메이션을 만들려면 어떻게 해야할까? 간단하게 알아보자! 몽타쥬 애니메이션으로 공격 기능을 사용해본 결과 언리얼엔진이 유니티보다 애니메이션 짜기 훨씬 쉽다는걸 알 수 있다.. 유니티에서 기능이 있는지 모르겠지만 애니메이션 중간에 파티클 이펙트, 사운드까지 추가 할 수 있다.. 얼마나 좋은가! 일단 플레이어 헤더파일에서 UAnimMonatge 를 선언하여 블루프린트에 애니메이션 몽타주를 삽입할 수 있도록 한다. 애니메이션 몽타주를 만들어서 기깔나게 애니메이션을 만들어보자 중간에 소리도 넣고 해보자! 만들어진 몽타주를 블루프린트에 넣어주고 프로젝트 세팅에서 입력칸에 마우스 좌클릭시 공격이라는 입력을 추가한후 코드로 바인딩을 해주고 코드상으로 마우스 좌클릭시에 Montage..

언리얼 엔진 5 2024.02.02

C++ 개인 필기(9) 은닉성 다형성

은닉성: 캡슐화 숨기는 이유 -> 위험하고 건드리면 안되는 경우, 다른 경료로 접근하길 원하는 경우 public, protected, private -> 멤버 접근 지정자 private -> class 내부에서만 class Warrior : public Player -> 상속 접근 지정자 protected -> class에 상속된 class에서만 사용이 가능하다. 상속 접근 지정자 -> 자식 class에 꼭 모든걸 물려줘야하는 것이 아니다. Warrior : protected Player -> public -> protected로 변환 부모는 public 자식은 protected // : priavte Player -> 부모만 public, 자식은 private-> 자식의 자식은 사용 불가능 다형성 ->..

c++ 2024.02.01

C++ 개인 필기(8) 객체지향 생성자

Player p=p1 -> 복사 생성자, const Player& p / 복사와 생성이 한번에 이루어짐 Player p2 -> 기본 생성자 p2=p1 -> 기본 생성자 *인자즐 한개만 받는 기타 생성자를 타입 변환 생성자라고도 한다. float f=(float)num -> 명시적 형변환 float f = num ->암시적 형변환 Player p; / Player(int id) p=1 -> 타입 변환 생성자로 인해 가능하다. (암시적 형변환) -> 암시적 부분은 오류 발생 가능 객체지향 (OOP , Object Orited Programming) -상속성 -은닉성 -다형성 -- 3대 속성-- 상속: Warrior : public Player Player 멤버 변수 -> id 4바이트 Warrior 멤버 변..

c++ 2024.01.31