[Ruby] 루비로 게임 제작해보기 3: 키보드 입력
키보드 입력을 받는 법을 알았으니 다음으로는 키보드를 이용하여 이동하는 부분을 구현하였습니다.
이동하면서 벽을 통과하기도 하였으니 벽을 통과하지 못하게 막는 기능도 구현하게 되었습니다.
# 방향을 정하는 모듈
module Direction
LEFT = "left"
RIGHT = "right"
TOP = "up"
UNDER = "down"
def Direction.move(e, o, speed = 1)
case e.key
when LEFT
o.x -= speed
when RIGHT
o.x += speed
when TOP
o.y -= speed
when UNDER
o.y += speed
else
return
end
end
end
require 'ruby2d'
check_in = lambda do |o1, os, x, y|
os.each do |o|
if o.contains? o1.x, o1.y
o1.x, o1.y = x, y
end
end
end
set title: "Game"
w = get :width
h = get :height
# 장애물
block = []
text = Text.new("Hello", x: w/2, y: h/2, rotate: 0, font: Font.default)
text.x -= text.width
text.y -= text.height
block << Rectangle.new(x: 0, y: 0)
Window.on :key_held do |e|
x, y = text.x, text.y
Direction::move(e, text, speed=2)
if text.x < 0 || text.x + text.width > w; text.x = x end
if text.y < 0 || text.y + text.height > h; text.y = y end
check_in.call(text, block, x, y)
end
show
화살표 key값을 각각 상수로 정의해주었습니다.
또한 move라는 메소드를 넣어서 혹시 다른 이동한 생길때 해당 메소드를 불러와서 사용할 수 있게 만들었습니다.
o1은 기본 객체
os는 장애물들 (배열)
그리고 x, y각각 벽에 만났을때 이동하는 좌표 입니다.
해당 람다식을 동작시켜서 객체가 벽에 닿았을때 못 지나가게 할 수 있습니다.
각각 창의 넓이와 높이의 상수입니다.
처음 스폰위치를 화면 정중앙에 생성하도록 구현하였습니다.
네모난 장애물을 생성합니다. 생성한 객체는 block이라는 장애물 리스트에 넣어줍니다.
x, y = text.x, text.y를 사용하여 이동하기 전 위치를 저장합니다.
move를 사용하여 이동시킬 객체를 이동해줍니다.
if text.x < 0 || text.x + text.width > w; text.x = x end
if text.y < 0 || text.y + text.height > h; text.y = y end
만약 x가 창밖으로 빠져나간상태라면 임시로 저장해둔 이동하기 전 위치의 x값을 불러와서 이전 x값으로 변경시킵니다. y축도 동일한 동작을 해줍니다.
check_in.call(text, block, x, y)를 사용하여 벽에 닿았다면 이전 좌표로 이동하게 만듭니다.