【v2.x OGE教程 15】 布局相关

本文介绍了OGE游戏引擎中的布局管理,包括父与子关系、实体的相对布局、Layer的使用、ZIndex的调整以及适配不同分辨率的策略。通过示例代码展示了如何创建和管理游戏对象的层次结构,确保在不同设备上正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.父与子关系

我们可以在Entity类看到很多parent(父)与child(子)这样的字眼,这是游戏引擎中常有的概念,简单而言是一种has-a的关系

对应代码:

B.attachChild(A);

B.attachChild(C);

C.attachChild(D);

从代码和图片可以看出

B没有父

B的子是AC

AC的父都是B

C的子是D

D的父是C


2.实体的相对布局

Entity方法中,Entity常用相对布局来实现界面效果,而且可以利用相对布局达到适配的效果。

private void initRectangle() {

        // white_rect对象在当前Scene中居中摆放

        Rectangle white_rect=new Rectangle(0,0,100,100,

                        this.getVertexBufferObjectManager());

        white_rect.setCentrePosition(TestScene.this.getCameraWidth() /2,

                        TestScene.this.getCameraHeight() /2);

        // white_rect对象添加至场景TestScene

        TestScene.this.attachChild(white_rect);

 

        // green_rect默认坐标 0,0 宽、高为50的矩形

        green_rect=new Rectangle(0,0,50,50,this.getVertexBufferObjectManager());

        // white_rect的顶部Y值将设置在white_rect的底部

        green_rect.setTopPositionY(white_rect.getBottomY());

        // green_rect的中心Xwhite_rect的中心X一致

        green_rect.setCentrePositionX(white_rect.getCentreX());

        green_rect.setColor(Color.GREEN);

        // green_rect对象添加至场景TestScene

        TestScene.this.attachChild(green_rect);

}



3.Layer

图层的基类是Entity,图层是逐个叠加的,类似于制作卡通动画时所用的赛璐珞。图层用来对场景中的Sprite等实体进行管理控制,以便在同一场景使用不同的图层达到表现效果。

如天天酷跑,有了图层,我们可以将RPG游戏中的按钮,状态放在一个场景中,游戏内容可以放到另一个图层中,这样就不会相互干扰了。


4.ZIndex的使用

有时候因为需求,需要将原本在底部的Entity置顶,那么就需要用到ZIndex这个参数,两者对比,ZIndex较大的Entity在上面,所以设置好ZIndex的值后,用sortChildren对其重新排序。


5.IEntityGroup

只有实现这个接口的类才可以进行这样的操作,这种嵌套方式可以让开发自行定义游戏层级结构

LayerA.attachChild(layerB);

LayerB.attachChild(layerC);


6.适配原理(多分辨率支持策略和原理)

游戏设计分辨率:

我们自己定义游戏的分辨率是多少(例如800×480),然后UI根据这个分辨率来进行绘图

手机屏幕分辨率:手机自身屏幕的分辨率

 

期望分辨率=游戏设计分辨率

实际分辨率=手机屏幕分辨率

 

首先确定是横屏游戏还是竖屏游戏,假设手机是320×480,是竖屏游戏,并且游戏设计分辨率是480×800

举例:以保持宽不变,高适配。假设UI给的图是480×800

 

屏幕宽高比=实际分辨率宽(320)/实际分辨率高(480)=期望分辨率宽(480)/期望分辨率高

 

我们可以得到期望分辨率高等于720,因为UI 给图的高是800,那么空出来那80=800-720部分就是图中没有阴影的那一部分。

在手机显示效果图

1. @Override

2. protectedPixelPerfectEngineOptions onCreatePixelPerfectEngineOptions() {

3.     PixelPerfectEngineOptionspixelPerfectEngineOptions = new PixelPerfectEngineOptions(this,ZoomCamera.class);

4.     pixelPerfectEngineOptions.setDesiredSize(480);

5.     pixelPerfectEngineOptions.setScreenOrientation(ScreenOrientation.PORTRAIT_FIXED);

6.     pixelPerfectEngineOptions.setPixelPerfectMode(PixelPerfectMode.CHANGE_HEIGHT);

7.     returnpixelPerfectEngineOptions;

8. }

复制代码

 

对应源码

public EngineOptions createEngineOptions() {

    float[] screenSize = this.getScreenSize();

    float screenWidth = screenSize[0];

    float screenHeight = screenSize[1];

    float screenRatio = screenWidth / screenHeight;

    float cameraWidth = this.mDesiredSize;

    float cameraHeight = this.mDesiredSize;

    if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_WIDTH) {

        cameraWidth = this.mDesiredSize * screenRatio;

    } else if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_HEIGHT) {

        cameraHeight = this.mDesiredSize / screenRatio;

    }

    Class<?>[] parameterTypes = { float.class, float.class, float.class,float.class };

    Object[] argParam = { 0.0f, 0.0f, cameraWidth, cameraHeight };

    Camera camera = ReflectionUtils.newInstance(this.mCameraCls, parameterTypes, argParam);

    EngineOptions engineOptions = new EngineOptions(true, this.mScreenOrientation, new FillResolutionPolicy(), camera);

    engineOptions.getTouchOptions().setNeedsMultiTouch(true);

    engineOptions.getAudioOptions().setNeedsSound(true);

    engineOptions.getAudioOptions().setNeedsMusic(true);

    engineOptions.getRenderOptions().setDithering(true);

    return engineOptions;

}

 

 

 

 

本人第一个Android程序,支持抓包(pcap)和对抓包文件进行分析(只支持http分析,自动解压gzip), 本程序无广告,无恶意代码, 如果不能用请告知手机信息和具体问题. Email: humorcolor@163.com 更新说明: V1.0.4 1.兼容Android4.2 V1.0.3 1.处理展示时间bug V1.0.2 1.增加部分机型适配 2.增加封包解析时间展示 3.处理长连接解析问题 说明: 1.请确认你的手机已ROOT 或者 能够在电脑上连接ADB 2.请确认你的手机有储存卡(/sdcard) 3.如果你的手机已经有ROOT权限,可以直接使用此应用进行抓包 4.如果没有获取ROOT权限,请使用 ADB命令 将应用生成的[/sdcard/tcpdump]复制到[/ststem/xbin/]目录下,并修改权限为6755后再次运行此应用抓包。 5.抓包文件保存在/sdcard/目录下,文件格式为.pcap 6.所抓取的数据包可以直接打开分析或者在电脑上使用Wireshark打开分析 7.注意在抓包过程中不要切换网络,否则会导致切换后的网络访问无法被抓取 ADB命令示例: adb root adb remount adb pull /sdcard/tcpdump c:\\ adb push c:\\tcpdump /system/xbin/ adb shell chmod 6755 /system/xbin/tcpdump 相关命令备注: 抓包命令:/system/xbin/tcpdump -p -s 0 -w /sdcard/xxxxxx.pcap 查看网卡:/system/xbin/tcpdump -D 或者 netcfg (查看状态为UP的网卡) 复制文件:cp 不成功可以使用 dd if=/sdcard/tcpdump of=/system/xbin/tcpdump 没有写权限:mount -o remount,rw / 和 mount -o remount,rw /system 参考代码: 手机抓包工具V2.0 pyhttpcap-master
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值