Touch
TouchDragExample:重载Sprite的OnAreaTouched方法,本例不管ACTION_DOWN还是ACTION_MOVE都移动Sprite。
最后注册TouchArea,并用scene.setTouchAreaBindingEnabled(true);把TouchArea和PointerID绑定,这样就算多点触摸Sprite也只会跟着一个手指走。
MultiTouchExample: MultiTouch类可以检测当前设备是否支持多点触摸。另外引起我兴趣的是AndEngine里的Card类,封装的扑克牌类。别忘了setTouchAreaBindingEnabled(true);绑定PointerID和触摸区域。使用前engine.setTouchController(newMultiTouchController());
AnalogOnScreenControlExample:参照第一节
DigitalOnScreenControlExample:参照第一节
AnalogOnScreenControlsExample:参照第一节
CoordinateConversionExample:很有趣,不管怎么移动和旋转face,箭头永远指向face的左眼。核心就一句:finalfloat[] eyeCoordinates =this.convertLocalToSceneCoordinates(11, 13);该方法把Entity的Local坐标转换成屏幕坐标。Entity很重要,代码值得精读。至少该看一下Outline里的各种方法。
PinchZoomExample:实现多点缩放步骤
1. 让Activity 实现IOnSceneTouchListener负责场景背景触摸, IScrollDetectorListener, IPinchZoomDetectorListener.
2.创建 SurfaceScrollDetector,PinchZoomDetector,ZoomCamera成员(本例要缩放整个场景,而不是单独的实体,单独实体用setScale缩放)。
3. onLoadEngine时给引擎设置多点触摸控制器engine.setTouchController(newMultiTouchController());
4. onLoadScene时初始化SurfaceScrollDetector和PinchZoomDetector,并this.mScene.setOnSceneTouchListener(this);
5.重载实现onScroll,onPinchZoomStarted,onPinchZoom,onPinchZoomFinished,onSceneTouchEvent的处理,通过mZoomCamera.setZoomFactor实时改变ZoomFactor
例子里的mScene.setOnAreaTouchTraversalFrontToBack()顺序遍历注册到场景的TouchArea,还可以逆序遍历。默认是逆序的。
今天起学习AndEngine,看给出的例子,从零开始。
首先说明下AndEngingeExamples实例教程,入口是examples.launcher包的ExampleLaucher类,各个子例程在ExampleGroup类里能找到。
功能:在游戏主场景显示虚拟摇柄,所谓模拟摇柄是360度的,每个方向有连续的力度值。对应数字摇柄例子DigitalOnScreenControlExample类力的数字摇柄,该摇柄仅支持8个方向,每个方向只有开关两状态。
该例子用摇柄控制方块sprite运动。
1引擎的生成和资源装载:
生成摄像机:
Camera(float pX, float pY, float pWidth, float pHeight)
BitmapTextureAtlas构造的时候前2个参数意义是划出
pWidth*
pHeight大小的一块空间用来存储
createFromAsset装载的贴图。
createFromAsset的后两个参数便是在这块空间里的左上角坐标。
2场景
PhysicsHandler:处理实体的匀速,加速,角速度状态的更新
registerUpdateHandler(IUpdateHandler pUpdateHandler):为实体注册一个Handler
AnalogOnScreenControl:模拟摇柄类,两个贴图绘成:摇把和底座。绘制方式可自定义透明度,缩放等等
Scene.setChildScene(Scene pChildScene)场景力加入子场景,这里把摇柄当成子场景在背景上绘制。
DigitalOnScreenControl与模拟摇柄例子大同小异。就差DigitalOnScreenControl类不同。AnalogOnScreenControlsExample是支持两个模拟摇柄的例子,一个控制平移,一个控制旋转
-----------------------------------------------------------------
关于创建纹理贴图时的选项TextureOptions涉及到openGL知识,这里粗浅地了解一下。
纹理过滤
将纹理映射到多边形上, 实际上是将纹理的图像数据空间映射到帧缓冲图像空间上。所以, 你必须保证纹理图像加载完成。 纹理图像被映射到多边形上可能会造成失真。纹理图像映射到多边形上去,屏幕上的一个点可能是纹理点的一个部分(如果视口设置的离纹理很近), 也有可能屏幕上的一个像素点是多个纹理的集合(如果视口设置的足够远).纹理过滤就是告诉 OpenGL 在纹理到屏幕像素点的映射中如何计算最终显示的图像数据。
在纹理过滤中, 放大器处理一个屏幕像素点代表一个纹理点的一部分的情况;缩小器处理一个像素点代表多个纹理点的情况. 你可以通过下面函数来告诉 OpenGL 怎样处理这两种情况:
void glTexParameter{if}(GLenum target, GLenum pname, T param); |
void glTexParameter{if}v(GLenum target, GLenum pname, T params); |
glTexParameter 不仅仅设置放大器和缩小器, 在本章中,由于只涉及纹理,所以只讨论纹理相关的参数取值.
参数 target 指的是纹理目标, 可以是 GL_TEXTURE_1D, GL_TEXTURE_2D*, GL_TEXTURE_3D 或 GL_TEXTURE_CUBE_MAP 。 指定纹理放大过滤器需要指定参数 pname为 GL_TEXTURE_MAG_FILTER, 指定纹理缩小过滤器需要指定参数 pname 为 GL_TEXTURE_MIN_FILTER.
当指定为 GL_TEXTURE_MAG_FILTER, 参数 param 取值 GL_NEAREST 或 GL_LINEAR. 对放大过滤器而言, 使用 GL_NEAREST 将告诉 OpenGL 使用离像素点中心最近的纹理来渲染, 这被称作 点样( point sampling); 使用 GL_LINEAR 告诉 OpenGL 会使用离像素点中心最近的四个纹理的平均值来渲染. 这被称作 双线性过滤( bilinear filtering)。
缩小过滤器比放大过滤器的取值更广, 下表是指定缩小过滤器时, 参数 param 的取值, 下面表中的值是为了增强渲染质量。
过滤参数 | 注解 |
GL_NEAREST | 使用像素点中心最近的点渲染 |
GL_LINEAR | 使用双线性过滤 |
GL_NEAREST_MIPMAP_NEAREST | |
GL_NEAREST_MIPMAP_LINEAR | |
GL_LINEAR_MIPMAP_NEAREST | |
GL_LINEAR_MIPMAP_LINEAR | |
缩小过滤器的参数
在缩小过滤器中, 有4个参数处理mipmap, 这将会在后面的mipmap部分讲解。
默认情况下, 放大过滤器的参数为 GL_LINEAR, 缩小过滤器为 GL_NEAREST_MIPMAP_LINEAR.
在渲染纹理时, OpenGL 会先检查当前的纹理是否加载完成,同时也会处理其他事情,如在选用缩小过滤器的mipmap处理时会验证mipmap的所有级别是否被定义。 如果纹理未完成, 纹理会被禁用。因为缩小过滤器的缺省值使用mipmap,所以你必须指定所有的mipmap级别或是将缩小过滤器的参数设为 *GL\_LINEAR* 或*GL\_NEAREST*.