12/08/2018, 15:20

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

Và phần cuối cùng của game đơn giản này mình hướng dẫn các bạn chèn âm thanh khi phi thuyền chạm vào ngôi sao và đếm số sao thu được bằng phương thức score() nhé. Các bạn down file beep.wav này và save vào thư mục media nhé. Load file âm thanh trong gosu Gosu cung cấp hàm Sample() giúp load ...

Và phần cuối cùng của game đơn giản này mình hướng dẫn các bạn chèn âm thanh khi phi thuyền chạm vào ngôi sao và đếm số sao thu được bằng phương thức score() nhé. Các bạn down file beep.wav này và save vào thư mục media nhé.

Load file âm thanh trong gosu

Gosu cung cấp hàm Sample() giúp load file âm thanh và mình để âm thanh trong class player.rb bằng đoạn code này @beep = Gosu::Sample.new("media/beep.wav") và khi phi thuyền chạm vào sao thì đoạn âm thanh kia sẽ được chạy @beep.play Class player.rb

class Player
    def initialize
        @image = Gosu::Image.new("media/starfighter.bmp")
        @x = @y = @vel_x = @vel_y = @angle = 0.0
        @beep = Gosu::Sample.new("media/beep.wav") #Load file beep.wav trong thư mục media
    end

    def warp(x, y)
        @x, @y = x, y
    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)
        @vel_y += Gosu::offset_y(@angle, 0.5)
    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

    def collect_stars(stars)
        if stars.reject! { |star| Gosu::distance(@x, @y, star.x, star.y) < 35} then
            @beep.play  #Sau khi phi thuyền chạm vào ngôi sao thì file âm thanh sẽ được bật
        end
    end
end

Thu thập stars

Trong class Player mình thêm phương thức score để đếm số starts thu thập được và collect_start () để định nghĩa khoảng cách tương tác giữa player và star.

class Player
    def initialize
        @image = Gosu::Image.new("media/starfighter.bmp")
        @x = @y = @vel_x = @vel_y = @angle = 0.0
        @score = 0
        @beep = Gosu::Sample.new("media/beep.wav") #Load file beep.wav trong thư mục media
    end

    def warp(x, y)
        @x, @y = x, y
    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)
        @vel_y += Gosu::offset_y(@angle, 0.5)
    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

    def score
        @score
    end

    def collect_stars(stars)
        if stars.reject! { |star| Gosu::distance(@x, @y, star.x, star.y) < 35} then
            @score += 1
            @beep.play #Sau khi phi thuyền chạm vào ngôi sao thì file âm thanh sẽ được bật
        end
    end
end

Vậy là mình đã hoàn thành series hướng dẫn làm game đơn giản bằng thư viện gosu dành cho ruby rồi             </div>
            
            <div class=

0