티스토리 뷰


1. 방향키 / WASD 이동
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed
if keys[pygame.K_RIGHT]:
x += speed
if keys[pygame.K_UP]:
y -= speed
if keys[pygame.K_DOWN]:
y += speed
WASD 입력은 다음과 같이 사용할 수 있다.
if keys[pygame.K_a]:
x -= speed
if keys[pygame.K_d]:
x += speed
2. 마우스 클릭 위치 가져오기
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
마우스를 클릭하면 event.pos에 클릭한 위치의 좌표가 저장된다.
3. 클릭한 위치에 점 그리기
pygame.draw.circle(screen, (255, 255, 255), (x, y), 5)
이 코드는 화면에 흰색 점을 그리는 코드이다.
추가 : 드래그 입력 (ex11.클릭드래그. py)
import pygame
import sys
# 전역 변수
WIDTH, HEIGHT = 800, 600
FPS = 60
screen = None
clock = None
running = True
circle_pos = None # 클릭한 점의 위치
circle_radius = 10 # 점의 크기
speed = 20 # 방향키 이동 거리
dragging = False # ADDED 점을 드래그 중인지 저장
# 1) 초기화
def init():
global screen, clock, running
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("점 찍기, 이동하기, 드래그하기")
clock = pygame.time.Clock()
running = True
# 2) 입력
def handle_input():
global running, circle_pos, dragging
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# ADDED 마우스 버튼을 눌렀을 때
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
# 점이 아직 없으면 클릭한 위치에 점을 만든다.
if circle_pos is None:
circle_pos = event.pos
dragging = True
# 점이 이미 있으면, 클릭한 위치가 점 안쪽인지 확인한다.
else:
mouse_x, mouse_y = event.pos
circle_x, circle_y = circle_pos
dx = mouse_x - circle_x
dy = mouse_y - circle_y
# 클릭한 위치가 점 안쪽이면 드래그를 시작한다.
if dx * dx + dy * dy <= circle_radius * circle_radius:
dragging = True
else:
# 점 바깥을 클릭하면 점을 새 위치로 옮긴다.
circle_pos = event.pos
dragging = True
# ADDED 마우스를 움직일 때
if event.type == pygame.MOUSEMOTION:
if dragging:
circle_pos = event.pos
# ADDED 마우스 버튼을 놓았을 때
if event.type == pygame.MOUSEBUTTONUP:
if event.button == 1:
dragging = False
# 방향키로 점 이동
if event.type == pygame.KEYDOWN:
if circle_pos is not None:
x, y = circle_pos
if event.key == pygame.K_LEFT:
x -= speed
if event.key == pygame.K_RIGHT:
x += speed
if event.key == pygame.K_UP:
y -= speed
if event.key == pygame.K_DOWN:
y += speed
circle_pos = (x, y)
# ESC 키로 종료
if event.key == pygame.K_ESCAPE:
running = False
# 3) 업데이트
def update_game():
global circle_pos
# 점이 화면 밖으로 나가지 않도록 제한한다.
if circle_pos is not None:
x, y = circle_pos
x = max(circle_radius, min(WIDTH - circle_radius, x))
y = max(circle_radius, min(HEIGHT - circle_radius, y))
circle_pos = (x, y)
# 4) 출력
def render():
screen.fill((0, 0, 0))
if circle_pos is not None:
pygame.draw.circle(screen, (255, 255, 255), circle_pos, circle_radius)
pygame.display.flip()
# 5) 실행
def run_game():
global running
init()
while running:
handle_input()
update_game()
render()
clock.tick(FPS)
pygame.quit()
sys.exit()
# 시작
run_game()
주요 코드 설명
1. 드래그 상태 저장
dragging = False
이 변수는 현재 점을 드래그하고 있는지 저장한다. 처음에는 마우스를 누르고 있지 않으므로 False이다.
2. 마우스 버튼을 누르면 드래그 시작
# ADDED 마우스 버튼을 눌렀을 때
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
이 코드는 마우스 버튼을 누르는 순간을 감지한다.
3. 점이 없으면 클릭한 위치에 점 생성
# 점이 아직 없으면 클릭한 위치에 점을 만든다.
if circle_pos is None:
circle_pos = event.pos
dragging = True
아직 점이 없다면 클릭한 위치에 점을 만든다.
그리고 바로 드래그할 수 있도록 dragging을 True로 바꾼다.
4. 점을 누르고 있는지 확인
dx = mouse_x - circle_x
dy = mouse_y - circle_y
if dx * dx + dy * dy <= circle_radius * circle_radius:
dragging = True
이 코드는 마우스로 클릭한 위치가 점 안쪽인지 확인한다. 점의 중심과 마우스 클릭 위치가 가까우면, 사용자가 점을 클릭한 것으로 판단한다. 그 경우 dragging = True가 되어 점을 끌 수 있다.
왜 dx * dx를 하는가?
점의 중심과 마우스 클릭 위치 사이의 직선 거리를 구하기 위해서이다. 화면에서 두 점 사이의 거리는 다음과 같이 생각할 수 있다.
가로 거리: dx
세로 거리: dy
직선 거리: ?
직선 거리는 피타고라스 정리로 구한다.
거리 = √(dx² + dy²)
예를 들어 dx = 6, dy = 8이면 다음과 같다.
거리 = √(6² + 8²)
거리 = √(36 + 64)
거리 = √100
거리 = 10
따라서 마우스 클릭 위치는 점의 중심에서 10만큼 떨어져 있다.
5. 마우스를 움직이면 점도 이동
if event.type == pygame.MOUSEMOTION:
if dragging:
circle_pos = event.pos
마우스를 움직일 때, dragging이 True이면 점의 위치를 마우스 위치로 바꾼다. 즉, 마우스를 끌고 가는 동안 점이 마우스를 따라 움직인다.
6. 마우스 버튼을 놓으면 드래그 종료
if event.type == pygame.MOUSEBUTTONUP:
if event.button == 1:
dragging = False
마우스 버튼을 놓으면 더 이상 점이 따라오지 않아야 한다. 그래서 dragging을 False로 바꾼다.
입력 처리 시 주의사항
| 주의사항 | 설명 |
| 위치 값 확인 | 점이나 캐릭터의 좌표가 None이면 오류가 발생할 수 있다 |
| 화면 밖 제한 | x, y 좌표가 화면 밖으로 나가지 않도록 제한하여야 한다 |
| 입력 위치 | 입력 처리는 반드시 게임 루프 안에서 반복 처리되어야 한다 |
| 종료 처리 | 창 닫기 이벤트를 반드시 처리하여야 한다 |

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스마트기술
- 초보자를 위한 텍스트마이닝
- UI
- 파이썬 기초
- 파이썬기초
- pygame
- 텍스트 마이닝
- 피그마
- 챗봇
- Text Mining
- matplotlib
- 파이썬
- 휴리스틱평가
- 챗GPT
- 안드로이드
- 관계자분석
- 컴퓨팅사고력
- 사물인터넷
- Idle
- python
- 데이터R지
- figma
- HIG
- 데이타R지
- 라이브러리
- UX
- HCI
- 4차산업혁명
- 프로토타입
- 텍스트마이닝
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함