노는게 제일 좋습니다.

pygame 키입력으로 이동해 상자먹기 본문

Python/기타 공부

pygame 키입력으로 이동해 상자먹기

노는게 제일 좋습니다. 2016. 2. 7. 22:50

원코드 출처 http://inventwithpython.com/downloads/


키입력을 추가함.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import pygame,sys,random
from pygame.locals import *
 
pygame.init()
mainClock = pygame.time.Clock()
 
WINDOWWIDTH = 400
WINDOWHEIGHT= 400
 
windowSurface = pygame.display.set_mode( (WINDOWWIDTH, WINDOWHEIGHT), 032 )
pygame.display.set_caption('Practice keyboardInput')
 
BLACK = (0,0,0)
GREEN = (0,255,0)
WHITE = (255,255,255)
 
foodCounter = 0
NEWFOOD = 40
FOODSIZE = 20
player = pygame.Rect(300,150,50,50)
 
foods = []
for i in range(0,20):
    foods.append( pygame.Rect( random.randint(0, WINDOWWIDTH - FOODSIZE),
                                                 random.randint(0, WINDOWHEIGHT - FOODSIZE),
                                                 FOODSIZE, FOODSIZE)
                          )
 
moveLeft=False
moveRight = False
moveUp = False
moveDown = False
 
MOVESPEED = 6
 
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT or event.key == ord('a'):
                moveRight = False
                moveLeft = True
            if event.key == K_RIGHT or event.key == ord('d'):
                moveRight = True
                moveLeft = False
            if event.key == K_UP or event.key == ord('w'):
                moveUp = True
                moveDown = False
            if event.key == K_DOWN or event.key == ord('s'):
                moveUp = False
                moveDown = True
        if event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            if event.key == K_LEFT or event.key == ord('a'):
                moveLeft = False
            if event.key == K_RIGHT or event.key == ord('d'):
                moveRight = False
            if event.key == K_UP or event.key == ord('w'):
                moveUp = False
            if event.key == K_DOWN or event.key == ord('s'):
                moveDown = False
            if event.key == ord('x'):
                player.top = random.randint(0, WINDOWHEIGHT - player.height )
                player.left = random.randint(0, WINDOWWIDTH - player.width )
 
        if event.type == MOUSEBUTTONUP:
            foods.append(pygame.Rect(event.pos[0], event.pos[1], FOODSIZE, FOODSIZE))
 
    foodCounter += 1
    if foodCounter >= NEWFOOD:
        foodCounter = 0
        foods.append(pygame.Rect(random.randint(0, WINDOWWIDTH-FOODSIZE)
                                 , random.randint(0, WINDOWHEIGHT-FOODSIZE)
                                 , FOODSIZE, FOODSIZE))
 
    windowSurface.fill(BLACK)
 
    if moveDown and player.bottom < WINDOWHEIGHT:
        player.top += MOVESPEED
    if moveUp and player.top > 0:
        player.top -= MOVESPEED
    if moveLeft and player.left > :
        player.left -= MOVESPEED
    if moveRight and player.right < WINDOWWIDTH:
        player.left += MOVESPEED
 
    pygame.draw.rect(windowSurface, WHITE, player)
 
    for food in foods[:]:
        if player.colliderect(food):
            foods.remove(food)
 
    for i in range(len(foods)):
        pygame.draw.rect(windowSurface, GREEN, foods[i])
 
    pygame.display.update()
    mainClock.tick(40)
cs


구조는 대강 이렇다.

키 이벤트 확인

-> 마우스 이벤트 확인

-> foodCounter가 NEWFOOD보다 크면 상자 하나 추가

-> 캐릭터 이동시키기

-> 캐릭터와 상자 충돌했으면 상자 삭제

-> 화면 표시하기


   mainClock.tick(n)

반복문을 초당 n번만 실행하도록 함. 1초가 지나기전 n번 실행했으면, 잠시 프로그램 멈춤

만약 time.sleep()을 사용한다면, 컴퓨터의 성능에 따라 결과가 달라짐.


**** 이벤트 타임과 특성이 정리된 링크. 아래 내용들을 포함하고 있음.

    http://pygame.org/ftp/contrib/input.html


   키보드 이벤트

1) attribute

key : event는 key attribute를 가지며, 이는 어느키가 눌렸는지에 대한 정보를 갖고있다.

키를 지정하기 위해서는 상수 변수(EX:K_LEFT)를 사용하거나, odr()함수에 키를 써넣어 ASCII값을 얻는다.(EX:ord('s'))

mod : mod attribute로는 쉬프트, 컨트롤, 알트나 다른 키를 같이 눌렀는지 알 수 있다.


2) type : 위 코드에서 나온 이벤트 type에는 KEYDOWN과 KEYUP이 있음. 위 두개 attribute는 두 type에 모두 있음(비슷)



   마우스 이벤트 - MOUSEMOTION 의 attribute

1) pos : 윈도우에서 마우스의 좌표를 나타내는 (x,y)튜플을 반환

pos[0]에는 x좌표가, pos[1]에는 y좌표가 있음


2) rel : 마지막 MOUSEMOTION 이벤트 후에 얼마나 움직였는지, 즉 상대적인 위치를 알려준다.


   마우스 이벤트 - MOUSEBUTTONUP, MOUSEBUTTONDOWN의 attribute

1) pos : 버튼이 눌렸을 때 마우스의 좌표를 나타내는 (x,y)튜플


2) button : 어떤 버튼을 눌렸는지 알려줌. 정수값으로 각 버튼을 나타냄.

1 : 왼쪽버튼 / 2 : 가운데버튼 / 3 : 오른쪽버튼 / 4. 스크롤휠 위쪽 / 5.스크롤휠 아래쪽


   colliderect() 메소드

두 그림이 충돌했는지 알려준다.

대상1.colliderect(대상2)




Comments