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() {

    }
}

 

转载于:https://www.cnblogs.com/xushihai/p/4187147.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值