파이썬을 이용한 게임만들기 2
[분류 전체보기] - 파이썬을 이용한 게임만들기 1 (파이썬 설치) 파이썬을 이용한 게임만들기 1 (파이썬 설치) 사람들이 게임을 제작할 때는 사용하는 툴이 어느 정도 정해져 있는데요. 가장 핫한
jastory.tistory.com
저번에는 공을 마우스와 키보드를 이용해 움직여 보았는데요... 그런데 저번에 있었던 문제 중 하나가 공을 움직일때 공이 화면 밖으로 나간다는 것이었습니다. 그래서 이번에는 공이 화면 끝에 닿았을때 화면 밖으로 나가지 못하도록 막아보도록 하겠습니다.
일단 저번에 만들었던 파일을 Wing으로 열어주세요.
일단 저는 공의 색과 배경화면의 색을 바꿔보았습니다. 배경색은
arcade.set_background_color(arcade.color.GRAY)
여기서 color. 다음에 원하시는 색을 대문자로 적어주시면 됩니다.
하지만 원하는 색의 이름을 잘 모르시겠다면
https://arcade.academy/arcade.color.html
이 사이트에서 찾아보세요!
사이트에서 왼쪽에 이름이 나와있습니다. 색을 입력하실때 색의 이름에 _가 있다면 꼭 같이 넣어주세요!
예를 들어서 색의 이름이 AERO_BLUE라면 AEROBLUE가 아닌 꼭 AERO_BLUE로 적어주세요!!
공의 색깔도
arcade.draw_circle_filled(self.ball_x, self.ball_y, 15, arcade.color.RED)
여기서 배경색과 똑같이 color. 뒤에 원하시는 색을 넣어주세요.
자 그럼 이제 본격적으로 공이 밖으로 나가는 것을 막아볼건데요..
간단하게 공의 x와 y값인 self.ball_x, self.ball_y가 0보다 작거나 화면크기보다 크면 못나가게 막아주면 되는거 아니야? 라고 생각하실 수 있습니다. 그렇지만 이렇게 코드를 작성해 주시면 문제가 생깁니다. 우선 self.ball_x와 self.ball_y 는 공의 중앙값입니다.
이게 무슨뜻이냐 하면 저희가 공을 만들때
arcade.draw_circle_filled(self.ball_x, self.ball_y, 15, arcade.color.RED)
이 코드를 사용했었습니다. 이 코드는 circle 즉 원을 self.ball_x라는 x축 값과 self.ball_y라는 y축 값에 15라는 크기로 RED로 생성해 준겁니다. 즉 좌표로 설명을 드리면 (self.ball_x, self.ball_y) 라는 좌표에 공을 그린겁니다. 그러니 self.ball_x와 self.ball_y는 공의 중앙의 x와 y값인 셈입니다.
그러니까 self.ball_x와 self.ball_y가 화면 밖으로 나가지 못하게 해도 공의 절반은 나갈수 있게 됩니다.
이런식으로 공의 절반은 밖으로 나갈수 있게 됩니다.
그럼 어떻게 해야 되나...
저희는 radius (반지름)을 사용할 것입니다.
공의 중앙을 사용하면 공의 절반은 나갈 수 있게 되니, 공의 끝부분을 반지름을 이용해 사용하는 것입니다.
그럼 코드를 작성해 보겠습니다.
우선 self.ball_radius = 15 을 사용해 공의 반지름을 변수로 만들어 주세요.
그리고 공을 만들어 주는 코드인
arcade.draw_circle_filled 에서 공의 크기를 아까 만든 반지름 변수로 정해 주세요.
그 다음 update메소드로 이동해 줍니다
그리고 공의 x값이 공의 반지름 보다 작을 경우 x값을 반지름과 같게 만들어 주세요.
이렇게 if문을 사용해 주세요. 그리고 코드를 실행 시켜주고 키보드를 이용해 공을 왼쪽 끝으로 이동시켜주면 공이 벽에 닿아 멈추게 됩니다.
그러면 공의 y값도 똑같이 해줄게요
이렇게 하고 코드를 실행시켜 공을 밑으로 움직여 주시면 바닥에 닿아 공이 이번에도 멈추게 될것입니다.
하지만 오른쪽 벽과 위쪽 벽은 조금 복잡한데요... 그 이유는 저희는 화면 크기를 x는 640, y는 480으로 설정해 주었습니다. 파이썬 아케이드에서 화면을 만들게 되면 왼쪽 밑 모퉁이가 (0, 0)으로 시작하는데요... 그렇기에 화면의 오른쪽 벽의 x값은 640이 될것이고 화면의 위쪽 벽의 y값은 480이 될것입니다.
그렇기에 공의 x값과 반지름의 값을 더했을때 (공의 오른쪽 끝)이 벽보다 크면 안되겠죠..
즉 self.ball_x + self.ball_radius >= 640(화면 오른쪽 벽의 x값) 일때 self.ball_x + self.ball_radius = 640 으로 만들어 주면 되겠군요!
그런데 저희는 self.ball_x만 한쪽에 있는걸 원하기 때문에 self.ball_x >= 640 - self.ball_radius 일때 self.ball_x = 640 - self.ball_radius 로 만들어 주겠습니다.
이런식으로 말이죠. 실행시켜주시면 이제는 공이 오른쪽 화면 밖으로도 나가지 않을 것입니다.
y값도 똑같이 해주죠.
그런데 화면의 최대 y값은 480이니 480을 넘으면 안되게 설정해주었습니다. 이제 코드를 실행시켜주면 공이 화면 밖으로 나가지 않을 겁니다.
이렇게 이번에는 공이 화면 밖으로 나가지 못하게 만들어 봤는데요.. 다음번에는 공이 화면에 닿았을때 소리가 나게 만들어 보겠습니다. 제 코드는 밑에 남겨두었으니 참고해 주세요^^ 감사합니다
import arcade
class Game(arcade.Window):
def __init__(self, width, height, title):
# Call init
super().__init__(width, height, title)
# Background color
arcade.set_background_color(arcade.color.GRAY)
# Ball's location
self.ball_x = 50
self.ball_y = 50
self.ball_change_x = 0
self.ball_change_y = 0
self.ball_radius = 15
self.set_mouse_visible(False)
def on_draw(self):
"""Draw the ball """
arcade.start_render()
arcade.draw_circle_filled(self.ball_x, self.ball_y, self.ball_radius, arcade.color.RED)
def update(self, delta_time):
self.ball_x += self.ball_change_x
self.ball_y += self.ball_change_y
if self.ball_x <= self.ball_radius:
self.ball_x = self.ball_radius
if self.ball_y <= self.ball_radius:
self.ball_y = self.ball_radius
if self.ball_x >= 640 - self.ball_radius:
self.ball_x = 640 - self.ball_radius
if self.ball_y >= 480 - self.ball_radius:
self.ball_y = 480 - self.ball_radius
def on_mouse_motion(self, x, y, dx, dy):
"""Control the ball with the mouse"""
self.ball_x = x
self.ball_y = y
def on_key_press(self, key, modifiers):
"""Control the ball with the keyboard"""
if key == arcade.key.A:
self.ball_change_x = -5
elif key == arcade.key.D:
self.ball_change_x = 5
elif key == arcade.key.S:
self.ball_change_y = -5
elif key == arcade.key.W:
self.ball_change_y = 5
def on_key_release(self, key, modifiers):
"""Stop the ball when key is released"""
if key == arcade.key.A or key == arcade.key.D:
self.ball_change_x = 0
if key == arcade.key.S or key == arcade.key.W:
self.ball_change_y = 0
def main():
window = Game(640, 480, "Player")
arcade.run()
main()
댓글