티스토리 뷰

0. 기본이미지 출력하기
기본 골격에서 이미지를 출력 해 보자. (ex04_basic_img.py)
import pygame
import sys
# 전역 변수
WIDTH, HEIGHT = 800, 600
FPS = 60 # ADDED
screen = None
clock = None
running = True
# 색상
BLACK = (0, 0, 0)
# 이미지
img1 = None # ADDED
player_rect = None # ADDED
# 1. 게임 초기화
def init():
global screen, clock, img1, player_rect
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("기본 게임 뼈대 - 이미지")
clock = pygame.time.Clock()
# ADDED 이미지 로드
try:
img1 = pygame.image.load("asset/img1.png").convert_alpha()
except pygame.error as e:
print("이미지 로드 실패:", e)
pygame.quit()
sys.exit()
# ADDED 플레이어 초기 위치 설정
player_rect = img1.get_rect(center=(WIDTH // 2, HEIGHT * 3 // 4))
# 2. 입력 처리
def handle_input():
global running
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 3. 게임 업데이트
def update_game():
pass
# 4. 출력 처리
def render():
screen.fill(BLACK)
# ADDED 플레이어 이미지 출력
screen.blit(img1, player_rect)
pygame.display.flip()
# 5. 게임 실행
def run_game():
init()
while running:
handle_input()
update_game()
render()
clock.tick(FPS)
pygame.quit()
sys.exit()
run_game()
다음 단계에서는 update_game()에 코드를 추가하여 이미지가 자동으로 아래로 이동하도록 만들면 된다.
04.이미지 자동 이동
이번 예제는 단순히 적 이미지를 아래로 움직이는 것이 목적이 아니다.
다음 장의 벽돌깨기 게임을 만들기 위해 이미지를 불러오고, 위치를 바꾸고, 다시 출력하는 기본 원리를 익히는 단계이다.


프롬프트
위 기본 이미지 출력 코드에 이어서, 두 번째 이미지가 화면 위에서 아래로 자동 이동하도록 수정해줘.
요구사항:
1. 기존 5개 함수 구조(init, handle_input, update_game, render, run_game)는 유지해줘.
2. img1은 플레이어 이미지로 화면 아래쪽 중앙에 고정해서 출력해줘.
3. img2는 적 이미지로 화면 위쪽에서 아래로 자동 이동하게 해줘.
4. 적 이미지가 화면 아래로 완전히 나가면, 다시 화면 위쪽의 랜덤한 x 위치에서 나타나게 해줘.
5. 적의 이동 속도는 enemy_speed 변수로 설정해줘.
6. 적이 다시 생성될 때마다 enemy_speed도 랜덤하게 바뀌도록 해줘.
7. random 모듈을 사용해줘.
8. 추가하거나 수정한 코드는 # ADDED 주석을 붙여줘.
9. 초보자가 이해하기 쉽도록 주석을 달아줘.
전체코드(ex04_autoImage.py)
import pygame
import sys
import random # ADDED 랜덤 위치와 속도를 위해 사용
# 전역 변수
WIDTH, HEIGHT = 800, 600
FPS = 60 # ADDED
screen = None
clock = None
running = True
# 색상
BLACK = (0, 0, 0)
# 이미지
img1 = None
img2 = None # ADDED
player_rect = None
enemy_rect = None # ADDED
# 적 이동 속도
enemy_speed = 3 # ADDED
# 1. 게임 초기화
def init():
global screen, clock
global img1, img2, player_rect, enemy_rect, enemy_speed # ADDED
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("이미지 자동 이동")
clock = pygame.time.Clock()
# ADDED 이미지 로드
try:
img1 = pygame.image.load("asset/img1.png").convert_alpha()
img2 = pygame.image.load("asset/img2.png").convert_alpha()
except pygame.error as e:
print("이미지 로드 실패:", e)
pygame.quit()
sys.exit()
# ADDED 플레이어 초기 위치: 화면 아래쪽 중앙
player_rect = img1.get_rect(center=(WIDTH // 2, HEIGHT * 3 // 4))
# ADDED 적 초기 위치: 화면 위쪽 랜덤 위치
enemy_x = random.randint(20, WIDTH - 20)
enemy_rect = img2.get_rect(center=(enemy_x, 30))
# ADDED 적 이동 속도 랜덤 설정
enemy_speed = random.randint(2, 7)
# 2. 입력 처리
def handle_input():
global running
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 3. 게임 업데이트
def update_game():
global enemy_rect, enemy_speed
# ADDED 적 이미지가 아래로 자동 이동
enemy_rect.y += enemy_speed
# ADDED 적이 화면 아래로 완전히 나가면 다시 위에서 생성
if enemy_rect.top > HEIGHT:
enemy_x = random.randint(20, WIDTH - 20)
enemy_y = random.randint(-150, -50)
enemy_rect.center = (enemy_x, enemy_y)
# ADDED 다시 생성될 때마다 속도 변경
enemy_speed = random.randint(2, 7)
# 4. 출력 처리
def render():
screen.fill(BLACK)
# ADDED 플레이어 이미지 출력
screen.blit(img1, player_rect)
# ADDED 적 이미지 출력
screen.blit(img2, enemy_rect)
pygame.display.flip()
# 5. 게임 실행
def run_game():
init()
while running:
handle_input()
update_game()
render()
clock.tick(FPS)
pygame.quit()
sys.exit()
run_game()
이미지 자동 이동 코드 단계별 설명
이번 코드는 두 개의 이미지를 사용하는 게임 구조이다.
- img1은 플레이어 이미지로 화면 아래쪽 중앙에 고정된다.
- img2는 적 이미지로 화면 위에서 아래로 자동 이동한다.
- 적 이미지가 화면 아래로 사라지면 다시 화면 위쪽의 랜덤한 위치에서 나타난다.
1. init()에서 이미지를 불러온다.
2. img1은 화면 아래쪽 중앙에 배치한다.
3. img2는 화면 위쪽 랜덤 위치에 배치한다.
4. update_game()에서 img2의 y좌표를 계속 증가시킨다.
5. img2가 화면 아래로 나가면 다시 위쪽 랜덤 위치에 배치한다.
6. render()에서 img1과 img2를 화면에 출력한다.
1. 라이브러리 불러오기
import pygame
import sys
import random # ADDED 랜덤 위치와 속도를 위해 사용
- random은 적 이미지가 다시 나타날 때 x 위치와 속도를 무작위로 정하기 위해 사용한다.
2. 전역 변수 설정
- 이전 변수를 설명을 생략한다.
img1 = None
img2 = None # ADDED
player_rect = None
enemy_rect = None # ADDED
| img1 | 플레이어 이미지 |
| img2 | 적 이미지 |
| player_rect | 플레이어 이미지의 위치 정보 |
| enemy_rect | 적 이미지의 위치 정보 |
적 이동 속도 변수 추가
enemy_speed = 3 # ADDED
- enemy_speed는 적 이미지가 한 번에 얼마나 아래로 이동할지를 정하는 값이다.
- 값이 크면 적이 빠르게 내려오고, 값이 작으면 천천히 내려온다.
3. 초기화
img1 = pygame.image.load("asset/img1.png").convert_alpha()
img2 = pygame.image.load("asset/img2.png").convert_alpha()
img1은 플레이어 이미지이고, img2는 적 이미지이다.
enemy_x = random.randint(20, WIDTH - 20)
enemy_rect = img2.get_rect(center=(enemy_x, 30))
- 적 이미지는 화면 위쪽의 랜덤한 x 위치에서 시작한다.
enemy_speed = random.randint(2, 7)
- 적의 이동 속도도 2부터 7 사이에서 랜덤하게 정한다.
4. 입력
def handle_input():
입력 단계에서는 현재 창 닫기 이벤트만 처리한다.
if event.type == pygame.QUIT:
running = False
5. 업데이트
def update_game():
적 이미지의 위치를 계속 바꾸어 자동 이동을 만든다.
enemy_rect.y += enemy_speed
- 적 이미지의 y좌표를 증가시킨다.
- pygame 화면에서는 아래쪽으로 갈수록 y값이 커지므로, 이 코드는 적을 아래로 이동시킨다.
y값 증가 → 아래로 이동
- 적이 화면 아래로 완전히 나가면 다시 위쪽에서 생성한다.
if enemy_rect.top > HEIGHT:
- enemy_rect.top이 화면 높이보다 크다는 것은 적 이미지 전체가 화면 아래로 사라졌다는 뜻이다.
enemy_x = random.randint(20, WIDTH - 20)
enemy_y = random.randint(-150, -50)
enemy_rect.center = (enemy_x, enemy_y)
- 적을 화면 위쪽 바깥의 랜덤한 위치에 다시 배치한다.
- enemy_y를 음수로 설정하는 이유는 적이 화면 위쪽 바깥에서 자연스럽게 내려오게 하기 위함이다.
enemy_speed = random.randint(2, 7)
- 다시 등장할 때 적의 속도도 새롭게 정한다.
6. 출력
def render():
screen.fill(BLACK)
- 화면 전체를 검은색으로 지운다.
screen.blit(img1, player_rect)
- 플레이어 이미지를 출력한다.
screen.blit(img2, enemy_rect)
- 적 이미지를 현재 위치에 출력한다.
pygame.display.flip()
- 지금까지 그린 내용을 실제 화면에 보여준다.
핵심 정리
이 코드는 img1 플레이어 이미지는 화면 아래쪽 중앙에 고정하고, img2 적 이미지는 화면 위쪽에서 아래로 자동 이동하게 만드는 예제이다.핵심 코드는 다음이다.
enemy_rect.y += enemy_speed
이 한 줄이 update_game()에서 반복 실행되기 때문에 적 이미지가 자동으로 아래로 이동한다.
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 파이썬 기초
- UI
- Idle
- 프로토타입
- 컴퓨팅사고력
- 라이브러리
- UX
- 챗봇
- 초보자를 위한 텍스트마이닝
- 파이썬기초
- 데이터R지
- 사물인터넷
- 피그마
- 안드로이드
- 4차산업혁명
- 텍스트마이닝
- 챗GPT
- 텍스트 마이닝
- 스마트기술
- python
- pygame
- Text Mining
- HCI
- 휴리스틱평가
- 관계자분석
- figma
- 파이썬
- HIG
- matplotlib
- 데이타R지
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
