[Ruby] 루비로 게임 제작해보기 6: 물체 통과 막기

PersesTitan·2022년 12월 28일
0

Ruby

목록 보기
17/24

[Ruby] 루비로 게임 제작해보기 4: 키보드로 이동 구현
[Ruby] 루비로 게임 제작해보기 5: 상대 위치로 이동
4번째 키보드로 이동 구현에서 이미 통과 막는 기능은 구현했었지만 사실 해당 기능은 문제가 1개 있는데요.

시작 좌표만 물체에 못들어가게 해두었기 때문에 아래와 같이 시작 좌표만 안 닿으면 통과를 할 수 있습니다.

코드

사실 크게 바뀐 내용은 없고, 코드가 길어져서 람다식에 넣어두었던 해당 좌표가 닿았는지 확인하는 로직을 Direction모듈을 이동시켰습니다.

# 방향을 정하는 모듈
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

  def Direction.check(o1, o2)
    p_x1, p_y1 = o1.x, o1.y
    p_x2, p_y2 = p_x1 + o1.width, p_y1 + o1.height
    return o2.contains?(p_x1, p_y1) || o2.contains?(p_x2, p_y2) || o2.contains?(p_x1, p_y2) || o2.contains?(p_x2, p_y1)
  end
end

require 'ruby2d'

check_in = lambda do |o1, os, x, y|
  os.each do |o|
    if Direction.check o1, o
      o1.x, o1.y = x, y
    end
  end
end

set title: "Game"
w = get :width
h = get :height
# 장애물
block = []

text = Rectangle.new(x: w/2, y:  h/2, width: 20, height: 20, color: "red")
text.x -= text.width
text.y -= text.height

rect = Rectangle.new(x: 0, y: 0, width: 50, height: 50)
Direction::rel_move(text, rect, Direction::UNDER)
block << rect

Window.on :key_held do |e|
  x, y = text.x, text.y
  Direction::move(e, text, speed=3)
  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.check

이전에 있던 코드는 1개의 좌표면 확인하였지만 각 꼭짓점 좌표를 4개중 1개라도 닿았다면 통과하지 못하게 코드를 구현하였습니다.


이미지 원본 링크
Github 예제 링크

profile
안녕하세요 페르세스 티탄입니다! 부족한 부분이 많이 있겠지만 잘부탁드립니다.

0개의 댓글