TRANG CHỦ
CHUYÊN MỤC
HỌC HỎI
TAG
ABOUT
Tìm kiếm
Lập trình games với Love2D - Chương 8 - Objects
2023-10-22 07:47:33
Love2D
Học Lập Trình Lua
163 lượt xem
0 bình luận
Trong chương trước, chúng ta đã sử dụng bảng làm danh sách đánh số, nhưng chúng ta cũng có thể lưu trữ giá trị theo một cách khác: Bằng chuỗi. ```lua function love.load() --rect là viết tắt của hình chữ nhật (rectangle) rect = {} rect["width"] = 100 end ``` "width" trong trường hợp này chúng ta gọi là ```key``` hoặc ```property```. Vì vậy, bảng ```rectangle``` hiện có thuộc tính "width" có giá trị 100. Chúng ta không cần sử dụng chuỗi mỗi khi muốn tạo thuộc tính. Dấu chấm (.) là cách viết tắt của ```table_name["property_name"]```. ```lua function love.load() rect = {} -- Hai cái này giống nhau rect["width"] = 100 rect.width = 100 end ``` Hãy thêm một số thuộc tính nữa. ```lua function love.load() rect = {} rect.x = 100 rect.y = 100 rect.width = 70 rect.height = 90 end ``` Bây giờ chúng ta đã có các thuộc tính của mình, chúng ta có thể bắt đầu vẽ hình chữ nhật. ```lua function love.draw() love.graphics.rectangle("line", rect.x, rect.y, rect.width, rect.height) end ``` Và hãy làm cho nó di chuyển! ```lua function love.load() rect = {} rect.x = 100 rect.y = 100 rect.width = 70 rect.height = 90 --Thêm thuộc tính tốc độ rect.speed = 100 end function love.update(dt) -- Tăng giá trị của x. Đừng quên sử dụng thời gian delta. rect.x = rect.x + rect.speed * dt end ``` Bây giờ chúng ta lại có một hình chữ nhật chuyển động, nhưng để thể hiện sức mạnh của bảng, tôi muốn tạo nhiều hình chữ nhật chuyển động. Để làm điều này, chúng ta sẽ sử dụng bảng làm danh sách. Chúng ta sẽ lập một danh sách các hình chữ nhật. Di chuyển mã bên trong ```love.load``` sang một hàm mới và tạo bảng mới ở định dạng ```love.load```. ```lua function love.load() -- Hãy nhớ cách đặt biến: vỏ Lạc đà (camelCase) listOfRectangles = {} end function createRect() rect = {} rect.x = 100 rect.y = 100 rect.width = 70 rect.height = 90 rect.speed = 100 -- Đặt hình chữ nhật mới vào danh sách table.insert(listOfRectangles, rect) end ``` Vì vậy, bây giờ mỗi khi chúng ta gọi ```createRect```, một đối tượng hình chữ nhật mới sẽ được thêm vào danh sách của chúng ta. Đúng vậy, một cái bảng đầy những cái bảng. Hãy làm sao để bất cứ khi nào chúng ta nhấn phím cách, chúng ta sẽ gọi ```createRect```. Chúng ta có thể làm điều này với gọi lại (callback) ```love.keypressed```. ```lua function love.keypressed(key) -- Nhớ, 2 dấu bằng (==) để so sánh! if key == "space" then createRect() end end ``` Bất cứ khi nào chúng ta nhấn một phím, LÖVE sẽ gọi ```love.keypress``` và chuyển phím được nhấn làm đối số. Nếu phím đó là "space", nó sẽ gọi ```createRect```. Điều cuối cùng cần làm là thay đổi chức năng cập nhật và vẽ của chúng ta. Chúng ta phải lặp qua danh sách các hình chữ nhật. ```lua function love.update(dt) for i,v in ipairs(listOfRectangles) do v.x = v.x + v.speed * dt end end function love.draw(dt) for i,v in ipairs(listOfRectangles) do love.graphics.rectangle("line", v.x, v.y, v.width, v.height) end end ``` Mã đầy đủ: ```lua function love.load() -- Hãy nhớ cách đặt biến: vỏ Lạc đà (camelCase) listOfRectangles = {} end function createRect() rect = {} rect.x = 100 rect.y = 100 rect.width = 70 rect.height = 90 rect.speed = 100 -- Đặt hình chữ nhật mới vào danh sách table.insert(listOfRectangles, rect) end function love.keypressed(key) -- Nhớ, 2 dấu bằng (==) để so sánh! if key == "space" then createRect() end end function love.update(dt) for i,v in ipairs(listOfRectangles) do v.x = v.x + v.speed * dt end end function love.draw(dt) for i,v in ipairs(listOfRectangles) do love.graphics.rectangle("line", v.x, v.y, v.width, v.height) end end ``` Và bây giờ khi bạn chạy trò chơi, một hình chữ nhật chuyển động sẽ xuất hiện mỗi khi bạn nhấn phím cách.  ------ ### Một lần nữa? Đó là rất nhiều mã trong một hướng dẫn khá ngắn. Tôi có thể tưởng tượng nó có thể khá khó hiểu vì vậy hãy xem lại toàn bộ mã một lần nữa: Trong ```love.load``` chúng ta đã tạo một bảng có tên ```listOfRectangles```. Khi chúng ta nhấn phím cách, LÖVE gọi ```love.keypressed```, và bên trong hàm đó chúng ta kiểm tra xem phím được nhấn có phải là "space". Nếu đúng, chúng ta gọi hàm ```createRect```. Trong ```createRect``` chúng ta tạo ra một bảng mới. Chúng ta cung cấp các thuộc tính cho bảng này, như ```x``` và ```y``` và chúng ta lưu trữ bảng mới này trong danh sách của mình ```listOfRectangles```. In ```love.update``` và ```love.draw``` chúng ta lặp qua danh sách hình chữ nhật này để cập nhật và vẽ từng hình chữ nhật. ------ ### Chức năng - Functions Một đối tượng cũng có thể có chức năng. Bạn tạo một hàm cho một đối tượng như thế này: ```lua tableName.functionName = function () end -- Hoặc cách phổ biến hơn function tableName.functionName() end ``` ### Bản tóm tắt Chúng ta có thể lưu trữ các giá trị trong bảng không chỉ bằng số mà còn bằng chuỗi. Chúng ta gọi những loại bảng này là đối tượng. Việc có các đối tượng giúp chúng ta không phải tạo ra nhiều biến số. ------ [Trước](/learn/detail?learnId=7) | [Mục lục](/learn/search?keyword=Lập%20trình%20games%20với%20Love2D) | [Kế tiếp](/learn/detail?learnId=9)
Gợi ý bài học liên quan
Awesome Love2D
Lập trình games với Love2D - Visual Studio Code
Lập trình games với Love2D - Chương 24
Lập trình games với Love2D - Chương 23
Lập trình games với Love2D - Chương 22