Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Java
Gamedevelopment

গেম ডেভেলপমেন্টের জন্য ব্যবহৃত জাভাএফএক্সের পরিচিতি

by
Difficulty:IntermediateLength:LongLanguages:

Bengali (বাংলা) translation by Syeda Nur-E-Royhan (you can also view the original English article)

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

এই টিউটোরিয়ালে আমরা ধরে নিচ্ছি জাভায় কিভাবে কোড তৈরি করতে হয় সে বিষয়ে আপনি ইতোমধ্যেই জানেন। তা যদি না হয় তাহলে অ্যান্ড্রয়েডের জন্য জাভা ব্যবহার শিখুন, জাভা দিয়ে কম্পিউটার প্রোগ্রামিঙের পরিচিতি: ১০১ এবং ২০১, জাভার শূন্য থেকে শুরু, গ্রিনফুট, অথবা জাভা শেখার দুরূহ উপায় টিউটোরিয়ালগুলো দেখে নিন।

ইন্সটলেশন

আপনি যদি ইতোমধ্যেই জাভার সাহায্যে অ্যাপ্লিকেশন তৈরি করতে শিখে ফেলেন তাহলে আপনার হয়তো কোন কিছুই নতুন করে ডাউনলোড করতে হবে না: জাভাএফএক্স জেডিকে ৭ইউ৬ সংস্করণের (আগস্ট ২০১২) পর সাধারণ জেডিকের (জাভা ডেভেলপমেন্ট কিট) সাথে অন্তর্ভুক্ত হয়েছে।  আপনি যদি বিগত সময়ের মধ্যে জাভার ইন্সটলেশন আপডেট না করে থাকেন তাহলে সর্বশেষ সংস্করণের জন্য সরাসরি জাভা ডাউনলোড ওয়েবসাইটে চলে যান।

মৌলিক ফ্রেমওয়ার্ক ক্লাস

জাভাএফএক্স প্রোগ্রাম তৈরি করা অ্যাপ্লিকেশন ক্লাস দিয়ে শুরু হয়। এখান থেকেই সমস্ত জাভাএফএক্স অ্যাপ্লিকেশন বিস্তৃত হয়। আপনার মূল ক্লাসের উচিত launch() প্রক্রিয়া কোল করা, এটি তারপর init() প্রক্রিয়া কোল করবে এবং তারপর start() প্রক্রিয়া। অ্যাপ্লিকেশনটি শেষ হবার অপেক্ষা করুন। তারপর stop() প্রক্রিয়া কোল করুন।  এই প্রক্রিয়াগুলোর মধ্যে শুধুমাত্র start() প্রক্রিয়াটি বিমূর্ত এবং অবশ্যই বাতিল গণ্য করতে হবে।

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

এসব জানার পর আমরা একটি ন্যুনতম উদাহরণ তৈরি করতে পারি যা দিয়ে জাভাএফএক্সে উইন্ডো চালু করা যাবে:

গঠনমূলক কন্টেন্ট

জাভাএফএক্সের কন্টেন্ট (যেমন টেক্সট, ইমেজ, এবং ইউআই কন্ট্রোল) সিন গ্রাফ নামের গাছের শাখার মতো বিস্তৃত কাঠামো দিয়ে গঠিত। এটি গ্রাফিক্যাল দৃশ্যের উপাদানগুলোকে ভিন্ন ভিন্ন দলে ভাগ করে সাজায়।

JavaFX Scene Graph
জাভাএফএক্স সিন গ্রাফের প্রতিনিধিত্ব।

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

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

গ্রাফিক্স রেন্ডার করা

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

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

ইমেজ ক্লাসের সাহায্যে ফাইলের বিভিন্ন ফরম্যাট থেকে ইমেজ লোড করা যায় এবং গ্রাফিক্সকনটেক্সট ক্লাসের সাহায্যে আঁকা যায়। রাইটেবলইমেজ ক্লাসের সাথে পিক্সেলরিডার এবং পিক্সেলরাইটার ব্যবহার করে সহজেই প্রক্রিয়াগতভাবে তৈরি ইমেজ গঠন করা যায়।

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

গেমের লুপ

পরবর্তীতে, আমাদের প্রোগ্রামগুলোকে গতিশীল করতে হবে। ের মানে হচ্ছে গেমের পরিস্থিতি সময়ের সাথে সাথে পরিবর্তিত হবে। আমরা একটি গেম লুপ বাস্তবায়ন করবো যেখানে গেমের উপাদানগুলো আপডেট করা হবে এবং স্ক্রিনে দৃশ্যগুলো বসানো হবে। মূলত প্রতি সেকেন্ডে ৬০ বার গতিতে।

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

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

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

জাভাএফএক্সে গেম লুপ বাস্তবায়নের অন্যান্য বিকল্প পদ্ধতিও রয়েছে। আরেকটু দীর্ঘ উপায় হচ্ছে টাইমলাইন ক্লাস। এটি কীফ্রেম উপাদানের সেটসহ তৈরি একটি অ্যানিমেশন সিকুয়েন্স। গেম লুপ তৈরির জন্য টাইমলাইন অনির্দিষ্টকালের জন্য পুনরাবৃত্ত হওয়ার উদ্দেশ্যে সেট করা উচিত। এই কাজে একটি মাত্র কীফ্রেম দরকার। এটির স্থায়িত্ব মাত্র ০.০১৬ সেকেন্ডে সেট করা হবে (এতে করে প্রতি সেকেন্ডে ৬০টি ঘূর্ণন পাওয়া যাবে)।  এই বাস্তবায়নটি দ্যা গিটহাব রেপোর Example3T.java ফাইলে পাবেন।

ফ্রেমভিত্তিক অ্যানিমেশন

আরেকটি সাধারণ চাহিদার তালিকায় থাকা গেম প্রোগ্রামিং উপাদান হচ্ছে ফ্রেমভিত্তিক অ্যানিমেশন: দ্রুত গতিতে ক্রমানুসারে ছবি দেখাতে হবে যাতে করে এক ধরণের গতিময়তার বিভ্রম তৈরি হয়।

ধরে নেই যে সমস্ত তথ্যই ঘুরেফিরে আসে এবং সবগুলো ফ্রেম একই সংখ্যক সেকেন্ডের জন্য প্রদর্শিত হয়। তাহলে বাস্তবায়নের মূল সূত্র এমন হতে পারে:

আগের উদাহরণে এই ক্লাসটিকে সমন্বিত করার জন্য আমরা একটি অ্যানিমেটেড ইউএফও তৈরি করতে পারি। উপাদানটিকে নিচের কোড ব্যবহার করে চালু করা যায়:

এবং অ্যানিমেশনটাইমারের মধ্যে কোডের একটি মাত্র লাইন যোগ করে:

উপযুক্ত জায়গায়। একটি সম্পূর্ণ কার্যকরী কোডের উদাহরণের জন্য দ্যা গিটহাব রেপোতে Example3AI.java ফাইলটি দেখুন।

ব্যবহারকারীর প্রতিক্রিয়ার বোঝাপড়া

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

সিন ক্লাসের ডকুমেন্টেশনের দিকে তাকালে দেখা যায় যে বিভিন্ন উৎস থেকে পাওয়া বিভিন্ন ধরণের প্রতিক্রিয়া নিয়ে আলোচনা করার নানান রকম উপায় আছে। যেমন, setOnKeyPressed() প্রক্রিয়াটি একটি ইভেন্টহ্যান্ডলার নিযুক্ত করতে পারবে যা কোন কী চাপা হলে চালু হয়ে যাবে। setOnMouseClicked() প্রক্রিয়াটি একটি ইভেন্টহ্যান্ডলার নিযুক্ত করতে পারবে যা কোন মাউসের বোতাম চাপ দেওয়া হলে চালু হয়ে যাবে। ইভেন্টহ্যান্ডলার ক্লাসটি একটি মাত্র উদ্দেশ্য সাধন করে: পরপর কোন ইভেন্ট ঘটলে কল করার মতো প্রক্রিয়াকে (handle() নামের) সীমাবদ্ধ করে ফেলা।

ইভেন্টহ্যান্ডলার তৈরি করার সময় আপনি অবশ্যই চিহ্নিত করে দিবেন যে কোন ধরণের ইভেন্ট নিয়ে এটি কাজ করবে: আপনি চাইলে ঘোষণা দিতে পারবেন  EventHandler<KeyEvent> অথবা একটি EventHandler<MouseEvent>। সেই সাথে ইভেন্টহ্যান্ডলারগুলো প্রায়ই বেনামি ইনার ক্লাস হিসেবে তৈরি করা হয়। কারণ এগুলো সাধারণত একবার মাত্র ব্যবহার করা হয় (যখন উপরের তালিকাভুক্ত প্রক্রিয়াগুলোর একটি হিসেবে বিবেচিত হয়)।

কীবোর্ড ইভেন্ট নিয়ে কাজ করা

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

নিচের উদাহরণে, ক্যানভাসে তীর চিহ্নের দুইটি কী রয়েছে। যখনই কোন কী চাপ দেওয়া হয় তখনই সেটির সাথে যুক্ত ইমেজ সবুজ হয়ে উঠে।


সোর্স কোডটি দ্যা গিটহাব রেপোতে Example4k.java ফাইলে রাখা আছে।

মাউস ইভেন্ট নিয়ে কাজ করা

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


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

তবে, মৌলিক ডাটার ধরণের ক্ষেত্রে, একবার চালু হয়ে গেলে মূল্য আর পরিবর্তন করা যায় না। আপনি যদি ইভেন্টহ্যান্ডলার দিয়ে মৌলিক ডাটা টাইপের মধ্যে যেগুলো প্রোগ্রামের অন্য কোথাও পরিবর্তন করা হয়েছে সেগুলোতে প্রবেশাধিকার নিতে চান তাহলে আপনি একটি র‍্যাপার ক্লাস তৈরি করতে পারেন যেখানে হয় পাবলিক ভ্যারিএবল অথবা গেটার/ সেটার প্রক্রিয়া থাকবে। (নিচের উদাহরণে IntValue হচ্ছে এমন একটি ক্লাস যেখানে value নামের একটি public int যুক্ত হয়েছে।

সম্পূর্ণ সোর্স কোডটি দ্যা গিটহাব রেপোতে রয়েছে। মূল ক্লাস হচ্ছে Example4M.java.

জাভাএফএক্স দিয়ে মৌলিক স্প্রাইত ক্লাস তৈরি

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

  • update(): স্প্রাইটের গতিময়তা বিচার করে নতুন পদবী হিসাব করা।
  • render(): অবস্থানকে নির্দেশিকা হিসেবে ব্যবহার করে ক্যানভাসে (গ্রাফিক্সকনটেক্সট ক্লাসের মাধ্যমে) একটি ইমেজ আঁকুন।
  • getBoundary(): জাভাএফএক্সের আয়তক্ষেত্র টুডি উপাদান হিসেবে ফিরে আসে। এটির ইন্টারসেক্ট প্রক্রিয়ার কারণে সংঘর্ষ চিন্নিতকরনে কাজে দেয়।
  • intersects(): এই স্প্রাইটের সীমাবদ্ধকরণ বাক্স অন্য স্প্রাইটের সাথে মধ্যচ্ছেদ করছে কিনা তা চিহ্নিত করে।

সম্পূর্ণ সোর্স কোডটি দ্যা গিটহাব রেপোতে Sprite.java -তে অন্তর্ভুক্ত আছে।

স্প্রাইট ক্লাসের ব্যবহার

স্প্রাইট ক্লাসের সহায়তায় আমরা সহজেই জাভাএফএক্সে সাধারণ কালেক্টিং গেম তৈরি করতে পারি।  এই গেমে, আপনি একটি স্বয়ংক্রিয় ব্রিফকেসের ভূমিকা পালন করবেন যেটি বিভিন্ন জায়গায় পড়ে থাকা টাকার থলে সংগ্রহ করে বেরায়। তীর চিহ্ন দিয়ে খেলোয়াড়টিকে স্ক্রিনের এক জায়গা থেকে আরেক জায়গায় নেওয়া যায়।

এই কোডটি আগের উদাহরণ থেকে অনেক কিছু অনুকরণ করেছে: স্কোর প্রদ্রশনের জন্য ফন্ট সেট আপ করা, অ্যারেলিস্টের সাহায্যে কীবোর্ড প্রতিক্রিয়া সংরক্ষণ করা, অ্যানিমেশনটাইমারের সাহায্যে গেম লুপ বাস্তবায়ন করা, সাধারণ মূল্যের জন্য র‍্যাপার ক্লাস তৈরি করা যেগুলো গেম লুপের সময় পরিমার্জনের দরকার হবে।

একটি বিশেষ কোড সেগমেন্ট খেলোয়াড়ের (ব্রিফকেস) জন্য স্প্রাইট উপাদান তৈরি করে এবং সংগ্রহ করার বস্তুর (মানি ব্যাগ) জন্য স্প্রাইট উপাদানের অ্যারেলিস্ট তৈরি করে।

আরেকটি মজার কোড সেগমেন্ট হচ্ছে AnimationTimer-এর সৃষ্টি। এখানে যে কাজগুলো রয়েছে তা হল:

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

বরাবরের মতো, সম্পূর্ণ কোডটি দ্যা গিটহাব রেপোতে সংযুক্ত কোড (Example5.java) ফাইল হিসেবে রেখে দিয়েছে।

পরবর্তী ধাপ

উপসংহার

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.