목록전체 글 (18)
개발이 취미인 개발자
얼마 전, 한 정치인이 지지자로 보이는 사람에게 칼로 공격을 당하는 사건이 발생했다. 회사 동료가 당시 상황이 담긴 영상을 공유해서 그 장면을 볼 수 있었다. 그 정치인이 살아있는 게 정말 기적으로 보일 정도로 아찔한 순간이었다. '저거 짜고 친거래. 유튜브에 증거 영상 쫘악 퍼졌어.' 동료가 말했다. 그래서 퇴근길에 검색을 해 봤다. 대충 많으면 5만에서 적으면 1만 정도의 조회 수를 가진 정치인 피습 조작 증거 영상이 조회 되었다. 그 중 하나를 클릭해 보았다. TTS서비스로 생성된 기계가 내는 목소리였다. 영상은 스크립트와는 별로 상관없는 그냥 피해를 입은 정치인의 사진만 반복 되었다. 이슈 시점에 조회수를 높이려고 급조해서 만든 티가 났다. 자막에 오타는 기본에 근거도 없고 논리도 빈약한 본인의 ..
플랫포머 게임에서 점프는 가장 중요한 기술이다. 과거 고전 게임의 경우에는 점프 컨트롤이 아주 불편했는데, 보통 점프의 높이 변경이나 방향 전환을 할 수 없도록 구현 되어 있었다. 특히 '마계촌'은 점프 스킬이 아주 불편했던 대표적인 고전 게임이다. 게임 내에서의 채공 시간도 매우 짧고 점프 높이도 낮아서 조금이라도 타이밍이 맞지 않으면 쉽게 적이 쏜 탄에 맞거나 몹과 부딪치게 구현되어 있었다. 최근 플랫포머 게임의 과거와 달리 키를 얼마동안 누르고 있느냐에 따라 점프의 높이를 조절할 수 있도록 구현되어 있다. 또 이중 점프와 같은 기술을 추가하여 점프 이후에 무방비로 떨어지는 메인 캐릭터에게 한번 더 점프 할 수 있는 기회를 주기도 한다. 우선, 이번 강의 점프는 과거 스타일의 점프를 그대로 구현해 보..
먼저, 메인 캐릭터(주인공)의 움직임을 처리하는 것부터 시작해보자. 메인 캐릭터를 좌우로 움직이게 하는 부분은 이전의 슛팅 게임에서 처리한 로직과 동일하다. 좌우 키를 입력할 때마다 메인 캐릭터의 x축의 값을 빼거나 더하여 이미지를 위치를 바꿔주면 된다. 하지만 슈팅게임과 다른 부분이 하나 있는데 그것이 바로 애니메이션 효과이다. 슈팅게임의 경우에는 메인 캐릭터가 비행기이기 때문에 한장의 이미지로만 화면에 표시하고 키 입력에 따라 좌우 위치만 변경해도 큰 무리가 없다. 하지만 플랫포머 게임의 경우 메인 캐릭터가 사물이 아닌 인간이나 생물인 경우가 많다. 따라서 움직임에 조금 더 디테일한 효과를 주어야 움직임이 자연스러워 보인다. 위와 같이 오른쪽 방향으로 움직이는 이미지 4장을 간단하게 만들어 보았다. ..
슈팅게임에서 배경은 화면의 속도감을 주는 역할을 한다. 속도감이 생기는 이유는 착시 효과를 이용한 것으로 배경을 빠르게 이동시켜 멈춰 있는 메인 캐릭터 빠른 속도로 움직인다는 느낌을 받게 된다. 코드 구현도 무척 간단하다. 최초 맨 위에서 출발한 이미지가 화면에 마지막에 도달하게 되면 배경이미지의 높이만큼 다시 위로 이동시키면 끝이다. 여기서는 조금 입체적인 효과를 주기 위해 배경 이미지를 4장을 사용했다. 별 이미지 2장과 성운 이미지 2장을 처리했는데 이미지를 더 추가하면 훨씬 더 속도감 있는 효과를 줄 수가 있을 것이다. game_background.py 파일을 새로 만들고 아래 소스코드를 추가한다. class Background(pygame.sprite.Sprite): def __init__(se..
슈팅게임에서 스테이지별 시작과 끝은 전통적으로 메인캐릭터의 출격하는 장면과 철수하는 장면이 나온다. 이번에는 그동안 개발한 소스에서 제트기류를 뒤로 뿜어내면서 출격하는 씬과 철수하는 씬을 추가하도록 하자. 우선 출격하는 장면을 구현해 보자 제트기류 연출은 이전에 처리한 총알 구현 파트에서 레이저 발사를 응용하면 된다. 제트기류가 뒤로 발사된 후 시간이 지나면서 사라지도록 처리하면 된다. 제트 기류의 발생 위치는 메인캐릭터의 꼬리 부분에 맞춰서 생성해준다. 시간이 모두 지나면 생성한 제트기류 객체를 삭제하면 끝이다. 제트기류 처리하는 class는 아래 소스코드를 참고하자. class FlightJet(pygame.sprite.Sprite): def __init__(self, sx, sy): pygame.s..
원래는 이번에는 스테이지 처리에 대해 구현하려고 했는데 스테이지 처리 전에 먼저 소개할 부분이 있다는 생각이 들었다. 그것은 바로 메인 캐릭터와 총알과의 충돌 처리 부분이다. 이제까지 많은 예제를 만들면서 충돌 처리와 같은 필수적인 부분을 추가하지 않았는데 지금이라도 설명하고 넘어가는 것이 앞으로 남은 강좌에 꽤나 필수적이라는 생각이 들었다. 충돌 처리는 게임 개발하는 과정에서 꽤 난이도가 높은 편이다. 특히 적기의 모양이 복잡할 수록 많은 연산과 로직이 들어가야 한다. 그래서 과거 하드웨어 성능이 떨어지던 시절에는 충돌 영역을 단순하게 박스 모양으로 설정해서 영역 안에 총알이 들어간 경우, 충돌로 판정하도록 처리했다고 한다. 하드웨어의 연산 속도가 빠르지 않았기 때문에 게임이 충돌 처리에 많은 자원을 ..
지난 번에는 회전을 하는 편대비행을 구현했다면 이번에는 회전이 없는 편대비행을 구현해 봤다. 사실 별로 코드상의 차이는 없다. rotate하는 부분을 코드를 주석으로 막으면 무회전하는 편대비행을 구현할 수가 있다. 적 생성 시점에 설정값 중에 회전 여부를 아래와 같이 추가하고 enemy_class 생성 시 회전여부를 속성값으로 설정할 수 있도록 처리했다. # 0 속도(vel) # 1 가속도(acceleration) # 2 회전속도(angle_speed) # 3 최대속도(max_vel) # 4 회전여부(rotated) true(1): false(0) # 5 회전시감속(curved_speed) enemy_config = [ [1, 0.1, 5, 7, 0, 1.5] , [1, 0.1, 5, 7, 0, 1.5]..
슛팅게임에서 보스전 만큼 중요한 건 바로 현란한 적기의 움직임이라고 생각한다. 인터넷에 있는 슛팅게임 예제를 많이 봐 왔는데 매번 아쉬운 점은 적기의 움직임이 단조롭다는 것이다. 대부분 위에서 아래로 내려오는 일직선 정도로 구현이 되고 끝이 나 버린다. 그래서 조금 더 다양한 패턴의 움직임을 가진 적기가 등장하는 것을 구현해 봤다. 적기의 움직임도 탄의 종류만큼이나 다양하게 나올 수가 있다. 총알과 다른 점이 있다면 방향이 바뀌면서 움직이는 경우, 더 자연스럽게 움직이도록 처리를 해줘야한다는 점이다. 총알도 각도가 변하는 경우는 많지만 화면에 노출되는 시간이 길지 않고 크기도 작은 편이라 다소 부자연스러운 움직임을 보이더라도 플레이어가 눈치를 채기가 매우 어렵다. 하지만 적기의 움직임은 그렇지가 않다. ..