AndEngine游戏引擎之BoundCamera
如何追逐一个玩家,始终让玩家在视野范围之内。
AndEngine引擎中使用BoundCamera类。
步骤
1.构造BoundCamera类,起始坐标,长宽,然后传给engine
2.设置BoundCamera的追踪范围一般范围会比之前的摄像头面积要大 setBounds(minX, maxX,minY, maxY)
3.设置BoundCamera可以追踪
4.给BoundCamera设置追踪的实体,然后BoundCamera就可以追踪这个实体了
下面是示例
package com.example.SpriteTest; import android.util.Log; import android.widget.Toast; import org.anddev.andengine.engine.Engine; import org.anddev.andengine.engine.camera.BoundCamera; import org.anddev.andengine.engine.camera.Camera; import org.anddev.andengine.engine.options.EngineOptions; import org.anddev.andengine.engine.options.resolutionpolicy.FillResolutionPolicy; import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; import org.anddev.andengine.entity.IEntity; import org.anddev.andengine.entity.layer.tiled.tmx.*; import org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TMXLoadException; import org.anddev.andengine.entity.modifier.*; import org.anddev.andengine.entity.scene.Scene; import org.anddev.andengine.entity.sprite.Sprite; import org.anddev.andengine.input.touch.TouchEvent; 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 org.anddev.andengine.util.modifier.IModifier; /** * Created by Administrator on 2014/12/26. */ public class TiledMapActivity extends BaseGameActivity{ /*----------------����-------------------------------*/ protected int CAMERA_WIDTH=1280; protected int CAMERA_HEIGHT=720; /*-----------------AndEngine����----------------------------*/ protected Engine mEngine; protected Camera mCamera; protected BoundCamera mBoundCamera; // protected Scene mMainScene; protected TextureRegion spriteRegion; @Override public Engine onLoadEngine() { mBoundCamera=new BoundCamera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT); mCamera=new Camera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT); mEngine=new Engine(new EngineOptions(true, EngineOptions.ScreenOrientation.LANDSCAPE,new FillResolutionPolicy(),mBoundCamera)); return mEngine; } @Override public void onLoadResources() { Texture mTexture=new Texture(32,32, TextureOptions.BILINEAR); spriteRegion= TextureRegionFactory.createFromAsset(mTexture,this,"face_box.png",0,0); mEngine.getTextureManager().loadTexture(mTexture); } @Override public Scene onLoadScene() { final Scene mMainScene=new Scene(1); TMXLoader mTMXloader=new TMXLoader(this,mEngine.getTextureManager(),new TMXLoader.ITMXTilePropertiesListener() { @Override public void onTMXTileWithPropertiesCreated(TMXTiledMap pTMXTiledMap, TMXLayer pTMXLayer, TMXTile pTMXTile, TMXProperties<TMXTileProperty> pTMXTileProperties) { Log.i("Property",pTMXLayer.getName()+": "+pTMXTileProperties.toArray().toString()); Toast.makeText(TiledMapActivity.this,"dgsdsdf",Toast.LENGTH_LONG).show(); } }); try { final TMXTiledMap map=mTMXloader.loadFromAsset(this, "gzip.tmx"); final TMXLayer tmxLayer=map.getTMXLayers().get(0); mMainScene.getFirstChild().attachChild(tmxLayer); Log.i("Property", "高度:"+tmxLayer.getHeight()); //用于限制镜头的大小 最小X,最大X,最小Y,最大Y this.mBoundCamera.setBounds(0, tmxLayer.getWidth(),0, tmxLayer.getHeight()); this.mBoundCamera.setBoundsEnabled(true); mMainScene.setOnSceneTouchListener(new Scene.IOnSceneTouchListener() { @Override public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { switch(pSceneTouchEvent.getAction()) { case TouchEvent.ACTION_DOWN: TMXTile mTile=tmxLayer.getTMXTileAt(pSceneTouchEvent.getX(),pSceneTouchEvent.getY()); StringBuffer sb = new StringBuffer(); sb.append("你点击的瓦片信息如下:"); sb.append("globalId: "+mTile.getGlobalTileID()); sb.append("col:"+mTile.getTileColumn()); sb.append("row:"+mTile.getTileRow()); Log.i("Property",sb.toString()); //瓦片是根据瓦片集中的全局ID来决定的,如果瓦片的ID发生了改变,就会在瓦片集中根据修改后的ID进行更新 mTile.setGlobalTileID(map,1); return true; default: return false; } } }); } catch (TMXLoadException e) { e.printStackTrace(); }catch (IllegalArgumentException ee){ ee.printStackTrace(); Toast.makeText(TiledMapActivity.this,ee.getMessage(),Toast.LENGTH_LONG).show(); } Sprite boy=new Sprite(0,0,spriteRegion); boy.registerEntityModifier(new SequenceEntityModifier(new MoveYModifier(10.0f,0.0f,960.0f-32), new DelayModifier(3.0f), new MoveXModifier(10.0f,0.0f,640-32))); mMainScene.getLastChild().attachChild(boy); //设置需要追逐的实体(chase:追逐,追寻) mBoundCamera.setChaseEntity(boy); return mMainScene; } @Override public void onLoadComplete() { } }