Difference between revisions of "Tutorial:Callback Functions (Tiếng Việt)"

(Created page with "Hàm callback trong LÖVE được gọi bởi love.run để thực hiện những nhiệm vụ khác nhau...")
 
m (Fix mousebutton comparison: Int instead of Char)
Line 48: Line 48:
 
<source lang="lua">
 
<source lang="lua">
 
function love.mousepressed(x, y, button)
 
function love.mousepressed(x, y, button)
   if button == 'l' then
+
   if button == 1 then
 
       imgx = x -- chuyển hình ảnh đến nơi nhấn chuột
 
       imgx = x -- chuyển hình ảnh đến nơi nhấn chuột
 
       imgy = y
 
       imgy = y
Line 59: Line 59:
 
<source lang="lua">
 
<source lang="lua">
 
function love.mousereleased(x, y, button)
 
function love.mousereleased(x, y, button)
   if button == 'l' then
+
   if button == 1 then
 
       fireSlingshot(x,y) -- hàm tự viết này được định nghĩa ở một nơi khác
 
       fireSlingshot(x,y) -- hàm tự viết này được định nghĩa ở một nơi khác
 
   end
 
   end

Revision as of 21:08, 6 June 2016

Hàm callback trong LÖVE được gọi bởi love.run để thực hiện những nhiệm vụ khác nhau, và chúng đều tùy ý có thể có hoặc không. Tuy nhiên, trải nghiệm game thực thụ đòi hỏi dùng đến gần như toàn bộ callback, vì vậy bạn nên biết chúng là gì.

Callback, đối với người mới lập trình hoặc chưa biết đến thuật ngữ này, có thể được coi là một hàm hoạt động theo hướng ngược lại. Trong một hàm thông thường như love.graphics.draw hoặc math.floor, bạn có thể gọi nó rồi Love hoặc Lua thực hiện một thao tác. Còn callback thì là một hàm bạn lập trình nên và Love gọi đến ở những thời điểm nhất định. Điều này khiến cho bạn dễ dàng giữ cho mã lệnh ngăn nắp và tối ưu. Chẳng hạn, vì love.load chỉ được gọi khi trò chơi khởi động lần đầu (trước bất cứ callback nào khác), nên đó sẽ là nơi phù hợp để đặt mã lệnh nạp nội dung của trò chơi, hoặc nếu không thì thực hiện khâu chuẩn bị.

love.load

function love.load()
   image = love.graphics.newImage("cake.jpg")
   local f = love.graphics.newFont(12)
   love.graphics.setFont(f)
   love.graphics.setColor(0,0,0,255)
   love.graphics.setBackgroundColor(255,255,255)
end

Hàm này được gọi đúng một lần, khi trò chơi khởi động, và thường là nơi bạn nạp những nguyên liệu trò chơi, khởi tạo các biến và thiết lập các giá trị riêng. Tất cả những thứ này cũng có thể được đặt ở nơi khác, nhưng đặt ở đây sẽ đồng nghĩa với việc chúng được thực hiện đúng một lần, tiết kiệm được nhiều tài nguyên hệ thống.

love.update

function love.update(dt)
   if love.keyboard.isDown("up") then
      num = num + 100 * dt -- mỗi giây làm tăng num thêm 100 
   end
end

Hàm này được gọi liên tục và có thể sẽ là nơi phần lớn phép toán được thực hiện. 'dt' đóng vai trò "delta time" và là số giây trôi qua kể từ lần cuối cùng hàm này được gọi (thường là một giá trị nhỏ như 0.025714).

love.draw

function love.draw()
   love.graphics.draw(image, imgx, imgy)
   love.graphics.print("Nhấn chuột và kéo rê hình chiếc bánh, hoặc dùng các phím mũi tên", 10, 10)
end

love.draw là nơi mà tất cả việc vẽ được tiến hành (nếu điều này còn chưa đủ rõ ràng) và nếu bạn gọi bất kì lệnh nào của love.graphics.draw nào bên ngoài hàm này thì nó sẽ không có hiệu quả gì. Hàm này cũng được gọi liên tục, vì vậy hãy nhớ rằng nếu bạn thay đổi font/color/mode/etc ở cuối hàm thì nó sẽ có ảnh hưởng đến những thứ ở đầu hàm. Chẳng hạn:

function love.load()
   love.graphics.setColor(0,0,0)
end

function love.draw()
   love.graphics.print("Dòng chữ này không phải màu đen bởi tác dụng của dòng lệnh dưới đây", 100, 100)
   love.graphics.setColor(255,0,0)
   love.graphics.print("Dòng chữ này màu đỏ", 100, 200)
end

love.mousepressed

function love.mousepressed(x, y, button)
   if button == 1 then
      imgx = x -- chuyển hình ảnh đến nơi nhấn chuột
      imgy = y
   end
end

Hàm này được gọi đến mỗi khi một nút chuột được nhấn và nó nhận nút chuột cùng tọa độ của con trỏ chuột lúc nhấn. Nút có thể có bất cứ giá trị nào trong số các giá trị ấn định. Hàm này kết hợp nhịp nhàng với love.mousereleased.

love.mousereleased

function love.mousereleased(x, y, button)
   if button == 1 then
      fireSlingshot(x,y) -- hàm tự viết này được định nghĩa ở một nơi khác
   end
end

Hàm này được gọi mỗi khi một nút chuột được nhả ra; hàm nhận vào nút cùng với tọa độ của con trỏ chuột lúc nhả. Bạn có thể kèm hàm này với hàm love.mousepressed hoặc viết riêng; chúng không có bất kì sự liên hệ nào.


love.mousepressed

function love.keypressed(key, unicode)
   if key == 'b' then
      text = "Phím B được nhấn."
   elseif key == 'a' then
      a_down = true
   end
end

Hàm này được gọi mỗi khi phím được nhấn; nó nhận vào phím vừa nhấn này. Phím có thể nhận bất kì giá trị ấn định nào. Hàm này kết hợp rất tốt với love.keyreleased.

love.keyreleased

function love.keyreleased(key, unicode)
   if key == 'b' then
      text = "Phím B được nhả."
   elseif key == 'a' then
      a_down = false
   end
end

Hàm này được gọi mỗi khi phím được nhấn; nó nhận vào phím vừa nhả này. Bạn có thể dùng hàm này cùng với love.keypressed (Tiếng Việt)|love.keypressed hoặc dùng riêng; chúng không có bất kì sự liên hệ nào.

love.focus

function love.focus(f)
  if not f then
    print("LOST FOCUS")
  else
    print("GAINED FOCUS")
  end
end

Hàm này được gọi mỗi khi người dùng kích chuột ra ngoài phạm vi, và vào trong cửa sổ LOVE. Chẳng hạn, nếu người đó đang chơi một trò trong cửa sổ mà lại kích chuột vào trình duyệt Internet, thì trò chơi có thể nhận biết được và tự động tạm dừng.

function love.focus(f) gameIsPaused = not f end

function love.update(dt)
	if gameIsPaused then return end

	-- Phần còn lại của hàm love.update bạn viết có thể đưa vào đây
end

love.quit

function love.quit()
  print("Cám ơn bạn đã chơi! Mong được gặp lại!")
end

Hàm này được gọi mỗi khi người chơi kích vòa nút đóng cửa sổ (thường có kí hiệu X). Chẳng hạn, nếu người dùng quyết định là đã chơi xong, họ có thể kích nút đóng. Lúc này, trước khi đóng lại, trò chơi có thể lưu giữ trạng thái hiện hành. Đó là những hàm callback và cách dùng cơ bản của chúng.



Ngôn ngữ khác