本篇包括瓦片地圖,物理系統,
1瓦片地圖
超級瑪麗,冒險島,魂鬥羅等遊戲主場景都有瓦片地圖畫成,它的作用可見一斑,它可以用tiled Qt軟件畫成,在輔助篇中講講解tiled Qt軟件的使用
1)加載tmx文件
try {
final TMXLoader tmxLoader = new TMXLoader(this,
this.mEngine.getTextureManager(), TextureOptions.NEAREST,
null);
this.mTMXTiledMap = tmxLoader.loadFromAsset(this,"sence"+leave.getInt("leave", 1)+".tmx");
} catch (final TMXLoadException tmxle) {
Debug.e(tmxle);
}
2)加載將每一個圖層瓦片
//將每一層TMXLayer加載到scene中
for (int i = 0; i < this.mTMXTiledMap.getTMXLayers().size(); i++) {
TMXLayer layer = this.mTMXTiledMap.getTMXLayers().get(i);
mScene.attachChild(layer);
}
3)具體瓦片圖塊的使用
好啦,一個很大的場景就加載完成了,具體的每個瓦片的使用,將在下一篇與box2d(物理系統)具體結合使用時展示它強大的威力
2)物理世界
物理世界想象成我們的世界就行,其中包括物理世界的實質,皮膚(人的衣服),剛體(人),連接器(設置彈性,密度,摩擦力),關節,碰撞檢測,物體在物理世界中的添加與移除等
1)創建物理世界
this.mPhysicsWorld = new FixedStepPhysicsWorld(30, new Vector2(0, 80),
true, 8, 1);//Vector()設置的是力,就是向下爲80N的力
2)皮膚的創建
很簡單,就是一個Sprinte或者是AnimateSprite圖片的創建,物體外邊的變化就是皮膚的變化啦
// 創建player,並別加載到scene中
final AnimatedSprite player = new AnimatedSprite(centerX-200, centerY-100,
this.mPlayerTextureRegion);//
this.mBoundChaseCamera.setChaseEntity(player);
3)連接器的創建
final FixtureDef playerFixtureDef = PhysicsFactory.createFixtureDef(0,
0, 0.5f);//設置彈性,密度,摩擦力
4)剛體
mPlayerBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, player,
BodyType.DynamicBody, playerFixtureDef);//BodyType有三種,一種是DynamicBody,運動的重型物體,一種是KinematicBody,運動的輕型物體,最後一種StaticBody,靜態物體,比如牆體,就是這一種
5)將物體添加到物理世界中
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(
player, mPlayerBody, true, false) );
6)將物體從物理世界中移除
mEngine.runOnUpdateThread(new Runnable()
{
@Override
public void run()
{
final PhysicsConnector physicsConnector =
mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(physicalmap.get(bodyb));//通過皮膚獲得連接器
if (physicsConnector != null)
{
mPhysicsWorld.unregisterPhysicsConnector(physicsConnector);//註銷連接器
bodya.setActive(false);
mPhysicsWorld.destroyBody(bodyb);//摧毀物體
mScene.detachChild(physicalmap.get(bodyb));
physicalmap.remove(bodyb);//physicalmap是皮膚與剛體結合的結合
System.gc();
}
}
});
一定要放到一個線程中,不然很容易出錯誤
7)碰撞檢測
在物理世界上註冊
this.mPhysicsWorld.setContactListener(new ContactListener() {
@Override
public void preSolve(Contact arg0, Manifold arg1) {
// TODO Auto-generated method stub
}
@Override
public void postSolve(Contact arg0, ContactImpulse arg1) {
// TODO Auto-generated method stub
}
@Override
public void endContact(Contact arg0) {
// TODO Auto-generated method stub
}
@Override
public void beginContact(Contact arg0) {
// TODO Auto-generated method stub
final Body bodya=arg0.getFixtureA().getBody();//獲得bodya
final Body bodyb=arg0.getFixtureB().getBody();//獲得bodyb
String ida=(String) bodya.getUserData();//通過bodya,bodyb對碰撞的物體進行處理
String idb=(String) bodyb.getUserData();
if("mPlayerBody".equals(idb)&&"bossBody".equals(ida))
{
scoresEditor.putInt("user0", score);
scoresEditor.commit();
lifeEditor.putInt("life", live);
lifeEditor.commit();
System.gc();
mHandler.postDelayed(boss, 2000);//2秒鐘後到gameover界面
}
});