31 điểm bởi GN⁺ 2023-11-26 | 1 bình luận | Chia sẻ qua WhatsApp

Tìm lại niềm vui với việc viết code: vượt qua burnout bằng phát triển game

  • Một lời than phiền thường thấy trong cộng đồng lập trình viên: mất đi đam mê với việc viết code
  • Mẹo để giải tỏa burnout: tự làm game của riêng mình để có thể tận hưởng việc viết code trở lại
  • Chia sẻ trải nghiệm cá nhân về việc mê lập trình nhờ phát triển game
  • Khuyến nghị phát triển game bằng ngôn ngữ Go và thư viện Ebitengine

Nguyên lý cơ bản của phát triển game

  • Tương tự phim ảnh, game là tập hợp các hình ảnh liên tiếp nhanh chóng (frame)
  • Game tạo hình ảnh theo thời gian thực và thay đổi frame tiếp theo theo đầu vào của người dùng
  • Về cơ bản, game là một vòng lặp vô hạn, lặp lại việc vẽ hình ảnh và cập nhật logic

Thiết lập dự án

  • Tạo mô-đun Go và thêm thư viện Ebitengine
  • Chạy một cửa sổ trống với phần triển khai tối thiểu của giao diện game

Tải tài nguyên

  • Khuyến nghị dùng đồ họa do lập trình viên tự làm hoặc tận dụng tài nguyên miễn phí
  • Dùng gói embed để tải tài nguyên vào mã

Vẽ hình ảnh

  • Thực hiện toàn bộ thao tác vẽ bên trong phương thức Draw
  • Dùng phương thức DrawImage của ebiten.Image để vẽ một hình ảnh lên trên hình ảnh khác
  • Điều chỉnh vị trí, xoay và thay đổi kích thước của hình ảnh thông qua cấu trúc DrawImageOptions

Logic game

  • Cấu trúc Game giữ trạng thái game và thay đổi trạng thái bằng phương thức Update
  • Ví dụ, duy trì vị trí của người chơi bằng vector (X, Y)

Chuyển động

  • Triển khai chuyển động bằng cách cập nhật vị trí của người chơi trong phương thức Update
  • Thay đổi vị trí người chơi theo đầu vào từ bàn phím

Bộ đếm thời gian

  • Triển khai timer để thay đổi logic theo thời gian trong game
  • Dùng cấu trúc Timer để kích hoạt sự kiện theo những khoảng thời gian nhất định

Đối tượng game

  • Quản lý bằng cách đóng gói các đối tượng game như người chơi
  • Mỗi đối tượng có các phương thức UpdateDraw riêng

Tạo đối tượng

  • Tạo đối tượng thiên thạch và spawn ở rìa màn hình
  • Cấu trúc Game theo dõi các đối tượng thiên thạch

Bắn đạn

  • Triển khai logic bắn đạn và timer hồi chiêu
  • Player tạo đạn còn Game theo dõi chúng

Phát hiện va chạm

  • Triển khai cấu trúc Rect và phương thức Collider() để phát hiện va chạm
  • Kiểm tra va chạm giữa các đối tượng trong Update của game

Ý kiến của GN⁺

Điểm quan trọng nhất của bài viết này là đưa ra một cách để các lập trình viên vượt qua burnout và tìm lại đam mê với việc viết code. Phát triển game mang đến cơ hội luyện tập kỹ năng lập trình thông qua những dự án sáng tạo và thú vị, đồng thời học thêm ngôn ngữ hoặc thư viện mới. Bài viết này truyền cảm hứng để các lập trình viên có thể một lần nữa tận hưởng việc viết code như một sở thích, đồng thời khơi gợi hứng thú bằng cách giải thích cách tiếp cận cơ bản trong phát triển game với ngôn ngữ Go và thư viện Ebitengine.

1 bình luận

 
GN⁺ 2023-11-26
Ý kiến trên Hacker News
  • Người dùng đầu tiên thích viết pháo hoa hoặc mô phỏng hạt đơn giản để kiểm tra hiệu năng khi học một ngôn ngữ mới hoặc API đồ họa mới. Khi thử nghiệm với Go và Ebitengine vào năm 2021, họ rất ấn tượng với hiệu năng đáng kinh ngạc có thể di chuyển nhiều pixel ở 60fps và sự dễ sử dụng.
  • Người dùng thứ hai đã phát triển game bằng ngôn ngữ Go với g3n-engine trong năm ngoái. Họ chọn vì thích và muốn học Go, đồng thời muốn làm việc với 3D sau kinh nghiệm phát triển game 2D trước đó nên đã chọn g3n-engine. Làm game là trải nghiệm thử thách và đáng giá hơn nhiều so với công việc được trả lương, và luôn có vô số điều cần học.
  • Người dùng thứ ba cho biết API Ebiten cho ngôn ngữ Go rất tốt và có thể mang lại cảm hứng trong thiết kế API. Ngoài ra, họ còn dùng một trình biên dịch tùy chỉnh chuyển Go sang C++ để tăng hiệu năng cho phát triển game, truy cập API C/C++, và cũng cho hiệu năng tốt trên WebAssembly. Trình biên dịch này còn bao gồm thử nghiệm tạo GLSL từ mã Go.
  • Người dùng thứ tư không phải là nhà phát triển Go, nhưng đã theo dõi một YouTuber/streamer Twitch làm game bằng Go trong thời gian dài. Streamer đó đang phát triển một MMO nhỏ bằng Go và làm phiên bản web bằng OpenGL và WASM. Dù họ hiểu rằng bộ gom rác của Go rất vững chắc, vẫn có nhiều người hỏi rằng "tại sao lại làm bằng Go?".
  • Người dùng thứ năm chỉ phản hồi với phần đầu của bài viết và gợi ý rằng nếu tác giả đang trải qua tình trạng kiệt sức như đã mô tả, thì thay vì "chinh phục lại" sở thích, nên phát triển mối quan tâm của mình. Đây có thể là dấu hiệu cho thấy não bộ đang bị chững lại, và dù không nhất thiết phải khác với lập trình, có thể đã đến lúc đào sâu hơn vào lý thuyết khoa học máy tính.
  • Người dùng thứ sáu cho biết họ đã có trải nghiệm hài lòng trong nhiều năm với tư cách là người dùng Ebitengine. Nếu muốn xem mã nguồn của các game được tạo bằng Ebitengine, họ khuyên nên xem danh sách awesome-ebitengine. Tất cả các game được liệt kê trong hồ sơ itch.io của họ đều được làm bằng Ebitengine và đều là mã nguồn mở.
  • Người dùng thứ bảy đang phát triển game bằng Ebitengine và cảm thấy trải nghiệm này rất mới mẻ, dễ chịu.
  • Người dùng thứ tám đặt câu hỏi liệu Go có phải là nền tảng phù hợp để viết các game lớn hay không, và liệu nó có đủ thư viện cùng hiệu năng để biện minh cho việc dùng thay vì C# hay không.
  • Người dùng thứ chín thắc mắc liệu Go có phù hợp để làm game hay không vì khái niệm goroutine của Go, và nghĩ rằng một ngày nào đó sẽ thử.
  • Cuối cùng, có một nhận xét về game dựa trên Ebitengine, chỉ ra rằng câu về "ví dụ component Sprite có thể trông như thế nào" đang bị đứt đoạn và cần được sửa lại.