AndEngine 学习系列2-实体(Entities)

第二部分,实体无素介绍

l 精灵(Sprites)

如果在2D游戏开发中你还是新手,不知道什么样是精灵,我先简单给Sprite下个定义。

精灵就是放在场景坐标(X,Y)位置的2D位图(Sprite is a 2D Bitmap, positioned on the scene by [X, Y] coordinates.)

在AE中,精灵是Entity扩展,更复杂的精灵类可以让你使用切分和动画。

1.创建精灵。

Sprite 有很多个构造函数,这是其中最简单一个:

Sprite yourSprite = new Sprite(x, y, textureRegion, vertexBufferObjectManager);

· 第一,二个参数指定精灵的坐标。

· 第三个参数是精灵的ITextureRegion(见loading resources

· 第四个是顶点缓冲对象管理器,很常用,可以通过mEngine.getVertexBufferObjectManager();获得。

你还可以指定精灵的宽和高,默认使用ITextureRegion中的尺寸。尽可能多地定制Sprite,使用最相近的构造函数。

2. 关联精灵

把精灵关联到其它实体,比如Scene,如下:

anyEntity.attachChild(yourSprite);

3. 更多

· 撤销关联

· 控制可见性

· 设置旋转

· 删除精灵 click.

· 启用抖动显示(注:Dithering是一种欺骗你眼睛,使用有限的色彩让你看到比实际图象更多色彩的显示方式。通过在相邻像素间随机的加入不同的颜色来修饰图象,通常这种方式被用于颜色较少的情况下)click.

· Entity 修改器 click.

· 切片和动画精灵 click.

l 切片和动画精灵 (TiledSprite & AnimatedSprite)

   本节介绍两个重要的Entity子类,略有不同。

1.TiledSprite:

在做按钮这些时候很有用,方便地创建按钮的不同状态(注:新的AE提供了ButtonSprite类来专门做按钮了)。你可以很方便地设置当前切片索引:

yourTiledSprite.setCurrentTileIndex(index)

2. AnimatedSprite:

是TiledSprite的子类,可以让TiledSprite动起来。

private void createTiledSprite()

{

        AnimatedSprite as = new AnimatedSprite(0, 0, tiledTextureRegion, vbo);

        long[] frameDurration = {100, 100, 100};

        as.animate(frameDurration);

        scene.attachChild(as);

}

上面的long[]有三个值因为,我的 tiledTextureRegion 有三个切片,猜对了,需要为每一个切片指定一个值。。。。。。。。。(注:每个切片播放后的延时)

如何删除实体(How to remove Entities):

对于不再需要的实体对象我们应当删除,按下面步骤来:

ourEntity.detachSelf();

yourEntity.dispose();

Entites作为层:

Layers的概念在游戏开发中很有用,幸运的是,在AE中,创建和管理层都很方便。

为了创建一个新的层,我们只需简单地将一个Entity对象与场景关联,好了!第一层可以使用了!

(注:这点与老版本有点不同,老版本把Layer独立出来了,有类似getTopLayer()函数)

final int FIRST_LAYER = 0;

final int SECOND_LAYER = 1;

private void createLayers()

{

    scene.attachChild(new Entity()); // First Layer

    scene.attachChild(new Entity()); // Second Layer

}

然后 通过:scene.getChildByIndex(FIRST_LAYER).attachChild(yourEntity);

再往第一层里添加东西!

实体修改器(Entity Modifiers):

 这个东西是用于将实体按照一定的数学函数作变化,f = E(x);参见org.andengine.entity.modifier 包获取更多信息。

1.为一个Entity注册修改器:

yourEntity.registerEntityModifier(new RotationModifier(3, 0, 360));

这里注册了一个旋转修改器,有三个参数:持续时间,起始角度,终止角度。

2.无限循环的修改器。

不停地重复调用,可以理解为容器

yourEntity.registerEntityModifier(new LoopEntityModifier(yourModifier))));

3.修改器的监听器

有时在执行修改器的某个时间需要执行一段特定的代码,这时候只需覆盖修改器中的某些函数就是了:

RotationModifier yourModifier = new RotationModifier(3, 0, 360)

{

        @Override

        protected void onModifierStarted(IEntity pItem)

        {

                super.onModifierStarted(pItem);

                // Your action after starting modifier

        }

       

        @Override

        protected void onModifierFinished(IEntity pItem)

        {

                super.onModifierFinished(pItem);

                // Your action after finishing modifier

        }

};

 

yourEntity.registerEntityModifier(yourModifier);

l 背景:

1. 纯色背景:

private void createBackground()

{

    scene.setBackground(new Background(Color.RED));

}

背景将被设置为红色

2. 视差背景 (parallax background)

你也可以使用图片作为背景,这就是视差背景。不管摄像机如何变化,是否去删去,视差背景总是可见。

private void createBackground()

{

    ParallaxBackground background = new ParallaxBackground(0, 0, 0);

    background.attachParallaxEntity(new ParallaxEntity(0, new Sprite(0, 0, background_region, vbo)));

    scene.setBackground(background);

}

ParallaxBackground 可以关联一个 ParallaxEntity ,这里是一个背景精灵图片 。

3.自动的视差背景

AutoParallaxBackgroundParallaxBackground的子类,可以用来控制里面的实体,比如移动的去朵。但是不太灵活,推荐使用jaym分享的ParallaxLayer来实现达到很酷的效果!

l 处理触摸操作:

通过重写onAreaTouched, 你可以很容易地控制实体的触摸事件,这个例子中,我们创建一个新的精灵,注册触摸区域,过滤掉某些操作:

final Sprite sprite = new Sprite(400, 420, 100, 50, vbo)

{

    @Override

    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float X, float Y) 

    {

        if (pSceneTouchEvent.isActionUp())

        {

            // execute action

        }

        return true;

    };

};

scene.registerTouchArea(sprite);

scene.attachChild(sprite);

记住在场景中注册触摸区域,不然没有作用。  IsActionUp 意思是在用户手指离开屏幕时候

更多触摸条件:

· isActionCancel

· isActionDown

· isActionMove

· isActionOutside

l 创建并理解场景  

场景是绘制到屏幕上的所有对象的根容器,一个场景可以包含多层,每层容纳(静态或者动态地)一定数量的实体(Entity)。Scene 有子类:HUD, MenuScene, CameraScene, 这些子类绘制在固定位置和摄相机镜头无关。

1.创建场景:

Scene newScene = new Scene();

2.显示切换场景:

有时候,应当使用多个场景而不是使用多个活动(Activity)

   mEngine.setScene(scene);

 切换到另一个场景,先前的场景就停止更新了。

scene.setChildScene(differentScene);

为场景设置一个不同的子场景,有时子场景设置后需要决定是否进行更新,那么使用

setChildScene(pChildScene, pModalDraw, pModalUpdate, pModalTouch)

子场景很有用,比如需要弹出界面的时候。

3.禁用场景的背景:

yourScene.setBackgroundEnabled(false);

在背景可见的情况下,设置子场景后只能看到子场景,为了出现弹出效果,把子场景的背景设为false。这样子场景好像在屏幕上一样(注:即子场景的背景透明)。

l HUD

HUD的解释在前面。

HUD是Scene的子类,可以跟随摄像机的运动。

HUD使用和Scene没有区别:

HUD hud = new HUD();

hud.attachChild(yourEntity);

camera.setHUD(hud);

不过记得为摄像机设置HUD.

l 创建菜单场景(MenuScene)

AE提供了一个很棒的MenuScene来创建好看又会动的菜单。

1. 创建菜单场景。

在例子中,我们创建一个带2个精灵菜单项的MenuScene.同时带有缩放的动画,当菜单项被点击时,会被放大。

private MenuScene menuScene;

private MenuScene createMenu()

{

    menuScene = new MenuScene(camera);

    

    final IMenuItem optionsMenuItem = new ScaleMenuItemDecorator(new SpriteMenuItem(0, region2, vbo), 2, 1);

    final IMenuItem playMenuItem = new ScaleMenuItemDecorator(new SpriteMenuItem(1, region1 vbo), 2, 1);

    

    menuScene.addMenuItem(optionsMenuItem);

    menuScene.addMenuItem(playMenuItem);

    

    menuScene.buildAnimations();

    menuScene.setBackgroundEnabled(false);

    

    menuScene.setOnMenuItemClickListener(this);

    return menuScene;

}

使用ScaleMenuItemDecorator 创建动画,引擎还提供了其他MenuItem修饰器

。你也可以很容易地创建自己的修饰器,还可以将修饰器和实体修改器结合起来。(具体见引擎的代码)

SpriteMenuItem 的第一个参数是按钮的ID,然后 为菜单设置setOnMenuItemClickListener 监听器,实现IOnMenuItemClickListener:

@Override

public boolean onMenuItemClicked(MenuScene pMenuScene, IMenuItem pMenuItem, float pMenuItemLocalX, float pMenuItemLocalY)

{

    handleButtonActions();

    

    switch(pMenuItem.getID())

    {

        case 0:

            //action

            return true;

        case 1:

            //action

            return true;

        default:

            return false;

    }

}

l 实体间的碰撞:

AE让我们检查两个实体的碰撞变得非常容易:

 a,创建实体。

b,重写onManagedUpdate()

Sprite entity = new Sprite(x, y, 100, 300, textureRegion, vbo)

{

     @Override

     protected void onManagedUpdate(float pSecondsElapsed)

     {

         if (player.collidesWith(this))

         {                                                              

             // execute actions

         }

     };

};

l 如何正确创建文字

GLES2只有一个类便可以创建静态和动态的文字。

1.创建文字时的重点

 实例化文字对象前先准备内存。 比如想显示一个分数:"Score:128"

 确定使用什么字体,和使用哪些字符,然后:

Text t = new Text(0, 0, font, "Score:0123456789", vbo);

这样,就不会每次都重新生成一个新的文字实例了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值