점프(jump) 기능 구현 > Pygame - python GUI module

본문 바로가기
사이트 내 전체검색

회원로그인

올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구

Pygame - python GUI module

점프(jump) 기능 구현

페이지정보

글쓴이 관리자 조회 29,610 조회 날짜 20-03-11 14:38 / Update:20-04-02 13:18
댓글 0 댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

점프(jump) 기능 구현

 

 

어떤 게임은 플레이어가 점프를 하는 경우가 있다. 이번 강좌에서는 점프를 하는 효과를 알아본다.

 

점프의 원리를 우선 생각해보자.

 

바닥에서 점프를 하면 처음에는 힘차게 위로 올라간다. 그리고 점점 속도가 줄어들며 최고점에 이르러서는 더이상 위로 올라가지 않고 다시 아래로 내려온다. 내려올 수록 점점 속도가 빨라지며, 바닥에 도착하면 더이상 밑으로 내려가지 않는다.

 

 

 

1. 점프할때의 위치 좌표 공식

 

위의 원리를 구현하기 위해 고전역학의 공식을 사용한다.

 

F = 1/2 * m * v^2

 

F = Force (위/아래 힘)

m = mass (물체의 질량)

v = velocity (속도)

 

위의 F를 플레이어의 y 좌표에 대입하면 플레이어가 점프하는 효과를 나타낼 수 있다.

 

 

 

2. 좌우로 이동하는 플레이어 만들기

 

우선 플레이어가 좌우로 이동하는 코드를 만들어 본다.

 

2921044682_1584122573.4673.png

smallcar.png

 

import sys
import pygame

 

# 게임 화면 크기
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 500

 

# 색상
WHITE = (255,255,255)

 

# 속도와 질량 기본 값
VELOCITY = 7
MASS = 2

 

class Car:

 

    def __init__(self):
        self.image = ""
        self.dx = 0
        self.dy = 0
        self.rect = ""

 

    def load_car(self):
        # 플레이어 차량
        self.image = pygame.image.load("smallcar.png")
        # 크기 조정
        self.image = pygame.transform.scale(self.image, (150, 57))
        self.rect = self.image.get_rect()
        self.rect.centerx = round(WINDOW_WIDTH / 2)
        self.rect.bottom = WINDOW_HEIGHT

 

    # 자동차를 스크린에 그리기
    def draw_car(self):
        SCREEN.blit(self.image, [self.rect.x, self.rect.y])

 

    # x 좌표 이동 - 플레이어 자동차의 움직임 제어할 때 필요
    def move_x(self):
        self.rect.x += self.dx

 

    # 화면 밖으로 못 나가게 방지
    def check_screen(self):
        if self.rect.right > WINDOW_WIDTH or self.rect.x < 0:
            self.rect.x -= self.dx
        if self.rect.bottom > WINDOW_HEIGHT or self.rect.y < 0:
            self.rect.y -= self.dy

 

def main():
    global SCREEN, WINDOW_WIDTH, WINDOW_HEIGHT

 

    # pygame 초기화 및 스크린 생성
    pygame.init()
    SCREEN = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("Jump Test")

 

    clock = pygame.time.Clock()

 

    # 플레이어 자동차 생성
    player = Car()
    player.load_car()

 

    playing = True

    while playing:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                playing = False
                pygame.quit()
                sys.exit()

 

            # 화살표 키를 이용해서 플레이어의 움직임 거리를 조정해준다.
            # 키를 떼면 움직임 거리를 0으로 한다.

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    player.dx = 5
                elif event.key == pygame.K_LEFT:
                    player.dx = -5

 

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    player.dx = 0
                elif event.key == pygame.K_LEFT:
                    player.dx = 0


        # 배경색을 흰색으로
        SCREEN.fill(WHITE)

 

        ''' 게임 코드 작성 '''

 

        # 플레이어를 스크린에 표시 및 화면 밖으로 못 벗어나게 하기
        player.draw_car()
        player.move_x()
        player.check_screen()

 

        ''' 게임 코드 끝 '''

 

        pygame.display.flip()

 

        # 초당 프레임 설정
        clock.tick(60)


if __name__ == '__main__':
    main()

 

 

2921044682_1584122219.985.gif

 

 

 

3. 점프 공식 적용하기

 

2번의 코드를 이용하면 자동차가 좌우로만 움직이게 된다.

이곳에 점프를 위한 공식을 적용해본다.

스페이스키를 누르면 점프를 하도록 설정해 본다.

 

 

1) 속성 추가

 

Car class의 __init__ 메서드에 점프를 위한 속성을 추가한다.

    def __init__(self):
        self.image = ""
        self.dx = 0
        self.dy = 0
        self.rect = ""
        self.isJump = 0
        self.v = VELOCITY # 속도
        self.m = MASS  # 질량

 

 

2) 점프 상태를 체크하는 메서드

 

Car class에 새로운 메서드를 추가한다.

    def jump(self, j):
        self.isJump = j

 

 

3) 점프일 경우 y 좌표를 변경해주는 메서드

 

역학공식을 적용하여 y 좌표를 위에서 아래로 변경해주는 메서드를 추가한다.

    def update(self):
        # isJump 값이 0보다 큰지 확인
        if self.isJump > 0:
            # isJump 값이 2일 경우 속도를 리셋
            # 점프 한 상태에서 다시 점프를 위한 값

            # 이 코드를 주석처리하면 이중점프를 못한다.
            if self.isJump == 2:
                self.v = VELOCITY

 

            # 역학공식 계산 (F). F = 0.5 * mass * velocity^2.
            if self.v > 0:
                # 속도가 0보다 클때는 위로 올라감
                F = (0.5 * self.m * (self.v * self.v))
            else:
                # 속도가 0보다 작을때는 아래로 내려감
                F = -(0.5 * self.m * (self.v * self.v))

 

            # 좌표 수정 : 위로 올라가기 위해서는 y 좌표를 줄여준다.
            self.rect.y -= round(F)

 

            # 속도 줄여줌
            self.v -= 1

 

            # 바닥에 닿았을때, 변수 리셋
            if self.rect.bottom > WINDOW_HEIGHT:
                self.rect.bottom = WINDOW_HEIGHT
                self.isJump = 0
                self.v = VELOCITY

 

 

4) 스페이스 바를 눌렀을 때, 점프 상태를 변경시켜주는 코드를 게임 루프안에 추가한다.

 

......

......

    while playing:

        # 키가 눌린 상태 체크
        keys = pygame.key.get_pressed()
        # 스페이스키가 눌려있고, isJump가 2라면 1로 변경한다.
        # 이 작업을 해주지 않으면 스페이스가 눌려있는 상태면 플레이어가 계속 위로 올라가게 된다.

        if (keys[pygame.K_SPACE]):
            if player.isJump == 2:
                player.jump(1)


        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                playing = False
                pygame.quit()
                sys.exit()

 

            # 화살표 키를 이용해서 플레이어의 움직임 거리를 조정해준다.
            # 키를 떼면 움직임 거리를 0으로 한다.

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    player.dx = 5
                elif event.key == pygame.K_LEFT:
                    player.dx = -5


                # 스페이스키를 눌렀을 때,
                # 0이면 바닥인 상태 : 1로 변경
                # 1이면 점프를 한 상태 : 2로 변경, 점프한 위치에서 다시 점프를 하게 된다. 즉, 이중점프

                if event.key == pygame.K_SPACE:
                    if player.isJump == 0:
                        player.jump(1)
                    elif player.isJump == 1:
                        player.jump(2)

 

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    player.dx = 0
                elif event.key == pygame.K_LEFT:
                    player.dx = 0

 

        # 배경색을 흰색으로
        SCREEN.fill(WHITE)

 

        ''' 게임 코드 작성 '''

 

        # 플레이어를 스크린에 표시 및 화면 밖으로 못 벗어나게 하기
        player.draw_car()
        player.move_x()

        # 플레이어의 y 좌표를 움직여주는 메서드 추가, 점프하는 것

        player.update()
        player.check_screen()

 

        ''' 게임 코드 끝 '''

 

......

......

 

 

 

2921044682_1584122235.8692.gif

 

위의 점프를 위한 코드에서 VELOCITYMASS 값을 변경해가면서, 자신의 게임에 맞게 점프 높이나 속도를 조절하여 응용해본다.

 

 

 

 

전체코드

import sys
import pygame

 

# 게임 화면 크기
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 500

 

# 색상
WHITE = (255,255,255)

 

# 속도와 질량 기본 값
VELOCITY = 7
MASS = 2

 

class Car:

 

    def __init__(self):
        self.image = ""
        self.dx = 0
        self.dy = 0
        self.rect = ""
        self.isJump = 0
        self.v = VELOCITY # 속도
        self.m = MASS  # 질량

 

    def load_car(self):
        # 플레이어 차량
        self.image = pygame.image.load("smallcar.png")
        # 크기 조정
        self.image = pygame.transform.scale(self.image, (150, 57))
        self.rect = self.image.get_rect()
        self.rect.centerx = round(WINDOW_WIDTH / 2)
        self.rect.bottom = WINDOW_HEIGHT

 

    # 자동차를 스크린에 그리기
    def draw_car(self):
        SCREEN.blit(self.image, [self.rect.x, self.rect.y])

 

    # x 좌표 이동 - 플레이어 자동차의 움직임 제어할 때 필요
    def move_x(self):
        self.rect.x += self.dx

 

    # 화면 밖으로 못 나가게 방지
    def check_screen(self):
        if self.rect.right > WINDOW_WIDTH or self.rect.x < 0:
            self.rect.x -= self.dx
        if self.rect.bottom > WINDOW_HEIGHT or self.rect.y < 0:
            self.rect.y -= self.dy

 

    def jump(self, j):
        self.isJump = j

 

    def update(self):
        # isJump 값이 0보다 큰지 확인
        if self.isJump > 0:
            # isJump 값이 2일 경우 속도를 리셋
            # 점프 한 상태에서 다시 점프를 위한 값

            # 이 코드를 주석처리하면 이중점프를 못한다.
            if self.isJump == 2:
                self.v = VELOCITY

 

            # 역학공식 계산 (F). F = 0.5 * mass * velocity^2.
            if self.v > 0:
                # 속도가 0보다 클때는 위로 올라감
                F = (0.5 * self.m * (self.v * self.v))
            else:
                # 속도가 0보다 작을때는 아래로 내려감
                F = -(0.5 * self.m * (self.v * self.v))

 

            # 좌표 수정 : 위로 올라가기 위해서는 y 좌표를 줄여준다.
            self.rect.y -= round(F)

 

            # 속도 줄여줌
            self.v -= 1

 

            # 바닥에 닿았을때, 변수 리셋
            if self.rect.bottom > WINDOW_HEIGHT:
                self.rect.bottom = WINDOW_HEIGHT
                self.isJump = 0
                self.v = VELOCITY

 

def main():
    global SCREEN, WINDOW_WIDTH, WINDOW_HEIGHT

 

    # pygame 초기화 및 스크린 생성
    pygame.init()
    SCREEN = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("Jump Test")

 

    clock = pygame.time.Clock()

 

    # 플레이어 자동차 생성
    player = Car()
    player.load_car()

 

    playing = True

    while playing:

        # 키가 눌린 상태 체크
        keys = pygame.key.get_pressed()
        # 스페이스키가 눌려있고, isJump가 2라면 1로 변경한다.
        # 이 작업을 해주지 않으면 스페이스가 눌려있는 상태면 플레이어가 계속 위로 올라가게 된다.

        if (keys[pygame.K_SPACE]):
            if player.isJump == 2:
                player.jump(1)


        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                playing = False
                pygame.quit()
                sys.exit()

 

            # 화살표 키를 이용해서 플레이어의 움직임 거리를 조정해준다.
            # 키를 떼면 움직임 거리를 0으로 한다.

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    player.dx = 5
                elif event.key == pygame.K_LEFT:
                    player.dx = -5


                # 스페이스키를 눌렀을 때,
                # 0이면 바닥인 상태 : 1로 변경
                # 1이면 점프를 한 상태 : 2로 변경, 점프한 위치에서 다시 점프를 하게 된다. 즉, 이중점프

                if event.key == pygame.K_SPACE:
                    if player.isJump == 0:
                        player.jump(1)
                    elif player.isJump == 1:
                        player.jump(2)

 

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    player.dx = 0
                elif event.key == pygame.K_LEFT:
                    player.dx = 0

 

        # 배경색을 흰색으로
        SCREEN.fill(WHITE)

 

        ''' 게임 코드 작성 '''

 

        # 플레이어를 스크린에 표시 및 화면 밖으로 못 벗어나게 하기
        player.draw_car()
        player.move_x()

        # 플레이어의 y 좌표를 움직여주는 메서드 추가, 점프하는 것

        player.update()
        player.check_screen()

 

        ''' 게임 코드 끝 '''

 

        pygame.display.flip()

 

        # 초당 프레임 설정
        clock.tick(60)


if __name__ == '__main__':
    main()

 

댓글목록 sfs

총 22 건 , 1 페이지
게시물 검색
Pygame - python GUI module 목록
번호 제목 글쓴이 조회 날짜
1 관리자 59753 02-21
2 관리자 33259 02-21
3 관리자 42186 02-21
4 관리자 45836 02-22
5 관리자 49256 02-22
6 관리자 43771 02-22
7 관리자 37457 02-22
8 관리자 38289 02-22
9 관리자 39603 02-23
10 관리자 45691 02-24
11 관리자 33608 02-25
12 관리자 37122 02-27
13 관리자 30540 03-05
14 관리자 37617 03-10
15 관리자 25166 03-10
16 관리자 30540 03-11
17 관리자 24130 03-11
18 관리자 26384 03-11
열람중 관리자 29611 03-11
20 관리자 31922 03-11
21 관리자 33126 04-05
22 관리자 26186 04-05
GNUBOARD_M
Copyright © JBMPA.com All rights reserved.