바로 전 글에 이어서 고양이를 밖으로 못나가게 해보자.
앞서 고양이를 이동시키는 예제에서 고양이를 그려주는 코드는 blit 부분이다.
우리는 방향키를 누를 때마다 catx, caty를 바꾸어 준 뒤 catImg를 바뀐 (catx, caty) 좌표에 뿌려주었다.
이를 생각하면 밖으로 못나가게 하는 건 쉽다. catx, caty가 화면 크기보다 커지면 catx, caty 값을 그대로 두면 된다.
즉 다음과 같은 코드가 있으면 된다.
if catx <= 400
catx += 5
위 코드에서 400은 화면의 가로 크기이다.
그런데 문제가 있다.
catx가 397이면 catx += 5가 실행되면서 402가 된다.
이를 고려하면 위 코드는 아래와 같이 바뀐다.
if catx <= 400 - 5
catx += 5
오른쪽 키 뿐만 아니라 위, 아래, 왼쪽 키에 대해서도 마찬가지로 적용하면 잘 동작할거라 생각이 든다.
하지만 실제로 해보면 왼쪽, 위쪽은 잘 동작하지만 오른쪽, 아래쪽은 화면 밖을 넘어가 버린다.
왜 그럴까?
처음에 언급한 blit 함수를 다시 살펴보자.
blit함수는 이미지를 화면에 그려주는 함수이다.
위에선 catx, caty 좌표에 고양이 이미지를 그렸다.
이 catx, caty 좌표의 기준은 어디일까?
제일 처음 고양이 이미지가 그려지는 위치를 생각해보면 알 수 있다.
바로 고양이 이미지의 왼쪽 위 꼭지점이다.
즉, 고양이를 밖으로 못나가게 하려면 catx, caty 값이 아래와 같은 영역 안에 있어야 한다.
그러면 가로 방향의 좌표는 화면의 가로 크기 - 고양이 이미지의 가로 크기 안에 있어야 하고
세로 방향의 좌표는 화면의 세로 크기 - 고양이 이미지의 세로 크기 안에 있어야 한다는 것을 알 수 있다.
고양이 이미지의 크기는 다음과 같이 알 수 있다.
세로 사이즈 = catImg.get_height()
이를 이용하면 코드는 아래와 같이 바뀐다.
if catx <= 400 - catImg.get_width() - 5
catx += 5
전체 소스는 아래와 같다.
(키 누르는 동안 움직이는 코드도 추가하였다)
from pygame.locals import *
pygame.init()
FPS = 30 # frames per second setting
fpsClock = pygame.time.Clock()
# set up the window
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Cat')
WHITE = (255, 255, 255)
catImg = pygame.image.load('cat.png')
catx = 10
caty = 10
RightkeyIsDown = False
LeftkeyIsDown = False
DownkeyIsDown = False
UpkeyIsDown = False
while True: # the main game loop
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN and event.key == K_RIGHT:
RightkeyIsDown = True
elif event.type == KEYDOWN and event.key == K_LEFT:
LeftkeyIsDown = True
elif event.type == KEYDOWN and event.key == K_DOWN:
DownkeyIsDown = True
elif event.type == KEYDOWN and event.key == K_UP:
UpkeyIsDown = True
elif event.type == KEYUP and event.key == K_RIGHT:
RightkeyIsDown = False
elif event.type == KEYUP and event.key == K_LEFT:
LeftkeyIsDown = False
elif event.type == KEYUP and event.key == K_DOWN:
DownkeyIsDown = False
elif event.type == KEYUP and event.key == K_UP:
UpkeyIsDown = False
if RightkeyIsDown == True:
if catx <= 400 - catImg.get_width() - 5:
catx += 5
if LeftkeyIsDown == True:
if catx >= 5:
catx -= 5
if DownkeyIsDown == True:
if caty <= 300 - catImg.get_height() - 5:
caty += 5
if UpkeyIsDown == True:
if caty >= 5:
caty -= 5
DISPLAYSURF.fill(WHITE)
DISPLAYSURF.blit(catImg, (catx, caty))
pygame.display.update()
fpsClock.tick(FPS)