Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- jetbrains
- Spring
- Android
- maven
- plugin
- Java
- OAuth
- 루비
- error
- 개발노트
- Vane
- Godot
- gnuplot
- Python
- OTLanguage
- CPP
- JS
- IntelliJ
- C
- rubymine
- ruby
- gradle
- GitHub
- RaspberryPi
- Baekjoon
- Shell
- kotlin
- react
- ruby2d
- boj
Archives
- Today
- Total
PersesTitan(페르) 기술블로그
[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
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)를 사용하여 벽에 닿았다면 이전 좌표로 이동하게 만듭니다.
'Language > Ruby' 카테고리의 다른 글
[Ruby] 루비로 게임 제작해보기 6: 물체 통과 막기 (0) | 2022.12.28 |
---|---|
[Ruby] 루비로 게임 제작해보기 5: 상대 위치로 이동 (0) | 2022.12.27 |
[Ruby] 루비로 게임 제작해보기 3: 키보드 입력 (0) | 2022.12.26 |
[Ruby] 루비로 게임 제작해보기 2: 텍스트 출력 (0) | 2022.12.26 |
[Ruby] 루비로 게임 제작해보기 1: 세팅 (1) | 2022.12.26 |