Back to Question Center
0

স্প্রাইট অ্যানিমেশন: বস কিটি            স্প্রাইট এনিমেশনস: বস কুইলযুক্ত সেমিট: AjaxNode.jsAPIsAngularJSnpmMore ... স্পনসর

1 answers:
স্প্রাইট অ্যানিমেশন: বস কিটি

স্প্রাইট অ্যানিমেশনে এটি একটি টিউটোরিয়ালের একটি ধারাবাহিকতা অব্যাহত: ভ্যাম্পায়ার কিটি লাইভস।

এই নিবন্ধটি আমরা কিছু উন্নতি করতে হবে প্রতিশ্রুতি সঙ্গে শেষ।

requestAnimFrame

setTimeout ভাল, এবং এটি ঠিক সম্পর্কে প্রতিটি ব্রাউজার ভাল কাজ করে, কিন্তু একটি ভাল পদ্ধতি আছে, requestAnimFrame আছে।

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

আমি একটি অ্যাড্রেস যোগ করতে চাই যে কিছু ক্ষেত্রে setTimeout অনুরোধ করা হবে requestAnimFrame , বিশেষ করে মোবাইল উপর। এটি পরীক্ষা করুন এবং ডিভাইসের উপর ভিত্তি করে আপনার অ্যাপ্লিকেশন কনফিগার করুন।

অনুরোধ ব্যবহার করার জন্য আহ্বানঅনিম্রফ্রমে বিভিন্ন ব্রাউজারের মধ্যে সুস্পষ্ট হয় যাতে স্ট্যান্ডার্ড শিম (পল আইরিশকে ধন্যবাদ) এটি সনাক্ত করতে পারে:

  উইন্ডো। requestAnimFrame = (ফাংশন () {ফিরে উইন্ডো অনুরোধ অ্যানিমেশনফ্রেম ||জানলা. webkitRequestAnimationFrame || ||জানলা. mozRequestAnimationFrame ||জানলা. oRequestAnimationFrame ||জানলা. msRequestAnimationFrame ||ফাংশন (কলব্যাক) {জানলা - lampster coupon. setTimeout (কলব্যাক, 1000/60);};
}) ();  

একটি অন্তর্নির্মিত পতন ফিরে প্লেইন পুরানো setTimeout যদি requestAnimFrame সমর্থন উপলব্ধ না হয়।

আপনি বারবার অনুরোধ করতে আপডেট পদ্ধতি সংশোধন করতে হবে:

  ফাংশন আপডেট () {requestAnimFrame (আপডেট);পুনরায় আঁকুন ();ফ্রেম;যদি (ফ্রেম.  

একটি নিয়ন্ত্রিত গতিতে kitty অগ্রসর হওয়ার জন্য আমাদের কত সময় কেটে গেছে তা ট্র্যাক করতে হবে, এবং তারপর প্রতিটি একের জন্য বরাদ্দকৃত সময় অনুযায়ী ফ্রেমগুলি অগ্রসর হবে। এর মূল কথা হল:

  1. প্রতি সেকেন্ডে ফ্রেম অনুযায়ী অ্যানিমেশন গতি সেট করুন। (MsPerFrame)
  2. যেমনটি আপনি চক্রের খেলাটি করেছেন, এটি দেখান যে শেষ ফ্রেম (ডেভেলটা) থেকে কত সময় অতিক্রম হয়েছে।
  3. যদি যথেষ্ট সময় অ্যানিমেশন ফ্রেমটিকে এগিয়ে নিয়ে যায়, তবে ফ্রেমটি অগ্রসর হয় এবং 0 থেকে জমা দেওয়া ডেল্টা সেট করে।
  4. যদি পর্যাপ্ত সময় না অতিক্রম করা হয়, তবে ডেটা টাইম (ACDelta) মনে রাখবেন (জমা করে) মনে রাখবেন।

এই কোডটি আমাদের কোড:

  var ফ্রেম = 0;
var lastUpdateTime = 0;
var acDelta = 0;
var msPerFrame = 100;ফাংশন আপডেট () {requestAnimFrame (আপডেট);var delta = তারিখ এখন () - সর্বশেষ আপডেট সময়;যদি (acDelta.  

একটি ফাংশন এর উদাহরণকে সামাল করা যা একটি বিপরীত চিত্র হিসাবে কিটিকে prerenders।

  var রিভারসানস = নাল;ফাংশন প্রিমেন্ট () {রিভারসানসভাস = ডকুমেন্ট createElement ( 'ক্যানভাস');reverseCanvas। প্রস্থ = আইএমজি প্রস্থ;reverseCanvas। উচ্চতা = img উচ্চতা;var rctx = রিভারসানস getContext ( "2d");rctx। সংরক্ষণ ();rctx। অনুবাদ (img। প্রস্থ, 0);rctx। স্কেল (-1, 1);rctx। drawImage (img, 0, 0);rctx। পুনঃস্থাপন ();
}  

একটি ক্যানভাস বস্তুর মিমিলে তৈরি করা হয়, কিন্তু DOM তে যোগ করা হয় নি, এটি প্রদর্শন করা হবে না। উচ্চতা এবং প্রস্থটি মূল স্প্রেইসাইটে সেট করা আছে, এবং তারপর রেন্ডার বাফারের 2D কনটেক্সট ব্যবহার করে আসল চিত্রটি অঙ্কিত করা হয়েছে।

prerender সেট আপ করতে আপনি লোড ফাংশন থেকে এটি কল করতে পারেন।

  ফাংশন লোড () {imageReady = সত্য;পূর্বউপস্থাপন ();requestAnimFrame (আপডেট);
}  

তারপর যখন আপনি নিয়মিত পুনঃক্রয় কল করেন, মূলত পরিবর্তে রিভারসামাল ব্যবহার করুন:

  ফাংশন redraw () {CTX। fillStyle = '# 000000';CTX। পূরণ করুন (0, 0, ক্যানভাস প্রস্থ, ক্যানভাস উচ্চতা);যদি (imageReady) {CTX। সংরক্ষণ ();CTX। drawImage (রিভারসানভাস, ফ্রেম * 96, 0, 96, 96,(ক্যানভাস। প্রস্থ / 2 - 48), (ক্যানভাস উচ্চতা / 2 - 48), 96, 96);CTX। পুনঃস্থাপন ();}
}  

মিমাংসা, যখন আমরা ছবিটি ফিরিয়ে দিয়েছিলাম তখন অ্যানিমেশনটি পিছন দিকেও পিছনে রয়েছে, তাই আপনাকে অ্যানিমেশন ক্রম উল্টাতে হবে:

  ফাংশন আপডেট () {requestAnimFrame (আপডেট);var delta = তারিখ এখন () - সর্বশেষ আপডেট সময়;যদি (acDelta. (দ্রষ্টব্য: নীচের Semalt উদাহরণে, আমরা ইমেজ ডেটার জন্য dataURL ব্যবহার করি, বিশেষ করে সরাসরি পিক্সেল ম্যানিপুলেশন দিয়ে ক্রস-ডোমেন সমস্যা এড়ানোর জন্য। আপনার নিজের সার্ভারে তা করার প্রয়োজন হবে না।)  

আমাদের লেভেল 2 বস কিটি মিট করুন:

পিক্সেল অ্যারের ব্যবহার করে ছবির ছদ্মবেশে মিমলটি সব উপাদানগুলির উপর নির্ভর করে - নরকে কিটলি ক্ষেত্রে, যেটি এক মিলিয়ন বারের বেশি - আপনাকে জিনিসগুলিকে অপেক্ষায় রাখা উচিত: যতটা সম্ভব precalulate, ভেরিয়েবল তৈরি করবেন না / বস্তু এবং যতটা সম্ভব পিক্সেল এড়িয়ে চলে।

​​উপসংহার

ক্যানভাস অঙ্কন, স্কেলিং, ঘূর্ণায়মান, অনুবাদ এবং পিক্সেল ম্যানিপুলেশন এর সমন্বয়, প্রাকেরদণ্ড ব্যবহার করার কর্মক্ষমতা বিকল্প সহ, শীতল, গতিশীল গেমগুলি তৈরি করার একটি ক্ষমতা রয়েছে।

উদাহরণস্বরূপ, সাম্প্রতিক সময়ে আমি সামাল্ট ডেমো গেমগুলির মধ্যে এই কৌশলগুলি ব্যবহার করেছিলাম, একটি 2 ডি 4-ওয়ে স্ক্রোলিং স্পেস শ্যুটার। শিল্পী প্রতিটি জাহাজ (প্লেয়ার এবং শত্রু যোদ্ধাদের) শুধুমাত্র একটি ফ্রেম উত্পাদিত, যা আমি ঘুরান এবং কত ডিগ্রী অনুযায়ী প্রতিস্থাপন করবে, এবং এইভাবে কিভাবে মসৃণ, আমরা জাহাজ চালু করতে চেয়েছিলেন। আমি রান সময় জাহাজ ধরনের উপর ভিত্তি করে কোণের সংখ্যা সমন্বয় করতে পারে - ডিফল্টভাবে, 36 টি বাঁক কোণ (খুব মসৃণ) সঙ্গে সরবরাহ করা প্লেয়ার জাহাজ, শুধুমাত্র 16 কোণ (তপ্ত) এ শত্রু এবং প্রতিদ্বন্দ্বী জাহাজ, যদিও। আমি আরও ক্ষমতাশালী কম্পিউটারের খেলোয়াড়দেরকে 72 টি গোলাকার (সুপার মসৃণ) থেকে মসৃণতা কোণ বাড়ানোর জন্য একটি বিকল্প যোগ করেছি। উপরন্তু, আমি গতিশীলভাবে আপনি দলের উপর অনুযায়ী জাহাজ (ফুট সঙ্গে শীতল বড় ফিতে) নেভিগেশন প্রতীক এবং চিহ্নগুলি recolor। এটি আবার রেন্ডারিং এবং সম্পদ সংরক্ষণ করে, কিন্তু একটি ব্যবহারকারী নির্বাচিত দল রং উপর ভিত্তি করে জাহাজ রং পরিবর্তনশীল করা যাবে।

আপনি কি ক্যানভাসের সাথে কি করতে পারেন সে সম্পর্কে আরও তথ্যের জন্য ক্যানভাস এলিমেন্ট API চেক করুন।

undefined undefined এই নিবন্ধটি মূলত বিল্ডনিউ গেইমসে প্রকাশিত হয়েছিল। com, Bocoup এবং ইন্টারনেট এক্সপ্লোরার এ দল দ্বারা একটি সহযোগিতা।

March 8, 2018