하루 만에 러시아 네모난 덩어리의 빛이 반짝인다!
19475 단어 programmingrubygamedevlearning
가장 터무니없는 것은 내가 어떤 유형의 게임 개발자도 아니라는 것이다.나는 이전에 러시아 네모난 블록을 엮은 적이 없다.25년 전 게임보이의 원시 시대 이후로 나는 아마 이 게임을 해 본 적이 없을 것이다.따라서 이는 Glimmer DSL for SWT이 루비 데스크톱으로 개발한 GUI 프레임워크의 우수성을 의심할 여지가 없다.만약 내가 하루 안에 이 게임을 완성할 수 있다면, 만약 당신이 경험이 풍부한 게임 개발자라면, 당신은 몇 시간 안에 그것을 완성할 수 있을 것이다.어쨌든, 우리 비밀번호에 들어갑시다. 네?
최고급 Glimmer GUI 코드:
# From: https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/samples/elaborate/tetris.rb
# Tetris App View Custom Shell (represents `tetris` keyword)
require_relative 'tetris/model/game'
require_relative 'tetris/view/playfield'
class Tetris
include Glimmer::UI::CustomShell
BLOCK_SIZE = 25
PLAYFIELD_WIDTH = 10
PLAYFIELD_HEIGHT = 20
before_body {
Model::Game.configure_beeper do
display.beep
end
Model::Game.start
display {
on_swt_keydown { |key_event|
unless Model::Game.current_tetromino.stopped?
case key_event.keyCode
when swt(:arrow_down)
Model::Game.current_tetromino.down
when swt(:arrow_left)
Model::Game.current_tetromino.left
when swt(:arrow_right)
Model::Game.current_tetromino.right
when swt(:shift)
if key_event.keyLocation == swt(:right) # right shift key
Model::Game.current_tetromino.rotate(:right)
elsif key_event.keyLocation == swt(:left) # left shift key
Model::Game.current_tetromino.rotate(:left)
end
when 'd'.bytes.first, swt(:arrow_up)
Model::Game.current_tetromino.rotate(:right)
when 'a'.bytes.first
Model::Game.current_tetromino.rotate(:left)
end
end
}
}
}
after_body {
Thread.new {
loop {
sleep(0.9)
sync_exec {
unless @game_over
Model::Game.current_tetromino.down
if Model::Game.current_tetromino.stopped? && Model::Game.current_tetromino.row <= 0
@game_over = true
display.beep
message_box(:icon_error) {
text 'Tetris'
message 'Game Over!'
}.open
Model::Game.restart
@game_over = false
end
Model::Game.consider_adding_tetromino
end
}
}
}
}
body {
shell(:no_resize) {
text 'Glimmer Tetris'
background :gray
playfield(playfield_width: PLAYFIELD_WIDTH, playfield_height: PLAYFIELD_HEIGHT, block_size: BLOCK_SIZE)
}
}
end
Tetris.launch
나를 믿어라, 내가 너에게 위의 코드를 알려주면 지구상에서 가장 깨끗한 러시아 네모난 블록이 실현된다.실제로 마지막 부분인 GUI 바디는 코드가 약 6줄에 불과합니다.이는 어느 정도 Glimmer DSL의 초모듈화 덕분이다.러시아 블록은 Custom Shell으로 선포되었다.또한 GUI는 여러 Custom Widgets(
playfield
및 block
)으로 나뉘어져 있습니다.Playfield: Tetromino 블록이
Block: 단일 사각형 블록
# From: https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/samples/elaborate/tetris/view/playfield.rb
require_relative 'block'
class Tetris
module View
class Playfield
include Glimmer::UI::CustomWidget
options :playfield_width, :playfield_height, :block_size
body {
composite {
grid_layout(playfield_width, true) {
margin_width block_size
margin_height block_size
horizontal_spacing 0
vertical_spacing 0
}
playfield_height.times { |row|
playfield_width.times { |column|
block(block_size: block_size, row: row, column: column)
}
}
}
}
end
end
end
view raw
glimmer-tetris-view-playfield.rb hosted with ❤ by GitHub
# From: https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/samples/elaborate/tetris/view/block.rb
class Tetris
module View
class Block
include Glimmer::UI::CustomWidget
options :block_size, :row, :column
body {
composite {
layout nil
layout_data {
width_hint block_size
height_hint block_size
}
background bind(Model::Game.playfield[row][column], :color)
rectangle(0, 0, block_size, block_size)
rectangle(3, 3, block_size - 6, block_size - 6) {
foreground :gray
}
}
}
end
end
end
아키텍처는 약간의 MVP(또는 양방향 데이터 바인딩이 있는 MVVM)가 있는 MVC로, 다음 모델이 있습니다.Game: 게임 규칙을 구현하여 게임을 시작하거나 다시 시작할 수 있음(프로그램을 시작하거나 게임이 끝날 때 자동으로 발생)
Tetromino: 러시아 블록의 모양과 그 모든 복잡한 작업, 예를 들어 아래, 오른쪽, 왼쪽으로 이동하고 오른쪽(시계 반대 방향)과 왼쪽(시계 반대 방향)으로 회전하는 것을 나타낸다.게임
Block: 테트로미노 모양이나 운동장을 형성할 수 있는
충돌 검측을 포함한Tetromino 논리는 분명히 미적분과 선형 대수 등 중수학 기술에 의존하기 때문에 나는 매트릭스 연산(예를 들어 시계 반대 방향과 시계 반대 방향으로 회전)으로 컴퓨터 도형학 분야의 컴퓨터 과학 학습을 공고히 해야 한다.다행히도 루비는 matrix 클래스를 통해 행렬 수학 연산을 지원합니다.
키보드 이벤트는 swt keydown filter handler의 일반 디스플레이에서 처리되며, 이 디스플레이는 모형이 사용자 키를 기반으로 올바르게 작동하도록 합니다(예를 들어, 왼쪽, 오른쪽, 아래, 오른쪽, 오른쪽, 오른쪽, 왼쪽, 왼쪽, 왼쪽 및 기타 회전 옵션(예를 들어 알파벳'a'와'd').Tetris custom shell 클래스의
before_body
블록에 설명되어 있으며 이는 GUI가 GUI에 의존하기 때문에 구성이 GUI를 구축하기 전에 완료되었음을 의미합니다.필요할 때 다중 루틴 프로그래밍을 사용하는데 주로 주 순환을 시작하여 운동장에서 약 1초마다Tetrominos를 이동할 수 있도록 하고 사용자가 필요에 따라 아래 화살표 키를 사용하여 이동 속도를 높일 수 있도록 한다.주 스레드 이외의 스레드와 GUI의 모든 상호작용은
sync_exec
을 통해 이루어져야 한다는 것을 기억하십시오.Tetris custom shell 클래스에서는 after_body
블록으로 선언되며, 이는 상호 작용이 가능한지 확인하기 위해 바디를 구축한 후에 실행되지만 GUI를 사용자에게 표시하기 전에 실행된다는 것을 의미합니다.그렇지 않으면 양방향 data-binding은 GUI 업데이트와 관련된 모든 작업을 처리하므로 코드가 매우 간결하고 깔끔합니다.모델 논리는 게임 논리를 걱정하는 모델일 뿐 GUI의 복잡성을 완전히 무시했다.
이 사각형 구역들은 새로 증가한 Canvas Shape DSL미광을 이용하여 경계 장식을 한다.
러시아 블록의 정교한 예시에 대한 더 많은 변화를 계속 주목해 주십시오. 예를 들어 다음과 같습니다.
그 전에 즐거움 Glimmering!
Glimmer DSL for SWT으로 만든 다른 게임의 경우 Tic Tac Toe!(매우 간결하고 깔끔함)을 참조하십시오.
최초로 Code Master Blog에 발표되었다.
Reference
이 문제에 관하여(하루 만에 러시아 네모난 덩어리의 빛이 반짝인다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/andyobtiva/glimmer-tetris-in-one-day-3k4o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)