
와 너무 신기하고 재밌어요
3달 전
좋은 강의 감사합니다
factory pattern의 스마트 포인터화 시켜봤는대 이게 맞는지 모르겠네요
3달 전
//Example클래스는 변함이 없고
namespace jm
{
class Example : public Game2D
{
float time = 0.0f;
std::vector<std::shared_ptr <Shape>> my_objs;
public:
Example() : Game2D()
{
my_objs.push_back(Shape::makeTriangle(Colors::gold, vec2{ -0.5f,0.2f }, 0.25f));
my_objs.push_back(Shape::makeCircle(Colors::olive, vec2{ -0.1f,0.1f }, 0.2f));
my_objs.push_back(Shape::makeBox(Colors::black, vec2{ 0.0f,0.5f }, 0.1f, 0.3f));
my_objs.push_back(Shape::makeStar(Colors::gold, vec2{ 0.0f,-0.5f }, 0.25f,0.15f));
//my_objs.push_back(new Triangle(Colors::gold, { -0.5f,0.2f }, 0.25f));
//my_objs.push_back(new Circle(Colors::olive, { -0.1f,0.1f }, 0.2f));
//my_objs.push_back(new Box(Colors::black, { 0.0f,0.5f }, 0.1f, 0.3f));
}
~Example() {
}
void update() override
{
for (const auto &obj : my_objs) {
obj->draw();
}
}
};
//shape.h의 static 함수들을
shared_ptr화 시켜주는 작업
#pragma once
#include "Game2D.h"
#include "Shape.h"
namespace jm {
class Shape {
public:
vec2 pos;
RGB color;
void init(const RGB& _color, const vec2& _pos,float _r=0.0f)
{
this->color = _color;
this->pos = _pos;
}
virtual ~Shape() {
}
virtual void drawShape() const = 0; //pure virtual classes
void draw() {
beginTransformation();
{
translate(this->pos);
drawShape();
}
endTransformation();
}
static std::shared_ptr<Shape> makeTriangle(const RGB& _color, const vec2& _pos, const float& _size);
static std::shared_ptr <Shape> makeCircle(const RGB& _color, const vec2& _pos, const float& _size);
static std::shared_ptr<Shape> makeBox(const RGB& _color, const vec2& _pos, const float& _width, const float& _height);
static std::shared_ptr<Shape> makeStar(const RGB& _color, const vec2& _pos, const float& _outer_radius, const float& _inner_radius);
};
}
//이렇게 해준 후
//Shape.cpp
#include "Shape.h"
#include"Triangle.h"
#include"Circle.h"
#include"Box.h"
#include"Star.h"
namespace jm {
std::shared_ptr<Shape> Shape::makeTriangle(const RGB& _color, const vec2& _pos, const float& _size) {
return std::make_shared<Triangle>(_color, _pos, _size);
}
std::shared_ptr <Shape> Shape::makeCircle(const RGB& _color, const vec2& _pos, const float& _size) {
return std::make_shared<Circle>(_color, _pos, _size);
}
std::shared_ptr <Shape> Shape::makeBox(const RGB& _color, const vec2& _pos, const float& _width, const float& _height) {
return std::make_shared <Box>(_color, _pos, _width, _height);
}
std::shared_ptr <Shape> Shape::makeStar(const RGB& _color, const vec2& _pos, const float& _outer_radius, const float& _inner_radius) {
return std::make_shared <Star>(_color, _pos, _outer_radius, _inner_radius);
}
}
//위에처럼 바꿔주면 돼는거 같은대
//소멸자가 정상적으로 호출되는거 같거든요 cout 찍어보니까
//맞나요?
콘솔 화면 없애고 창화면만 남기는법
5달 전
맨 위에
#include <Windows.h>
넣은뒤
int main(void) 를 지우고
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
넣은뒤
솔루션->Lecture 우클릭->속성->링커->시스템->하위시스템
에서 콘솔을 창으로 바꾸면
콘솔이 없어지고 창만 남습니다
안녕하세요 강의를 듣게되었는데요 예제 Cpp 파일이 어디있을까요?
5달 전
안녕하세요 따배씨 20.2 를 참조하라 하셨는데
제가 대학생이라 학교에서 배운 c++ 기반으로 뭔가 더 만들고싶어서 수강하게되었는데요..
따배씨 20.2 에 깃허브에 소스가 있으시다하신거같은데 그럼 추기로 따배씨를 수강해야 깃허브 예제들을 받아볼 수 있는것인가요??
슬랙 가입 링크
6달 전
제가 슬랙 가입 링크 공지를 늦게 봐서 링크를 타고 들어가보니
'This link is no longer active' 라고 나옵니다.
혹시 다시 링크 하나 공유해주실 수 있으실까요?
새로 프로젝트를 만들면 glfw가 자동으로 인클루드 되지 않습니다.
7달 전
처음 opengl 설치하고 강의 예제 코드를 작성하는 동안엔 #include <GL/glew.h> 등이 무리없이 잘 작성됩니다.
강의를 다 끝내고 간단한 게임을 만들기 위해 새로운 솔루션/프로젝트를 만들어 include 하려고 하는데
#include <GL/glew.h>이나 #include <GLFW/glfw3.h>을 작성하고 컴파일을 시행하면 파일을 열 수 없다고 하네요.
제공해 주신 예제 프로젝트에서 무언가 따로 설정을 해 준 것이 있는지 궁금합니다.
참고로 프로젝트의 [속성]에서 [C/C++]-[추가 포함 디렉터리], [링커]-[일반]-[추가 라이브러리 디렉터리], [링커]-[입력]-[추가 종속성] 들어가서 외부 라이브러리 추가하는 법까지 해 봤는데도 위와 같은 문제가 지속됩니다.
UTF-16 (LE) byte order mark detected 에러
7달 전
안녕하세요 교수님, 맥 OS 환경에서 예제 코드를 돌려보려고 했으나
fatal error: UTF-16 (LE) byte order mark detected in '/Users/Desktop/GameDevPracticePackage/Chapter1/Lecture1/main.cpp', but encoding is not supported
라는 에러가 뜹니다. 맥 OS라서 그런걸까요..? 진도를 못나가서 답답합니다ㅠㅠ
안녕하세요 교수님 첫 시작부터 빌드에 실패해서 질문드립니다..
9달 전
교수님이 주신 링크로 github에서 자료를 다운받고 비쥬얼스튜디오로 폴더를 열었는데
빌드에 실패했습니다. 디버그를 계속할까요?
라는 메세지가 나오고
예 를 누르니까
GameDevPracticePackage20181206\Chapter1\Lecture1\Debug\Lecture.exe파일을 찾을 수 없다고 하네요 ㅠㅠ
이제 막 시작한 수강생이라 어떻게 해야할지 모르겠습니다..
1-1강 초반에 교수님께서 실행을 시키시고 하얀색 창이 뜨는 부분을 저도 main.cpp를 찾아서 실행을 시킨건데..
이번 강의에서는 SharedPointer를 이용해서 GeometricObject를 저장하셨는데
10달 전
이번 강의에서는 SharedPointer를 통해 GeometricObject를 사용하셨는데 UniquePointer를 사용하지않으신 이유가 있을가요??
여러발의 탱크 구현 질문이 있습니다.
10달 전
교수님 깃을 fork해서 multi bullet 구현을 해보았습니다.
unique_ptr를 이용해서 구역을 벗어나면 해당 unique_ptr를 reset해서 delete하게 구현했습니다. 구현간에 궁금한 점이 있습니다.
질문 1)
https://github.com/shonjiho/GameDevPracticePackage/blob/master/Chapter1/Lecture1/TankExample.h#L74-L76
화면을 벗어났는지 범위를 체크하는함수를 isOutMap으로 구현했는데 Game2D Class의 width와 height와는 다른 단위(?)를 가진 것 같아서 할 수 없이 매직넘버를 어림잡아 넣게되었습니다. 어떤 값을 참고해서 범위를 재지정해야할가요?OpenGL만의 그려지는 단위가 따로 있나요?
의문 1)
https://github.com/shonjiho/GameDevPracticePackage/blob/master/Chapter1/Lecture1/TankExample.h#L89-L90
unique_ptr를 한정된 개수로 모아놓은 vector<unique_ptr<MyBullet>> bullets 으로 총알을 모아놓고 재활용하고 있습니다. 이렇게 렌더링하는 부분에서 반복문을 통해서 하나씩 비어있는지 체크하는 방식이 맞는 방식일가요?
초반 세팅 방법 정리.(삽질 공유)
10달 전
프로젝트 세팅간에 해매시는분들을 위해 기록 남기겠습니다.
우선, 첫번째 github 링크찾는데 꽤 걸렸습니다.어디에 올라와있는지 몰랏는데 홍정모교수님 블로그에서 GameDevPracticePackage 라는 키워드를 보고 깃허브에 검색해서 찾았습니다.
r위 remote repository를 clone했습니다.
vcpkg install opengl 를 통해 opengl를 설치했지만 해결되지않았습니다.
하지만 코드를 들여다보면 opengl이라는 패키지가 아니라glew, glfw3 를 설치해야합니다. 아래와 같이요.
vcpkg install glew:x64-windows
vcpkg install glfw3:x64-windows
vcpkg integrate install // visual studio 인클루드에 반영
그러면 위와 같이 해결됐습니다. 문제 해결과정에 깨달은게 OpenGL은 하나의 표준이더군요. 언어마다 그에 해당하는 패키지이름을 정확히 인지하는게 중요한 것 같습니다.
실행 순서에 대해 질문 입니다 !
10달 전
안녕하세요 !
1-3 상호작용 맛보기 - 키보드 입력과 반응
해당 강의의 연습문제로 내주신 WalkingPerson.h 에 대한 질문과
1-2 기본적인 그리기 - 이동, 회전, 애니메이션
해당 강의의 '태양계 공전,자전 구현' 연습문제 질문입니다.
아래는 제가 푼 태양계 연습문제 답안입니다.
보시기 좀 지저분 하실 것 같아 죄송하지만 ㅠㅠ 노란색 하이라이터는 제가 이해한 실행 순서와 그에 따른 과정을
필기해놓은 것입니다.
그려지고 회전하고 평행이동 하는 그런 함수들이 코드상의 순서와는 다르게 역순으로 실행된다고 하셔서
이렇게 순서를 짜고 풀었습니다.
1.원점에 달이 먼저 그려지고
2. 달이 평행이동하고 (0.2, 0.0)
3. 달이 원점에 대해 time * 90 도로 회전하고
4. 원점에 지구가 그려지고 (그래서 원점에 있는 지구를 달이 공전하는 모습이 되고)
5. 지구와 달이 함께 평행이동하여 지구는 (0.5, 0.0) 달은 (0.7, 0.0) 좌표를 가지고
6. 원점에 별이 그려지고
7. 별은 원점에서, 지구는 (0.5, 0.0) 에서 time * 45 도로 회전하고
실행 결과도 알맞게 나와서 이 순서로 실행되는 것이 맞구나하고 이해했었습니다.
그런데 WalkingPerson.h 코드를 보니
노란 팔이 몸통 위에 그려지고 초록다리 또한 몸통 위에 그려지는 것을 보아하니
이 순서대로 그림이 그려지는 것 같더라구요. 눈 또한 얼굴 위에 그려진 것을 보니 얼굴보다 나중에 그려지는 것 같습니다.
이건 또 역순이 아닌 그냥 원래 코드 순서대로 그려지니까 혼란이 옵니다.. !
태양계 연습문제와 걷는 사람 연습문제에서 제가 잘 못 이해하고 있는 부분들 알려주셨으면 좋겠습니다 ㅠㅠ
또 두 연습문제엣서 올바른 실행 순서는 어떻게 될지 궁금합니다.
탱크예제에 포탄 발사소리
10달 전
연습문제 중에 탱크예제에 포탄발사 소리를 넣으려고 하는데
해당 강의에서 배운 내용을 바탕으로 bulletSound()라는 함수를 만들고
if (isKeyPressedAndReleased(GLFW_KEY_SPACE))
{
for (int i = 0; i < 5; ++i)
{
if (bullet[i]==nullptr)
{
bullet[i] = new MyBullet;
bulletSound();
bullet[i]->center = tank.center;
bullet[i]->center.x += 0.2f;
....
이런식으로 스페이스바 누르면 총알 나가는 구조 안에 bulletSound()를 추가했습니다.
그런데 이렇게하면 bulletSound() 함수 안의
while문(노래끝났으면 break;) 때문에
효과음이 끝나고나서야 총알이 발사가 됩니다.
bulletSound()함수를 뒤에 위치시켜도 똑같은 결과가 나오구요.
while문을 없애면 소리가 안나오고,
if(!playing) break; 조건을 없애서
while(true)
{
system->update();
}
로 하자니 무한반복으로 계속 돌고
어떤 방법을 이용해야 총알과 소리가 같이 나올 수 있을까요
제가 놓치고 있는게 뭔지 알려주시면 감사하겠습니다.
사운드 loop off와 pause, resume
10달 전
질문을 다른데에 잘못 올려서 다시 올립니다.
11분 33초 즈음 loop off 상태일때 바로 1을 눌러서 반응이 없다고 하시면서 loop normal로 바꾸시고 0, 1 누르고 일시정지와 재생 확인해주셨습니다.
loop off 상태일때도 0누르면 일시정지, 1누르면 다시 재생이 되는데요, loop off일때 일시정지 안한상태로 1누르셔서 반응이 없었던 건가요?? loop normal일때도 1만 누르면 반응이 없는데 착오가 있던 것인지 이 부분 확인 부탁드립니다.
그리고 만약 그렇다면 loop off와 normal의 차이는 resume 기능이 되고 안되고가 아니라 단순히 사운드가 반복이 되고 안되고의 차이인 건가요?