এন্ড্রয়েড গেম ডেভেলপমেন্ট টিউটোরিয়াল – AndEngine + Android Studio

AndEngine হচ্ছে একটি ফ্রি এবং ওপেন সোর্স OpenGL   এন্ড্রোয়েড গেম ইঞ্জিন। OpenGL (Open Graphics Library) হচ্ছে গ্রাফিক্স রেন্ডারিং API. আমরা চাইলে OpenGL ব্যবহার করে আমাদের মোবাইলের জন্য গেম তৈরি করতে পারি। ঐ ভাবে গেম তৈরি করতে গেলে অনেক সময় লাগবে। এক একটা ছোট খাটো স্টেপ এর জন্য অনেক গুলো কোড লিখতে হবে। কিন্তু আমরা চাই সহজেই কোড কম লিখে গেম তৈরি করতে, আর এ জন্য   রয়েছে গেম ইঞ্জিন। আমাদের জন্য প্রয়োজনীয় ব্যাসিক সব কোড লেখা রয়েছে। আমরা শুধু সে গুলোকে কল করব, এবং নিজেদের প্রয়োজন মত কিছু বাড়তি কোড লিখে একটা গেম তৈরি করে ফেলব। আর এজন্য  আমরা সাহায্য AndEngine এর।

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

প্রথমে আমাদের Android NDK ডাউনলোড করতে হবে। NDK ডাউনলোড করল exe ফাইলটি রান করলে একটা ফোল্ডার তৈরি হবে। যেখানে NDK এর সব ফাইল গুলো। ঐ ফোল্ডারটি রুট ড্রাইভে / C ড্রাইভে কপি করব। আমরা চাইলে ঐ ফোল্ডারটি রিনেইম করে শুধু ndk দিতে পারি।

এরপর আমরা AndEngine ডাউনলোড করে নিব। Git জানা থাকলে ক্লোন করে নিব। বা নিচের লিঙ্ক থেকে Download as Zip এ ক্লিক করে ডাউনলোড করে নিলেও হবেঃ

আনজিপ করে যে কোন যাগায় রাখব। আমি রেখেছি C ড্রাইভে।  AndEngine এর অনেক গুলো উদাহরণ রয়েছে। সে গুলোও ডাউনলোড করে নিব। উদাহরণ গুলো পাওয়া যাবেঃ

 

এবার আমরা একটি সাধারণ এন্ড্রয়েড প্রজেক্ট তৈরি করব, এন্ড্রোয়েড স্টুডিওতে। এন্ড্রোয়েড স্টুডিওতে কিভাবে একটি প্রজেক্ট করতে হয়, তা নিয়ে বিস্তারিত নিচের লিঙ্কে পাওয়া যাবেঃ

প্রজেক্ট তৈরি হয়ে গেলে রান করে দেখব, এখান শুধু Hello World! দেখাবে। এরপর File মেনু থেকে Project Structure এ ক্লিক করবঃ


AndEngine 2

নতুন একটা উইন্ডো ওপেন হবে। এখানে আমরা AndEngine ইম্পোর্ট করব। তার জন্য এড সাইনে ক্লিক করব। নিচের ছবিটি দেখিঃ

AndEngine 3

নতুন একটি উইন্ডো ওপেন হবে, এখান থেকে Phone and Tablet Application এর নিচ থেকে Import Existing Project এ ক্লিক করব।

AndEngine 4

আমাদের প্রোজেক্ট কোথায় রয়েছে, তা দেখিয়ে দিতে হবে। আমি যেহেতু C ড্রাইভে রেখেছি AndEngine তাই তা সিলেক্ট করব।

AndEngine 5

 

ওকে ওকে দিয়ে বের হয়ে আসব। File মেনু থেকে Synchronize এ ক্লিক করব। বা Ctrl + Alt + Y এ ক্লিক করলেও হবে। বা এন্ড্রোয়েড স্টুডিও এর টুলবার থেকে Syc বাটনে ক্লিক করলেও হবে। তাহলে আমাদের প্রজেক্ট ন্যাভিগেটরে AndEngine দেখাবে।

আবার File মেনুত থেকে Project Structure এ ক্লিক করব। বাম পাশ থেকে app এ ক্লিক করে ডান পাশ থেকে Dependencies এ ক্লিক করব।
AndEngine 6

 

এখানে ডান কোনায় আরেকটা + চিহ্ন দেখব। সেখানে ক্লিক করব তাহলে আমাদের তিন ধরনের Dependencies যুক্ত করার সুযোগ দিবে। আমরা Module Dependency তে ক্লিক করব। তাহলে নিচের মত একটা উইন্ডো ওপেন হবে।

 

AndEngine 7

 

এখান থেকে AndEngine সিলেক্ট করে ওকে দিব। এবং আবার অ্যাপটা সিঙ্কোনাইজ করে নিব। Sync করলে অ্যাপে একটা ইরর দেখাবে। আমরা এখন চাইলেও অ্যাপটা রান করে দেখতে পারব না। নিচের ছবির মত এরর দেখাবেঃAndEngine 8

 

আমাদের এ ইরর টা ফিক্স করতে হবে। তার জন্য প্রজেক্ট ন্যাভিগেশন থেকে Gradle Script এক্সপেন্ড করব। এরপর ঐখান থেকে build.gradle (Module:andEngine) এটা ডাবল ক্লিক করে এডিট করতে হবে। এরপর নিচের কোড টা যুক্ত করে দিতে হবেঃ


soruceSets{

main{

jni.srcDirs = []

}

}

 

নিচের ছবিটি দেখিঃ

 

AndEngine 9

এবার আবার সিঙ্ক করে নিলে কোন ভুল দেখাবে না, আমরা চাইলে অ্যাপটি রান করে দেখতে পারি। আমরা মাত্র AppEngine লোড করেছি, এখনো কোন কোড যুক্ত করিনি, তাই এখনো আগের Hello World! ই দেখাবে।

 

এবার আমরা কোড যুক্ত করব। আমরা যে AndEngine Example গুলো ডাউনলোড করেছি, সে গুলো যে কোনটাই এখন আমরা টেস্ট করে দেখতে পারব। এখানে অনেক গুলো উদাহরণ রয়েছে।

MainActivity.java ওপেন করে সকল ইম্পোর্ট গুলো রিমুভ করব। এরপর extends Activity পরিবর্তন করে extends SimpleBaseGameActivity লিখব, আর এর ভেতরের সব কিছু রিমুভ করব। নিচের মত করে সিম্পল করে নিব। এখানে  package এর নামটা যেন রিমুভ না হয়, সে দিকে লক্ষ্য রাখতে হবে। যেমন আমার জন্য package এর নাম হচ্ছে package me.jakir.andeginetutorial;


package me.jakir.andeginetutorial;
public class MainActivity extends SimpleBaseGameActivity{

}

 

এবার AndEngineExamples-GLES2 ফোল্ডারের ওপেন করে src ফোল্ডার ওপেন করব, এরপর org > andengine > examples ফোল্ডারে অনেক গুলো উদারহণ কোড দেখব। যেকোন একটা আমরা ব্যবহার করতে পারি। আমি উদাহরন হিসেবে LineExample.java ফাইলটা ব্যবহার করব। কোন টেক্সট এডিটরে ওপেন করে এরটার import গুলো আমাদের MainActivity.java তে যুক্ত করব। তাহলে আমাদের MainActivity.java দেখাবে নিচের মত করেঃ


package me.jakir.andeginetutorial;

import java.util.Random;

import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.primitive.Line;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.util.FPSLogger;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;

public class MainActivity extends SimpleBaseGameActivity{

}

LineExample.java ফাইল থেকে public class LineExample extends SimpleBaseGameActivity { এর ভেতরের থাকা সব গুলো কোড MainActivity.java এর public class MainActivity extends SimpleBaseGameActivity{ এর ভেতরে পেস্ট করব। তাহলে MainActivity.java দেখাবে নিচের মত করেঃ


package me.jakir.andeginetutorial;

import java.util.Random;

import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.primitive.Line;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.util.FPSLogger;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;

public class MainActivity extends SimpleBaseGameActivity{

 // ===========================================================
 // Constants
 // ===========================================================

 /* Initializing the Random generator produces a comparable result over different versions. */
 private static final long RANDOM_SEED = 1234567890;

 private static final int CAMERA_WIDTH = 720;
 private static final int CAMERA_HEIGHT = 480;

 private static final int LINE_COUNT = 100;

 // ===========================================================
 // Fields
 // ===========================================================

 // ===========================================================
 // Constructors
 // ===========================================================

 // ===========================================================
 // Getter & Setter
 // ===========================================================

 // ===========================================================
 // Methods for/from SuperClass/Interfaces
 // ===========================================================

 @Override
 public EngineOptions onCreateEngineOptions() {
 final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);

 return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
 }

 @Override
 public void onCreateResources() {

 }

 @Override
 public Scene onCreateScene() {
 this.mEngine.registerUpdateHandler(new FPSLogger());

 final Scene scene = new Scene();
 scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));

 final Random random = new Random(RANDOM_SEED);

 final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager();
 for(int i = 0; i < LINE_COUNT; i++) {
 final float x1 = random.nextFloat() * CAMERA_WIDTH;
 final float x2 = random.nextFloat() * CAMERA_WIDTH;
 final float y1 = random.nextFloat() * CAMERA_HEIGHT;
 final float y2 = random.nextFloat() * CAMERA_HEIGHT;
 final float lineWidth = random.nextFloat() * 5;

 final Line line = new Line(x1, y1, x2, y2, lineWidth, vertexBufferObjectManager);

 line.setColor(random.nextFloat(), random.nextFloat(), random.nextFloat());

 scene.attachChild(line);
 }

 return scene;
 }

 // ===========================================================
 // Methods
 // ===========================================================

 // ===========================================================
 // Inner and Anonymous Classes
 // ===========================================================
}

}

এবার প্রজেক্টি সিঙ্ক করে রান করে দেখব। তাহলে নিচের মত কত গুলো লাইন দেখাবেঃ
Screenshot_2015-02-07-03-20-21

হ্যা, এটাই আমাদের প্রথম AndEngine প্রজেক্ট। কোড গুলো একটু দেখলে আমরা বুঝতে পারব কিভাবে এ লাইন গুলো ড্র করেছে। কিভাবে ব্যাকগ্রাউন্ড সেট করেছে, ইত্যাদি ইত্যাদি। এভাবে অন্য উদারহণ গুলোও রান করে দেখব। ঐ গুলোর কোড গুলো দেখব। কোডের সাথে দেখব কমেন্ট করা রয়েছে। কমেন্ট গুলো পড়ে পড়ে কিভাবে কোড গুলো কাজ করছে, তা বুঝতে চেষ্টা করব। আর সব গুলো উদারহণ যদি বুঝতে পারি, নিজের কোন গেম আইডিয়া থাকলে সহজেই আমরা তা তৈরি করে ফেলতে পারব।

 

ইমিউলেটরে OpenGL প্রজেক্ট / AndEngine প্রজেক্ট টেস্ট করার জন্য ইমিউলেটর তৈরির সময় অবশ্যই Use Host GPU চেক করে দিতে হবে।কারণ   OpenGL প্রজেক্ট গুলো রেন্ডার হয় GPU তে। আর AndEngine লাইব্রেরীটি OpenGL এর উপর ভিত্তি করে তৈরি। নিচের ছবি দেখিঃ

create avd

প্রজেক্ট তৈরি করতে কোন সমস্যা হলে আমাকে জানাতে পারেন। আর যদি কোন ইরর দেখায়, তাহলে কি ইরর দেখায়, তা সহ বিস্তারিত মেইল করলে আমি সমাধান দেওয়ার চেষ্টা করব। মেইল এড্রেসঃ mail [at] jakir.me

এটা শুধু মাত্র AndEngine ব্যবহার শুরু করার একটা টিউটোরিয়াল। এখনো অনেক কিছু শিখতে হবে। OpenGL কি, Game Programming কি, Scene কি, Sprite কি, OpenGL এ Camera কি, Entity কি সহ অনেক কিছু। তা ছাড়া দরকার জাভা প্রোগ্রামিং এ দক্ষতা। বেসিক গুলো ভালো করে জানা থাকলেই কাজ হয়ে যাবে। যেমন ক্লাস, অ্যারে, মেথড, ইটারেশন সহ দরকারী সব কসেপ্টে ভালো ধারণা। জাভা নিয়ে অল্প কিছু লেখার রয়েছে এ ব্লগে।  ইন্টারনেট থেকে জাভা এর উপর টিউটোরিয়াল পড়ে, কিছু ভিডিও দেখে শিখে নেওয়া যাবে। ভালো হয় একটা বই কিনে বাসায় বসে বসে প্র্যাকটিস করলে।

গেম প্রোগ্রামিং দারুণ, সারাক্ষণ তো গেম খেলে কাটাই, কেমন হয় যদি নিজের গেম নিজে খেলি, নিজের গেম বন্ধুদের খেলতে দি। গেম প্রোগ্রামারদের জন্য রয়েছে স্মার্ট ক্যারিয়ার। বিলিয়নিয়ার হওয়ার সর্টকার্ট রাস্তা 😛

OpenGL ES 2 / OpenGL ES 3 কিভাবে এন্ড্রয়েডে কাজ করে তা নিয়ে দুই একটা ছোট খাটো প্রজেক্ট তৈরি করলে দারুণ হবে। আইডিয়া গুলো AndEngine দিয়ে প্রজেক্ট তৈরি করতে দারুণ কাজে দিবে। গুগলে সার্চ করলে অনেক গুলো টিউটোরিয়াল পাওয়া যাবে। দুই একটা ভিডিও দেখা যেতে পারে। নিচের দুইটা থেকেও ফলো করা যেতে পারেঃ

AndEngine দিয়ে গেম তৈরি করার উপর একটা সুন্দর সাইট রয়েছে। রয়েছে পুর্নাঙ্গ গেম তৈরির টিউটোরিয়াল। সহজ সহজ করে লেখা। তা ভিজিট করা যাবে নিচের লিঙ্ক থেকেঃ


2 thoughts on “এন্ড্রয়েড গেম ডেভেলপমেন্ট টিউটোরিয়াল – AndEngine + Android Studio

Leave a Reply

Your email address will not be published. Required fields are marked *