PyGame

sz L·2023년 3월 16일
0

MINII_Project

목록 보기
12/15
post-thumbnail
pip install pygame

원 그리기

import pygame

pygame.init() # 1. 게임 초기화

win = pygame.display.set_mode((500, 500)) #윈도우 사이즈 500 X 500
pygame.display.set_caption('게임 만들기')
icon = pygame.image.load('./StudyPyGame/game.png')
pygame.display.set_icon(icon)

# object 설정
x = 250
y = 250
radius = 10
vel = 10

run = True

while run:
    pygame.draw.circle(win, (255,255,255), (x,y), radius)

    # 이벤트 = 시그널
    for event in pygame.event.get(): # 2. 이벤트 받기
        if event.type == pygame.QUIT:
            run = False

    pygame.display.update() # 3. 화면 업데이트(전환)


이미지 파일 준비

# 달려라 공룡
import pygame
import os

pygame.init()

ASSETS = './StudyPyGame/Assets/'
SCREEN = pygame.display.set_mode((1100,600))
icon = pygame.image.load('./StudyPyGame/dinoRun.png')
pygame.display.set_icon(icon)
BG = pygame.image.load(os.path.join(f'{ASSETS}Other', 'Track.png'))

RUNNING = [pygame.image.load(f'{ASSETS}Dino/DinoRun1.png'),
           pygame.image.load(f'{ASSETS}Dino/DinoRun2.png')]

DUCKING = [pygame.image.load(f'{ASSETS}Dino/DinoDuck1.png'),
           pygame.image.load(f'{ASSETS}Dino/DinoDuck2.png')]

JUMPING = pygame.image.load(f'{ASSETS}Dino/DinoJump.png')

class Dino: # 공룡 클래스
    X_POS = 80; Y_POS = 310; Y_POS_DUCK = 340; JUMP_VEL = 9.0

    def __init__(self) -> None:
        self.run_img = RUNNING; self.duck_img = DUCKING; self.jump_img = JUMPING

        self.dino_run = True; self.dino_duck = False; self.dino_jump = False # 달리는게 디폴트

        self.step_index = 0
        self.jump_vel = self.JUMP_VEL # 점프 초기값 9.0
        self.image = self.run_img[0]
        self.dino_rect = self.image.get_rect() # 이미지의 사각형 정보를 가져옴
        self.dino_rect.x = self.X_POS
        self.dino_rect.y = self.Y_POS

    def update(self,userInput) -> None:
        if self.dino_run:
            self.run()
        elif self.dino_duck:
            self.duck()
        elif self.dino_jump:
            self.jump()

        if self.step_index >= 10: self.step_index = 0 # 애니메이션 스텝

        if userInput[pygame.K_UP] and not self.dino_jump: # 점프
            self.dino_run = False
            self.dino_duck = False
            self.dino_jump =True
            self.dino_rect.y = self.Y_POS # 이게 없으면 점프키 계속 누르면 공룡이 계속 올라감
        elif userInput[pygame.K_DOWN] and not self.dino_jump: # 수구리
            self.dino_run = False
            self.dino_duck = True
            self.dino_jump = False
        elif not(self.dino_jump or userInput[pygame.K_DOWN]): # 달리기
            self.dino_run = True
            self.dino_duck = False
            self.dino_jump = False

    def run(self):
        self.image = self.run_img[self.step_index // 5] # 0,1 반복
        self.dino_rect = self.image.get_rect()
        self.dino_rect.x = self.X_POS
        self.dino_rect.y = self.Y_POS
        self.step_index += 1


    def duck(self):
        self.image = self.duck_img[self.step_index // 5] 
        self.dino_rect = self.image.get_rect()
        self.dino_rect.x = self.X_POS
        self.dino_rect.y = self.Y_POS_DUCK
        self.step_index += 1
    
    def jump(self):
        self.image = self.jump_img
        if self.dino_jump:
            self.dino_rect.y -= self.jump_vel * 4
            self.jump_vel -= 0.8
        if self.jump_vel < -self.JUMP_VEL: # -9.0이 되면 점프 중단
            self.dino_jump = False
            self.jump_vel = self.JUMP_VEL # 9.0으로 초기화                

    def draw(self,SCREEN) -> None:
        SCREEN.blit(self.image, (self.dino_rect.x, self.dino_rect.y))

def main():
    run = True
    clock = pygame.time.Clock()
    dino = Dino()

    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        
        SCREEN.fill((255,255,255)) # 배경 흰색
        userInput = pygame.key.get_pressed()
        
        dino.draw(SCREEN) # 공룡 그리기
        dino.update(userInput)

        clock.tick(30) # 프레임 개수
        pygame.display.update() # 초당 30번 업데이트

if __name__ == '__main__':
    main()        

점프/수구리기 기능

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글