কোনও খেলায় টাইম স্টপ বা বুলেট টাইম কীভাবে কোড করবেন?


11

আমি এক্সএনএ ৪.০ এ একক প্লেয়ার আরপিজি প্ল্যাটফর্মার বিকাশ করছি। আমি এমন একটি ক্ষমতা যুক্ত করতে চাই যা সময়টিকে "থামিয়ে" বা ধীর করে দেয় এবং মূল গতিতে কেবল প্লেয়ার চরিত্রের চালনা করতে পারে (বালদুরের গেট সিরিজ থেকে টাইম স্টপ স্পেলের অনুরূপ)। আমি সঠিক বাস্তবায়ন খুঁজছি না, বরং কিছু সাধারণ ধারণা এবং নকশা-নিদর্শন।

সম্পাদনা: দুর্দান্ত ইনপুটটির জন্য সবাইকে ধন্যবাদ। আমি নিম্নলিখিত সমাধান নিয়ে এসেছি

    public void Update(GameTime gameTime)
        {

            GameTime newGameTime = new GameTime(gameTime.TotalGameTime,
 new TimeSpan(gameTime.ElapsedGameTime.Ticks / DESIRED_TIME_MODIFIER));
            gameTime = newGameTime;

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

উত্তর:


8

এটি একটি খারাপ সমাধান হতে পারে, তবে অগত্যা নয়। আপনি যদি ব-দ্বীপের সময় ব্যবহার করছেন তবে নির্দিষ্ট জিনিসের গতি পরিবর্তন করতে আপনি এটি পরিবর্তন করতে পারেন।

উদাহরণ স্বরূপ:

player.update(dt)
dt = dt * .5 --half speed
enemy.update(dt)

এটি অবশ্যই কাজ করে যদি আপনি অন্য কিছুের চেয়ে শত্রুকে আপডেট করার সময় বলতে পারেন। আপনি সমস্ত কিছুকে একটি গতির মূল্য দিতে এবং যেমন কিছু করতে পারেন:

x = x + xspeed * dt * speed

প্রথম অংশটি নিখুঁত ধারণা দেয়, দ্বিতীয় অংশটি পরিষ্কার নয়
আতুরস্যামস

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

এখন জ্ঞান করে তোলে। :)
আতুরস্যাম

দ্বিতীয় ধারণা শোনায় ... বন্ধ। কেবল "গতি" ফ্যাক্টর দ্বারা চলাচলকে স্কেলিং করা পদার্থবিজ্ঞান চালিত বস্তুর জন্য কাজ করতে পারে তবে এআই তাদের গতিবেগ ধীর / প্রতিবন্ধী হয়ে স্বাভাবিক গতিতে প্রতিক্রিয়া জানাতে সক্ষম হবে।

আপনি কী বলতে চাইছেন এআই স্বাভাবিক গতিতে প্রতিক্রিয়া জানাতে সক্ষম হবে? এআই এর এমন কী কোড থাকবে যাতে স্পিড ভেরিয়েবল প্রয়োগ করা যায় না?
টেসেলোড

3

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

যদি আপনি একটি একক প্লেয়ার গেমের গেম উপাদানগুলির একটি বৃহত গ্রুপকে ধীর করতে চান তবে আপনি প্রতিটি প্রাণীর জন্য দ্বিতীয় অভ্যন্তরীণ ঘড়ি তৈরি করতে পারেন, ঘড়িরটি বর্তমান সময়ে স্রষ্টার উপস্থিতির সাথে শুরু হয়। যখন একটি ধীরে ধীরে স্পেল কাস্ট করা হয় তখন প্রতিটি ফ্রেম, ঘড়িটি আসলে যে সময় পেরিয়ে যায় তার x% দ্বারা বৃদ্ধি করে। সমস্ত দৈত্য আচরণ তার অভ্যন্তরীণ ঘড়ি দ্বারা নির্ধারিত হয়। যদি বিভিন্ন দানবদের ধীর গতির প্রতিরোধ থাকে তবে তারা তাদের নিজস্ব ঘড়িটি ব্যবহার করতে পারে, এটি মূলত একটি পূর্ণসংখ্যা যার জন্য অনেক বেশি স্থান বা গণনার প্রয়োজন হয় না।

ধীরে ধীরে প্রভাব থামলে, ঘড়িগুলি এখনও ব্যবহৃত হচ্ছে এবং বাস্তবে যে সময় অতিবাহিত হয়েছিল তার 100% বৃদ্ধি পেয়ে যায়।

এটি তাত্ক্ষণিকী মন্ত্রের জন্যও কাজ করতে পারে।

@ সিদার: আমি দুটি পছন্দ দেখতে পাচ্ছি,

  1. জীব প্রতি অভ্যন্তরীণ ঘড়ি। প্রাণীটি আবার আক্রমণ করার জন্য প্রস্তুত কিনা তা অনুসন্ধানে: প্রতিটি আক্রমণটি ব্যবহার করা শেষ সময়টি সংরক্ষণ করুন + রিচার্জের সময় এবং এই সময়টিতে অভ্যন্তরীণ ঘড়িটি ইতিমধ্যে পাস হয়েছে কিনা তা পরীক্ষা করুন।

  2. আক্রমণ প্রতি এক টাইমার: আপনি জানেন যে রিচার্জ করতে আক্রমণটি কতক্ষণ সময় নেয় এবং আপনি কেবল একটি টাইমার সেট করে এবং প্রতিটি বার * (1-স্লোডেন%) কেটে যাওয়া সময়কে বিয়োগ করে।

আমি ব্যক্তিগতভাবে একাধিক স্বতন্ত্র টাইমার এবং ব্যবহারকারীর একটি অভ্যন্তরীণ ঘড়ি প্রক্রিয়াজাতকরণ সময় এবং জটিলতা রক্ষা করার জন্য বিয়োগ এড়াতে পছন্দ করি।

এটি সত্যিই অগ্রাধিকারের বিষয় (এটি পারফরম্যান্সকে তেমন প্রভাবিত করে না)।


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

@ সিদার আপনি যদি এড়িয়ে যান তবে আপনার সম্ভবত আক্রমণ প্রতি ঘড়ি প্রয়োজন কেবল সময়ের আক্রমণ রিচার্জ, বানানের সময়কাল এবং এই জাতীয় জিনিসগুলির জন্য। কমপক্ষে এইভাবে আপনাকে কেবল একটি ঘড়ি আপডেট করতে হবে এবং সম্পত্তি পুনরায় সেট করার জন্য কেবল 'শেষ সক্রিয়করণ' সময় রাখা দরকার।
আতুরস্যামস

তার প্রশ্ন অবশ্য প্লেয়ার ব্যতীত পরিবেশকে মন্থর করার বিষয়ে। আমার কাছে যা ডিটারিকে ১ এর চেয়ে কম সংখ্যার সাথে কেবলমাত্র গুণনের সহজতম ফর্ম বলে মনে হচ্ছে it প্লেয়ারের মতো রাখার সময়।
সিডার

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

2

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

আমি আপনাকে একটি ঘড়ির শ্রেণিবিন্যাস বাস্তবায়নের পরামর্শ দিচ্ছি :

.
├── Main clock
│   └── UI clock
│   └── 3D clock
│       ├── GFX clock
│       └── Gameplay clock
│           └── Slowdown spell clock 01
│           └── Slowdown spell clock 02

আপনার গেমের প্রত্যেকটি ঘড়ির মধ্যে একটি থেকে ডেল্টা সময় ব্যবহার করা উচিত: জিএফএক্স ক্লকটিতে গ্রাফিক্সের প্রভাব চলমান, এআই এবং অ্যানিমেশন গেমপ্লে ঘড়ির উপর চলে, অস্থায়ী স্লোডাউন স্পেল ঘড়িতে চালিত মন্থরতা দ্বারা প্রভাবিত প্রাণীরা ইত্যাদি various আপনার শ্রেণিবিন্যাসের বিভিন্ন অংশকে প্রভাবিত করে: একটি ধীরগতির স্পেল একটি কাস্টম ঘড়ি তৈরি করে এবং প্রভাবিত করে, অন্যদিকে বুলেট সময় পুরো 3D ঘড়ির স্তরক্রমকে প্রভাবিত করে।


ধন্যবাদ, এটি একটি গুরুত্বপূর্ণ অন্তর্দৃষ্টি। তবে, আমি মনে করি আমি সহজ চিন্তাভাবনা করব, যেহেতু এটি আমার বিশেষ ক্ষেত্রে বোধগম্য নয় যে একাধিক ধীরগতির প্রভাব একই সাথে ঘটবে।
ডেভিড মিলার

1

আপনার একটির পরিবর্তে দুটি ভিন্ন ঘড়ি দরকার, একটি গেমপ্লে সম্পর্কিত সময়ের জন্য এবং একটি "সত্য" সময়।

currentGameTime = 0;
gameSpeed = 1.0f;
[...]
currentApplicationTime = GetTime():
timeDelta = (currentApplicationTime - lastApplicationTime)*gameSpeed;
currentGameTime += timeDelta;
lastApplicationTime = currentApplicationTime;

তারপরে আপনি গেমস্পিডকে গতি বাড়ানোর জন্য (> 1) বা সময়কে ধীর করতে পারেন (<1)। খেলোয়াড়কে বিভিন্ন গতিতে চলার জন্য সময়টি কমিয়ে আনা হয় কিনা তা পরীক্ষা করে দেখুন।

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