গেমগুলিতে সময় বিপরীত ব্যবস্থা


10

গেমগুলিতে কীভাবে সময় হেরফের করার পদ্ধতিগুলি সাধারণত ডিজাইন করা হয় তা নিয়ে আমি ভাবছি। আমি সময় বিপরীতে বিশেষত আগ্রহী (সর্বশেষতম এসএসএক্স বা পার্সিয়ার রাজপুত্রের মতো)।

গেমটি 2 ডি টপ ডাউন শ্যুটার।

আমি যে পদ্ধতিটি ডিজাইন / বাস্তবায়নের চেষ্টা করছি তার নিম্নলিখিত প্রয়োজনীয়তা রয়েছে:

1) প্লেয়ার চরিত্র বাদে সত্তার ক্রিয়াকলাপগুলি সম্পূর্ণ নির্দোষ।

  • কোনও সত্তা যে ক্রিয়াটি গ্রহণ করে তা স্তরের সূচনা এবং / বা পর্দার প্লেয়ারের অবস্থানের পরে অগ্রসর হওয়া ফ্রেমের উপর ভিত্তি করে
  • স্তরের সময় নির্ধারিত সময়ে সত্ত্বা তৈরি হয়।

2) টাইম রিভার্স রিয়েলটাইমে ফিরে গিয়ে কাজ করে।

  • প্লেয়ার ক্রিয়াগুলিও বিপরীত হয়, এটি খেলোয়াড় যা করেছে তার বিপরীতে পুনরায় প্রদর্শন করে lays বিপরীত সময়ে প্লেয়ারের কোনও নিয়ন্ত্রণ থাকে না।
  • বিপরীতে ব্যয় করা সময়টির কোনও সীমা নেই, আমরা চাইলে স্তরের শুরুতে সমস্ত পথ উল্টাতে পারি।

উদাহরণ হিসাবে:

ফ্রেম 0-50: এই মুহূর্তে প্লেয়ার 20 ইউনিটকে সরিয়ে রাখে শত্রু 1 ফ্রেম 20-এ শত্রু 1 টি ফ্রেম 30-40 চলাকালীন 10 ইউনিট রেখে যায় প্লেয়ার 45 টি ফ্রেভারে বুলেট অঙ্কুরিত হয় এবং বুলেটটি 5 ফোরওয়ার্ডে (45-50) যাত্রা করে এবং এনিমে 1 কে হত্যা করে ফ্রেম 50

এটির বিপরীতটি রিয়েলটাইমে ফিরে আসবে: প্লেয়ার এই সময় 20 টি ইউনিট পিছনে চলে যায় শত্রু 1 ফ্রেম 50 এ পুনর্জীবন ঘটে বুলেটটি ফ্রেম 50 এ ফিরে আসে বুলেটটি পিছনের দিকে 5 এবং অদৃশ্য হয়ে যায় (50-45) শত্রু চালগুলি বাম 10 (40-30) এ সরানো হয় ফ্রেম 20।

কেবল আন্দোলনটির দিকে তাকিয়ে আমার কীভাবে এটি অর্জন করা যায় সে সম্পর্কে কিছু ধারণা ছিলাম, আমি এমন একটি ইন্টারফেস রাখার কথা ভেবেছিলাম যে সময়ের অগ্রগতি বা বিপরীত সময়ে আচরণের পরিবর্তন ঘটে। এর মতো কিছু করার পরিবর্তে:

void update()
{
    movement += new Vector(0,5);
}

আমি এই জাতীয় কিছু করব:

public interface movement()
{
    public void move(Vector v, Entity e);
}

public class advance() implements movement
{
    public void move(Vector v, Entity e)
    {
            e.location += v;
    }
}


public class reverse() implements movement
{
    public void move(Vector v, Entity e)
    { 
        e.location -= v;
    }
}

public void update()
{
    moveLogic.move(new vector(5,0));
}

তবে আমি বুঝতে পেরেছি যে এটি সর্বোত্তম কর্মক্ষমতা অনুযায়ী হবে না এবং আরও অগ্রিম ক্রিয়াকলাপগুলির জন্য দ্রুত জটিল হয়ে উঠবে (যেমন বাঁকা পথগুলিতে মসৃণ চলাচল ইত্যাদি)।


1
আমি এই সমস্ত (ইউটিউব নড়বড়ে ক্যাম, 1.5 ঘন্টা) দেখিনি , তবে জোনাথন ব্লো সম্পর্কে কিছু ধারণা থাকতে পারে তার গেম ব্রিডে এটি কাজ করেছিল।
মাইকেলহাউস

উত্তর:


9

আপনি কমান্ড প্যাটার্নটি একবার দেখে নিতে পারেন ।

মূলত আপনার সত্তা গ্রহণ করে এমন প্রতিটি বিপর্যয়মূলক ক্রিয়া কমান্ড অবজেক্ট হিসাবে প্রয়োগ করা হয়। এই সমস্ত অবজেক্টস কমপক্ষে 2 টি পদ্ধতি প্রয়োগ করে: কার্যকর করুন () এবং পূর্বাবস্থায় ফেরান (), এবং আরও যা কিছু আপনার প্রয়োজন, সঠিক সময়ের জন্য সময় স্ট্যাম্প সম্পত্তি হিসাবে।

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

আপনি কোনও ক্রিয়াকলাপের পরে, কোনও পাঠ্য সম্পাদক বা পেইন্ট প্রোগ্রামের পূর্বাবস্থায় / পুনরায় ফাংশনের মতো আপনি ইচ্ছামতো সামনে এবং পিছনের দিকে যেতে চাইলে একটি পুনরায় স্ট্যাকে সংরক্ষণ করুন। অবশ্যই, আপনার অ্যানিমেশনগুলিকে পিছনে পিছনে খেলতে "রিওয়াইন্ড" মোডকে সমর্থন করতে হবে।

আরও গেম ডিজাইনের শেননিগানগুলির জন্য, প্রতিটি সত্তা তার নিজস্ব স্ট্যাকগুলিতে তার ক্রিয়াকলাপগুলি সংরক্ষণ করুন, যাতে আপনি একে অপরের সাথে স্বাধীনভাবে এটিকে পূর্বাবস্থায় / পূর্বাবস্থায় ফিরিয়ে আনতে পারেন।

একটি কমান্ড প্যাটার্নের আরও সুবিধাগুলি রয়েছে: উদাহরণস্বরূপ, রিপ্লে রেকর্ডার তৈরি করা এটি বেশ তুচ্ছ, কারণ আপনাকে কেবল স্ট্যাকের সমস্ত বস্তু একটি ফাইলে সংরক্ষণ করতে হবে এবং পুনরায় খেলতে গিয়ে কেবল একে একে গেম ইঞ্জিনে খাওয়াতে হবে need এক.


2
নোট করুন যে কোনও গেমের ক্রিয়াকলাপগুলির পরিবর্তনগুলি খুব স্পর্শকাতর জিনিস হতে পারে কারণ ভাসমান-পয়েন্ট যথার্থ সমস্যা, পরিবর্তনশীল টাইমস্টেপ ইত্যাদির কারণে; এটি বেশিরভাগ পরিস্থিতিতে পুনর্নির্মাণের চেয়ে সেই রাষ্ট্রটি সংরক্ষণ করা অনেক বেশি নিরাপদ।
স্টিভেন স্টাডনিকি

@ স্টিভেনস্ট্যাডনিকি সম্ভবত, তবে এটি অবশ্যই সম্ভব। আমার মাথার উপরের অংশটি সি, সি জেনারেলরা এভাবেই করেন। এটিতে 8 টি প্লেয়ারের ঘন্টা-দীর্ঘ রিপ্লে রয়েছে, এটি কয়েক শ কেবি ওজনের মধ্যে সবচেয়ে খারাপ হয় এবং এটি সমস্তরকম আরটিএস গেমগুলি যদি তাদের মাল্টিপ্লেয়ার না করে তবে আমি সবচেয়ে বেশি অনুমান করি: আপনি কেবলমাত্র সম্পূর্ণ গেমের রাজ্যকে সম্ভাব্য শত শত দিয়ে প্রেরণ করতে পারবেন না প্রতিটি ফ্রেমের ইউনিটগুলির জন্য, আপনাকে ইঞ্জিনটিকে আপডেটিং করতে দিতে হবে। হ্যাঁ, এটি অবশ্যই কার্যকর।
হ্যাকওয়ার্থ

3
রিপ্লে রিওয়াইন্ডের থেকে একেবারে আলাদা জিনিস, কারণ ক্রমাগত পুনরুত্পাদনযোগ্য ফরোয়ার্ড করা অপারেশনগুলি (উদাহরণস্বরূপ, x_0 = 0 দিয়ে শুরু করে এবং প্রতিটি পদক্ষেপের জন্য ডেল্টাস ভি_এন যোগ করে ফ্রেম এন, x_n এ অবস্থানটি সন্ধান করা) অগত্যা পুনরুত্পাদনযোগ্য পিছনের দিকে নয় ; (x + v_n) -v_n ভাসমান-পয়েন্ট গণিতে ধারাবাহিকভাবে x এর সমান হয় না। এবং 'এর আশেপাশে কাজ করা' বলা সহজ তবে আপনি অনেকগুলি বহিরাগত লাইব্রেরি ব্যবহার করতে সক্ষম না হওয়াসহ সম্ভাব্য একটি সম্পূর্ণ ওভারহোলের কথা বলছেন।
স্টিভেন স্টাডনিকি

1
কিছু গেম জন্য আপনার পদ্ধতির সম্ভবপর হতে পারে, কিন্তু আমি যতদূর জানি সবচেয়ে গেমস একজন মেকানিক হিসাবে ব্যবহার সময়-উলটাপালটা OriginalDaemon-এর 'মেমেন্টো পদ্ধতির যেখানে প্রাসঙ্গিক রাষ্ট্র কাছাকাছি কিছু ব্যবহার করছেন হয় যে ফ্রেমের জন্য সংরক্ষণ করা হয়েছে।
স্টিভেন স্টাডনিকি

2
পদক্ষেপগুলি পুনরায় গণনা করে রিন্ডন্ডিং সম্পর্কে কী বলা যায় তবে প্রতি কয়েক সেকেন্ডে একটি কী ফ্রেম সংরক্ষণ করে? ভাসমান পয়েন্ট ত্রুটিগুলি কেবল কয়েক সেকেন্ডের মধ্যে (অবশ্যই জটিলতার উপর নির্ভর করে) একটি উল্লেখযোগ্য পার্থক্য তৈরি করতে পারে না। এটি ভিডিও
সংকোচনেও

1

আপনি মেমেন্টো প্যাটার্নটি একবার দেখে নিতে পারেন; এর প্রাথমিক উদ্দেশ্যটি হ'ল পিছনে বস্তু স্থিতির মাধ্যমে পূর্বাবস্থায় ফিরিয়ে নেওয়া / পুনরায় করণ করা, তবে নির্দিষ্ট ধরণের গেমগুলির জন্য এটি যথেষ্ট should

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


0

আপনার বিশেষ ক্ষেত্রে গতি রিওয়ন্ডিংয়ের মাধ্যমে রোলব্যাক পরিচালনা করা ভাল কাজ করা উচিত। আপনি যদি এআই ইউনিটগুলির সাথে যেকোন ধরণের পাথফাইন্ডিং ব্যবহার করছেন তবে ওভারল্যাপিং ইউনিটগুলি এড়াতে কেবল রোলব্যাকের পরে এটি পুনরায় গণনা করতে ভুলবেন না।

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


0

যদিও এটি একটি আকর্ষণীয় ধারণা। আমি এটার বিরুদ্ধে পরামর্শ চাই।

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

(1.1 + 3 - 3) == 1.1

কমপক্ষে সি এবং সি ++ এ এটি মিথ্যা ফেরত দেয়। পার্থক্যটি ছোট হতে পারে, তবে কয়েক সেকেন্ডের 10 সেকেন্ডের মধ্যে 60fps এ কত ত্রুটি জমা হতে পারে তা কল্পনা করুন। এমন কিছু ঘটনা ঘটবে যেখানে কোনও খেলোয়াড় কেবল কিছু মিস করে তবে গেমটি পিছন দিকে খেলতে গিয়ে এটি হিট করে।

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

যদি আপনার গেমটি খুব জটিল না হয় তবে গেমের স্টেটের কীফ্রেমগুলি সেকেন্ডে 30 বার সঞ্চয় করুন এবং এটি পিছন দিকে খেলুন। যদি আপনার 2 ডি পজিশন সহ 15 টি বস্তু থাকে, তবে কোনও এমপি পর্যন্ত কমারেশন ছাড়াই 1.5 মিনিট সময় লাগতে পারে। কম্পিউটারগুলিতে গিগাবাইটের স্মৃতি রয়েছে।

সুতরাং এটি অত্যধিক জটিল করবেন না, কোনও গেমটি পিছনের দিকে চালানো সহজ হবে না এবং এটি প্রচুর ত্রুটি ঘটায়।

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