কীভাবে একটি গুলি চালানোর অ্যানিমেশন সহ বুলেট রিলিজ টাই করা যায়


15

বলুন যে আপনার কাছে একটি অ্যানিমেশন রয়েছে যা আপনি বুলেট চালানোর সময় ঘটতে চান want অ্যানিমেশন শেষে আপনি কীভাবে বুলেটটি দেখতে পাবেন। অ্যানিমেশনের সময়ের দৈর্ঘ্য জানতে এবং বুলেটগুলির অবস্থান নির্ধারণে এবং সেই পরিমাণ সময় পেরিয়ে যাওয়া পর্যন্ত এটি সক্রিয় করে রাখা দেরি করা কেবলমাত্র আমিই বুঝতে পারি। আমি কেবল ভাবছিলাম যে এটি যদি সেরা পদ্ধতির হয় তবে অন্য সবাই কীভাবে এটি পরিচালনা করে?

সম্পাদনা: আমি মনে করি প্রশ্নটি সঠিকভাবে বলতে আমার সমস্যা হচ্ছে।

আমার প্রশ্ন


ধন্যবাদ! আপনার সবার কাছ থেকে অনেক ভাল ধারণা, আমি কলব্যাক ব্যবহার করার ধারণাটি পছন্দ করি। আমি মনে করি আমি চেষ্টা করব এবং এটি বাস্তবায়ন করব, আমি সত্যিই সময় ট্র্যাকিংয়ের উপর নির্ভর করতে চাই না।
tp0w3rn

উত্তর:


8

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

একটি নমনীয় পন্থা এই ধরণের তথ্য encapsulate জন্য অ্যানিমেশন সংজ্ঞা একটি ধরণের ব্যবহার করা হয়। সুতরাং "অ্যানিমেশন এক্স এই সমস্ত ফ্রেমগুলির মধ্যে কেবলমাত্র এটির মাধ্যমে খেলুন" না বলার পরিবর্তে আপনি কিছুটা জটিল জটিল পান।

যেমন কোনও ধরণের উপহাসের ডেটা ফর্ম্যাট সহ

অ্যানিমেশন =
{
  {নাম = "হাঁটা", ফাইলগুলি = "হাঁটা * .png", ফ্রেমকাউন্ট = "12", লুপ = "সত্য"},
  {নাম = "ফায়ার" ফাইল = "ফায়ার * .png" ফ্রেমকাউন্ট = "6",
       ইভেন্ট = {
           {নাম = "বুলেটলিভসগান", ফ্রেম = "4", প্যারাম 1 = "43", প্যারাম 2 = "30"}
       }
  }
}

সুতরাং আপনার কোড কিছু বলে:

currentAnimation = animations.Get("fire");
currentAnimation.Play();

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

List<Event> events = currentAnimation.EventsSinceLastCheck();
foreach (AnimationEvent event in events)
{
    if (event.name == "bulletLeavesGun")
    {
        Vector2 bulletPosition = new Vector2(event.param1, event.param2);
        Vector2 actualBulletPosition = new Vector2(
                 character.x + bulletPosition.x, 
                 character.y + bulletPosition.y);
        CreateBulletAt(actualBulletPosition);
    }
}

লক্ষ্য করার বিষয়গুলি:

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

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


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

অ্যানিমেশনটি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করা pretty আমি অ্যানিমেশনের স্থিতির জন্য ভোট না দেওয়ার সাথে একমত হব, তবে এটি এখনও তার প্রথম প্রস্তাবটি ছেড়ে দেয়। আমি জানি না যে তিনি খেলার বাকি অংশ (পর্যবেক্ষক প্যাটার্ন?) থেকে অ্যানিমেশন কোডটি ডিকুয়াল করার জন্য একটি পৃথক ইভেন্ট সিস্টেমটি বোঝাতে চেয়েছিলেন তবে আমি কীভাবে এটি করব। "লজিকস" আপনি যেমন রাখেন তেমনই অ্যানিমেশন কোড বা তার বিপরীতেও জানা উচিত নয়।
ঝাঁকুনি দিচ্ছেন

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

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

@ কোয়েট প্রকৃতপক্ষে এখন আমি এটি সম্পর্কে ভাবি, বুলেট ফায়ারিং এটির জন্য একটি ভয়াবহ উদাহরণ, বেশিরভাগ কারণেই নীচের দেডায়ানের উত্তর। গুলি চালানো সরাসরি হওয়া উচিত should এর চেয়ে ভাল উদাহরণ হ'ল ডাস্ট ভিএফএক্স ফায়ারিং যখন কোনও অক্ষর অবতরণ করে - সার্ভার এবং ক্লায়েন্ট সিঙ্ক করবে কখন অক্ষরটি লাফানো শুরু করে তবে ভিজ্যুয়াল প্রদর্শন ক্লায়েন্টের কাছে ছেড়ে যায়। এবং যখন অ্যানিমেশনটি ডান ফ্রেমে আঘাত করে যেখানে পা মাটিতে পড়ে তখন ভিএফএক্স ইভেন্টটি চালিত হওয়া উচিত। একইভাবে, ইভেন্টগুলি প্রয়োজন যদি কোনও অ্যানিমেশনটিতে শাখা করা উচিত কিনা তা নির্দিষ্ট অ্যানিমেশন ফ্রেমে সিদ্ধান্ত নেওয়া দরকার।
মিঃ ক্র্যাঙ্কি

3

কোনও উপায়ে, অ্যানিমেশনটি হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হবে এবং সেই সময়ে বুলেটটি তৈরি করতে হবে।

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

আপনার বিকাশ প্ল্যাটফর্মের উপর নির্ভর করে আপনার কিছু ধরণের অ্যানিমেশন আপডেট ফাংশন বা কলব্যাক থাকতে পারে যা আপনাকে অ্যানিমেশনটি পছন্দসই পর্যায়ে পৌঁছানোর সঠিক মুহুর্তের প্রতিক্রিয়া জানাতে দেবে। উদাহরণস্বরূপ, আমি এটি ফ্লিক্সেলের সাথে এটি করব।


1
ফ্লিক্সেলের addAnimationCallbackপদ্ধতিটি ফায়ারিং সত্তায় ব্যবহার করা যেতে পারে। কলব্যাক ফাংশনে আপনি দেখতে পাবেন যে ফায়ারিং অ্যানিমেশনের বর্তমান ফ্রেমটি এমন একটি ফ্রেম যা বুলেট সত্তা তৈরি করতে হবে। যদি তা হয় তবে আপনি স্ক্রিনে একটি বুলেট যুক্ত করতে পারেন।
তুষার অন্ধ

2

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

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


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

2

মিঃ ক্র্যাঙ্কি যেমন বলেছেন; অ্যানিমেশন এবং লজিকগুলি পৃথক রাখুন।

তবে সবচেয়ে গুরুত্বপূর্ণ, লজিক্স অবশ্যই মাস্টার অংশ হিসাবে থাকতে হবে

  • যখন ফায়ার বোতামটি টিপানো হয় তখন আপনার আঁক " ক্রিয়াটি ট্রিগার করা উচিত আপনার চরিত্রের অবস্থার (যুক্তিবিদ্যা) অঙ্কনটি " চালিত করা উচিত।
  • এই ক্রিয়াকলাপটি অঙ্কন অ্যানিমেশনটি ট্রিগার করা উচিত সমস্ত পরামিতি (লাইভের সময় ইত্যাদি) দিয়ে ।
  • একবার ড্র ক্রিয়া শেষ হয়ে গেলে আপনি ফায়ার অ্যাকশনটি ট্রিগার করতে পারেন (অস্ত্রের উপর নির্ভর করে একবারে বা আরও গুলি চালাতে পারে)
  • এই ক্রিয়াটি বুলেট উত্পন্ন করতে পারে এবং ফায়ার অ্যানিমেশনটি ট্রিগার করতে পারে ।

মনে রাখবেন যে লজিস্টিকগুলি থেকে ইউআই নিয়ন্ত্রণ করা হ'ল এটি নিশ্চিত করার একমাত্র উপায় যে আপনি পরে নিজের লজিস্টিকগুলি রাখতে, পুনরায় ব্যবহার করতে এবং ভাগ করতে সক্ষম হবেন (নতুন রেন্ডারার, নতুন গেম, কোনও রেন্ডারার ছাড়া সার্ভার সংস্করণ ...)


1

প্রথমে, আমি কোডের টুকরা ডিকুয়াল করতে কোনও ইভেন্ট সিস্টেম (পর্যবেক্ষক প্যাটার্ন?) ব্যবহার করব? এটি কেবল অ্যানিমেশনের জন্য নয়, তবে অবশ্যই সেখানে প্রযোজ্য। তারপরে অ্যানিমেশন কোডটি সহজেই প্রেরণযোগ্য ইভেন্ট (ইভেন্ট) এবং কোডের কিছু অন্যান্য অংশ এই ইভেন্টটির জন্য শোনায় কোডের কোনও অংশই একে অপরকে সম্পর্কে জানতে হবে না without

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

{
  animation: {
    name: shoot,
    length: 12,
    spritesheet: shoot.png
    event: {
      frame: 4,
      name: bulletLeavesGun,
    },
  },
}

অ্যানিমেশনটি লোড করার সময় ডেটা পড়ুন এবং প্লেব্যাক চলাকালীন ইভেন্টটিতে যখন ফ্রেমটি থাকে তখন অ্যানিমেশন কোডটি প্রেরণ করুন।

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