Android Oyun Programlama Ders 7: PhysicsWorld ve Body Oluşturma Uygulaması(Top Sektirme)

Android ile oyun programalama dersinin yedincisinde Daha önce anlattığım PhysicsWorld ve Body kavramlarının kullanımlarını örnek bir uygulama ile açıklayamaya çalışacağım.

Bir önceki yazıda ana mantığı anlatmıştım. Bu yüzden tekrar aynı şeylerden bahsetmenin pek anlamlı olacağını düşünmüyorum. Bu yüzden örnek uygulamayı anlatmak istiyorum. Örnek uygulamada bir PhysicsWorld oluşturdum. Bu PhysicsWorld’ ün özelliklerinin belirtilebileceği bir de FixtureDef nesnesi tanımladım. Bu nesnenin yapıcı metodu sırasıyla yoğunluk, esneklik ve ortamın sürtünme katsayısını içine parametre olarak alır. Aşağıdaki gibi tanımlanır.
[cc lang=’java’]
private final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(1, 0.8f, 0.5f);
[/cc]

[cc lang=’java’]
this.physicsWorld= new PhysicsWorld(new Vector2(SensorManager.GRAVITY_EARTH, 0), false);
[/cc]
Yine yukarda oluşturulan PhysicsWorld nesnesi ise içine parametre olarak bir Vector2 ve PhysicsWorld’ ün uyuma(bekletilebilme) özelliğinin olup olmayacağını ifade eden bir bool ifadesi alıyor. Vector2 nesnesi de yine içine x ve y ekseni için yerçekimi ivmesini belirten parametreler alıyor. Yukarıdaki ifadede de gördüğünüz üzere, ben uygulamada yerçekiminin x ekseninde etkin olmasını istedim. Yani cihazınızı dikey konumda tuttuğunuzda oluşturulacak top dikey eksende oluşturulan duvarın üstünde sekecektir.

Uygulamanın kodlarına göz atacak olursak;
[cc lang=’java’]
package www.serefakyuz.com;

import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.Camera;
import org.anddev.andengine.engine.options.EngineOptions;
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.anddev.andengine.entity.primitive.Rectangle;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.entity.util.FPSLogger;
import org.anddev.andengine.opengl.texture.Texture;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.region.TextureRegion;
import org.anddev.andengine.opengl.texture.region.TextureRegionFactory;
import org.anddev.andengine.ui.activity.BaseGameActivity;

import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import org.anddev.andengine.extension.physics.box2d.PhysicsConnector;
import org.anddev.andengine.extension.physics.box2d.PhysicsFactory;
import org.anddev.andengine.extension.physics.box2d.PhysicsWorld;
import android.hardware.SensorManager;

public class PhysicsExampleActivity extends BaseGameActivity
{
private static final int CAMERA_WIDTH = 800;
private static final int CAMERA_HEIGHT = 480;

private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.8f, 0.5f);

Texture textureResim1, textureResim2;
TextureRegion textRegResim1, textRegResim2;
Sprite spriteResim1, spriteResim2;
Body body1, body2;

private Scene mScene;
private PhysicsWorld physicsWorld;

public Engine onLoadEngine()
{
final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
engineOptions.getTouchOptions().setRunOnUpdateThread(true);
return new Engine(engineOptions);
}

public void onLoadResources()
{
textureResim1=new Texture(128,128,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
textureResim2=new Texture(128,128,TextureOptions.BILINEAR_PREMULTIPLYALPHA);

textRegResim1 = TextureRegionFactory.createFromAsset(textureResim1, this, “gfx/blueSmileIcon.png”, 0, 0);
textRegResim2 = TextureRegionFactory.createFromAsset(textureResim2, this, “gfx/yellowSmileIcon.png”, 0, 0);

mEngine.getTextureManager().loadTextures(textureResim1, textureResim2);
}

public Scene onLoadScene() {
this.mEngine.registerUpdateHandler(new FPSLogger());

this.mScene = new Scene();
this.mScene.setBackground(new ColorBackground(0, 0, 0));

this.physicsWorld = new PhysicsWorld(new Vector2(SensorManager.GRAVITY_EARTH, 0), false);

final Rectangle duvar = new Rectangle(CAMERA_WIDTH-2, 0, 2, CAMERA_HEIGHT -2);
PhysicsFactory.createBoxBody(this.physicsWorld, duvar, BodyType.StaticBody, FIXTURE_DEF);
this.mScene.attachChild(duvar);

spriteResim1 = new Sprite(100, 300, textRegResim1);
body1 = PhysicsFactory.createCircleBody(this.physicsWorld, spriteResim1, BodyType.DynamicBody, FIXTURE_DEF);
spriteResim2 = new Sprite(100, 100, textRegResim2);
body2 = PhysicsFactory.createCircleBody(this.physicsWorld, spriteResim2, BodyType.DynamicBody, FIXTURE_DEF);

this.mScene.attachChild(spriteResim1);
this.mScene.attachChild(spriteResim2);

this.physicsWorld.registerPhysicsConnector(new PhysicsConnector(spriteResim1, body1, true, true));
this.physicsWorld.registerPhysicsConnector(new PhysicsConnector(spriteResim2, body2, true, true));

this.mScene.registerUpdateHandler(this.physicsWorld);

return this.mScene;
}

public void onLoadComplete() {

}
}

[/cc]

Özellikle bir kaç kod bloğuna değinmek istiyorum. Body nesnesi oluşturulurken içine; daha önce oluşturulan PhysicsWorld nesnesini, body’ nin kaplayacağı sprite nesnesini, body türünü(dinamik(hareketli), statik(sabit)) ve FixtureDef nesnesini parametre olarak alır.
[cc lang = ‘java’]
body1 = PhysicsFactory.createCircleBody(this.physicsWorld, spriteResim1, BodyType.DynamicBody, FIXTURE_DEF);
[/cc]

Vurgulanması gereken bir diğer kod bloğu ise, body-sprite ilişkilendirmesini sağlayan kod bloğudur. physicsWorld nesnesinin registerPhysicsConnector fonksiyonu ile sağladığımız bağlama işlemi için bu fonksiyonun yapıcı metoduna bir PhysicsConnector nesnesi gönderilir. Yine bu PhysicsConnector nesnesinin yapıcı metoduna, sprite, body, bu body’nin yer bilgisinin sürekli güncellenmesine izin veren bir bool değişkeni ile yön bilgisinin sürekli güncellenmesine izin veren bir bool değişkeni parametre olarak gönderilir.
[cc lang = ‘java’]
this.physicsWorld.registerPhysicsConnector(new PhysicsConnector(spriteResim1, body1, true, true));
[/cc]

Biraz karışık bir konudur, umarım açıklamalar yeterli olur. İyi çalışmalar…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir