গতি পরিবর্তনের জন্য, আমি কিছুটা ডেভ লগ করতে চাই। কিছু সময় আগে, আমি একটি গেম জ্যামে অংশ নিয়েছিলাম এবং এই গেমটি তৈরি করেছি – অফ মাইস অ্যান্ড ব্যাড চয়েস – একটি ছোট ধাঁধা খেলা, যেখানে আপনি ইঁদুরগুলিকে প্রলুব্ধ করার জন্য গোলকধাঁধার চারপাশে পনির রাখুন। এটা মজার ছিল, কিন্তু স্পষ্টতই কিছু ত্রুটি ছিল.
অন্যতম প্রধান হল ইঁদুরের আচরণ অজ্ঞাত। খেলোয়াড়রা উল্লেখ করেছে যে তারা আশা করবে ইঁদুরগুলিকে একটি অপছন্দনীয় পনির দ্বারা তাড়ানো হবে, শুধু হিমায়িত নয়। এছাড়াও, এই মেকানিকটি বাস্তবায়ন করলে অনেক বেশি সমৃদ্ধ ধাঁধা ডিজাইনের জন্য অনুমতি দেবে।
সুতরাং, আমি মনে করি এটি একটি ভাল সুযোগ কিভাবে গডোতে স্বয়ংক্রিয় পরীক্ষা করা যায়।
কিছু টেস্টিং ফ্রেমওয়ার্ক আছে যা Godot 4 এর জন্য উপলব্ধ, কিন্তু যেটি আমার I ধরল তা হল Godot Unit Test (GUT) । GUT বেশ সহজ:
test_
দিয়ে শুরু করে ফাংশন যোগ করুন এবং কিছু দাবী লিখুন - সাধারণ ইউনিট পরীক্ষার কাঠামো।
এই বিশেষ ক্ষেত্রে, আমি জটিল পরিস্থিতি সংজ্ঞায়িত করার একটি উপায় চাই, একইভাবে আমি গেমের জন্য স্তরগুলিকে সংজ্ঞায়িত করি - কোডের পরিবর্তে ইঞ্জিন সম্পাদকে (এইভাবে, পরীক্ষাগুলি বাস্তবতার কাছাকাছি হবে)। অতএব, আমি এই জিনিসগুলি করতে চাই:
সুতরাং, এর এই unwrap করা যাক.
আসুন একটি নতুন শ্রেণী `মাউসটেস্টকেস` সংজ্ঞায়িত করি। আমরা এটিকে 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 আপনি নির্দিষ্ট পিআরও দেখতে পারেন যা পরীক্ষার প্রবর্তন করে। বোনাস পয়েন্টের জন্য, কেউ যদি তাদের CI-এ কাজ করতে পারে, তাহলে সেটা হবে দারুণ। চিয়ার্স।