3-4 Main loop

3-4 Main loop

Tại phần này, chúng ta bắt đầu thử sức với hình động. Để làm động được hình thì chúng ta phải tạo một chuỗi chính, từ trong đấy sẽ làm động hình ảnh

Main loop

Để viết được chuỗi xử lý lệnh thì chúng ta viết được như sau.

require 'mygame/boot'
main_loop do
  nội dung chuỗi xử lý
end

Chuỗi sẽ xử lý nội dung trong khoảng [do~end] nên chúng ta cũng viết nội dung cần xử lý vào khu vực đó.

require 'mygame/boot/
main_loop do
  image.render "sample.bmp", :x => 100, :y => 50
end

Chuỗi được viết ra bởi main_loop sẽ kết thúc khi đóng màn hình lại. Bình thường thì chúng ta chỉ viết 1 main_loop, trong đó sẽ viết nội dung cần xử lý. Phần chuỗi có tất cả trung tâm của cả chương trình như thế này thì ta gọi là [main_loop].

Làm hình động

Bây giờ chúng ta hãy thử làm động tấm hình chúng ta vừa đưa vào thôi. Với lệnh của chương trình dưới đây thì hình ảnh vẫn chưa hoạt động nhưng chúng ta dùng biến số [x] [y] để chỉ định

require 'mygame/boot'
x=100
y=50
main_loop do
  image.render "sample.bmp", :x => x, :y => y
end

Như vậy chúng ta có thể làm động hình bằng cách thay đổi giá trị của các biến số [x] và [y] từ đó ta có thể nhìn thấy hình ảnh chuyển động. Trong hình vẽ, chúng ta thử cộng x dần dần với 1 xem sao.

renderimage04.rb

require 'mygame/boot'
x = 100
y = 50
main_loop do
  x += 1
  image.render ("sample.bmp", :x => x, :y => y)
end

Theo như lệnh của [image.render], biến số [x] được cộng vào liên tiếp và chuỗi lênh sẽ được chạy. Khi giá trị [x] thay đổi thì hình ảnh cũng di chuyển đến vị trí tương ứng với [x] thay đổi đó

Hình 3-9 Hình miên tả chuyển động của hình ảnh

6.PNG

Chu kì của chuỗi

Khi sử dụng lênh [main_loop] thì chuỗi được xử lý với chu kì 1/60 giây. Có nghĩa cứ 1 giây thì chuỗi được xử lý lặp lại 60 lần. Tuy nhiên, để an định tốc độ xử lý của chuỗi là 1/60 thì máy tính cần thiết phải có tốc độ xử lý đủ.Có những lúc vì lệnh trong chuỗi quá phức tạp hay có quá nhiều hình ảnh được đưa ra trên màn hình làm chuỗi không thử xử lý xong trong 1/60 giây. Trong trường hợp trong thời gian chỉ định không thực hiện được hết các chuỗi lệnh, làm chậm thời gian chạy chương trình thì người ta gọi đây là "xử lý bị rơi". Tốc độ xử lý chuỗi được mặc định là 1 giây xử lý 60 lần nhưng chúng ta cũng có thể thay đổi chu kì của chuỗi xử lý.

main_loop (30) do
  Nội dung chuỗi
end

Đằng sau [main_loop] chính là chỉ định về số lần chuỗi được xử lý lại trong 1 giây. Như ví dụ trên thì 1 giây chuỗi được xử lý lại 30 lần, các bạn nên chú ý, nếu số lần này càng nhiều thì khả năng chuỗi bị xử lý chậm, trường hợp "xử lý bị rơi" càng dễ xảy ra hơn. Những hình ảnh trên TV hay những máy chơi game thì tốc độ trung bình sẽ là 30~60 lần /1 giây.

Clear màn hình và định giờ cho hình ảnh

Khi sử dụng mệnh [main_loop] thì các lệnh được xử lý lần lượt như sau

Clear màn hình -> Chạy các lệnh -> Chờ thời gian được chỉnh -> Refresh màn hình

Khi vào chuỗi thì đầu tiên màn hình sẽ được clear. Theo như chương trình thì toàn màn hình được bôi đen. Sau đó, bộ phận lệnh được bao trong khoảng [do~end] được thực hiện, ở đây lệnh [render] sẽ được thực hiện. Tuy nhiên, lệnh [render] chỉ là chuẩn bị cho hình ảnh thôi nên thực thế hình ảnh được đưa ra màn hình là kết quả trong quá trình Refresh màn hình.

Vì trong khi thực hiện lênh [render] thì trên màn hình không có hình ảnh nào được phản chiếu nên chương trình như thế này sẽ không thực hiện được.

Image.render ("sample.bmp")
sleep 1
Image.render ("sample/bmp")
sleep 1

Hình ảnh hiện lên màn hình mà chúng ta nhìn thấy được chỉ là hình ảnh của kết quả sau khi thực hiện quá trình refresh màn hình. Mặt khác, khi thực hiện lệnh [sleep]thì chức năng xử lý sự kiện sẽ bị khóa, cả màn hình sẽ đứng yên. Nên trong khi sử dụng [MyGame] thì chúng ta chú ý không sử dụng lệnh [sleep].