목록전체 글 (18)
개발이 취미인 개발자
딥러닝 강의가 2017년 버전이라 예제로 나온 소스코드가 너무 오래 되서 동작이 되질 않았다. tensorflow 1.0 버전에 작성된 코드라 2.0에서는 동작을 하지 않는다. 구글링을 해보니 tf.compat.v1.disabled_v2_behavior()를 상단에 추가해 주면 1.0 코드도 2.0에서 가능하다고 하는데 그럼에도 불구하기 실행은 되지 않았다. 아래 소스가 실행되지 않는 tensorflow 1.0 버전의 소스이다. import gym import numpy as np import tensorflow as tf from gym.envs.registration import register register( id='FrozenLake-v3', entry_point='gym.envs.toy_tex..
보스전은 그동안 여러 종류의 총알을 구현하면서 사용한 코드를 그대로 재활용해서 구현해 보았다. 보스의 본체 위에 터렛을 올리고 보스와 터렛이 함께 움직이도록 처리했다. 그리고 총알 발사하는 로직은 기존에 개발한 조준탄, n-way탄, 원형 회전탄을 거의 그대로 사용했다. 수정한 부분은 거의 발사 간격 정도이다. 보스의 움직임은 처음에는 좌우로 한번 움직이고 그리고 가운데로 이동 한 뒤에 아래로 이동했다가 다시 제자리로 돌아오도록 처리했다. 움직임을 처리하는 데이터는 배열 형태로 만들었다. 보스의 움직임 배열의 기본 구조는 아래와 같다. 0 start_x (시작 위치 -1인 경우 현재 위치) 1 start_y (시작 위치 -1인 경우 현재 위치) 2 dx (x의 좌표 이동값) 3 dy (y의 좌표 이동값)..
슈팅게임에서 화면을 어지럽게 채우는 일명 탄의 장막, 탄막을 만들기 위해서는 360도 회전하면서 발사하는 회전탄을 빼놓을 수가 없다. 360도 회전탄의 경우 탄 사이의 각도와 탄의 속도를 조금만 변경해도 난이도를 상당히 어렵게 만들 수가 있다. 360도 방향탄을 구현하는 경우, 게임 난이도 측면에서 안전지대에 대해서 고려해야 한다. 만약 처음 총알을 15도 각도로 발사 했다고 가정하면 발사된 총알과 총알 사이에 15도 각도 영역만큼 안전지대가 생성이 된다. 문제는 360도 회전을 모두 마치고 2회차도 동일한 각도로 총알이 회전을 하게 되면 결국 안전지대에서 플레이어는 아무런 움직임 없이도 현란한 총알을 모두 피하게 된다. 그래서 360도 회전을 마치고 0도로 돌아 왔을때 회전 각도를 살짝 틀어줘서 1회차..
회전탄은 발사된 총알이 원을 그리며 움직이는 탄이다. 여러 개의 총알이 회전을 하기 때문에 현란해 보일 뿐만 아니라 위의 구현된 회전탄처럼 점점 그리는 원의 반경을 넓혀주면 플레이어가 예상하는 움직임을 빗나가게 피하기 어렵게 만든다. cx, cy를 총알의 움직이는 중심 좌표로 두고, 총알이 움직이는 원의 반지름을 rad로 가정할 때, 원을 그리면서 움직이는 총알의 좌표는 아래와 같은 공식을 통해 얻을 수 있다. x = cx + rad * cos(θ) y = cy + rad * sin(θ) 위의 공식을 코드로 구현하면 아래와 같다. def update(self, GameMain): self.x = self.cx + self.rad * math.cos(math.radians(self.theta)) self...
조준탄이나 n-way탄보다 슈팅게임의 난이도를 높이는 방법은 유도탄을 게임에 추가하는 것이다. 플레이어가 피했다고 생각한 순간 각도를 틀어서 따라오는 탄은 플레이어의 움직임의 제한하여 실수를 유도하게 된다. 이로 인해 플레이어의 게임에 대한 긴장감과 집중도를 높일 수가 있다. 유도탄 알고리즘은 조준탄의 연장선에 있다. 조준탄은 발사되는 순간에 플레이어의 위치를 파악한 후 발사된다. 그에 비해 유도탄은 발사된 후에도 계속 플레이어 위치를 추적한다. 조준탄이 최초 한번하는 조준을 유도탄을 매 순간하도록 코드를 작성하면 된다. 물론 끝까지 플레이어를 조준하고 방향을 틀게 되면 플레이어가 영원히 피할 수 없는 유도탄이 되기 때문에 적절한 시점에 추적하는 것을 멈춰줘야 한다. 여기서 구현한 것은 유도탄이 아니라 ..
슈팅게임의 난이도를 높이기 위해서는 바로 이 n-way탄은 필수적인 요소이다. 한번에 여러발을 발사하여 플레이어가 피할 수 있는 공간 줄이고 움직임이 제한하여 게임의 긴장감을 높일 수가 있다. 여러발이 동시에 발사되어 꽤 어려운 것 같지만 기본 원리는 조준탄과 거의 유사하다. 정말 단순하다. 조준한 원래 탄에 좌우로 각도가 다른 총알만 생성해주면 끝이다. 처음 총알은 플레이어를 조준한 각도 θ로 만든다. 그리고 좌우로 θ₁, -θ₁각도를 더한 추가로 탄을 생성한다. 원하는 방향을 늘리고 싶다면 위의 각도 추가하는 걸 반복만 하면 된다. 여기서는 3방향, 5방향만 구현을 했다. 더 많은 방향으로 총알이 나가고 싶다면 그냥 소스에서 nway의 값만 늘려주면 된다. def createBullet(self, b..
슈팅게임 개발 시 레이저를 구현하는 거에 대해 알아보자. 최초 레이저의 발사되는 방향과 속도, 또 그에 따른 이동거리는 계산은 기존에 배운 조준탄과 동일하다. 조준탄의 경우 플레이어를 향해 발사되면 끝이 났다. 하지만 레이저의 경우에는 발사으로 끝이 나지 않는다. 위의 그림처럼 1번 레이저가 발사된 후 1번 레이저를 뒤 따라오는 2번과 3번 레이저를 만들어줘야한다. 자연스러운 레이저의 이동을 위해서는 1번 레이저가 그려진 후 다음 위치로 이동하기 전에 2번 레이저를 생성해 줘야한다. 1번 레이저가 이동한 후, 생성된 2번 레이저는 원래 1번 위치에 그려진다. 이를 위해서는 2번 레이저가 생성되는 시점에 1번 레이저의 원래 x, y, theta, angle의 값으로 생성되어야 한다. 3번 레이저를 생성할 ..
플레이어 위치를 향해 발사되는 총알(조준탄)을 구현해보자. 총알이 발사되는 위치 좌표를 sx, sy 라고 하고 플레이어의 위치를 tx, ty 라고 할 때 발사되는 위치와 플레이어의 위치는 아래와 같은 그림으로 나타낼 수 있다. 조준탄이 발사되면 위 그림의 삼각형의 빗변을 따라 위치가 이동하게 된다. atan2 함수를 이용하면 총알이 발사되는 각도를 구할 수가 있다. math.atan2를 통해 구해지는 값은 라디언 값으로 cos, sin 함수를 이용하면 위의 삼각형 빗변을 따라 이동하는 좌표 x, y를 구할 수가 있다. self.angle = math.atan2(ty - sy, tx - sx) self.theta = math.degrees(self.angle) * -1 총알이 발사되기 전 포탑이 플레이어 ..