전체 글

게임개발자 및 그래픽 엔지니어를 목표로 공부하고 있는 학생입니다
0x00 시간, 공간복잡도 시간복잡도(Time Complexity) ★ 입력의 크기와 문제를 해결하는데 걸리는 시간의 상관관계 빅오표기법(Big-O Notation) 주어진 식을 값이 가장 큰 대표항만 남겨서 나타내는 방법 일단 5N+3을 보면 누가 봐도 N이 커지면 커질수록 3보다는 5N이 훨씬 크다. 그래서 3을 버리고 5N만 냅두는데, 5N에서 상수 5도 떼고 O(N)으로 나타낸다. 2N+10lgN에서도 N이 커지면 커질수록 10lgN보다는 2N이 훨씬 클테니 2N만 냅두고, 상수 2를 떼서 O(N)으로 나타낸다. N^2+2N+4에서는 N^2이 2N과 4보다 훨씬 크니 O(N^2)이 된다. NlgN과 N을 비교하면 아무래도 그냥 N보다는 lgN이 곱해진 NlgN이 더 클 것입니다. 그래서 NlgN ..
Spring Force Hooke's Law, 질점이 1개일 때 L0 : 용수철 원래 길이 L : 용수철 나중 길이 K : 용수철의 경직 정도 Fspring : 원래 길이로 돌아가려는 용수철의 힘 ∝ K Hooke's Law, 질점이 2개일 때 Damping Force Damper : 두 물체의 상대속도를 줄여준다. 즉, 두 물체의 속도가 비슷해지도록 만든다 ( 현관문이 쾅 안닫히도록 해주는 그 장치와 같다 ) 스프링이 출렁거리는 정도를 서서히 줄여준다 Spring Force : '길이의 차이' 에 의해 작용 됨 Damping Force : '속도의 차이'에 의해 작용 됨 덤핑 계수 d : 단위 속도 당 물체의 운동을 방해하는 힘 질점이 1개일 때 Damping Force in 1D :질점이 1개일때, ..
RigidCircle.h "공" 객체를 찍어낼 클래스를 포함한 헤더 #pragma once #include "Game2D.h" namespace jm { class RigidCircle { public: vec2 pos; vec2 vel; RGB color = Colors::hotpink; float radius = 0.1f; float mass = 1.0f; public: void draw() { beginTransformation(); { translate(pos); drawFilledCircle(color, radius - 1e-3f); setLineWidth(2.0f); drawWiredCircle(Colors::black, radius); } endTransformation(); } void u..
기본 틀 코드 #include "Game2D.h" #include "Examples/PrimitivesGallery.h" #include "RandomNumberGenerator.h" #include #include namespace jm { class RigidCircle { public: vec2 pos; vec2 vel; const float radius = 0.1f; void draw() // 원 그리기 { beginTransformation(); { translate(pos); drawFilledCircle(Colors::hotpink, radius - 1e-3f); setLineWidth(2.0f); drawWiredCircle(Colors::black, radius); } endTransfo..
어떤 클래스의 객체가 프로그램 전체에서 단 하나만 만들어지도록 하는 것. 오직 한개의 인스턴스만을 갖도록 보장. 그래픽스 엔진이나 사운드 엔진에 종종 사용 된다. 싱글톤을 사용하는 이유 1. 객체 생성 없이 사용될 수 있게 한다. 사운드 엔진은 여러가지 많은 클래스, 객체에서 많이 사용된다. 사운드 기능을 쓰는 객체마다 계속 사운드 엔진 객체를 생성해내고 매개변수로 넘기고 하는 것 너무 낭비. 2. 사운드 엔진 객체를 딱 하나를 여러곳에서 공유 할 수 있게 한다. 사운드 엔진은 객체가 여러개일 필요가 없다. 단 하나면 된다. 사운드 엔진의 기능들만 가져다 쓰면 된다. 사운드 엔진의 map 에 저장되어있는 사운드들 굳이 다 객체로 찍어낼 필요 없이 기존에 만들어진 사운드 엔진 객체를 공유하는게 더 효율적이..
명령과 행위 자체를 객체로 만듬 최대한 추상화 해서 변경 사항이 생기더라도 메인 무한루프를 가지는 메인 함수에서는 변경할 것이 없게끔 해야 좋다. 전체 코드 #pragma once #include "Game2D.h" #include namespace jm { class Actor { public: virtual void moveUp(float dt) = 0; virtual void moveLeft(float dt) = 0; virtual void moveRight(float dt) = 0; virtual void moveDown(float dt) = 0; }; class Command { public: virtual ~Command() {} virtual void execute(Actor& actor, ..
#include "Game2D.h" #include "Examples/PrimitivesGallery.h" #include "RandomNumberGenerator.h" #include #include #include "Triangle.h" #include "Circle.h" #include "Box.h" namespace jm { class Example : public Game2D { public: std::vector my_objs; Example() : Game2D() { my_objs.push_back(std::make_unique(Colors::gold, vec2{ -0.5f, 0.2f }, 0.25f)); my_objs.push_back(std::make_unique(Colors::olive..
std::vector 동적배열 std::vector 배열명; : 생성 배열명.size() : 크기값 배열명.resize(n) : n의 크기로 재설정 배열명.push_basck(value) : 벡터 제일 마지막 위치에 새로운 value 추가 배열명.pop_back(value) : 벡터 마지막 값을 삭제 배열명.clear() : 백터의 모든 값을 삭제 auto 추론 키워드 컴파일이 알아서 타입을 결정해준다. new와 delete 힙메모리 활용 type * 포인터 = new type; type만큼의 힙 공간에 메모리를 할당하고 주소를 반환해준다. 할당된 메모리 공간을 포인터가 가리키고 있다. 스마트포인터 make_shared, shared_ptr, unique_ptr 포인터처럼 동작하는 클래스 템플릿으로 사용..