-【优秀文档资料】Android游戏开发之旅(打印版)_第1页
-【优秀文档资料】Android游戏开发之旅(打印版)_第2页
-【优秀文档资料】Android游戏开发之旅(打印版)_第3页
-【优秀文档资料】Android游戏开发之旅(打印版)_第4页
-【优秀文档资料】Android游戏开发之旅(打印版)_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、l.android游戏开发之旅一长按button原理今天android123开始新的android游戏开发之旅系列,主要从控制方法(按键、轨迹球、 触屏、重力感应、摄像头、话筒气流、光线亮度)、图形view(高效绘图技术如双缓冲)、音 效(游戏音乐)以及最后的opengl es(java层)和ndk的opengl和j2me游戏移植 android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在android opengl如 何使用md2文件”个部分讲述下android游戏开发的过程最终实现f 比较完整的游戏引 擎。相信大家都清楚android market下载量比较好的都是游戏,未来手机

2、网游的发展相信 android使用的java在这方面有比iphone有更低的入门门槛。对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射 武器,结合android button模型,我们实现一个带图片的button的长按,为了更清晰的显 示原理,android开发网这里使用imagebutton作为基类public class repeatinglmagebutton extends imagebutton private long mstarttime; 记录长按开始private int mrepeatcount; /重复次数计数private repeatli

3、stener mlistener;private long mlnterval = 500; /timer 触发间隔,即每 0.5 秒算一次按下public repeati nglmagebutt on(con text con text) this(c on text, null);public repeatinglmagebutton(c ontext con text, attributeset attrs) this(context5 attrs, android.r.attr.imagebuttonstyle);public repeatinglmagebutton(context

4、con text, attributeset attrs, int defstyle) super(c on text, attrs, defstyle);setfocusable(true); 允许获得焦点setlongclickable(true); 启用长按事件public void setrepeatlistener(repeatlistener i, long interval) 实现重复按下事件listenermlistener = i; m interval = interval;overridepublic boolean performlongclick() mstartti

5、me = systemclock.elapsedrealtime(); mrepeatc ount = 0;post(m repeater);return true;overridepublic boolean on toucheve nt(moti on eve nt eve nt) if (event.getaction() = motionevent.action_up) / 本方法原理同 onkeyup 的样,这里处理屏幕事件,下面的onkeyup处理android手机上的物理按键事件removecallbacks(mrepeater);if (mstarttime != 0) dor

6、epeat(true); mstarttime = 0;return super.ontouchevent(event);处理导航键事件的中键或轨迹球按下事件overridepublic boolean onkeydown(int keycode, keyevent event) switch (keycode) case keyevent.keycode_dpad_center:case keyevent.keycode_enter:super. onkeydown (keycode, eve nt);return true;return super.onkeyd own (keycode,

7、 eve nt);当按键弹起通知长按结束overridepublic boolean onkeyllp(int keycode, keyevent event) switch (keycode) case keyevent.keycode_dpad_center:case keyevent.keycode_enter:removecallbacks(mrepeater);徳消重复 listener 捕获if (mstarttime != 0) dorepeat(true); 如果长按事件累计时间不为0则说明长按了mstarttime = 0; 重置长按计时器return super.onkey

8、up(keycode, eve nt);private runnable mrepeater = new runnable() 在线程中判断重复public void run() dorepeat(false);if (ispressed() postdelayed(this, mlnterval); /计算长按后延迟下一次累加;private void dorepeat(boolean last) long now = systemclock.elapsedrealtime();if (mlistener != null) mlistener.onrepeat(this, now mstar

9、ttime, last ?: mrepeatcount+);下面是重复button listener接口的定义,调用时在button中先使用setrepeatlistener() 方法实现repeatlistener接口public in terface repeatliste ner void onrepeat(view v, long duration, int repeatcount); /参数一为用户传入的button对象,参数二为延迟的毫秒数,第三位重复次数回调。本类大家可以直接在自己的view中implements实现repeatlistener接口即可。如果有 问题可以来函到an

10、droid123 ,明天我们将讲至惰关view处理的问题。2.android 游戏开发之旅二 view 和 surfaceview在android游戏当中充当主要的除了控制类外就是显示类,在j2me中我们用display和 canvas来实现这些;而google android中涉及到显示的为view类,android游戏开发中 比较重要和复杂的就是显示和游戏逻辑的处理。这里我们说下android.view.view和 android.view.surfaceview0 surfaceview是从view基类中派生出来的显示类,直接子类有 glsurfaceview和videoview ,可以

11、看岀gl和视频播放以及camera摄像头一)均使用surfaceview ,到底有哪些优势呢? surfaceview可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了 surfaceholder类,使用getholder方法获取,相关的有canvas lockcanvas()canvas lockcanvas(rect dirty) 、 void removecallback(surfaceholder.callback callback)x void unlockcanvasandpost(canvas canvas)控制图形以及绘制,而在 surfaceholder.ca

12、llback接口回调中可以通过下面三个抽象类可以自己定义具体的实现比 如第i 更改格式和显示画面。abstract void surfacechanged(surfaceholder holder, int format, int width, int height)abstract void surfacecreated(surfaceholder holder)abstract void surfacedestroyed(surfaceholder holder)对于surface相关的,android底层还提供了 gpu加速功能,所以一般实时性很强的应 用中主要使用surfaceview

13、而不是直接从view构建z同时android123未来后面说到的 opengl中的glsurfaceview也是从该类实现。3.android游戏开发之旅三view类详解在android游戏开发之旅二中我们讲至u了 view和surfaceview的区别,今天android123 从view类开始着重的介绍android图形显示基类的相关方法和注意点。自定义view的常用方法:onfinishlnflate()当view中所有的子控件均被映射成xml后触发 onmeasure(int, int)确定所有子元素的大小onlayou=boo_ean 二hinc.nc.noilkview 耳owsw

14、m渊s”、*a口«耳裁加 onsizechanged(inlinlinc.nt)l1ksew3汁、=加徉左3謬加 ondrawoanvas) viewbaiks苗tit 0r!keyd0wn(i3-keyeveh)时菇滿菇 tdn 0nkeyup(int “ keyevem)血游鎰游讪耀尅母酸烁 0ntrackba=eve2.(m2.i0neve2.)删亠井 ontouchevenumohoneveni)謬a删弃 onfocuschanged(boo_eap isreci)味 viewsgt冷讯淋汕專當那 onwindowfocuschanged(boo_ean)昧»口曲2

15、3view 鋼牺熾冷卅»汨母謬 onahachedtowindowo11ksew 潯尽«也->»專酸那 ondes-chedfromwindowo11ksew®葺眦3»口3諄加、andro.ch23affi$llm sonahachedtowindowofilmffi><nso onwindowvisibi 牙 ychanged(h)dka召凹23凹曰sview 笫時艰左母諄规以上是view实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写ondraw(canvas)用的的是最多的:overrideprotect

16、ed void ondraw(canvas canvas) 这里我们直接使用canvas对象处理当前的画布,比如说使用paint来选择要填充的颜 色paint paintbackground = new paint();paintbackground.setcolor(getresources().getcolor(r.color.xxx); 从 res 中找到名为 xxx的color颜色定义canvas.drawrect(o, 0, getwidth(), getheight(), paintbackground); /设置当前画布的背景 颜色为paintbackground中定义的颜色,以

17、0,0作为为起点,以当前画布的宽度和高度为重 点即整块画布来填充。具体的请查看android123未来讲到的canvas和paint,在canvas中我们可以实现画路 径,图形,区域,线。而paint作为绘画方式的对象可以设置颜色,大小,甚至字体的类型当然还有就是处理窗口还原状态问题(一般用于横竖屏切换)除了在activity中可以调用外, 开发游戏时我们尽量在view中使用类似overrideprotected parcelable onsavelnstancestate() parcelable p = super.onsavelnstancestate();bundle bundle =

18、 new bundle();bundle.putlnt(hxm, px);bundle.putlnt(*y py);bundle.putparcelablefandroid 123_stateh, p);return bundle;overrideprotected void onrestorelnstancestate(parcelable state) bundle bundle = (bundle) state;dosomething(bundle.getlnt("x"), bundle.getlnt(”y”); 获取刚才存储的 x 和 y 信息super.onres

19、torelnstancestate(b un dle.getparcelable(,a ndroid123_staten); return;在view中如果需要强制调用绘制方法ondraw ,可以使用invalidate。方法,它有很多重载版本,同时在线程中的postlnvailidate()方法将在android游戏开发之旅六中的自定义view完整篇讲到。4.android游戏开发之旅四canvas和paint实例昨天我们在android游戏开发之旅三view详解中提到了 ondraw方法,有关详细的实现 我们今天主要说下android的canvas和paint对象的使用实例。canvas类

20、主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、 区域、贴图、画点、画线、渲染文本,下面是canvas类常用的方法,当然android开发网 提示大家很多方法有不同的重载版本,参数更灵活。void drawrect(rectf rect, paint paint) /绘制区域 r 参数一为 rectf个区域void drawpath(path path, paint paint) /纟会制一个路径,参数一为 path 路径对象void drawbitmap(bitmap bitmap, rect src, rect dst, paint paint) /贝占图,参数一就是

21、 我们常规的bitmap对象z参数二是源区域(android123提示这里是bitmap),参数三是目标 区域(应该在canvas的位置和大小),参数四是paint画刷对象,因为用到了缩放和拉彳申的 可能,当原始rect不等于目标rect时性能将会有大幅损失。void drawline(float startx, float starty, float stopx, float stopy, paint paint) /®线,参 数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y 轴垂直位置,最后一个参数为paint画刷对象。void drawpoint

22、(float x, float y, paint paint) /画点 z 参数一水平 x 轴,参数二垂直 y 轴, 第三个参数为paint对象。void drawtext(string text, float x, float y, paint paint) 渲染文本,canvas 类除了上面的 还可以描绘文字,参数一是string类型的文本,参数二x轴,参数三y轴,参数四是paintvoid drawtextonpath(string text, path path, float hoffset, float voffset, paint paint) / 在路径上绘制文本,相对于上面第二

23、个参数是path路径对象从上面来看我们可以看出canvas绘制类比较简单同时很灵活,实现一般的方法通常没有 问题,同时可以叠加的处理设计出一些效果,不过细心的网友可能发现最后一个参数均为 paint对象。如果我们把canvas当做绘画师来看,那么paint就是我们绘画的工具,比如画笔、画刷、颜料等等。paint类常用方法: void setargb(int a, int r, int g, int b)设置 paint 对象颜色,参数一为 alpha 透明通道void setalpha(int a)设置alpha不透明度,范围为0255void setantialias(boolean aa)

24、 /是否抗锯齿void setcolor(int color) 设置颜色,这里android内咅0定义的有color类包含了一些常见颜色定义void setfakeboldtext(boolean fakeboldtext) 设置伪粗体文本void setlineartext(boolean lineartext) 设置线性文本path effect setpatheffect(patheffect effect) /设置路径效果rasterizer setrasterizer(rasterizer rasterizer) /设置光栅化shader setshader(shader shade

25、r) 设置阴影void settextalign(paint.align align) /设置文本对齐void settextscalex(float scalex) 设置文本缩放倍数,1 .of 为原始void settextsize(float textsize) 设置字体大小typeface settypeface(typeface typeface) 设置字体,typeface 包含了字体的类型,粗 细”还有倾斜、颜色等。void setunderlinetext(boolean underlinetext) 设置下划线最终canvas和paint在on draw中直接使用overri

26、deprotected void ondraw(canvas canvas) paint paintred=new paint();paintred.setcolor(color.red);canvas.drawpoint(11,3,paintred); /在坐标 11,3 上画一个红点下一次androidl 23将会具体讲到强大的path路径,和字体typeface相关的使用。s.android游戏开发之旅五path和typeface今天我们继续处理上次android游戏开发之旅四canvas和paint实例中提到的path路 径和typeface字体两个类。对于android游戏开发或者说

27、2d绘图中来讲path路径可以用 强大这个词来形容。在photoshop中我们可能还记得使用钢笔工具绘制路径的方法。path 路径类在位于android.graphics.path中,path的构造方法比较简单,如下path cwj=new path(); 构造方法f面我们画一个封闭的原型路径,我们使用path类的addcircle方法cwj.addcircle(10,10,50,direction.cw); 参数一为x轴水平位置 参数二为y轴垂直位置, 第三个参数为圆形的半径,最后是绘制的方向,cw为顺时针方向,而ccw是逆时针方向。结合android上次提至!的canvas类中的绘制方法d

28、rawpath和drawtextonpath z我们 继续可以在ondraw中加入。canvas.drawpath(cwj,paintpath); /android 123 提示大家这里 paintpath 为路径的画刷颜 色,可以见下文完整的源代码。canvas.drawtextonpath(”android123 - cwj",cwj,0,15,painttext); 将文字绘制到路径中去,有关drawtextonpath的参数如下:方法原型 public void drawtextonpath (string text, path path, float hoffset, fl

29、oat voffset,paint paint)参数列表text为需要在路径上绘制的文字内容。path将文字绘制到哪个路径。hoffset距离路径开始的距离voffset离路径的上下高度,这里android开发网提示大家,该参数类型为float浮点型, 除了精度为8位小数外,可以为正或负,当为正时文字在路径的圈里面,为负时在路径的 圈外面。paint最后仍然是一 paint对象用于制定text本文的颜色、字体、大小等属性。-71画制芟 _sondraw 谢m-b-合魚霁码msww盍overrideproqcod void 0ndraw(canvas canvas)(paihpainipaihu

30、new pains paispphtexnnew painspai2-p2.h.s2.co-or(co-or.red)励血s画迦卅口® painttexls2-co-or(co-or.b-ue)二/8sm_t3>4+涉蹴® pa5paihcwjunew path?paihcwj.addqoeuo二 ocnodreaon.cw)s*mx 50px睦sme cw 址胃3茸canvasdrawpath(paihcwj9pairdpath);canvas.drawtexionpaih(=androich23 , cwjjpe.hcwjolpppnhexu 八 w亩 ssmh-

31、站8void addaarecif oval foai ssrrtange foai sweepang-e) /、涉ssmgvoid addcirc_e(f_oai x- foai, foai radiuspaihdreciion dir) /誌 pa_h 豹莒回岡voidaddova-(reaf oval paihbirecdon dir)ilvoid addrect(rectf rect, path.direction dir) 添加一区域void add ro u nd rect (rectf rect, float radii, path.direction dir) /添加一个圆角区

32、域 boolean isemptyo 判断路径是否为空void transform(matrix matrix) 应用矩阵变换void transform(matrix matrix, path dst) 应用矩阵变换并将结果放至!新的路径中,即第二 个参数。有关路径的高级效果大家可以使用patheffect类,有关路径的更多实例android123将在 今后的游戏开发实战中讲解道。typeface字体类平时我们在textview中需要设置显示的字体可以通过textview中的settypeface方法来指定f typeface对象”因为android的字体类比较简单”我们列出所有成员方法st

33、atic typeface create(typeface family, int style) 静态方法,参数一为字体类型这里是typeface的静态定义,如宋体,参数二风格,如粗体,斜体static typeface create(string familyname, int style) 静态方法,参数一为字体名的字符串,参数二为风格同上,这里我们推荐使用上面的方法。static typeface createfromasset(assetmanager mgr, string path) 静态方法,参数一为 assetmanager对彖 注要用于从apk的assets文件夹中取出字体

34、参数二为相对于android 工程下的assets文件夹中的夕卜挂字体文件的路径。static typeface createfromfile(file path) /清争态方法,从文件系统构造一个字体,这里 参数可以是sdcard中的某个字体文件static typeface createfromfile(string path) 静态方法,从指定路径中构造字体static typeface defaultfromstyle(int style) /|争态方法,返回默认的字体风格int getstyle() /炭取当前字体风格final boolean isbold() 判断当前是否为粗体f

35、inal boolean isltalic() 判断当前风格是否为斜体本类的常量静态定义,首先为字体类型名称typeface defaulttypeface default_boldtypeface monospacetypeface sans_seriftypeface serif字体风格名称int boldint bold_italicint italicint normal明天我们将在android游戏开发之旅六自定义view 文中具体讲解ondraw以及什么时 候会触发绘制方法,来实现我们自定义或子类化控件。6.android游戏开发之旅六自定义view有关android的自定义vie

36、w的框架今天我们一起讨论下,对于常规的游戏,我们在view 中需要处理以下几种问题:1控制事件2刷新view 3.绘制view1对于控制事件今天我们只处理按键事件onkeydown ,以后的文章中将会讲到屏幕触控 的具体处理ontouchevent以及sensor重力感应等方法。2. 刷新view的方法这里主要有invalidate(int i, int t, int r, int b)刷新局部z四个参数分别 为左、上、右、下。整个view刷新泊validate(),刷新一个矩形区域invalidate(rect dirty) z 刷 一个特性 drawable , invalidatedra

37、wable(drawable drawable),执行 invalidate 类的 方法将会设置view为无效,最终导致ondraw方法被重新调用。由于今天的view比较简单, androidl 23提示大家如果在线程中刷新,除了使用handler方式夕卜,可以在thread中直接 使用postinvalidate方法来实现。3. 绘制view主要是ondraw()中通过形参canvas来处理,相关的绘制主要有drawrect、 drawline. drawpath等等。view方法内部还重写了很多接口,其回调方法可以帮助我们判 断出 view 的位置和大小,比如 onmeasure(int,

38、 int) called to determine the size requirements for this view and all of its children. 、onlayout(boolean, int, int, int, int)called when this view should assign a size and position to all of its children 和 onsizechanged(int, int, int, int) called when the size of this view has changed 具体的作 用,大家可以用lo

39、gcat获取当view变化时每个形参的变动。下面cwjview是我们为今后游戏设计的一个简单自定义view框架,我们可以看到在 android平台自定义view还是很简单的,同时java支持多继承可以帮助我们不断的完善复 杂的问题。public class cwjview extends view public cwjview(context context) super(context);setfocusable(true); /允许获得焦点setfocusablelntouchmode(true); /炭取焦点时允许触控overrideprotected parcelable onsave

40、lnstancestate() 处理窗口保存事件parcelable psaved = super.onsavelnstancestate();bundle bundle = new bundle();/dosomethi ngreturn bundle;overrideprotected void onrestorelnstancestate(parcelable state) 处理窗口还原事件bundle bundle = (bundle) state;/dosomethingsuper.onrestorelnsta ncestate(b un dle.getparcelable(,cwj

41、h);return;overrideprotected void onsizechanged(int w, int h, int oldw, int oldh) /处理窗口大小变化事件super.onsizechanged(w, h, oldw, oldh);overrideprotected void onmeasure (int widthmeasurespec, int heightmeasurespec)super.onmeasure(widthmeasurespec? heightmeasurespec); 如果不让父类处理记住 调用 setmeasureddimensionover

42、rideprotected void onlayout (boolean changed, int left, int top, int right, int bottom)super.onlayout (changed,left,top, ight,bottom);overrideprotected void ondraw(canvas canvas) paint bg = new paint();bg.setcolor(color.red);canvas.drawrect(o, 0, getwidth()/2, getheight()/2, bg);加务 view 的左上角四分之一填 充为

43、红色overridepublic boolean ontouchevent(motionevent event) return super.ontouchevent(event); 让父类处理屏幕触控事件overridepublic boolean onkeydown(int keycode, keyevent event) 处理按键事件,响应的轨 迹球事件为 public booleanontrackballevent (motionevent event)switch (keycode) case keyevent.keycode_dpad_up:break;case keyevent.k

44、eycode_dpad_down:break;case keyevent.keycode_dpad_left:break;case keyevent.keycode_dpad_right:break;case keyevent.keycode_dpad_center: /处理中键按下break;default:return super.onkeydown(keycode, event);return true;上面我们可以看到onmeasure使用的是父类的处理方法,如果我们需要解决自定义view 的大小,可以尝试下面的方法overrideprotected void onmeasure (i

45、nt widthmeasurespec, int heightmeasurespec)height = view.measurespec.getsize(heightmeasurespec);width = view.measurespec.getsize(widthmeasurespec);setmeasureddimension(width,height); 这里面是原始的大小,需要重新计算可以修 改本行/dosomethi ng7.android游戏开发之旅七 自定义surfaceview今天我们说下未来的android游戏引擎模板架构问题,对于游戏我们还是选择 surfaceview

46、,相关的原因android123已经在android游戏开发之旅二view和 surfaceview中说的很清楚了,这里我们直接继承surfaceview ,实现 surfaceholder.callback 接口 '处理 surfacecreated . surfacechanged 以 及 surfacedestroyed方法这里我们并没有把按键控制传入,最终游戏的控制方面仍然由view 内部类处理比较好,有关surfaceview的具体我们可以参见android开源项目的camera 中有关画面捕捉以及videoview的控件实现大家可以清晰了解最终的用意。public clas

47、s cwjview extends surfaceview implements surfaceholder.callback public cwjview(context context, attributeset attrs) super(c on text, attrs);surfaceholder holder=getholder();holder.addcallback(this);setfocusable(true);public void surfacechanged(surfaceholder holder, int format, int width, int height)

48、 public void surfacecreated(surfaceholder holder) public void surfacedestroyed(surfaceholder holder) overridepublic void onwindowfocuschanged(boolean haswindowfocus) s.android游戏开发之旅八surfaceview类实例有关surfaceview我们将通过三个系统自带的例子来深入掌握android绘图必会的 surfaceview ,今天我们以sdk中的sample游戏lunarlander中的lunarview具体实现z

49、android123建议大家导入该游戏工程到你的eclipse然后自己编译先玩一下这个游戏,然 后再看代码比较好鱷。class lunarview extends surfaceview implements surfaceholder.callback class lunarthread extends thread /* difficulty setting constants*/public static final int difficulty_easy = 0;public static final int difficulty_hard = 1;public static fina

50、l int difficulty_medium = 2;/* physics constants*/public static final int phys_down_accel_sec = 35;public static final int phys_fire_accel_sec = 80;public static final int phys_fuel_init = 60;public static final int phys_fuel_max = 100;public static final int phys_fuel_sec = 10;public static final i

51、nt phys_slew_sec = 120; / degrees/second rotatepublic static final int phys_speed_hyperspace = 180;public static final int phys_speed_init = 30;public static final int phys_speed_max = 120;r* state-tracking constants*/public static final int state_lose = 1;public static final int state_pause = 2;pub

52、lic static final int state_ready = 3;public static final int state_running = 4;public static final int state_win = 5;goal condition constantspublic static final int target_angle = 18; / > this angle means crash public static final int target_bottom_padding = 17; / px below gear public static fina

53、l int target_pad_height = 8; / how high above ground public static final int target_speed = 28; / > this speed means crash public static final double target_width = 1.6; / width of targetul constants (i.e. the speed & fuel bars)public static final int ui_bar = 100; / width of the bar(s) publi

54、c static final int ui_bar_height = 10; / height of the bar(s) private static final string key_difficulty = “mdifficulty" private static final string key_dx = ”mdx”; private static final string key_dy = "mdy"private static final string key_fuel = "mfuel”;private static final strin

55、g key goal angle = "mgoalangle" private static final string key_goal_speed = "mgoalspeed" private static final string key_goal_width = “mgoalwidth”;private static final string key_goal_x = "mgoalx"private static final string key_heading = "mheading"private sta

56、tic final string key_lander_height = "mlanderheighc;private static final string key_lander_width = 'mlanderwidth" private static final string key_wins = "mwinsinarow"private static final string key_x = "mx" private static final string key_y = ”my”;* member (state) fields*/* the drawable to use as the background of the animation canvas */ private bitmap mbackgroundlmage;* current height of the surface/canvas.* see #setsurfacesize*/private int mcanvasheight = 1;* current width

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论