[Ruby] 루비로 게임 제작해보기 4: 키보드로 이동 구현
오프젝트를 생성할때 위치를 절대 위치로 위치를 구해야하는데 상대 위치를 이용하여 객체의 위치를 지정할 수 있게 할 수 있도록 하는 기능을 구현하였습니다.
# 방향을 정하는 모듈
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
# @o1 : 기준이 될 객체
# @o2 : 위치가 변경될 객체
# @option : 위치 (왼쪽, 오른쪽, 위쪽, 아래쪽) 기준
# @distance_x : 추가 x 값
# @distance_y : 추가 y 값
def Direction.rel_move(o1, o2, option, distance_x = 0, distance_y = 0)
case option
when LEFT
o2.x, o2.y = o1.x - o2.width + distance_x, o1.y + distance_y
when RIGHT
o2.x, o2.y = o1.x + o1.width + distance_x, o1.y + distance_y
when TOP
o2.x, o2.y = o1.x + distance_x, o1.y - o2.height + distance_y
when UNDER
o2.x, o2.y = o1.x + distance_x, o1.y + o1.height + distance_y
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
rect = Rectangle.new(x: 0, y: 0, width: 20, height: 20)
Direction::rel_move(text, rect, Direction::RIGHT)
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
상대 위치를 이동시켜주는 메소드입니다.
처음 파라미터에 기준이 될 객체
두번째 파라미터에는 이동시킬 객체
세번째 파라미터에는 기준이 되는 객체로 부터 방향을 지정하는 값입니다.
(파라미터는 Direction의 LEFT, RIGHT, TOP, UNDER를 상수로 위치를 지정하였습니다.)
LEFT | RIGHT |
---|---|
Direction::rel_move(text, rect, Direction::LEFT) | Direction::rel_move(text, rect, Direction::RIGHT) |
TOP | UNDER |
---|---|
Direction::rel_move(text, rect, Direction::TOP) | Direction::rel_move(text, rect, Direction::UNDER) |
distance_x 상대 위치로 부터 추가 이동할 x값을 입력하면 됩니다.
distance_y 상대 위치로 부터 추가 이동할 y값을 입력하면 됩니다.