गति में बदलाव के लिए, मैं थोड़ा सा डेव लॉग बनाना चाहूँगा। कुछ समय पहले, मैंने एक गेम जैम में भाग लिया था और इस गेम को बनाया था - चूहों और बुरे विकल्पों का - एक छोटा पहेली गेम, जहां आप चूहों को लुभाने के लिए भूलभुलैया के चारों ओर पनीर रखते हैं। यह मजेदार था, लेकिन जाहिर तौर पर इसमें कुछ कमियां भी थीं।
उनमें से एक प्रमुख यह है कि चूहों का व्यवहार सहज नहीं होता। खिलाड़ियों ने उल्लेख किया कि वे उम्मीद करेंगे कि चूहों को नापसंद पनीर से खदेड़ा जाएगा, न कि सिर्फ फ्रीज से। साथ ही, इस मैकेनिक को लागू करने से अधिक समृद्ध पहेली डिज़ाइन की अनुमति मिलेगी।
इसलिए, मुझे लगता है कि यह एक अच्छा अवसर है कि गोडोट में स्वचालित परीक्षण कैसे किया जा सकता है।
कुछ परीक्षण ढाँचे हैं जो गोडोट 4 के लिए उपलब्ध हैं, लेकिन जिसने मेरी पकड़ बनाई वह गोडोट यूनिट टेस्ट (जीयूटी) है। GUT बहुत सरल है:
test_
से शुरू होने वाले फ़ंक्शन जोड़ें और कुछ अभिकथन लिखें - विशिष्ट इकाई परीक्षण संरचना।
इस विशेष मामले के लिए, मैं जटिल परिदृश्यों को परिभाषित करने का एक तरीका चाहता था, उसी तरह जैसे मैं खेल के लिए स्तरों को परिभाषित करता हूं - कोड के बजाय इंजन संपादक में (इस तरह, परीक्षण वास्तविकता के करीब होंगे)। इसलिए, मैं ये चीजें करना चाहता हूं:
तो, आइए इसे खोलें।
आइए एक नए वर्ग 'माउसटेस्टकेस' को परिभाषित करें। हम चाहते हैं कि यह Node2D
को इनहेरिट करे (जैसा कि हम इसे एक दृश्य पर रखना चाहते हैं। और हम चाहते हैं कि यह अपने बच्चों को ढूंढे (जिन्हें हम स्वयं एक दृश्य पर रखेंगे): एक माउस और इसकी अपेक्षित अंतिम स्थिति (एक मार्कर के रूप में)
extends Node2D class_name MouseTestCase @export var steps_left = 0 # How many steps to simulate @export var done = false @onready var mouse: Mouse = $Mouse @onready var expected_position = SnapUtils.get_tile_map_position($TestMarker.position)
अब, हम इसे एक दृश्य पर रख सकते हैं, और हम अच्छे हैं! हम जानते हैं कि चूहा कहाँ से शुरू होता है, हम जानते हैं कि उसे कहाँ समाप्त होना चाहिए, और कितने चरणों में।
अब, आइए उनमें से कुछ और बनाएं, और हमारे विकर्षक व्यवहार का परीक्षण करने के लिए एक मानचित्र बनाएं।
यह व्यवहार कुछ हद तक जटिल है, इसलिए, हम कई अलग-अलग मामलों को कवर करना चाहते हैं:
इस व्यवहार को कवर करने के लिए 12 परीक्षण मामलों को परिभाषित करने वाला परिणामी मानचित्र ऊपर दिखाया गया है (कल्पना करें कि कोड में उन सभी निर्देशांकों को हार्ड कोड करना कितना कठिन हो सकता है)।
केवल टेस्ट रनर फ़ंक्शन ही करना बाकी है। फ़ंक्शन की आवश्यकता है:
कोड काफी सरल है.
func run_level_with_mouse_test_cases(map_path: String): var level = load(map_path) map.load_level(level) var cases = MouseTestCase.cast_all_cases(get_tree().get_nodes_in_group(MouseTestCase.MTC_GROUP_NAME)) while (cases.any(func(case): return not case.done)): map.move_mice() for case in cases: if not case.done: case.steps_left -= 1 if case.steps_left == 0: case.done = true assert_eq(case.get_mouse_position(), case.expected_position, case.get_parent().name+"/"+case.name)
मुझे लगता है कि यह विकसित होगा, लेकिन वर्तमान कार्यान्वयन अभी के लिए काफी अच्छा है। मैंने परीक्षण लिखे हैं, मैकेनिक लागू किया है, और परीक्षण वास्तव में पुष्टि करते हैं कि मैकेनिक सही ढंग से लागू किया गया है!
यहां, मैंने खेलों में परीक्षणों तक पहुंचने का एक तरीका दिखाया है। जाहिर है, यहां सुधार करने के लिए और भी बहुत सी चीजें हैं, और मैं पाठकों को कोड और फ्रेमवर्क लेने और इसे अपनी आवश्यकताओं के अनुसार अनुकूलित करने के लिए प्रोत्साहित करता हूं।
हमेशा की तरह, कोड GitHub पर उपलब्ध है: https://github.com/d-lowl/of-mice-and- Bad-choices आप उस विशिष्ट पीआर पर भी नज़र डाल सकते हैं जो परीक्षण पेश करता है। बोनस अंकों के लिए, यदि कोई उन्हें सीआई में काम करवा सके, तो यह शानदार होगा। प्रोत्साहित करना।