andengine遊戲引擎總結進階篇2

本篇包括瓦片地圖,物理系統,

         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界面
						
				}
});

 

                 8)關節andengine學習示例網站

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章