টার্ন ভিত্তিক গেমটিতে বিশ্ব রাষ্ট্র এবং অ্যানিমেশন পৃথকীকরণ


9

আপনি কীভাবে একটি পালা ভিত্তিক গেমের মধ্যে বিশ্ব রাষ্ট্র থেকে অ্যানিমেশনটির বিচ্ছেদকে পরিচালনা করবেন? আমি বর্তমানে একটি 2 ডি গ্রিড ভিত্তিক গেমের সাথে কাজ করছি। নীচের কোডটি আরও ভালভাবে ব্যাখ্যা করার জন্য সরল করা হয়েছে।

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

আমি যা করেছি তা হ'ল দুই প্রকারের অ্যানিমেশনগুলি, যা আমি ব্লকিং অ্যানিমেশন এবং অ-ব্লকিং অ্যানিমেশনগুলিকে কল করি। প্লেয়ারটি যখন সরে যেতে চায়, তখন কোডটি কার্যকর হয়

class Actor {
    void move(PositionInfo oldPosition, PositionInfo newPosition) {
        if(isValidMove(oldPosition, newPosition) {
             getGame().pushBlockingAnimation(new MoveAnimation(this, oldPosition, newPosition, ....));
             player.setPosition(newPosition);
        }
    }
}

তারপরে মূল আপডেট লুপটি করে:

class Game {
    void update(float dt) {
        updateNonBlockingAnimations(dt); //Effects like particle explosions, damage numbers, etc. Things that don't block the flow of turns.
        if(!mBlockingAnimations.empty()) {
            mBlockingAnimations.get(0).update(dt);
        } else {
             //.. handle the next turn. This is where new animations will be enqueued..//
        }
        cleanUpAnimations(); // remove finished animations
    }
}

... যেখানে অ্যানিমেশন অভিনেতার পর্দার অবস্থান আপডেট করে।

আরেকটি ধারণা যা আমি প্রয়োগ করছি তা হল একটি একযোগে অবরুদ্ধ অ্যানিমেশন থাকা, যেখানে একাধিক ব্লকিং অ্যানিমেশন একসাথে আপডেট করা হত, তবে পরবর্তী বারটি সমস্ত না হওয়া পর্যন্ত ঘটবে না।

এটি কি জিনিসগুলি করার মতো বুদ্ধিমান উপায় বলে মনে হচ্ছে? কারও কি কোনও পরামর্শ, বা অন্যান্য অনুরূপ গেমগুলি কীভাবে এই জাতীয় কাজ করে তার উল্লেখ রয়েছে re

উত্তর:


2

যদি আপনার সিস্টেমটি আপনার পক্ষে কাজ করে তবে আমি এটি না করার কোনও কারণ দেখতে পাচ্ছি না।

ঠিক আছে, একটি কারণ: আপনি যখন "প্লেয়ার.সেটপজিশন (নতুন অবস্থান)" এর পরিণতিগুলি সহজে বিচার করতে না পারেন তখন অগোছালো হতে পারে; আর।

উদাহরণ (সবেমাত্র জিনিস তৈরি করা): কল্পনা করুন যে আপনি খেলোয়াড়টিকে কিছুটা ফাঁদের উপরে আপনার সেটপজিশন দিয়ে সরিয়ে নিয়েছেন। "প্লেয়ার.সেটপজিশন" -এর কল নিজেই অন্য কিছু কলকে ট্রিগার করবে .. বলুন এমন একটি ট্র্যাপ শ্রোতা কোড যা নিজেই একটি ব্লকিং অ্যানিমেশনকে ধাক্কা দেয় যা নিজের উপরে "আঘাতকারী স্প্ল্যাশ" প্রদর্শন করে।

আপনি সমস্যাটি দেখুন: স্প্ল্যাশটি প্লেয়ারের ফাঁদে যাওয়ার সাথে সাথে একযোগে প্রদর্শিত হবে । (এখানে ধরে নেওয়া যাক আপনি এটি চান না, তবে সরানো শেষ হওয়ার পরে ট্র্যাপ অ্যানিমেশনটি খেলতে চান;)))

সুতরাং যতক্ষণ আপনি আপনার ক্রিয়াকলাপের সমস্ত পরিণতি মাথায় রাখতে সক্ষম হন যে আপনি এই "পুশব্লকিংঅ্যানিমেশন" কল করার পরে করেন না , সবকিছু ঠিক আছে।

আপনার "গেম যুক্তি" কিছু "ব্লক করা" - ক্লাসগুলিতে গুটিয়ে নেওয়া শুরু করতে পারে যাতে অ্যানিমেশন শেষ হওয়ার পরে তাদের ক্রিয়াকলাপ করা যায়। বা আপনি একটি কলব্যাক "কলটিসএফটারএনিমেশনফিনিশস" পুশব্লকিং অ্যানিমেশনটিতে পাস করুন এবং সেটপজিশনটিকে কলব্যাক ফাংশনে সরান।

অন্য পদ্ধতির ভাষা স্ক্রিপ্টিং হবে। উদাহরণস্বরূপ লুয়ার "Coroutine.yeld" রয়েছে যা একটি বিশেষ রাষ্ট্রের সাথে ফাংশনটি ফিরিয়ে দেয় যাতে পরবর্তী বিবৃতিতে চালিয়ে যাওয়ার জন্য এটি পরে বলা যেতে পারে। এইভাবে আপনি সহজেই আপনার কোডটির "সাধারণ" প্রোগ্রামের প্রবাহের চেহারাটিকে বিশৃঙ্খলা না করে গেম লজিক চালানোর জন্য অ্যানিমেশনটির শেষের জন্য সহজেই অপেক্ষা করতে পারেন। (এর অর্থ আপনার কোডটি এখনও "প্লেঅ্যানিমেশন (); সেটপজিশন ();" এর মতো কলব্যাকগুলি পাস করার পরিবর্তে এবং একাধিক ফাংশনগুলিতে গেম যুক্তি বিশৃঙ্খলার পরিবর্তে কিছুটা দেখতে লাগবে)।

ইউনিটি 3 ডি (এবং কমপক্ষে অন্য একটি গেম সিস্টেমটি আমি জানি) এটি সি # কোডে সরাসরি অনুকরণ করতে সি # "ফলন ফেরত" বিবৃতি বৈশিষ্ট্যযুক্ত।

// instead of simple call to move(), you have to "iterate" it in a foreach-like loop
IEnumerable<Updatable> move(...) {
    // playAnimation returns an object that contain an update() and finished() method.
    // the caller will not iterate over move() again until the object is "finished"
    yield return getGame().playAnimation(...)
    // the next statement will be executed *after* the animation finished
    player.setPosition(newPosition);
}

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

আমি আপনাকে বাস্তব-বিশ্বব্যাপী সমস্যা না হওয়া অবধি আপনার পুশব্লকিং অ্যানিমেশন ধারণাটি আটকে রাখার পরামর্শ দিচ্ছি। তারপরে এটি পরিবর্তন করুন। ;)


এই প্রতিক্রিয়াটি লেখার জন্য সময় দেওয়ার জন্য আপনাকে অনেক ধন্যবাদ, আমি সত্যই এটির প্রশংসা করি।
mdkess
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.