티스토리 뷰

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
링크
«   2026/05   »
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
글 보관함