Android Oyun Programlama Ders 10 : Nesnelere Hız Verme

Android oyun geliştirme derslerinin onuncusunda hız kavramına ve nesnelere nasıl hız verilebileceğine değineceğim.
Geride kalan tüm makalelerimde sizleri bir şeyin yanılttığını tahmin ediyorum. Bahsettiğim konu, nesneleri sürükleme konusu. Nesneleri sürükleme uygulamalarında sprite’ları parmağımızla hareket ettirdik ama hız vermedik! Lise yıllarından da hatırlayacağınız üzere hız, fiziksel bir olaydır. Yani bizim sprite’ ları kullanarak sürüklediğimiz nesneler birer görüntüden ibarettir. Fiziksel anlamda bir varlık ifade etmezler ki sürükleme uygulamalarında yaptığımız şey nesneye hız vermek değil, sadece yerini değiştirmekti. A noktasında oluşturulan bir nesneyi oradan silip B noktasında oluşturmaktı yaptığımız. Mantığı oturttuktan sonra – en azından ben öyle düşünüyorum=) – hız hangi ortamda, nasıl ve neye verilir sorularının cevaplarına değineyim.
Hız kavramından bahsedilmesi için tabi ki ortamın fiziksel bir ortam olması gerekir. Yani ilk şart uygulamada bir PhysicsWorld ve FixtureDef nesnelerinin bulunması. İkinci şart ise nesnelere fiziksel özellikler kazandıran body nesneleridir. Hız da zaten bu body nesnelerine verilir. İki çeşit hız vardır yine lisedeki fizik bilgilerinden hatırlayacağınız üzere. Doğrusal hız ve dairesel hız. Box2d fizik motoru ile bu iki hız türünü de nesnelere uygulayabiliyoruz.
Doğrusal hız;
[cc lang =’java’]
body.setLinearVelocity(xHizi, yHizi);
[/cc]
yapısı ile veriliyorken, dairesel hız;
[cc lang =’java’]
body.setAngularVelocity(hiz);
[/cc]
şeklinde verilir.

Uygulamanın kodlarını ise buradan bütün halinde inceleyebilirsiniz:
[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.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 TopSektirmeActivity 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, body;

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_DEATH_STAR_I, 0), false);

spriteResim1 = new Sprite(100, 300, textRegResim1);
body1 = PhysicsFactory.createCircleBody(physicsWorld, spriteResim1, BodyType.DynamicBody, FIXTURE_DEF);
spriteResim2 = new Sprite(100, 100, textRegResim2);
body2 = PhysicsFactory.createCircleBody(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));

//Çizgisel hız
body1.setLinearVelocity(1, -1);
body2.setLinearVelocity(1, 1);
//DAiresel hız
body1.setAngularVelocity(10);
body2.setAngularVelocity(-10);

this.mScene.registerUpdateHandler(this.physicsWorld);

return this.mScene;
}

public void onLoadComplete() {

}
}

[/cc]

Bir cevap yazın

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