하루 만에 러시아 네모난 덩어리의 빛이 반짝인다!

나는 하루 동안 너에게 Glimmer Tetris을 보여줄게!괜찮지!?그것은 방금 발표된 Glimmer DSL for SWTv4에 포함되어 있다.18.2.3.

가장 터무니없는 것은 내가 어떤 유형의 게임 개발자도 아니라는 것이다.나는 이전에 러시아 네모난 블록을 엮은 적이 없다.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(playfieldblock)으로 나뉘어져 있습니다.

  • Playfield: Tetromino 블록이
  • 에 있는 GUI 재생 영역을 나타냅니다.

  • 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미광을 이용하여 경계 장식을 한다.
    러시아 블록의 정교한 예시에 대한 더 많은 변화를 계속 주목해 주십시오. 예를 들어 다음과 같습니다.
  • 득점
  • 수준 측정
  • 다음 Tetromino
  • 미리 보기
    그 전에 즐거움 Glimmering!

    Glimmer DSL for SWT으로 만든 다른 게임의 경우 Tic Tac Toe!(매우 간결하고 깔끔함)을 참조하십시오.
    최초로 Code Master Blog에 발표되었다.

    좋은 웹페이지 즐겨찾기