분류 전체보기 1092

[pygame] 7. 충돌 처리를 위한 준비

충돌 처리는 게임을 만드는 것에 있어서 꽤 중요한 부분 중 하나이다. 아무 처리를 하지 않았을때, 캐릭터 그림끼리 서로 겹치기도 하고 그냥 스쳐 지나간다. 그래서 이 캐릭터의 rigid 처리를 해주고, 서로 간의 충돌처리를 해주는 것이 중요하다. 이 파트를 잘 다룰 수 있다면, 벽돌깨기 게임도 만들 수 있고, 적군과 부딪쳤을때 또는 보물상자나 함정에 부딪쳤을 때, 어떤 이벤트를 발생시킬 수 있다. 여기에서는 피카츄가 몬스터볼에 부딪쳤을 때, 충돌처리를 하면서 게임을 종료시키는 작업을 진행해보자. 우선 그 전에 몬스터볼 이미지 파일도 불러오고, 셋팅하는 작업을 해줘야한다. 이것은 예전 캐릭터 셋팅 시 진행했던 작업과 거의 유사하다. * 참고 https://bayleaf07.tistory.com/62 [추억..

[pygame] 6. FPS 설정2

여기서 이제 문제가 뭐냐, FPS가 초당 프레임 수를 의미하는 거라면 FPS = 10이나 FPS = 60이나 화면이 버벅이는 차이만 있어야하지, FPS에 따라서 캐릭터의 속도 자체가 바뀌면 안된다. 근데 지금 그 문제가 일어나고 있음 일단 이 문제를 해결하기 전에 캐릭터 좌표를 변수로 만들어서 먼저 빼보자. # 이동 속도 character_speed = 10 # 원래 5로 적었던 부분을 character_speed라는 변수로 바꾸었음. if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: to_x -= character_speed elif event.key == pygame.K_RIGHT: to_x += character_speed elif e..

[pygame] 5. FPS 설정1

FPS는 초당 프레임 수를 의미한다. 보통은 30~60 정도로 설정하는데 프레임 수가 높으면, 화면이나 캐릭터 이동이 끊기지 않고 자연스럽다. 대신 더 많은 CPU 메모리를 사용하게 된다. 반면, 프레임 수가 낮으면 움직임이 부자연스럽고 끊기는 느낌이 나지만 CPU 메모리는 적게 사용하게 된다. FPS는 테트리스를 만들면서도 많이 고민했던 부분인데, 시간이 지남에 따라 블록이 내려오는 과정을 구현해야하다보니 그랬던 것 같다. 기본적으로 사람의 눈에는 블록이 내려오는 것처럼 보이지만, 컴퓨터의 입장에서 보면 블록을 지웠다가 조금 밑에 다시 생성하고, 또 지우고 생성하는 과정을 반복하는 것이다. 결국은 일종의 착시 또는 눈속임인데, 애니메이션의 작동원리와 비슷하다. 코드만 요약해서 적으면 아래와 같은데, 하..

[pygame] 4. 배경화면 경계선 처리

배경화면의 경계선을 처리하기 위해서는, 먼저 배경화면과 캐릭터의 x좌표, y좌표의 값을 잘 알아야합니다. 그래서 먼저 코드로 구현해보기 전에 종이나 펜으로 그림을 그려보는 과정이 필요합니다. 코드 구현 과정은 다음과 같습니다. # 가로 경계값 처리 # 캐릭터 위치가 0보다 작아지면, 그 자리에 멈춰있게 처리 if character_x_pos screen_width - character_width: character_x_pos = screen_width - character_width # 세로 경계값 처리 ..

[pygame] 3. 키보드 이벤트

아주~~ 아주 과거에는 컴퓨터에 input 값을 입력하려면, 직접 다 코드를 작성해야했다. (지금 리눅스처럼) 그런데 미국의 발명가인 더글러스 엥겔바트씨는 일찍이 이런 불편함을 느꼈었고, 1963년 세계 최초의 마우스를 개발했다. 키보드의 경우는 초창기 천공카드라고 불리는 종이 카드로부터 시작하였고. (뭔가 컴퓨터의 역사는 공부할수록 재미있다.) 아무튼 사용자가 이렇게 키보드와 마우스를 통해서 정보를 입력하면, 그 정보를 입력 받아서 처리하는 장치가 필요하다. 그 부분이 바로 이 키보드 이벤트 기능인 것이다. running이 true인 동안 while문을 계속 돌면서, 모든 이벤트를 입력받아 처리한다. 감사하게도 pygame에서 이벤트 처리 기능을 제공하기 때문에 이것을 이용하면 조금 더 쉽게 코드를 처..

[pygame] 2. 배경화면과 캐릭터 설정

▶ 배경화면 배경화면을 넣는 방법은 2가지가 있다. 그림판으로 480 X 640 크기의 이미지를 만든 다음에 pygame.image.load("C:/Users/경로/그림.png") 이렇게 직접 이미지를 불러오는 방법이 있다. 참고로 경로를 입력할 때, \ 역슬레시를 / 슬레시로 바꿔줘야한다. 이럴 경우에는 나중에 screen.blit(background, (0,0)) 이 코드를 통해서 배경을 나타내면 되는데, 여기서 (0,0)은 이미지를 어디에 넣을지 그 좌표값을 말한다. 두번째 방법은 background = screen.fill((255,255,250)) 이렇게 화면 전체를 우리가 정한 RGB 값으로 채워주는 경우이다. 이 때는 배경을 불러올 때, print(background) 이렇게 배경을 프린트 ..

[pygame] 1. 기본 설정

대략 pygame의 기본 설정 코드는 아래와 같다. 어떤 게임을 만드냐에 따라서 조금씩 달라질 수는 있겠지만, 10가지 정도의 코드를 보면서 공통점을 찾아보면 다음과 같았다. 이것은 pygame에서 처음 샘플형태로 제공한 코드일 수도 있고, 아니면 잘하는 유저가 만들어서 배포한 형태일 수도 있다. 영어강의를 들어도 이 형태가 많아서, 아마 전자가 맞지 않을까? 내가 맨 처음에 스켈레톤 코드를 그냥 맨땅에 헤딩 식으로 짜려고 했을때, 이벤트 루프 부분을 추가하지 않았었다. 그랬더니 제대로 동작하지 않았다는.. 이벤트 루프가 꼭 필요한 부분인가보다. (그래야지 게임을 종료시킬 수 있으니까) pygame 덕분에 게임을 조금 더 쉽게 개발할 수 있어서 감사하다. #0. 스켈레톤 코드 import pygame #..

[pygame] 0. 동기

테트리스 만들기를 하면서, 코드를 많이 보다보니까 대충 다른 게임의 코드들도 기본적인 흐름은 똑같다는 걸 알게 되었다. 흐름이 보인다고 해야하나? 기본 틀에 안에 내용만 좀 바꾸면, 다른 2D 게임이 만들어진다. 대부분 흐름이, 배경이랑 프레임 설정하고, 캐릭터 설정하고, FPS 설정하는 것. 그리고 충돌처리, 게임오버까지 잘 해주면 기본은 된 것이다. 근데 이제 여기부터 좀 더 깔끔하게 정리해서 말해주는 수업을 한번 듣고 정리해보기로 했다. 그러면 내가 배웠던 개념들을 응용해서, 벽돌깨기나 보글보글 게임도 만들 수 있겠지. 중요한 것은 그 흐름과 원리를 이해하는 것이다. 나중에 이 코드들을 보지 않고도 혼자서 만들 수 있을 정도로 되려면, 원리를 잘 이해하고 있어야한다. 그리고 코드 한줄 한줄을 이해하..

[테트리스] 기본 블록 만들어보기

대략 노트에 한번 그림으로 그려보았다. 블록 모양은 7개인데, 회전해서 바뀌는 것까지 모두 고려했다. 색칠된 부분은 1, 아닌 부분은 0으로 입력할 예정이다. 아래와 같은 느낌으로 블록을 하나하나 입력해보았다. block = [ # 1번 인덱스 ㄴ 모양 [ [[0,0,0],[1,0,0],[1,1,1]], [[1,1,0],[1,0,0],[1,0,0]], [[1,1,1],[0,0,1],[0,0,0]], [[0,0,1],[0,0,1],[0,1,1]] ] ] 더보기 block = [ # 0번 인덱스 ㅁ 모양 [ [[1,1,0],[1,1,0],[0,0,0]] ], # 1번 인덱스 ㄴ 모양 [ [[0,0,0],[1,0,0],[1,1,1]], [[1,1,0],[1,0,0],[1,0,0]], [[1,1,1],[0,0,..

[테트리스] 배경화면에 벽 맵 추가하기

대충 이렇게 하니까, 블록이 2개 만들어졌다. 이제 좌표값을 잘 설정하고 for문을 돌리면서 블록을 깔아봐야겠다. 나중에 바꾸기 쉽도록 함수로 만들도록 하자. # 오브젝트 생성하기 # (100,50) 는 스크린에서의 위치 box1 = pygame.Rect(60,530,20,20) pygame.draw.rect(background,pink,box1,10) box2 = pygame.Rect(85,530,20,20) pygame.draw.rect(background,pink,box2,10) 더보기 import sys import pygame from pygame.locals import * # 초기화 & 기능 사용 시작을 알림 pygame.init() ## 초당 프레임 단위 설정 ## FPS = 30 Fram..