+1

Gosu - Thư viện game 2D cho Ruby - Cùng bắt đầu với game đơn giản - Phần 1

Trong loạt bài 4 phần Gosu - Thư viện game 2D cho Ruby trước mình đã giới thiệu qua những khái niệm cơ bản nhất về thư viện Gosu game 2D của Ruby, và tiếp theo, các bạn cùng mình làm thử 1 game đơn giản nhé. Nội dung: Điều khiển phi thuyền ăn sao trong không gian. Những ngôi sao sẽ có animation xoay xoay, màu và vị trí xuất hiện của những ngôi sao đó là random.

Đầu tiên mình sẽ tạo file gosu0.rb. file này sẽ khởi tạo cửa sổ game 640 x 480 và 1 background không gian space.png

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 480, false
    self.caption = "Tutorial Game"
    
    @background_image = Gosu::Image.new("media/space.png", :tileable => true)
  end
  
  def update
  end
  
  def draw
    @background_image.draw(0, 0, 0)
  end
end

GameWindow.new.show

Tiếp theo mình sẽ tạo 1 class Player ra 1 file player.rb Player là chiếc phi thuyềnspaceship nhé.

class Player
    def initialize
        @image = Gosu::Image.new("media/starfighter.bmp")
        @x = @y = @vel_x = @vel_y = @angle = 0.0
        @score = 0
    end

    def warp(x, y)
        @x, @y = x, y #Vị trí phi thuyền xuất hiện ở cửa sổ GameWindow
    end

    def turn_left
        @angle -= 4.5
    end

    def turn_right
        @angle += 4.5
    end

    def accelerate
        @vel_x += Gosu::offset_x(@angle, 0.5) #Phi thuyền sẽ tiến về hướng x  với số pixel = 0.5 * cos(@angle)
        @vel_y += Gosu::offset_y(@angle, 0.5) #Phi thuyền sẽ tiến về hướng y  với số pixel = 0.5 * cos(@angle)
    end

    def move
        @x += @vel_x
        @y += @vel_y
        @x %= 640
        @y %= 480

        @vel_x *= 0.95
        @vel_y *= 0.95
    end

    def draw
        @image.draw_rot(@x, @y, 1, @angle)
    end
end

Tạo object player mới từ class Player trong gosu0.rb

require 'gosu'
require './player'

class GameWindow < Gosu::Window
    def initialize
        super 640,480,false
        self.caption = "Spaceship"
        @background_image = Gosu::Image.new("media/space.png")

        @player = Player.new
        @player.warp(320, 240)
    end

    def update
        if Gosu::button_down? Gosu::KbLeft or Gosu::button_down? Gosu::GpLeft then @player.turn_left end
        if Gosu::button_down? Gosu::KbRight or Gosu::button_down? Gosu::GpRight then @player.turn_right end
        if Gosu::button_down? Gosu::KbUp or Gosu::button_down? Gosu::GpButton0 then @player.accelerate end
        @player.move
    end

    def draw
        @player.draw
        @background_image.draw(0,0,0)
    end

    def button_down(id)
        close if id == Gosu::KbEscape
    end
end

window = GameWindow.new
window.show

Và các bạn sẽ có kết quả như hình bên dưới. HbjUoD

Và ở phần tiếp theo mình sẽ thực hiện tạo những ngôi sao trong không gian và để phi thuyền ghi điểm khi chạm vào chúng.

Cảm ơn các bạn đã theo dõi 😄 Nguồn: http://memorandums.hatenablog.com/entry/2016/04/21/174834


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí