3-5 Nhập Key

3-5 Nhập Key

Chúng ta đã học cách nhập hình ảnh và âm thanh rồi. Tiếp theo chúng ta sẽ thử thách với việc nhập Key. Nếu chúng ta kết hợp việc đưa hình ảnh và âm thanh cùng với việc nhập key thì chúng ta đã hoàn thành việc làm một game

Nhập key

Dưới đây là chương trình chỉ khi nhấn phím Space thì hình ảnh mới được hiển thị trên màn hình.

key00.rb

require 'mygame/boot'
main_loop do
  if key_pressed?(Key:Space)
  Image.render ("sample.bmp")
  end
end

Trong chuỗi liên tục thì có nội dung lệnh sau:

if key_pressed?(Key:Space)
   image.render ("sample.bm")
 end

Code này có ý nghĩa là khi nút Space được nhấp hãy thay đổi vị trí image. trong [mygame] thì lệnh [key_pressed] dùng để check lại những nội dung nhập Key. Vào argument thì chúng ta sẽ đưa cho chúng key. [KET::SPACE] được qui định để thể hiện dấu cách. Lệnh [key_pressed] phản ứng với argument được giao cho, nếu phím space được nhấn thì lệnh sẽ trở thành true và nếu chưa được nhấn thì coi như lệnh là failse.

Chương trình tiếp theo hiển thị lệnh khi ta nhấn A, B, c trên màn hình thì các chữ cái tương tự cũng sẽ hiện ra.

key01.rb

require 'mygame/boot'
main_loop do
  if key_pressed?(Key:a)
    puts "A"
  end
  if key_pressed?(Key:b)
    puts "B"
  end
  if key_pressed?(Key:c)
    puts "C"
  end
end

Trong khi màn hình vẫn trong trạng thái hoạt động, khi ta nhấn các phím [A,B, C] thì các chữ cái sẽ được hiển thị tương tự.

Sau đây sẽ là bảng những lệnh chính được thực hiện theo [key_pressed]

Key Phím tương ứng
Key::ESCAPE Esc
Key::SPACE Dấu cách
Key::K0 0
Key::K1 1
Key::K1~9 1~9
Key::A a
Key::B b
Key::UP Lên trên
Key::DOWN Xuống dưới
Key::LEFT Sang trái
Key::RIGHT Sang phải

Tìm key đã được nhấn

Chương trình tiếp theo là chương trình để tìm ra khoảnh khắc mà key được nhấn.

Key02.rb

require 'mygame/boot'
main_loop do
  if new_key_pressed?(Key::SPACE)
    puts "SPACE"
  end
end

Chạy thử chương trình này, các bạn hãy nhấn thử phím cách trên màn hình chương trình chạy thử xem. Như vậy, ngay trong khoảng khắc nhấn phím cách, thì chắc chắn trên màn hình của command promt sẽ hiện lên chữ [SPACE]. Kể cả chúng ta để mặc một thời gian rồi nhấn lại thì cứ mỗi lần nhấn, trên màn hình của command promt thì lại hiện chữ SPACE.

Những lệnh có kèm dấu [?]

Những lệnh như [key_pressed?] hay [new_key_pressed?] đều có dấu "?" ở cuối lệnh. Những lệnh có dấu ? ở cuối lệnh là những lệnh sẽ trả lại câu trả lời true/false (đúng/sai)

Chương trình mỗi khi nhấn Key thì âm sẽ kêu

Tại sao chúng ta cần thiết phải tìm ra khoảnh khắc mà key được nhấn? Lệnh [new_pressed_key] cần thiết như thế nào?

Ví dụ, khi ta muốn viết lên một chương trình là cứ mỗi khi nhấn phím cách thì âm thanh sẽ vang lên. Các bạn hãy nhìn chương trình dưới đây.

require 'mygame/boot'
main_loop do
  if key_pressed?(Key::SPACE)
    wave.play "sample.wav", 0 # Chơi bản sample ở chanel 0
  end
end

Đây là chương trình chạy mỗi lần nhấn phím cách thì lệnh [wave.play] sẽ được thực hiện. Tuy nhiên, chương trình này sẽ không chạy được như mình mong đợi. Lý do bởi vì trong thời gian phím cách được nhấn thì lệnh [wave.play] sẽ được gọi liên tiếp. Vì ngay sau khi âm thanh chạy thì nó lại phải chạy lại từ đầu nên trong khi phím cách được nhấn thì bản [sample.wav] bị chạy lại liên tục.

Trong trường hợp này nếu ta sử dụng lệnh [new_pressed_key?] thì sẽ đúng.

require 'mygame/boot'
  if new_pressed_key?(KEY::SPACE)
    wave.play "sample.wav", 0
  end
end

Như vậy thì cứ mỗi lần nhấn phím cách thì bản nhạc lại được chơi lại chỉ 1 lần.