থ্রেডিং ছাড়াই স্ক্রিপ্টিং এবং সিনেমাটিক্স


12

আমি কীভাবে আমার গেম ইঞ্জিনে স্ক্রিপ্টিং বাস্তবায়নের সাথে লড়াই করছি। আমার কেবল কয়েকটি প্রয়োজনীয়তা রয়েছে: এটি স্বজ্ঞাত হওয়া উচিত, আমি কোনও কাস্টম ভাষা, পার্সার এবং দোভাষী লিখতে চাই না এবং থ্রেডিং ব্যবহার করতে চাই না। (আমি নিশ্চিত যে এর আরও সহজ সমাধান আছে; আমার একাধিক গেম লজিক থ্রেডের ঝামেলা দরকার নেই)) পাইথনের (ওরফে সিউডোকোড) এখানে একটি উদাহরণ স্ক্রিপ্ট রয়েছে:

def dramatic_scene(actors):
    alice = actors["alice"]
    bob = actors["bob"]

    alice.walk_to(bob)
    if bob.can_see(alice):
        bob.say("Hello again!")
    else:
        alice.say("Excuse me, Bob?")

গল্প বলার সেই মহাকাব্যটি বাস্তবায়নের সমস্যা তৈরি করে। আমি কেবল একবারে পুরো পদ্ধতিটি মূল্যায়ন করতে পারি না, কারণ walk_toগেমের সময় লাগে। যদি এটি এখনই ফিরে আসে, অ্যালিস ববের দিকে হাঁটা শুরু করবে এবং (একই ফ্রেমে) হ্যালো বলবে (বা অভিনন্দন জানাবে)। তবে যদি walk_toসে কোনও ব্লকিং কল আসে যা সে ববকে পৌঁছানোর পরে ফিরে আসে, তবে আমার খেলা আটকে যায়, কারণ এটি মৃত্যুদন্ড কার্যকর করার একই থ্রেডকে ব্লক করে যা অ্যালিসকে হাঁটাচলা করে।

আমি প্রতিটি ক্রিয়াকলাপটিকে একটি ক্রিয়া তৈরি করার বিষয়টি বিবেচনা করেছিলাম - alice.walk_to(bob)কোনও বস্তুকে একটি কাতারে ঠেকিয়ে দেব, যা এলিস ববয়ের কাছে পৌঁছে যাওয়ার পরে পপ আপ হয়ে যাবে, যেখানেই সে ছিল। এটি আরও সূক্ষ্মভাবে ভেঙে গেছে: ifশাখাটি অবিলম্বে মূল্যায়ন করা হয়, সুতরাং বব অ্যালিসের পিছনে ফিরে গেলেও তাকে শুভেচ্ছা জানাতে পারে।

অন্যান্য ইঞ্জিন / লোকেরা থ্রেড তৈরি না করে স্ক্রিপ্টিং পরিচালনা করে কীভাবে? আমি jQuery অ্যানিমেশন চেইনের মত নন-গেম-দেব অঞ্চলে, ধারণাগুলির জন্য দেখতে শুরু করছি। দেখে মনে হচ্ছে এই ধরণের সমস্যার জন্য কিছু ভাল নিদর্শন থাকা উচিত।


1
প্রশ্নের জন্য +1 তবে বিশেষত "পাইথন (ওরফে সিউডোকোড)" এর জন্য :) :)
রিকিট

পাইথন হ'ল পরাশক্তি থাকার মতো।
ojrac

উত্তর:


3

পান্ডার মতো কিছু এর মাধ্যমে কলব্যাক করে with ব্লক করার পরিবর্তে এটি এমন কিছু হবে

def dramatic_scene(actors):
    alice = actors["alice"]
    bob = actors["bob"]

    def cb():
        if bob.can_see(alice):
            bob.say("Hello again!")
        else:
            alice.say("Excuse me, Bob?")
    alice.walk_to(bob, cb)

সম্পূর্ণ-পূর্ণ কলব্যাক থাকা আপনাকে এই ধরণের ইভেন্টগুলি যতটা গভীরভাবে চান তত চেইন করতে দেয়।

সম্পাদনা: জাভাস্ক্রিপ্ট উদাহরণ যেহেতু এই স্টাইলের জন্য আরও ভাল বাক্য গঠন রয়েছে:

function dramatic_scene(actors) {
    var alice = actors.alice;
    var bob = actors.bob;
    alice.walk_to(bob, function() {
        if(bob.can_see(alice)) {
            bob.say('Hello again!');
        } else {
            alice.say('Excuse me, Bob?');
        }
     });
}

এটি একটি +1 এর জন্য যথেষ্ট কাজ করে, আমি কেবলমাত্র মনে করি বিষয়বস্তু ডিজাইনের ক্ষেত্রে এটি ভুল। আমি আমার শেষ দিকে কিছু অতিরিক্ত কাজ করতে ইচ্ছুক যাতে স্ক্রিপ্টগুলি সহজ এবং পরিষ্কার হয়ে যায়।
ojrac

1
@ প্রকল্প: আসলে এই উপায়টি আরও ভাল, কারণ এখানে একই স্ক্রিপ্টে আপনি একাধিক অভিনেতাকে একই সাথে হাঁটা শুরু করতে বলতে পারেন।
বার্ট ভ্যান হিউকেলোম

উঘ, ভাল পয়েন্ট।
ojrac

পাঠযোগ্যতার উন্নতি করার জন্য, কলব্যাক সংজ্ঞাটি ওয়াক_টো () কলের অভ্যন্তরে বা তার পরে রেখে দেওয়া যেতে পারে (উভয়ের জন্য: যদি ভাষাটি সমর্থন করে) যাতে পরে যে কোডটি কল হয় সেটি উত্সটিতে পরে দেখা যায়।
বার্ট ভ্যান হিউকেলোম

হ্যাঁ, দুর্ভাগ্যক্রমে পাইথন এই জাতীয় সিনট্যাক্সের জন্য সত্যই দুর্দান্ত নয়। এটি জাভাস্ক্রিপ্টে খুব সুন্দর দেখাচ্ছে (উপরে দেখুন, এখানে কোড ফর্ম্যাটিং ব্যবহার করতে পারবেন না)।
কোডরেঞ্জার

13

আপনি এখানে যে শব্দটি অনুসন্ধান করতে চান তা হ'ল " কর্টাইনস " (এবং সাধারণত ভাষার কীওয়ার্ড বা ফাংশনটির নাম yield)।

Coroutines হ'ল প্রোগ্রাম উপাদান যা সাবরোটাইনগুলিকে সাধারণ স্থানে নির্দিষ্ট স্থানে স্থগিতকরণ এবং পুনরায় শুরু করার জন্য একাধিক এন্ট্রি পয়েন্টগুলিকে অনুমতি দেয়।

প্রয়োগটি প্রথমে আপনার ভাষার উপর নির্ভর করবে। একটি গেমের জন্য আপনি বাস্তবায়নটি যতটা সম্ভব হালকা ওজনের হতে চান (থ্রেড বা এমনকি ফাইবারের চেয়ে হালকা)। উইকিপিডিয়া পৃষ্ঠায় (লিঙ্কযুক্ত) বিভিন্ন ভাষা-নির্দিষ্ট প্রয়োগের কিছু লিঙ্ক রয়েছে।

শুনেছি লুয়ার কার্টাইনগুলির জন্য অন্তর্নির্মিত সমর্থন রয়েছে। গেমমনকিও তাই করে।

অবাস্তব স্ক্রিপ্ট এটিকে "স্টেটস" এবং "সুপ্ত ফাংশন" বলে ডাকে এটি প্রয়োগ করে।

আপনি যদি সি # ব্যবহার করেন আপনি নিক গ্র্যাভলিনের এই ব্লগ পোস্টটি দেখতে পারেন।

অতিরিক্ত হিসাবে "অ্যানিমেশন চেইন" ধারণাটি একই জিনিস নয়, একই সমস্যাটির কার্যক্ষম সমাধান। নিক গ্রেভেলিনও এর একটি সি # বাস্তবায়ন করেছেন ।


দুর্দান্ত ক্যাচ, টেট্রাড;)
অ্যান্ড্রু রাসেল

এটি সত্যিই ভাল, তবে আমি নিশ্চিত নই যে এটি আমাকে সেখানে 100% পথ পেয়েছে। দেখে মনে হচ্ছে কর্টিনগুলি আপনাকে কলিং পদ্ধতিতে উপার্জন করতে দেয় তবে আমি লুয়া স্ক্রিপ্ট থেকে উপার্জনের একটি উপায় চাই, পুরো পথ দিয়ে সি # কোড পর্যন্ত স্ট্যাক আপ না করে (ওয়াক_টো ()! = সম্পন্ন) {ফলন}}
ojrac

@ প্রকল্প: লুয়া সম্পর্কে আমি জানি না, তবে আপনি যদি নিক গ্রেভলিনের সি # পদ্ধতি ব্যবহার করছেন তবে আপনি কোনও প্রতিনিধি (বা একটি উপাদান যুক্ত) ফিরিয়ে দিতে পারেন যা আপনার স্ক্রিপ্ট ব্যবস্থাপকের শর্তসাপেক্ষে পরীক্ষা করতে পারে (নিকের কোডটি কেবল একটি সময় দেয়) যা স্পষ্টত শর্তসাপেক্ষ)। এমনকি আপনি সুপ্ত কার্যাবলী নিজেই প্রতিনিধিকে ফিরিয়ে দিতে পারেন, যাতে আপনি লিখতে পারেন: yield return walk_to();আপনার স্ক্রিপ্টে।
অ্যান্ড্রু রাসেল

সি # তে ফলন দুর্দান্ত, তবে আমি সহজ, হার্ড-টু-মেস-আপ স্ক্রিপ্টিংয়ের জন্য আমার সমাধানটি অনুকূলিত করছি। ফলনের চেয়ে কলব্যাক্স ব্যাখ্যা করার জন্য আমার আরও সহজ সময় থাকবে, তাই আমি অন্য উত্তরটি গ্রহণ করব। আমি পারলে +2 করতাম।
ojrac

1
আপনাকে সাধারণত ফলন কলটি ব্যাখ্যা করতে হবে না - উদাহরণস্বরূপ, আপনি "ওয়াক_ টু" ফাংশনে এটি মোড়ানো করতে পারেন।
কাইলোটন

3

থ্রেড না করা স্মার্ট।

বেশিরভাগ গেম ইঞ্জিনগুলি প্রতিটি পর্যায়ে মেমরি ড্রাইভিংয়ের স্টাফ সহ একাধিক মডুলার পর্যায় হিসাবে কাজ করে। আপনার 'উদাহরণস্বরূপে চলুন' এর জন্য, আপনার সাধারণত একটি এআই পর্যায় থাকে যেখানে আপনার হাঁটার অক্ষরগুলি এমন অবস্থায় থাকে যেখানে তারা শত্রুদের হত্যা করার সন্ধান না করে, একটি অ্যানিমেশন স্টেজ যেখানে অ্যানিমেশন এক্স চালানো উচিত, একটি পদার্থবিজ্ঞানের স্টেজ (বা সিমুলেশন স্টেজ) যেখানে তাদের আসল অবস্থান আপডেট হয় ইত্যাদি

আপনার উপরের উদাহরণে, 'এলিস' এমন একটি অভিনেতা যা টুকরো দ্বারা গঠিত যা এই বেশিরভাগ পর্যায়ে থাকে তাই কোনও ব্লকিং অভিনেতা .ওয়াক_কে কল করুন (বা আপনি যে ফ্রেমে প্রতি ফ্রেমে একবার () পরের দিকে কল করবেন) সম্ভবত যথাযথ প্রসঙ্গটি থাকবে না অনেক সিদ্ধান্ত নিতে।

পরিবর্তে, একটি 'start_walk_to' ফাংশন সম্ভবত কিছু করতে পারে:

def start_cutscene_walk_to(actor,target):
    actor.ai.setbrain(cutscene_brain)
    actor.physics.nocoll = 1
    actor.anims.force_anim('walk')
    # etc.

তারপরে, আপনার মূল লুপটি তার আই টিক, এটির পদার্থবিজ্ঞানের টিক, এটির অ্যানিমেশন টিক এবং তার কাটসিন টিক চালায় এবং কুতসিন আপনার ইঞ্জিনের প্রতিটি সাবসিস্টেমের জন্য স্থিতি আপডেট করে। Cutscene সিস্টেম অবশ্যই তার প্রতিটি cutscenes করছে তা ট্র্যাক করা উচিত, এবং custscene মত রৈখিক এবং নির্বিচারবাদী কিছু জন্য একটি কর্টিন চালিত সিস্টেম বুঝতে পারে।

এই পরিমিতরতার কারণ হ'ল এটি কেবল জিনিসগুলি সুন্দর এবং সাধারণ রাখে এবং কিছু সিস্টেমের জন্য (যেমন পদার্থবিজ্ঞান এবং এআই) আপনার জিনিসগুলি সঠিকভাবে সমাধান করতে এবং গেমটিকে ধারাবাহিক অবস্থায় রাখতে একই সময়ে সমস্ত কিছুর অবস্থা জানতে হবে need ।

আশাকরি এটা সাহায্য করবে!


আপনি যা যাচ্ছেন তা আমি পছন্দ করি তবে আমি অভিনেতা.ওয়ালক_কে ([অন্য অভিনেতা, একটি নির্দিষ্ট অবস্থান, এমনকি এমন কোনও ফাংশন যা কোনও অবস্থানে ফিরে আসে]) সম্পর্কে আমি দৃ strongly়ভাবে অনুভব করি। আমার লক্ষ্য হ'ল সহজ, বোধগম্য সরঞ্জাম সরবরাহ এবং গেমের সামগ্রী তৈরির অংশ থেকে সমস্ত জটিলতা পরিচালনা করে। আপনি আমাকে বুঝতেও সহায়তা করেছিলেন যে আমি সত্যই যা চাই তা হ'ল প্রতিটি স্ক্রিপ্টকে একটি সীমাবদ্ধ রাষ্ট্রের মেশিন হিসাবে বিবেচনা করা।
ojrac

আমি সাহায্য করতে পেরে আনন্দিত! আমি অনুভব করেছি যে আমার প্রতিক্রিয়াটি একটি সামান্য বিষয় :)
অ্যারন ব্র্যাডি

দেখে মনে হচ্ছে আমি কলব্যাক এবং শৃঙ্খলিত ফাংশনগুলির একটি jQuery- শৈলীর মিশ্রণ নিয়ে যাব। গৃহীত উত্তর দেখুন;)
ojrac
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.