




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前言:andengine学习翻译,原文:/tutorials.html译者:moonlight email: 文中有不少不准确的地方,凑合看吧,希望对初学者有些帮助。一。开始: 1.andengine 介绍: ae 是一个基于opengl的开源免费游戏引擎,作者是nicolas gramlich。该引擎封装了opengl的大多数重要功能,意味着即使你没有opengl编程经验,也可以使用该引擎来创建游戏,只要你有java编程经验。 引擎的主要特点: 支持不同分辨率设备的缩放。 多点触摸支持 物理引擎-box2d(愤怒的小鸟也使用该引擎) tmx 瓦片地图支持 粒子系统 动态壁纸扩展支持 使用ae的好处: 免费开源 游戏开发中的方方面面都被做好了 不需要opengl的经验 快速和良好的设计(注:引擎采用高内聚低耦合,模块分得很细) 相对来说大而活跃的帮助社区(注:) 不错的引擎扩展(注:8还是9个扩展包) 大量的实例,告诉你引擎能做什么l 不足: 几乎没有代码文档 有时候速度比不上其他引擎 缺乏文档是初学者的最大困难不过实例,社区还有我的(作者的)这个网站也能给初学者极大帮助l 2.搭建开发环境:环境的搭建参造realmayo的视频,里面说得很详细。l 3.重要概念: 本节描述引擎中的重要概念,简单地说就是引擎中最常用到的类和扩展l 1.andengine-核心术语(bynicolas gramlich + updates and addons) engine: 引擎通过时间片来处理游戏,周期性地同步场景的绘制和更新。你也可以使用engine的子类: limitedfpsengine 限定的fps。(注:即固定的帧数,代码中还有一种是fixstepengine 即固定步长,文中没有写。意思是每次更新传递的时间都是固定的,即使实际更新场景用的时间超过的了设定的,也会传入固定的时间。) iresolutionpolicy: iresolutionpolicy 接口实现是engineoptions的一部分,它告诉引擎如何处理不同设备的不同屏幕尺寸。i.e. ratioresolutionpolicy 在保持比例的情况下会最大化surfaceview到屏幕的大小。这样屏幕上的东西不会发生变形。 ratioresolutionpolicy 保持比例 fillresolutionpolicy 填充屏幕,可能被拉伸 camera: 相机就是定义场景中可显示的部分,通常一个场景有一个相机,camera 的子类有更多功能: boundcamera- 可以设定场景的边界。 zoomcamera 可以缩放,定点缩放,滚动场景 scene: 场景是绘制到屏幕上的所有对象的根容器,一个场景可以包含多层,每层容纳(静态或者动态地)一定数量的实体(entity)。scene 有子类:hud, menuscene, camerascene, 这些子类绘制在固定位置和摄相机镜头无关。 hud- head up display. 像游戏中的分数显示。(注:理解成电视频道的台标!) entity: 实体就是可以被绘制的对象,如,精灵sprites, 矩形rectangles, 文字 text 或 线条lines等,每个实体都有,位置/旋转/缩放/颜色等等属性。 sprite- 具有纹理(texture)的实体(entity) tiledsprite- 被切开了的精灵 animatedsprite- tiledsprite的扩展,可以按指定的时间播放。 texture: texture 就是内存中图像的一个切片。在android上纹理的宽和高应当是2的幂(但在eles2中没有这个要求了,可以很好地减少内存使用。) ae 将许多itexturesources 源组成一个纹理,可以更合理地使用内存空间。textureregion:textureregion 定义了texture上的一矩形区域,用来定义精灵要绘制的部分。l 4.andengine 的官方例子:ae虽然缺乏文档,但是别担心,实例代码可以很好帮你理解引擎如何工作,这是链接:andengine examples github link l 5. gles1 和gles2的比较:有三个ae的版本,gles1, gles2, gles2 anchor center。gles1已经停止开发。虽然有人说gles2比gles1要慢(click here)。但是还是强烈建议使用最新版本。l 6.gles2 和 gles2 anchor center 的不同:g2ac 最有意义的改变是坐标系统。原点在左下。原因是: 和原生opengl的坐标系统一致。 和cocos2d-iphoneandcocos2d-x的一致。注:我理解为就是数学上的笛卡尔坐标系 作者更容易更有效写引擎,使用andenginecocosbuilderextension扩展包能读取从cocosbuilder 导出的格式(cocos有较多的工具)。 对需要滚屏的游戏更自然。另外一个变化是锚点(旋转,缩放等的中心)是个从0.0到1.0的相对量。总得来说,这有点像cocos-2d了。这不是什么坏事。为了更好理解g2ac的坐标系统如何工作,举个例子:假如上图是一个场景,摄像机宽高为800x480,则: 左下角(bottom left corner)为(0,0),左上(top left corner)为(0, 480) 左下角(bottom right corner)为(800, 0),右上(top right corner)为(800, 480) 场景中有image a, image b, 和 image c 三张图。 image a 是50x50, 那么它的坐标应当是(25, 25)。 image b 是200x150 ,要放在屏幕中间,那么它的坐标就是(400,240) a 和b都是与场景关联(attached), c 是与b关联,即在b的(0,0)点。二。实体无素介绍l 精灵(sprites)如果在2d游戏开发中你还是新手,不知道什么样是精灵,我先简单给sprite下个定义。精灵就是放在场景坐标(x,y)位置的2d位图(sprite is a 2d bitmap, positioned on the scene by x, ycoordinates.)在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 有三个切片,猜对了,需要为每一个切片指定一个值。(注:每个切片播放后的延时)l 如何删除实体(how to remove entities):对于不再需要的实体对象我们应当删除,按下面步骤来:ourentity.detachself();yourentity.dispose();l 将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);再往第一层里添加东西!l 实体修改器(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.自动的视差背景autoparallaxbackground是parallaxbackground的子类,可以用来控制里面的实体,比如移动的去朵。但是不太灵活,推荐使用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 isactionoutsidel 创建并理解场景 场景是绘制到屏幕上的所有对象的根容器,一个场景可以包含多层,每层容纳(静态或者动态地)一定数量的实体(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 hudhud的解释在前面。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:overridepublic 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);这样,就不会每次都重新生成一个新的文字实例了!三。处理触摸事件:l 使用场景触摸监听:我会解释如何使用触摸监听 首先,应当实现ionscenetouchlistener接口 然后检查事件 动作。overridepublic boolean onscenetouchevent(scene pscene, final touchevent pscenetouchevent) if (pscenetouchevent.isactiondown() /execute action. return false;最后,注册到场景:scene.setonscenetouchlistener(this);l 创建左/右按钮在大多数游戏中,你都要控制某个对象。所以控制器显得有必要。在这个例子中,我会展示如何创建左/右按钮(控制主角左/右移动)1.创建按钮本例使用 矩形实体(rectangle entity)简单明了。当然你可以使用任何其他实体如sprite 或 animatedsprite。按钮会被关联到hudprivate void createcontrollers() hud yourhud = new hud(); final rectangle left = new rectangle(20, 200, 60, 60, vbo) public boolean onareatouched(touchevent touchevent, float x, float y) if (touchevent.isactionup() / move player left return true; ; ; final rectangle right = new rectangle(100, 200, 60, 60, vbo) public boolean onareatouched(touchevent touchevent, float x, float y) if (touchevent.isactionup() / move player right return true; ; ; / 可见,实际接受触摸事件消息的是场景! yourhud.registertoucharea(left); yourhud.registertoucharea(right); yourhud.attachchild(left); yourhud.attachchild(right); camera.sethud(yourhud);首先,创建一个hud,然后,两个矩形,重写矩形实体的 onareatouched以便能处理事件,在场景中注册响应区域,最后把实体加到场景中。别忘了调用camera的sethud。l 处理安卓的原生按键消息(native key)在开发应用时候,处理按键消息也很重要。有几个要记住,这是我的观点:(注:这个属于android framework 层)1.重写方法:首先,应该重写onkeydown方法,该方法会捕获电话的回退键。overridepublic boolean onkeydown(int keycode, keyevent event) if (keycode = keyevent.keycode_back) / perform your actons. return false; 2.处理不同的按键显然,会有很多不同的按键消息,重要的有: keyevent.keycode_home keyevent.keycode_back keyevent.keycode_menu值得一提的是,在有些设备上,没有特定的键,像我的平板就没有menu键。3.仔细思考我强烈不建议重写系统的home/back键,因为需要返回 前一个app,另一个重要因素是:在 google play store 团队为应用排位时也会考虑这个因素。(注:不太了解)l 捕获连续的触屏事件本文讲述如何简单,快速,正确捕获连续触屏事件。假如有一个精灵,需要连续地执行某一动作(如,在x轴上给玩家力来作移动),这里,我使用矩形实体。1. 可能的解法有两个办法,分别介绍:final rectangle button = new rectangle(0, 0, 100, 100, vbo) override public boolean onareatouched(touchevent pscenetouchevent, float ptoucharealocalx, float ptoucharealocaly) if (pscenetouchevent.isactionmove() / handle your action here return true; ;如上,重写onareatouched 方法并捕获isactionmove。这是个好办法,因为你手指按下时随着手指移动,即使是一,两个像素也会获得连续的移动事件,但并不完美。所以有更好的解法:/ our flagprivate boolean istouchedflag = false;/ our buttonfinal rectangle button = new rectangle(0, 0, 100, 100, vbo) override public boolean onareatouched(touchevent pscenetouchevent, float ptoucharealocalx, float ptoucharealocaly) if (pscenetouchevent.isactiondown() istouchedflag = true; if (pscenetouchevent.isactionup() istouchedflag = false; return true; override protected void onmanagedupdate(float psecondselapsed) if (istouchedflag) / execute your actions. super.onmanagedupdate(psecondselapsed); ;这个办法使用了update handler总是有效,因为: 首先,声明一个布尔标志来存储按钮状态。 使用rectangle声明一个按钮。 重写onareatouched 方法捕获事件 . 如果是 isactiondown 按下,设置标志为true (触屏开始) 如果是 isactionup 抬起设置标志为 false (释放) 这次我们重写 onmanageupdate 检查标志是否为true,如果是则在循环中执行我们的要做的事。l 捕获长时点击(long click)按着不放这个事件很容易实现,因为 ae已经内置这个功能了长时点击在界面中很有用,下面代码展示如何在场景中实现这个功能: 首先,必须实现iholddetectorlistener接口,重写下面三个未实现的方法:overridepublic void onholdstarted(holddetector pholddetector, int ppointerid, float pholdx, float pholdy) overridepublic void onhold(holddetector pholddetector, long pholdtimemilliseconds, int ppointerid, float pholdx, float pholdy) overridepublic void onholdfinished(holddetector pholddetector, long pholdtimemilliseconds, int ppointerid, float pholdx, float pholdy) 声明一个continousholddetector 对象private continuousholddetector continuousholddetector; 初始化它,并注册到场景。 注意,这里使用默认的构造函数,如果要自定义一些参数,你也可以使用带参数的构造函数。continuousholddetector = new continuousholddetector(this);yourscene.registerupdatehandler(continuousholddetector); 完成后,你就可以在iholddetectorlistener接口的实现函数里执行自己的代码了 onholdstarted() - 手指按住一段时间后调用。 onholdfinished() - 手指离开屏幕后调用。四。基础l helloworld本文讲述如何使用ae创建helloworld。相当简单,不需要有什么经验。使用的引擎为:gles2确认android开发环境和ae的代码都准备好了。1. 在eclipse中创建一个android project。2.将导入的ae 工程连接成库右键点击andengine-属性-android-library field3.在创建的helloworld工程中,删除自动生成的java 类.建一个新的类,基类为:simplebasegameactivityide会强制你添加未实现的方法.package test.matim;import org.andengine.engine.options.engineoptions;import org.andengine.entity.scene.scene;import org.andengine.ui.activity.simplebasegameactivity;public class testactivity extends simplebasegameactivity override public engineoptions oncreateengineoptions() return null; override protected void oncreateresources() override protected scene oncreatescene() return null; 4.创建新的engineoptions 和camera. 声明camera 声明两个final变量, 作为camera的宽和高.private camera camera; private static final int camera_width = 800; private static final int camera_height = 480;记住,摄相机大小总是由你自己控制. 在oncreateengineoptions() 中,实例化一个camera对象.然后生成一个新的engineoptionsoverridepublic engineoptions oncreateengineoptions() camera = new camera(0, 0, camera_width, camera_height); engineoptions engineoptions = new engineoptions(true, screenorientation.landscape_fixed, new fillresolutionpolicy(), camera); return engineoptions;engineoptions 第一个参数指是否全屏,第二个是屏幕方法,第三个分辨率大小策略. 见click here5.创建新的主场景 在oncreatescene() 中创建新的scene对象 场景是个实体(entity)所以可以增加新的实体,如精灵 把场景的背景设为蓝色overrideprotected scene oncreatescene() scene scene = new scene(); scene.setbackground(new background(0.09804f, 0.6274f, 0.8784f); return scene;现在这个工程就可以运行了,只有一个蓝色的背景.l 加载游戏资源这篇会说明如何加载大多数常用的资源:u graphicsu fontsu sounds1.注意事项 在gles2中不再强制要求纹理使用2,4,8,16,32.的大小了.可以自由设置大小. 强烈不建议使用大于1024x1024像素的纹理,因为在有些低端设备上不支持. 如果在游戏中需要音乐,考虑.ogg格式.apk会更小.2.加载资源要加载资源,所有你要做的是把加载资源的代码放在 oncreateresources() 中. 从易读修改方面考虑, 我们可能需要将其分成三个小方法.overridepublic void oncreateresources(oncreateresourcescallback poncreateresourcescallback) throws ioexception loadgraphics(); loadfonts(); loadsounds(); poncreateresourcescallback.oncreateresourcesfinished();private void loadgraphics() private void loadfonts() private void loadsounds() 3. 加载图片这里详细实现loadgraphics声明一个新的纹理, 纹理区域,然后 从asset/gfx 中加载image.png图片.private bitmaptextureatlas yourtexture;private itextureregion yourtextureregion;private void loadgraphics() bitmaptextureatlastextureregionfactory.setassetbasepath(gfx/); yourtexture = new bitmaptextureatlas(gettexturemanager(), 256, 256, textureoptions.default); yourtextureregion = bitmaptextureatlastextureregionfactory.createfromasset(yourtexture, this, image.png, 0, 0); yourtexture.load(); 纹理大小是256x256, 你可以在任何时候加载和缷载图片. yourtexture.load(); yourtexture.unload();考虑这种情况, 有两个场景,每个场景使用自己的图片资源. 在场景切换的时候, 先缷载一个纹理,加载另一个来达到减少内存的使用.4.加载字体加载字体类似,选择合适纹理大小:private font yourfont;public void loadfonts() fontfactory.setassetbasepath(font/); final itexture fonttexture = new bitmaptextureatlas(activity.gettexturemanager(), 256, 256, textureoptions.bilinear_premultiplyalpha); yourfont = fontfactory.createfromasset(getfontmanager(), fonttexture, getassets(), font.ttf, 40, true, color.black); yourfont.load();5. 加载声音这里我们从assets/mfx/ 中加载private sound yoursound;public void loadsounds() try yoursound = soundfactory.createsoundfromasset(getengine().getsoundmanager(), this, mfx/sound.ogg); catch (ioexception e) e.printstacktrace(); l 声音和音乐在ae从加载使用声音很容易, 还有一些其他功能如音量控制, 也可以加载不同格式的声音文件.1.加载资源private music music;try music = musicfactory.createmusicfromasset(mengine.getmusicmanager(), this,mf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商场施工清场方案(3篇)
- 电梯环境改造方案(3篇)
- 景区门楼改建方案(3篇)
- 基础护理教学教学课件
- 服装导购绩效方案(3篇)
- 样品生产控制方案(3篇)
- 民族地区草场承包与民族团结进步协议
- 菜鸟驿站快递网点转让与经营规范协议
- 出租车驾驶员心理健康保障合同
- 厂房拆除与拆除区域安全防护与交通管制合同
- 商务英语写作实践智慧树知到答案章节测试2023年中北大学
- 社会治安动态视频监控系统工程建设方案
- 脱硫塔玻璃鳞片胶泥衬里施工组织设计
- XB/T 505-2011汽油车排气净化催化剂载体
- GB/T 3672.2-2002橡胶制品的公差第2部分:几何公差
- GB/T 27744-2021异步起动永磁同步电动机技术条件及能效分级(机座号80~355)
- GB 8076-2008混凝土外加剂
- 宝盾转门故障代码
- 【课件】草原上的小木屋
- 医务人员违规行为与年度考核挂钩制度
- 空调维保质量保障体系及措施方案
评论
0/150
提交评论