
โจ๏ธ: 2025๋ 2์ 10์ผ โ 2025๋ 2์ 11์ผ
โ๏ธ : 2025๋ 2์ 11์ผ
Pygame
- Python์ผ๋ก 2D ๊ฒ์์ ๋ง๋ค ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ฌ์ฉ
- ๋ํ, ์ด๋ฏธ์ง, ๊ทธ๋ํฝ, ์ฌ์ด๋, ์ถฉ๋ ์ฒ๋ฆฌ ๋ฑ์ ๊ธฐ๋ฅ ์ ๊ณต
screen = pygame.display.set_mode((๊ฐ๋ก, ์ธ๋ก))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
WHITE = (255, 255, 255) # RGB ๊ฐ
screen.fill(WHITE)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN: # ํค๋ฅผ ๋๋ ์ ๋
if event.key == pygame.K_LEFT:
print("์ผ์ชฝ ํ์ดํ ํค ๋๋ฆผ")
KEYDOWN โ ํค๊ฐ ๋๋ ธ์ ๋KEYUP โ ํค์์ ์์ ๋ ๋for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
print("๋ง์ฐ์ค ํด๋ฆญ๋จ!", event.pos) # ํด๋ฆญ ์์น ์ถ๋ ฅ
pygame.draw.rect(screen, (255, 0, 0), (50, 50, 100, 100)) # ๋นจ๊ฐ์ ์ฌ๊ฐํ
pygame.draw.circle(screen, (0, 0, 255), (250, 200), 50) # ํ๋์ ์
draw.rect(ํ๋ฉด, ์์, (x, y, ๋๋น, ๋์ด))draw.circle(ํ๋ฉด, ์์, (x, y), ๋ฐ์ง๋ฆ)image = pygame.image.load("character.png")
screen.blit(image, (100, 100)) # (100, 100) ์์น์ ์ด๋ฏธ์ง ์ถ๋ ฅ
sound = pygame.mixer.Sound("jump.wav")
sound.play() # ์ฌ์ด๋ ์ฌ์
pygame.event ๋ชจ๋์์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด๋ฒคํธ ํ์
์์๊ฐ ์ ์๋์ด ์์ต๋๋ค. ์ด ์์๋ค์ ์ฌ์ฉํด์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
pygame.QUIT
if event.type == pygame.QUIT:
running = False
pygame.KEYDOWN / pygame.KEYUP
KEYDOWN)์ ๋ผ์์ ๋(KEYUP) ๋ฐ์ํ๋ ์ด๋ฒคํธ.
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
print("์ผ์ชฝ ํ์ดํ ํค ๋๋ฆผ")
pygame.MOUSEBUTTONDOWN / pygame.MOUSEBUTTONUP
MOUSEBUTTONDOWN)์ ๋ผ์์ ๋(MOUSEBUTTONUP) ๋ฐ์ํ๋ ์ด๋ฒคํธ.
if event.type == pygame.MOUSEBUTTONDOWN:
print("๋ง์ฐ์ค ๋ฒํผ ํด๋ฆญ๋จ", event.pos) # ํด๋ฆญ๋ ์์น
pygame.MOUSEMOTION
if event.type == pygame.MOUSEMOTION:
print("๋ง์ฐ์ค ์์น:", event.pos)
pygame.ACTIVEEVENT
if event.type == pygame.ACTIVEEVENT:
if event.state == pygame.APPINPUTFOCUS:
print("์ฑ ํ์ฑํ๋จ")
elif event.state == pygame.APPINPUTFOCUSLOSS:
print("์ฑ ๋นํ์ฑํ๋จ")
pygame.VIDEORESIZE
if event.type == pygame.VIDEORESIZE:
screen = pygame.display.set_mode(event.size, pygame.RESIZABLE)
pygame.USEREVENT
pygame.event.post()๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
pygame.event.post(pygame.event.Event(pygame.USEREVENT, {"data": "example"}))
import pygame
import sys
from pygame.locals import * #pygame ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ชจ๋ ์ง์ญ ๋ณ์ ํธ์ถ
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
init()pygame.init()
pygame.time.Clock().tick(์ซ์)clock = pygame.time.Clock()
clock.tick(60)
tick()์ ์ฌ์ฉํ์ง ์์ผ๋ฉด CPU ์ฌ์ฉ๋์ด ๊ณผ๋ํ๊ฒ ์ฆ๊ฐํ ์ ์์ต๋๋ค!pygame.display.set_caption("์ ๋ชฉํ์์ค๋ช
")pygame.display.set_caption("Crazy Driver")
pygame.display.set_mode(( , ))screen = pygame.display.set_mode((500,800))
screen.fill(WHITE)screen.fill(WHITE)
pygame.display.update()pygame.display.update()
#๋ฉ์ธ ๊ฒ์ ๋ฃจํ
while True:
#๋ฐฐ๊ฒฝ ๋๊ธฐ
screen.blit(IMG_ROAD,(0,0))
#ํ๋ ์ด์ด ํ๋ฉด์ ๋๊ธฐ
screen.blit(player.image, player.rect)
#์ ํ๋ฉด์ ๋๊ธฐ
screen.blit(enemy.image, enemy.rect)
#์ด๋ฒคํธ ํ์ธํ๊ธฐ
for event in pygame.event.get():
#ํ๋ ์ด์ด๊ฐ ๊ฒ์์ ๊ทธ๋ง๋๋์ง?
if event.type == QUIT:#pygame.QUIT
#๊ฒ์ ๋๋ด๊ธฐ
pygame.quit()
sys.exit()
#ํ๋ฉด ์
๋ฐ์ดํธํ๊ธฐ
pygame.display.update()
os.path.dirname(**file**)ํ์ฉimport os
GAME_ROOT_FOLDER = os.path.dirname(__file__) #๊ฒ์๋ฃจํธ
IMAGE_FOLDER = os.path.join(GAME_ROOT_FOLDER,"Images")
#๊ฒ์๋ฃจํธ์ Images ์ถ๊ฐํด์ ์ด๋ฏธ์ง ๋ฃจํธ ์ ์ฅ
pygame.image.load(์ด๋ฏธ์ง๋ช
)IMG_ROAD = pygame.image.load(os.path.join(IMAGE_FOLDER,"Road.png")
blit(๋ณต์ฌํ ๊ณณ์ด๋ฆ,(x,y))screen.blit(IMG_ROAD, (0,0))
h = IMG_ROAD.get_width()//2
v = IMG_ROAD.get_height() - (IMG_PLAYER.get_height()//2)
์๋์ชฝ ๊ฐ์ด๋ฐ์ ํ๋ ์ด์ด ์๋์ฐจ๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
player = pygame.sprite.Sprite()
player.image = IMG_PLAYER
player.surf = pygame.Surface(IMG_PLAYER.get_size())
player.rect = player.surf.get_rect(center = (h,v))
#์คํ๋ผ์ดํธ๋ฅผ ๋ด์ ์ง์ฌ๊ฐํ ์ ์
# ์
# ์ ์ด๊ธฐ ์์น ๊ณ์ฐํ๊ธฐ
hl = IMG_ENEMY.get_width()//2 #๊ฐ์ฅ์ผ์ชฝ
hr = IMG_ROAD.get_width() - (IMG_ENEMY.get_width()//2) #๊ฐ์ฅ์ค๋ฅธ์ชฝ
h = random.randrange(hl, hr) #๋๋ค
v = 0 #์ธ๋ก
# enemy ์คํ๋ผ์ดํธ ๋ง๋ค๊ธฐ
enemy = pygame.sprite.Sprite()
enemy.image = IMG_ENEMY
enemy.surf = pygame.Surface(IMG_ENEMY.get_size())
enemy.rect = enemy.surf.get_rect(center = (h, v))
hl = IMG_ENEMY.get_width()//2 #๊ฐ์ฅ์ผ์ชฝ hr = IMG_ROAD.get_width() - (IMG_ENEMY.get_width()//2) #๊ฐ์ฅ์ค๋ฅธ์ชฝ h = random.randrange(hl, hr) #๋๋คcf. Surface() vs get_rect()
| ์์ฑ | ์ค๋ช | ์ฉ๋ | ์ฃผ์ ํน์ง |
|---|---|---|---|
surf | Surface ๊ฐ์ฒด๋ก, ๊ฒ์ ๊ฐ์ฒด์ ์ด๋ฏธ์ง๋ ๋ํ์ ๋ด๊ณ ์์ต๋๋ค. | ์คํ๋ผ์ดํธ์ ๋น์ฃผ์ผ์ ์ ์ํ๊ณ ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค. | - ์ค์ ๊ฒ์ ํ๋ฉด์ ๊ทธ๋ ค์ง ์ด๋ฏธ์ง๋ ๋ํ์ ๋ด๊ณ ์์. |
- surf๋ ์คํ๋ผ์ดํธ์ ๋ด์ฉ์ ๋ด๋น. | |||
rect | ์ฌ๊ฐํ ์์ญ์ ๋ํ๋ด๋ pygame.Rect ๊ฐ์ฒด๋ก, ์์น์ ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. | ์คํ๋ผ์ดํธ์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ถฉ๋์ ์ฒ๋ฆฌํฉ๋๋ค. | - ์คํ๋ผ์ดํธ์ ์์น์ ํฌ๊ธฐ๋ฅผ ์ ์. |
| - ์ถฉ๋ ๊ฐ์ง๋ ์คํ๋ผ์ดํธ ๋ฐฐ์น๋ฅผ ์ํด ์ฌ์ฉ๋จ |
screen.blit(player.image, player.rect)#๋ฉ์ธ ๊ฒ์ ๋ฃจํ
while True:
#๋ฐฐ๊ฒฝ ๋๊ธฐ
screen.blit(IMG_ROAD,(0,0))
#ํ๋ ์ด์ด ํ๋ฉด์ ๋๊ธฐ
screen.blit(player.image, player.rect)
#์ ํ๋ฉด์ ๋๊ธฐ
screen.blit(enemy.image, enemy.rect)
#์ด๋ฒคํธ ํ์ธํ๊ธฐ
for event in pygame.event.get():
#ํ๋ ์ด์ด๊ฐ ๊ฒ์์ ๊ทธ๋ง๋๋์ง?
if event.type == QUIT:#pygame.QUIT
#๊ฒ์ ๋๋ด๊ธฐ
pygame.quit()
sys.exit()
#ํ๋ฉด ์
๋ฐ์ดํธํ๊ธฐ
pygame.display.update()
#๊ฒ์ ๋ณ์ ์ด๊ธฐํ
moveSpeed = 5
#์ ํ๋ฉด์ ๋๊ธฐ
screen.blit(enemy.image, enemy.rect)
#์ ์ ์๋์ชฝ์ผ๋ก ์์ง์ด๊ธฐ
enemy.rect.move_ip(0, moveSpeed)
#ํ๋ฉด ๋ฐ์ผ๋ก ๋๊ฐ๋์ง ์ฒดํฌ, ๋๊ฐ์ผ๋ฉด ์์ชฝ ๋๋ค์ผ๋ก ๋๋๋ฆผ
if (enemy.rect.bottom) > IMG_ROAD.get_height():
hl = IMG_ENEMY.get_width()//2
hr = IMG_ROAD.get_width() - (IMG_ENEMY.get_width()//2)
h = random.randrange(hl, hr)
v = 0
#ํ๋ฉด์ ๋๊ธฐ
enemy.rect.center = (h,v)
keys[K_LEFT] keys[K_RIGHT]#ํ๋ ์ด์ด ํ๋ฉด์ ๋๊ธฐ
screen.blit(player.image, player.rect)
#ํค๋ณด๋๋ฅผ ๋๋ ์ ๋
keys = pygame.key.get_pressed()
if keys[K_LEFT] and player.rect.left > 0:
player.rect.move_ip(-moveSpeed, 0)
if player.rect.left < 0:
player.rect.left = 0
if keys[K_RIGHT] and player.rect.right < IMG_ROAD.get_width():
player.rect.move_ip(moveSpeed,0)
if player.rect.right > IMG_ROAD.get_width():
player.rect.right = IMG_ROAD.get_width()
moveSpeed = 5
maxSpeed = 12
#์๋ ์
๋ฐ์ดํธ
if score % 3 == 0 and moveSpeed <= maxSpeed:
moveSpeed += 0.5
#ํฐํธ ์ค์
textFonts = ['minecraftia']
textSize = 48
#๊ฒ์์ค๋ฒ ํจ์
def GameOver():
# ๊ฒ์ ๋๋ด๊ธฐ ๋ฌธ์์ด ๋ง๋ค๊ธฐ
fontGameOver = pygame.font.SysFont(textFonts, textSize)
textGameOver = fontGameOver.render("Game Over!", True, RED)
rectGameOver = textGameOver.get_rect()
rectGameOver.center = (IMG_ROAD.get_width()//2,
IMG_ROAD.get_height()//2)
# ๊ฒ์์ ๋ฐฐ๊ฒฝ์ ๊ฒ์ ์ค๋ฒ ๋ฉ์์ง ์ถ๋ ฅํ๊ธฐ
screen.fill(BLACK)
screen.blit(textGameOver, rectGameOver)
# ์ถ๋ ฅ ์
๋ฐ์ดํธํ๊ธฐ
pygame.display.update()
# ๊ฐ์ฒด ์์ ๊ธฐ
player.kill()
enemy.kill()
# ์ผ์ ์ ์งํ๊ธฐ
time.sleep(2)
# ๊ฒ์ ๋๋ด๊ธฐ
pygame.quit()
sys.exit()
#์ถฉ๋ ํ์ธํ๊ธฐ
if pygame.sprite.collide_rect(player,enemy):
GameOver()
pygame.init()pygame.time.Clock()clock.tick(60)์ ์ฌ์ฉํ์ฌ ์ด๋น 60ํ๋ ์์ผ๋ก ์ ํํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.pygame.display.set_caption("Crazy Driver")pygame.image.load(os.path.join(IMAGE_FOLDER, "ํ์ผ๋ช
"))pygame.display.set_mode(IMG_ROAD.get_size())IMG_ROAD ์ด๋ฏธ์ง ํฌ๊ธฐ์ ๋์ผํ๊ฒ ์ค์ ํฉ๋๋ค.pygame.sprite.Sprite()pygame.Surface(IMG_PLAYER.get_size())player.rect = player.surf.get_rect(center = (h, v))pygame.display.update()pygame.key.get_pressed()player.rect.move_ip(-moveSpeed, 0)rect ์ขํ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ด๋์ ๊ตฌํํฉ๋๋ค.pygame.QUITpygame.quit()์ ํธ์ถํ์ฌ Pygame์ ์ ๋ฆฌํฉ๋๋ค.pygame.quit()sys.exit()pygame.event.get()screen.blit(IMG_ROAD, (0,0))enemy.rect.move_ip(0, moveSpeed)time.sleep(2)