One Dreamer đã dạy người chơi lập trình như thế nào?
Hóa thân thành một nhà phát triển trò chơi có khả năng thay đổi thực tại bằng C#.
Trong thế giới của One Dreamer, bạn sẽ hóa thân thành một nhà phát triển trò chơi có khả năng thay đổi thực tại bằng C#. Thông qua việc tương tác với thế giới trò chơi, nhân vật sẽ dần tìm lại động lực sống cho mình.
Hôm nay chúng tôi đã có cơ hội gặp gỡ cha đẻ của One Dreamer, anh Gareth Ffoulkes, để thảo luận về những thách thức trong việc biến ngôn ngữ lập trình thành thứ mà một người bình thường có thể hiểu và sử dụng, cách tạo ra các câu đố lập trình và lý do tại sao anh ấy muốn thay đổi ấn tượng của mọi người về thiết kế trò chơi nói riêng và lập trình nói chung.
One Dreamer là câu chuyện của một lập trình viên đang cố gắng theo đuổi giấc mơ phát hành một trò chơi của riêng mình. Vì sao anh lại chọn câu chuyện này để kể cho mọi người?
Tôi luôn dành một sự quan tâm đặc biệt cho phát triển trò chơi. Tất cả chúng ta đều yêu trò chơi, nhưng hầu hết đều không hiểu được sự kì diệu của những dòng mã đằng sau trò chơi đó. Vậy nên tôi làm ra One Dreamer.
Vì không thể đưa tất cả các khía cạnh của phát triển trò chơi như hội họa hay âm nhạc vào One Dreamer, tôi quyết định tập trung hết vào lập trình. Công việc của người chơi là tìm lỗi và sửa lỗi trong trò chơi - đúng như những gì các nhà phát triển trò chơi thường làm trong quá nửa thời gian của mình. Tất nhiên hoạt động đó sẽ được Game hóa để mọi người không chạy mất ngay trong câu đố đầu tiên.
Nhiều người chơi cho rằng lập trình quá phức tạp. Vì sao anh vẫn chọn nó là cơ chế cốt lõi của One Dreamer?
Hồi mới học lập trình, tôi thường gặp rắc tối với tài liệu hướng dẫn vì chúng quá phức tạp và quá khó để làm theo. Người ta cứ liệt kê hết những thuật ngữ và cú pháp trước, như thể muốn làm nản lòng bất cứ ai có hứng thú với bộ môn này.
Thế nên để trấn an người chơi, tôi đã biến cơ chế lập trình cốt lõi thành cơ chế giải đố thông thường. Tôi muốn sau một khoảng thời gian, khi người chơi quay lại One Dreamer, họ sẽ nhận ra lập trình không khó đến thế, rằng lập trình cũng có thể rất vui.
Anh có lên kế hoạch sử dụng C# cho One Dreamer không? Điều gì đã khiến anh chọn ngôn ngữ lập trình đó?
Tôi luôn có ý định sử dụng C# vì đó là ngôn ngữ tôi sử dụng để phát triển One Dreamer và cũng là ngôn ngữ tôi quen thuộc nhất. Trong thực tiễn lập trình tôi đã gặp rất nhiều tình huống mã hóa thú vị; tôi đã ghi lại chúng rồi biến chúng thành những câu đố trong trò chơi.
Để không làm những người chơi không chuyên hoảng sợ, tôi đã loại bỏ và rút ngắn một số chi tiết để mã trông trực quan và dễ hiểu. Và cũng phải ngắn nữa. Mục tiêu của tôi là hiển thị được logic của tệp mã mà không dùng quá 12 dòng lệnh.
Theo anh điều gì đã giúp ngôn ngữ lập trình của One Dreamer trực quan và dễ hiểu?
Tôi loại bỏ tất cả những cú pháp "trông có vẻ phức tạp" để người chơi không phải đọc nhiều. Tôi cũng ẩn "mã thực" đằng sau các hàm như "DoComplexLogic ()" hoặc loại trừ tất cả cùng nhau.
Ví dụ, khi người chơi muốn đùa giỡn với chú chó AI trong trò chơi nhưng hành động "Chơi đùa" trong HUD lại bị chuyển sang màu xám và không nhấp được. Họ sẽ thấy thất vọng đôi chút. Tuy nhiên, nếu họ xem mã của chú chó, họ sẽ thấy nó được hiển thị là:
class Dog
{
isPetable = false
}
Bạn không cần kinh nghiệm lập trình để nhận ra việc thay đổi is Petable
thành true
sẽ cho phép bạn chơi với chú chó. Tôi nghĩ thế là đủ, không nhất thiết phải hiển thị hết 30 dòng mã như một tình huống ngoài đời thực.
Anh đã gặp phải những thách thức nào khi tạo ra các câu đố mã hóa? Anh đã đối phó với chúng như thế nào?
Thách thức lớn nhất của tôi là tạo ra những câu đố cân bằng. Chúng phải đủ dễ để đưa tất cả người chơi đến một kết thúc nào đó, nhưng cũng phải đủ khó với những người đã có kinh nghiệm lập trình. Tôi đã giải quyết vấn đề này bằng cách tổ chức nhiều buổi chơi thử cho mọi đối tượng, thêm chức năng bảo vệ tiến trình chơi và nội dung mở khóa tùy chọn.
Xin hãy giải thích thêm về chức năng bảo vệ tiến trình chơi.
Mặc dù tôi đã thêm một số cơ chế bảo vệ chung chung như nhận gợi ý dưới dạng email nếu người chơi mất quá nhiều thời gian cho một câu đố, nhưng "failsafes" thực sự là độ khó tăng dần của trò chơi.
Trong phần đầu của trò chơi, tôi giữ lối chơi thật tuyến tính để người chơi luôn biết đối tượng mã hóa nào là chìa khóa để giải câu đố lập trình. Mã thực tế được thiết lập đủ đơn giản để người chơi có thể vượt qua nó thật dễ dàng.
Khi trò chơi tiến triển, thiết kế cấp độ mở ra các khu vực lớn hơn với nhiều đối tượng được mã hóa hơn. Người chơi càng vượt qua nhiều câu đố, họ càng được chuẩn bị để chinh phục khu vực lớn nhất, rộng lớn nhất ở cuối trò chơi.
Anh thích câu đố nào nhất trong One Dreamer?
Tôi rất thích câu đố Jumpy (một bản sao của Flappy Bird). Câu đố này xuất hiện dưới dạng một thùng game arcade, người chơi sẽ phải sửa lỗi lập trình trong thùng game rồi chơi tới một số điểm đủ cao để qua màn.
Tôi từng thử dựng lại Flappy Bird vô số lần trong quá khứ và tất cả chúng đều gặp những lỗi giống nhau như quá nhiều trọng lực, quá nhiều lực nhảy hay hình nền quá khó nhìn. Trong câu đố Jumpy, tôi đã tái tạo lại Flappy Bird rồi đưa tất cả những vấn đề mà tôi đã trải qua trước đây rồi để người chơi tự khắc phục.
Vì sao anh lại chọn thể hiện cơ chế lập trình cốt lõi dưới dạng một trình soạn mã giống với đời thực mà không phải cái gì đó giống game hơn?
Ban đầu tôi hình dung về một bảng mạch. Khi người chơi sửa lỗi, họ sẽ thấy các đường dẫn mạch thay đổi. Nghe thì rất tuyệt nhưng nó chỉ làm phức tạp hóa vấn đề. Rồi tôi quyết định dùng trình soạn mã truyền thống, phòng trường hợp người chơi có hứng thú với lập trình nghiêm túc thì họ sẽ thấy mọi thứ dễ dàng hơn vì thấy giữa game và đời không khác nhau là mấy. Và để giúp người chơi tập trung vào đoạn mã, tôi cũng loại bỏ những chi tiết như tab hay số dòng, v.v..
Ý tưởng thay đổi thực tại thông qua lập trình đã đến với anh như thế nào? Anh đã thể hiện nó ra sao trong One Dreamer?
Tôi làm cho các đối tượng mã hóa trông càng trực quan càng tốt để người chơi có thể tiếp thu các khái niệm lập trình thông qua phản hồi. Ví dụ, nếu có một bóng đèn với một biến duy nhất được gọi là "màu" và người chơi thay đổi nó từ trắng sang đỏ, họ có thể thấy điều đó xảy ra trong trò chơi và tự động biết màu đại diện trong các đoạn mã trong tương lai.
Cá nhân tôi thích học hỏi thông qua kinh nghiệm. Tôi luôn cố gắng hạn chế hướng dẫn/giải thích trong trò chơi của mình. Đối với tôi, nó tương tự việc học các nguyên tắc lập trình cơ bản thông qua việc tạo một trò chơi nhỏ như Pong so với việc đọc giáo trình lý thuyết lập trình mà không thực sự viết bất kỳ dòng mã nào.
Làm thế nào anh giữ cho mình động lực để làm việc với One Dreamer trong một thời gian dài như vậy?
Hãy nói rằng trong bảy năm làm việc với One Dreamer, tôi rất hiếm khi mất động lực. Có lẽ mọi chuyện sẽ khác nếu tôi phải làm việc với một trò chơi bản thân không có hứng thú hoặc không có quyền tự do sáng tạo. Tiến độ chậm là do tôi thiếu kinh nghiệm và thiếu nguồn lực, nhưng nó luôn vui vẻ và tôi chưa bao giờ thực sự coi đó là công việc.
Tôi dành toàn bộ thời gian của mình cho dự án và luôn có những quãng nghỉ để chơi thử nghiệm. Nhưng nhìn chung đó là một hành trình căng thẳng. Mặc dù tôi có thể đổ lỗi cho sự non yếu của bản thân hay bám vào lí lẽ là mình không bao giờ mất động lực, nhưng nếu được quay ngược thời gian, tôi sẽ yêu cầu bản thân phải nghỉ ngơi đầy đủ và làm việc theo một lịch trình thật nhẹ nhàng.
Bạn có suy nghĩ gì về cách tránh kiệt quệ như nhân vật trong One Dreamer không? Bạn có cảm thấy có điều gì bạn đã làm, cố ý hay vô tình, khiến mọi thứ trở nên vui vẻ thay vì cảm thấy mệt mỏi trong khoảng thời gian này không?
Dành một chút thời gian bên ngoài mỗi ngày, thậm chí chỉ mười lăm phút đi bộ, chắc chắn đã giúp tôi giải tỏa và thiết lập lại tâm trí. Nếu bạn làm việc ở nhà, việc ra ngoài thay đổi không khí sẽ giúp ích cho cả cơ thể lẫn tinh thần của bạn.
Tôi làm việc với One Dreamer để giải trí sau những giờ lao động mệt nhọc. Dù tiến độ chậm nhưng bản thân việc thiết kế rất thú vị nên tôi hầu như không cần phải làm gì để cảm thấy vui vẻ hơn nữa.
Xin hãy chia sẻ về cách xây dựng bối cảnh thế giới của One Dreamer.
Thành thật mà nói, tôi chưa bao giờ là một họa sĩ và chỉ mới bắt đầu vẽ tranh pixel để thiết kế trò chơi. Sau nhiều năm làm việc, bạn có thể đạt được một phong cách của riêng mình, còn với tôi thì tôi chỉ cần một bức tranh diễn đạt được ý tưởng với độ phân giải cực thấp mà thôi.
Anh có muốn giới thiệu bất kỳ hướng dẫn hoặc chương trình nào hữu ích cho một họa sĩ pixel mới bắt đầu không?
Superbrothers: Sword & Sworcery đã gợi cho tôi rất nhiều ý tưởng, tôi luôn cố gắng tạo ra tác phẩm theo phong cách đó. Dần dần, tôi nghĩ mình nên vẽ những bức tranh có độ phân giải cao hơn, tôi tự thay đổi các yếu tố trong tranh cho đến khi tôi cảm thấy hài lòng với sản phẩm. Tôi không thực sự làm theo bất kỳ hướng dẫn nào, nhưng tôi thấy việc học về lý thuyết màu cơ bản đã giúp tranh của tôi đi từ "meh" thành "okay" khá nhanh. Tôi sử dụng Aseprite cho ảnh động và tranh pixel của mình và tôi muốn giới thiệu nó cho bất cứ ai đang muốn tìm hiểu các phần mềm đồ họa thông thường như Photoshop.
Anh muốn khơi dậy những cảm xúc nào trong người chơi khi đưa họ đi qua câu chuyện của một lập trình viên?
Tôi không thực sự muốn khuấy động bất kỳ cảm xúc cụ thể nào, nhưng tôi muốn người chơi cảm thấy như họ đang tham gia vào việc tạo ra một trò chơi indie của riêng mình.
Sau khi trò chơi ra mắt, tôi liên tục nhận được phản hồi từ các nhà phát triển trò chơi đầy khát vọng, những người luôn ấp ủ những ý tưởng trò chơi tuyệt vời, nhưng đã từ bỏ vì lập trình trông quá khó. Nếu việc chơi One Dreamer khiến họ nhận ra lập trình không khó như họ nghĩ và bạn không cần phải là một thiên tài để tạo ra một trò chơi, thì tôi nghĩ One Dreamer đã thực hiện được sứ mệnh của mình.
Anh có đề xuất nào về một công cụ hay hướng dẫn để bắt đầu học lập trình không?
Như tôi đã nói trước đây, tôi thích học hỏi qua kinh nghiệm. Vì vậy tôi khuyên bạn nên tự đọc hướng dẫn và thử lập trình một trò chơi đơn giản như Pong hoặc Flappy Bird (giống như Frank và Luna đã làm trong One Dreamer). Tôi không thể giới thiệu một hướng dẫn cụ thể vì nó sẽ phụ thuộc vào công cụ trò chơi mà bạn sử dụng. Ví dụ, nếu bạn muốn sử dụng C#, bạn có thể sử dụng Unity. Nếu không, bạn chỉ cần Google công cụ trò chơi của bạn và "hướng dẫn Pong", tôi sẵn sàng đặt cược kết quả đầu tiên là chính là địa chỉ tốt nhất để bắt đầu. Sau đó, hãy thử thêm các tính năng mới như tùy chọn màu sắc, quả bóng thứ hai, chế độ hai người chơi, v.v. trước khi chuyển sang các trò chơi nâng cao.
Dịch bởi Trịnh Quỳnh Dung từ gamedeveloper.com