ইতি মধ্যে আমরা অনেক কিছু শিখে গিয়েছি। এবার আরো দারুণ কিছু শিখব। এবার শিখব কিভাবে একটা অবজেক্টকে মুভ করানো যায়। গেমের কারেক্টার গুলোকে Sprite বলা হয়। আমরা এখন থেকে যে কোন কারেক্টারকে Sprite বলব। প্রথম টিউটোরিয়াল আমরা একটা স্ট্যাটিক ইমেজ দেখিয়েছি। এবার দেখ একটি ইমেজকে কিভাবে মুভ করানো যায়। যেমন একটা বুলেট। আমরা একটা বুলেটকে মুভ করাবো। তার জন্য গুগলে সার্চ করে বা নিজে একটা বুলেট তৈরি করে নি। ধরি bullet.png, ঐটা রাখি আমাদের প্রজেক্টের andorid এর ভেতরে থাকা assets ফোল্ডারে। এরপর ইমেজটি লোড করি। ক্যামেরা সেট করি। আর শেষে ইমেজ যেন ডান পাশ থেকে বাম পাশে যায়, তা সেট করি। সম্পূর্ণ কোড, গিটহাবে Movement নামক ফোল্ডারে পুরো প্রজেক্ট পাওয়া যাবে।
import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; public class Movement extends ApplicationAdapter { OrthographicCamera camera; SpriteBatch batch; Sprite sprite; private float xPosition = 0; private float yPosition = 240; // y position to middle @Override public void create () { camera = new OrthographicCamera(800,480); camera.setToOrtho(false, 800, 480); batch = new SpriteBatch(); sprite = new Sprite( new Texture("bullet.png")); sprite.setPosition(xPosition, yPosition); } @Override public void dispose(){ } @Override public void render () { Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); camera.update(); batch.setProjectionMatrix(camera.combined); batch.begin(); sprite.draw(batch); batch.end(); xPosition = xPosition + (200 * (Gdx.graphics.getDeltaTime())); if (xPosition < 800) xPosition=0; sprite.setPosition(xPosition,yPosition); } }
গিটহাবে প্রজেকটির লিঙ্ক। যে বুলেট নিয়ে কোডটি লিখছি, তা ডাউনলোড করতেঃ
এটি খুবি সাধারণ একটা কোড। আমরা শুধু বলে দিয়েছি আমাদের স্প্রাইট/বুলেটের x পজিশন পরিবর্তন করতে। তা বলে দিয়েছি এ লাইনেঃ xPosition = xPosition + (50 * (Gdx.graphics.getDeltaTime())); বুলেটের x পজিশন পরিবর্তন করার কারণে আমাদের কাছে মনে হচ্ছে বুলেটটি বাম থেকে ডান দিকে যাচ্ছে।
আবার যখন দেখব ডান দিকে যেতে যেতে আমাদের স্ক্রিনের বাহিরে চলে যাচ্ছে, তখন আবার x পজিশন শূন্য করে দিয়েছি। তাই আবার প্রথম থেকে বাম থেকে ডান দিকে যাচ্চে বুলেটটি। আর তা করেছি এ লাইনেঃ if (xPosition > 800) xPosition=0;
খেয়াল করলে দেখতে পাবো বুলেটটি ডান দিকে যেতে যেতে হারিয়ে যাচ্ছে! বুলেটটিকে থামানো দরকার। এর পরে শিখব কিভাবে তা করতে হয়।
এখানে আমরা Delta Time ব্যবহার করেছি। কোন কোন ডিভাইসের FPS বা Frame per Second ৬০, কোনটির ৩০। কিন্তু আমরা চাই আমাদের গেম সব জাগায় একই আউটপুট দিক, এ জন্য আমরা DeltaTime টাইম ব্যবহার করেছি। DeltaTime হচ্ছে কারেন্ট ফ্রেম এবং লাস্ট ফ্রেম এর পার্থ্যক্য।
একটা উল্কা উপর থেকে নিচে পড়বে, এমন একটা কোড লিখি এবার, উপরের কোডটি একটু মডিফাই করলেই লিখতে পারব। উপরের প্রজেক্টে আমরা পরিবর্তন করেছি x ভ্যালু। এবার পরিবর্তন করব y ভ্যালু। তাহলেই হবে। গিটহাবে Movement2 নামক ফোল্ডারে পুরো প্রজেক্ট পাওয়া যাবে।
import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; public class MyGdxGame extends ApplicationAdapter { OrthographicCamera camera; SpriteBatch batch; Sprite sprite; private float xPosition = 400; private float yPosition = 480; @Override public void create () { camera = new OrthographicCamera(800,480); camera.setToOrtho(false, 800, 480); batch = new SpriteBatch(); sprite = new Sprite( new Texture("comet.png")); sprite.setPosition(xPosition, yPosition); } @Override public void dispose(){ } @Override public void render () { Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); camera.update(); batch.setProjectionMatrix(camera.combined); batch.begin(); sprite.draw(batch); batch.end(); yPosition = yPosition - (200 * (Gdx.graphics.getDeltaTime())); if (yPosition < -174 ) yPosition = 480; sprite.setPosition(xPosition, yPosition); } }
গিটহাবে প্রজেকটির লিঙ্ক। যে কোন স্প্রাইট নিয়েই টেস্ট করা যাবে। যে উল্কাটি ব্যবহার করেছি আমিঃ
আমরা প্রোগ্রাম থেকে বলে দিয়েছি আমাদের স্প্রাইট কিভাবে মুভ করবে। এবার আমরা ইউজার ইনপুট থেকে আমাদের স্প্রাইট মুভ করাবো। যেমন স্ক্রিনের ডান দিকে টাচ করলে আমাদের স্প্রাইট ডান দিকে যাবে। স্ক্রিনের বাম দিকে টাচ করলে আমাদের প্রাইট বাম দিকে যাবে। গিটহাবে Touch নামক ফোল্ডারে পুরো প্রজেক্ট পাওয়া যাবে। এ প্রজেক্টের ব্যবহৃত astronaut:
import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; public class MyGdxGame extends ApplicationAdapter { OrthographicCamera camera; SpriteBatch batch; Sprite sprite; private float xPosition = 400; private float yPosition = 0; // y position to middle @Override public void create () { camera = new OrthographicCamera(800,480); camera.setToOrtho(false, 800, 480); batch = new SpriteBatch(); sprite = new Sprite( new Texture("astronaut.png")); sprite.setPosition(xPosition, yPosition); } @Override public void dispose(){ } @Override public void render () { Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); camera.update(); batch.setProjectionMatrix(camera.combined); batch.begin(); sprite.draw(batch); batch.end(); // checking if user touch the screen and set position if(Gdx.input.isTouched()) { Vector3 touchPos = new Vector3(); touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0); xPosition = touchPos.x - 64 / 2; } sprite.setPosition(xPosition, yPosition); } }
গেমের আউটপুঃ
প্রজেক্টের সোর্স কোড গুলো ডাউনলোড করা যাবে গিটহাব থেকে। প্রত্যেকটা প্রজেক্ট আলাদা আলাদা ফোল্ডারে রয়েছে। ঐখান থেকে ডাউনলোড করে নিয়ে কাজ করা যাবে। গিটহাব লিঙ্ক।