PersesTitan(페르) 기술블로그

[Ruby] 루비로 게임 제작해보기 4: 키보드로 이동 구현 본문

Language/Ruby

[Ruby] 루비로 게임 제작해보기 4: 키보드로 이동 구현

PersesTitan(페르) 2022. 12. 27. 11:25

[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

결과


코드 풀이

Direction

화살표 key값을 각각 상수로 정의해주었습니다.
또한 move라는 메소드를 넣어서 혹시 다른 이동한 생길때 해당 메소드를 불러와서 사용할 수 있게 만들었습니다.

check_in

o1은 기본 객체
os는 장애물들 (배열)
그리고 x, y각각 벽에 만났을때 이동하는 좌표 입니다.
해당 람다식을 동작시켜서 객체가 벽에 닿았을때 못 지나가게 할 수 있습니다.

w = get :width, h = get :height

각각 창의 넓이와 높이의 상수입니다.

Text

처음 스폰위치를 화면 정중앙에 생성하도록 구현하였습니다.

block << Rectangle.new(x: 0, y: 0)

네모난 장애물을 생성합니다. 생성한 객체는 block이라는 장애물 리스트에 넣어줍니다.

Window.on

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)를 사용하여 벽에 닿았다면 이전 좌표로 이동하게 만듭니다.


Github 예제 링크

 

GitHub - PersesTitan/ruby-games: make game

make game. Contribute to PersesTitan/ruby-games development by creating an account on GitHub.

github.com

 

[Ruby] 루비로 게임 제작해보기 3: 키보드 입력

[Ruby] 루비로 게임 제작해보기 2: 텍스트 출력 키보드 값의 입력을 받는 동작을 구현하였습니다. 예제 코드 require 'ruby2d' set title: "Game" text = Text.new("Hello", x: 0, y: 0, rotate: 0, font: Font.default) Window.on :k

persestitan.tistory.com