এ পর্যন্ত আমরা অনেক কিছু শিখেছি। কিভাবে একটা স্প্রাইট লোড করা যায়, কিভাবে একটা স্প্রাইট মুভ করা যায়, কিভাবে ইউজার ইনপুটের মাধ্যমে কোন স্প্রাইটকে মুভ করানো যায়, কিভাবে সাউন্ড দেওয়া যায়, জেনেছি ক্যামেরা সম্পর্কে ইত্যাদি। আজ সব এক সাথ করে আমরা একটা গেম তৈরি করব।
গেমটির নাম Survive on new planet. আইডিয়া হচ্ছে উপর থেকে উল্কা পড়বে। একজন নবচারীর কাজ হচ্ছে উল্কা থেকে নিজেকে বাঁচানো। স্ক্রিনের ডানে বামে সরে নিয়েকে বাঁচাতে পারবে। আর ডানে বামে যাওয়ার জন্য স্ক্রিনে টাচ করতে হবে। গেমটিতে আমরা তিনটা ইমেজ ব্যবহার করব। একজন নবচারী, একটা ব্যাকগ্রাউন্ড এবং উল্কা। আর ব্যবহার করব দুইটা সাউন্ড। গেমটা রান করার সাথে সাথে একটা সাউন্ড প্লে করা শুরু হবে। এবং যখন উল্কা এসে নবচারীর গায়ে পড়বে, তখন একটা সাউন্ড করবে। নিচে সব গুলো এসেট এক সাথে দিয়ে দিলাম। আপনারা নিজেদের ইমেজ এবং সাউন্ড ব্যবহার করতে পারেন।
bg audio
dead audio
গেমের সম্পুর্ণ কোডঃ
import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.TimeUtils; import java.util.Iterator; public class Survive extends ApplicationAdapter { SpriteBatch batch; Texture astronautImage, bg, cometImage; private Sound deadSound; private Music bgAudio; private OrthographicCamera camera; private Rectangle astronaut; private Array<Rectangle> comets; private long lastCometTime; @Override public void create () { batch = new SpriteBatch(); // loading images cometImage = new Texture(Gdx.files.internal("comet.png")); astronautImage = new Texture(Gdx.files.internal("astronaut.png")); bg = new Texture(Gdx.files.internal("bg.jpg")); // loading Sounds deadSound = Gdx.audio.newSound(Gdx.files.internal("dead.wav")); bgAudio = Gdx.audio.newMusic(Gdx.files.internal("bgAudio.mp3")); // start playing background music bgAudio.setLooping(true); bgAudio.play(); // creating the camera camera = new OrthographicCamera(); camera.setToOrtho(false,800,480); batch = new SpriteBatch(); // creating the astronaut astronaut = new Rectangle(); astronaut.x = 800/2 - 128; astronaut.y = 0; astronaut.width = 128; astronaut.height = 128; // create the random comet arry comets = new Array<Rectangle>(); randomComet(); } private void randomComet() { Rectangle comet = new Rectangle(); comet.x = MathUtils.random(0, 800 - 62); comet.y = 480; comet.width = 62; comet.height = 174; comets.add(comet); lastCometTime = TimeUtils.nanoTime(); } @Override public void render () { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); camera.update(); batch.setProjectionMatrix(camera.combined); batch.begin(); batch.draw(bg, 0, 0, 800, 480); batch.draw(astronautImage, astronaut.x, astronaut.y); for(Rectangle comet: comets){ batch.draw(cometImage,comet.x,comet.y); } batch.end(); if(Gdx.input.isTouched()){ Vector3 touchPos = new Vector3(); touchPos.set(Gdx.input.getX(),Gdx.input.getY(),0); camera.unproject(touchPos); astronaut.x = touchPos.x - 128/2; } if(TimeUtils.nanoTime() - lastCometTime > 1000000000) randomComet(); Iterator<Rectangle> iter = comets.iterator(); while (iter.hasNext()){ Rectangle comet = iter.next(); comet.y -= 200 * Gdx.graphics.getDeltaTime(); if(comet.y + 174 < 0) iter.remove(); if(comet.overlaps(astronaut)){ deadSound.play(); iter.remove(); } } } }
কিভাবে কি করেছি, তা সম্পর্কে একটু বলতে পারি। ইমেজ গুলো লোড করার জন্য নিচের কোড গুলো লিখেছিঃ
cometImage = new Texture(Gdx.files.internal("comet.png")); astronautImage = new Texture(Gdx.files.internal("astronaut.png")); bg = new Texture(Gdx.files.internal("bg.jpg"));
সাউন্ড লোড করার জন্য এবং গেমের শুরুতে সাউন্ড প্লে করার জন্য লিখেছি নিচের কোড গুলোঃ
// loading Sounds deadSound = Gdx.audio.newSound(Gdx.files.internal("dead.wav")); bgAudio = Gdx.audio.newMusic(Gdx.files.internal("bgAudio.mp3")); // start playing background music bgAudio.setLooping(true); bgAudio.play();
নবচারী স্ক্রিনের কোথায় অবস্থান করবে, তা ঠিক করে দিয়েছি এরপরঃ
// creating the astronaut astronaut = new Rectangle(); astronaut.x = 800/2 - 128; astronaut.y = 0; astronaut.width = 128; astronaut.height = 128;
আমরা কিছু রেন্ডম উল্কা তৈরি করেছি, এবং পরে তা একটা অ্যারে রেখেছি, তারপর রেন্ডারে কিছুক্ষণ পর পর একটা উল্কা উপর থেকে পেলছি আমরা রেন্ডার মেথড থেকে।
Rectangle comet = new Rectangle(); comet.x = MathUtils.random(0, 800 - 62); comet.y = 480; comet.width = 62; comet.height = 174; comets.add(comet); lastCometTime = TimeUtils.nanoTime();
স্ক্রিনে টাচ করলে আমাদের নবচারীকে মুভ করার জন্যঃ
if(Gdx.input.isTouched()){ Vector3 touchPos = new Vector3(); touchPos.set(Gdx.input.getX(),Gdx.input.getY(),0); camera.unproject(touchPos); astronaut.x = touchPos.x - 128/2; }
এবং আমরা উল্কা যদি নবচারীকে টাচ করে, তাহলে একটা সাউন্ড প্লে করেছি।
if(comet.overlaps(astronaut)){ deadSound.play(); iter.remove(); }
এই তো, সিম্পল গেম। কিন্তু একটি গেম তৈরি করার জন্য প্রয়োজনীয় সব কিছুই একটু একটু দেখা হয়েছে এ গেমে। এটি কিভাবে কাজ করে, তা যদি বুঝতে পারি, তাহলে মোটামুটি 2D যে কোন গেমই তৈরি করতে পারব আমরা। দরকার শুধু আইডিয়া, কি ধরনের গেম তৈরি করব।
প্রজেক্টের সোর্স কোড গুলো ডাউনলোড করা যাবে গিটহাব থেকে। প্রত্যেকটা প্রজেক্ট আলাদা আলাদা ফোল্ডারে রয়েছে। ঐখান থেকে ডাউনলোড করে নিয়ে কাজ করা যাবে। গিটহাব লিঙ্ক।
ঠিক আছে
মনের মতো জিনিস খুজে পাইলাম