杭州斯凯SDK教程入门篇Word下载.docx
- 文档编号:19993359
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:47
- 大小:845.82KB
杭州斯凯SDK教程入门篇Word下载.docx
《杭州斯凯SDK教程入门篇Word下载.docx》由会员分享,可在线阅读,更多相关《杭州斯凯SDK教程入门篇Word下载.docx(47页珍藏版)》请在冰豆网上搜索。
1.5、SDK简介
杭州斯凯的SDK开发环境是一个标准的C语言开发环境,
我们已经将手机平台的底层相关功能统一封装成标准的C语言函数,只要用户熟悉C语言开发,那么就可以像在Windows一样使用标准C语言进行开发应用。
二、HelloWorld
下面我们就从在手机屏幕上显示“Helloworld!
”字符串开始来熟悉SDK开发。
字符串显示的效果如下图所示:
C语言的入口函数是main函数,我们的SDK入口函数mrc_init函数。
因此,我们实现打印上述字符串功能代码如下:
mrc_base.h头文件包含的SDK库的基本函数,helloworld.h头文件是我们应用自己的头文件。
详细的实现功能都在PrintHelloWorld里面,代码如下:
该函数里面主要使用到SDK接口有:
mrc_clearScreen、mrc_getScreenInfo、mrc_textWidthHeight、mrc_drawText和mrc_refreshScreen。
我们的SDK里面的函数都是以“mrc_”为前缀开始的。
mrc_clearScreen(0,0,0)用来将手机屏幕清除为指定颜色,颜色值是为RGB类型,这里我们把屏幕清除为“0,0,0”颜色,即黑色。
mrc_getScreenInfo(&
screeninfo)用来获取手机屏幕的信息,包括宽高像素值等。
mrc_textWidthHeight用来获取给定字符串的宽高信息,便于绘制时候控制位置,x和y变量就是用来控制绘制文字的坐标位置。
mrc_drawText用来绘制文本信息。
当我们绘制完文字信息以后,我们不能在屏幕上看到实际的效果,因为调用mrc_drawText以后,只是把文字绘制到手机的屏幕缓冲区中,只有当调用了mrc_refreshScreen函数进行屏幕刷新以后才可以看到绘制的字符串信息。
三、图片添加、加载、显示和释放
在软件开发过程中,我们经常需要使用到图片,下面我们就来说说图片的加载和使用方法。
我们的SDK平台目前只支持bmp格式的图片,其他格式如jpg、png等压缩格式的图片暂时不支持。
下面我将详细讲解如何添加、加载、显示和释放一个24bit格式的文件名为plane.bmp的图片。
3.1添加图片资源方法
由于我们的程序最终会生成mrp格式文件,因此我们需要把要显示的图片先打包到mrp文件里面。
添加文件的方法,是需要修改mpr格式的工程文件,该工程文件类似我们在Linux开发环境里的makefile。
例如我们当前的工程文件为demo.mpr,那么我们在files组里面加入名字为plane.bmp的图片,如下图所示:
当我们编译mpr工程文件的时候,如果图片被成功打包到mrp文件中,那么在编译完成的时候,会有提示信息,如下图所示:
当要添加的图片不存在的时候,编译器报编译错误,如下图所示:
当编译通过,并且编译输出有看到图片被成功打包进mrp包里面,说明我们完成了在mpr工程文件里面增加图片的功能。
3.2从mrp包里面加载图片方法
我们这里说的图片加载是指在程序运行过程要显示mrp包里面的bmp图片时候,需要先将bmp加载到内存中的方法。
将bmp图片加载到内存中通常有两种方法,一种是通过调用mrc_readFileFromMrpEx函数;
另一种是通过调用mrc_bitmapLoad函数。
第一种加载图片的具体方法如下面代码所示:
在第一种图片加载方法里面,我使用了mrc_readFileFromMrpEx来从mrp中读取先前打包进去的图片。
mrc_readFileFromMrpEx函数的原型如下:
它的功能就是从指定的packnamemrp包里面读取文件名为filename的文件,当读取文件成功以后,通过filebuf和filelen来返回指定文件数据和数据长度,这里返回的plane.bmp文件的数据和长度,mrc_readFileFromMrpEx函数的详细使用说明可以查考mrc_base.h文件里面的函数说明。
当mrc_readFileFromMrpEx函数调用返回成功以后,说明我们成功把plane.bmp加载到内存中,这里我们把加载的数据保存到bmp变量里面,该变量是一个T_ICON_MAP类型的指针变量,T_ICON_MAP结构体定义如下:
注意:
利用mrc_readFileFromMrpEx函数加载图片资源成功以后,需要对返回的filebuf内存进行管理,到不使用图片资源的时候,需要进行是否,否则会造成内存泄露!
第二种图片加载方法是通过使用mrc_bitmapLoad函数来实现的。
具体加载方法如下:
我们的SDK提供了30个图片缓冲区来管理图片资源,序号为0-29,用户可以通过调用mrc_bitmapLoad来把指定的图片从mrp包里面加载到图片缓冲区中。
mrc_bitmapLoad函数的原型如下:
参数i为图片缓冲区序号,必须是0-29,filename为预加载图片文件名称,x,y为图片加载的起始坐标,w为预加载图片的宽度,h为预加载图片高度,max_w为图片原始宽度。
这里plane.bmp图片的宽高分别为41和26,在这个例子中,我们把整张图片都加载到内存中,当然,需要的时候,我们可以只加载部分图片。
当mrc_bitmapLoad函数调用返回成MR_SUCCESS时候,说明图片成功加载到指定的缓冲区中。
到这里,我们就已经成功通过两种方法来加载图片。
其实,mrc_readFileFromMrpEx函数不仅可以加载bmp图片,还可以加载其他任意类型的文件到内存中。
3.3bmp图片显示方法
当我们成功把图片加载内存里面以后,接下来就需要把图片显示出来。
同样地,图片的显示方法也有两种,并且与加载的方法是一一对应的。
下面我们就来详细讲解图片的两种显示方法。
第一种显示方法如下:
在该图片显示ShowBmp函数里面,我们使用了第一种图片加载方法LoadBmp函数返回的数据结构T_ICON_MAP。
该种图片显示方法就是通过调用mrc_bitmapShowEx函数来实现图片显示。
mrc_bitmapShowEx函数对输入的bmp数据缓冲区bmp->
pdata进行显示。
显示的图片效果如下图所示:
plane.bmp图片是一张41X26的小飞机图片,上图中飞机图片屏幕居中显示。
用户可能注意到了,该飞机图片的红色的背景图片怎么也显示出来了。
这里就需要先了解一下mrc_bitmapShowEx函数的功能,该函数的原型如下:
参数p为图片数据,x、y为图片显示的起始坐标,mw为图片原始宽度,w、h为图片显示宽度和高度,sx、sy为原始图片中的坐标位置,rop为图片显示效果,其类型主要有BM_COPY和BM_TRANSPARENT。
在ShowBmp函数里面rop的参数值为BM_COPY,即覆盖模式,图片中所有的数据都会显示出来,而BM_TRANSPARENT模式为透明色模式,图片的第一个像素为透明色,图片中与第一个像素相同颜色值的点不会显示处理。
而在程序里面,我们经常需要进行透明色显示,例如plane.bmp图片,其实我们只想实现飞机本身部分而不显示红色背景。
下面我们就通过修改mrc_bitmapShowEx函数中的rop参数值来显示透明色图片,调用mrc_bitmapShowEx函数的代码修改为:
那么图片显示的效果如下图所示:
通过上图,我们可以明显看出图片效果发生变化。
但是需要注意的是,不同图片显示模式绘制过程所需要花费的时间有很大差异,其中BM_COPY模式是最节约时间,BM_TRANSPARENT和其他模式由于在图片绘制过程中需要进行大量运算,相对BM_COPY模式需要花费更多的时间。
因此,在软件开发过程中应该尽量使用BM_COPY模式。
第二种显示方法如下:
该方法是通过调用mrc_bitmapShow函数来实现图片显示,mrc_bitmapShow函数的原型如下:
该函数与mrc_bitmapShowEx函数的区别只是图片数据的输入参数不一样,该函数是从SDK管理的图片缓冲区中绘制图片,而调用mrc_bitmapShowEx函数的时候需要把自己管理的图片数据传入。
mrc_bitmapShow函数调用以后效果如下:
为了区分mrc_bitmapShowEx函数显示方法,这里我们在调用mrc_bitmapShow函数的时候,只显示一半宽度的plane.bmp图片。
到这里,我们已经把两种bmp图片显示的加载和显示方法都给介绍完了。
需要注意的是,上述介绍的加载和显示方法是针对24bit和16bit的bmp图片的,不适合8bit和小于8bit的bmp图片。
3.4bmp图片释放方法
当图片使用完成以后,我们需要释放加载的图片所占用的内存资源。
对于不同的图片加载方法,其释放资源的方法也是不一样的。
第一种图片加载方式的释放方法如下:
由于第一种图片加载方法中,mrc_readFileFromMrpEx函数会从heap中分配空间,因此释放的时候,只需要通过调用free函数来释放heap内存资源就可以了。
第二种图片加载方式的释放方法如下:
由于第二种图片加载方式中,使用了SDK管理的图片缓冲区,因此释放资源的时候,也是通过调用mrc_bitmapLoad函数来实现的,只是将filename参数值设置为”*”。
通过上述两种方法,我们就可以释放图片加载后所消耗的内存资源。
四、音乐添加、加载、播放、停止和释放
在第三章节里面,我们讲述了图片的添加和加载方法,对于音乐文件的添加和加载也是类似的。
下面,我们将通过讲解一个文件名为bg.mid的添加、加载、播放、停止和释放来熟悉SDK开发过程中音乐文件的具体使用方法。
4.1添加音乐资源方法
音乐文件的添加方法与图片资源添加类似,也是通过修改mpr文件来实现的,如下图所示:
通过修改mpr工程文件,我们添加了bg.mid音乐文件。
在成功编译mpr工程文件并生成mrp文件过程中,如果bg.mid文件成功地被打包到mrp文件里面,会有如下类型提示信息:
同样的,当编译过程编译器无法找到bg.mid文件,那么就会提示如下错误信息:
当编译通过,bg.mid文件被打包进mrp文件,说明我们完成了音乐资源文件的添加。
4.2从mrp包里面加载音乐方法
与bmp图片的加载方法类似,我们要对bg.mid音乐进行播放之前需要将文件从mrp包里面加载到内存中,同样地,音乐文件的加载方法与bmp图片的加载方法类似,也有两种方法。
第一种加载音乐文件的方法,如下面代码所示:
在该种音乐文件加载的时候,我们使用mrc_readFileFromMrpEx函数来实现,与bmp图片的第一种方法一样。
加载的音乐文件的相关数据我们存放到music变量里面,该变量是一个T_MUSIC_MAP类型的指针变量,T_MUSIC_MAP结构体定义如下:
该结构体分别用来表示音乐文件的长度、数据以及音乐类型。
我们SDK支持的音乐文件类型如下所示:
我们支持常见的音乐格式,包括midi、wav、mp3等。
第二种音乐文件加载方法是通过使用mrc_soundSet函数来实现的。
我们的SDK提供了5个音乐缓冲区来管理音乐资源,序号为0-4,用户可以通过调用mrc_soundSet来把指定的音乐从mrp包里面加载到音乐缓冲区中。
mrc_soundSet函数的原型如下:
参数i为音乐缓冲区序号,必须是0-4,filename为预加载音乐文件名称,type为音乐类型,这里bg.mid的音乐类型为MR_SOUND_MIDI。
当mrc_soundSet函数调用返回成MR_SUCCESS时候,说明音乐文件成功加载到指定的缓冲区中。
这样,我们就已经成功通过两种方法来实现加载音乐文件。
4.3音乐播放方法
当我们成功把音乐文件加载内存里面以后,接下来就需要把音乐播放出来。
同样地,音乐的播放方法也有两种,并且与加载的方法是一一对应的。
下面我们就来详细讲解音乐的两种播放方法。
第一种播放方法如下:
在该音乐播放PlayMusic函数里面,我们使用了第一种音乐文件加载方法LoadMusic函数返回的数据结构T_MUSIC_MAP。
该种音乐播放方法就是通过调用mr_playSoundEx函数来实现图片显示。
mr_playSoundEx函数对输入的music数据缓冲区music->
pdata进行播放。
这里就需要先了解一下mr_playSoundEx函数的功能,该函数的原型如下:
参数type为音乐类型,data为音乐数据,dataLen为音乐数据长度,loop为音乐循环播放标志。
第二种音乐播放方法如下:
该方法是通过调用mrc_soundPlay函数来实现音乐播放,mrc_soundPlay函数的原型如下:
该函数与mr_playSoundEx函数的区别只是音乐数据的输入参数不一样,该函数是从SDK管理的音乐缓冲区中获取数据,而调用mr_playSoundEx函数的时候需要把自己管理的音乐数据传入。
需要注意的是,虽然我们的SDK提供了5个音乐缓冲区,但是同一时间,我们只能播放一个缓冲区里面的音乐,而不能同时播放多个音乐。
4.4音乐停止播放方法
当我们想停止播放音乐的时候,需要调用相应的函数来实现停止播放功能。
同样地,不同的音乐播放方法需要用不通的停止方法。
针对第一种播放方式,其停止播放的方法如下:
针对通过调用mr_playSoundEx函数来播放时候,需要调用mr_stopSoundEx函数来停止播放。
mr_stopSoundEx函数的原型如下:
针对第二种播放方式,其停止播放的方法如下:
针对通过调用mrc_soundPlay函数来播放时候,需要调用mr_stopSound函数来停止播放。
mr_stopSound函数的原型如下:
在使用过程中,音乐播放和停止需要配对使用,否则会出现异常。
4.5音乐资源释放方法
当音乐资源使用完成以后,我们需要释放加载的音乐所占用的内存资源。
对于不同的音乐加载方法,其释放资源的方法也是不一样的。
第一种音乐加载方式的释放方法如下:
由于第一种音乐加载方法中,mrc_readFileFromMrpEx函数会从heap中分配空间,因此释放的时候,只需要通过调用free函数来释放heap内存资源就可以了。
第二种音乐加载方式的释放方法如下:
由于第二种音乐加载方式中,使用了SDK管理的音乐缓冲区,因此释放资源的时候,也是通过调用mrc_soundSet函数来实现的,只是将filename参数值设置为”*”。
通过上述两种方法,我们就可以释放音乐加载后所消耗的内存资源。
五、定时器创建、启动、停止和删除
在软件开发过程中,我们经常需要使用定时器来实现一些功能,本章节我们将详细描述SDK中定时器的创建、启动、停止和释放使用方法。
5.1创建定时器
SDK中创建一个定时器的方法如下所示:
在SDK中,我们通过调用mrc_timerCreate函数来创建一个定时器,mrc_timerCreate的函数原型如下:
当定时器创建成功以后,返回一个非NULL的句柄,否则返回NULL句柄。
5.2启动定时器
当成功创建一个定时器以后,就可以去启动定时器,方法如下所示:
我们通过调用mrc_timerStart函数来启动定时器,mrc_timerStart的函数原型如下:
t为要启动的定时器句柄,time为定时器超时的时间,单位为毫秒,data为定时器数据,f为定时器超时回调函数,loop为定时器是否循环的标志。
在StartTimer函数里面,我们启动了一个定时为1000ms的定时器,定时器的回调函数为TimerCallBack,当定时器超时的时候,SDK会自动调用TimerCallBack。
TimerCallBack函数的具体实现如下:
在回调函数TimerCallBack里面,将会把定时器返回的data数据显示在屏幕上。
我们结合定时器创建和启动函数,代码如下:
显示效果如下:
这说明我们成功创建、启动定时器,而其定时器能工作正常。
5.3停止定时器
当我们想让定时器停止工作的时候,可以通过下面的方法来实现:
停止定时器的时候,我们通过调用mrc_timerStop函数来实现的,mrc_timerStop的函数原型如下:
当一个定时器被停止以后,它还在定时器队列里面,下次还可以重新启动它。
5.4删除定时器
当我们不再使用某个定时器的时候,可以通过下面的方法来删除定时器:
删除定时器的时候,我们通过调用mrc_timerDelete函数来实现的,mrc_timerDelete的函数原型如下:
当一个定时器被删除以后,它会从定时器队列里面被删除,下次就不可以重新使用它。
六、游戏收费
与斯凯合作开发的应用软件或者游戏,在用户使用过程中,我们会向其收取注册费用和道具购买费用。
因此,SDK开发人员需要熟悉注册收费和道具收费的方法。
下面,我们将详细描述这两种收费的实现方法。
6.1注册收费实现方法
一般情况下,当用户从游戏主菜单进入游戏界面的时候,我们会提示用户进行游戏注册,游戏注册是通过发送短信来实现,具体的实现方法如下所示:
游戏注册的时候,我们通过调用RegGame函数来实现的,而RegGame函数是通过调用SendSms来进行发送短信的,SendSms函数中最后通过调用SDK中封装好的发送短信函数mrc_ChargeEx来实现。
mrc_ChargeEx的函数原型如下:
Option用来区分注册收费和道具收费,当Option值为1表示游戏注册收费,Option值为0表示游戏道具收费,Channel表示发送的短信通道,value表示收费的费用,单位是角,当函数调用成功返回MR_SUCCESS,否则返回MR_FAILED。
在SendSms函数中,在调用mrc_ChargeEx之前,需要确定Channel参数,这里Channel参数我们就指定为ZHIYUNSHIDAI_2RMB_MMS。
当SendSms函数调用函数MR_SUCCESS时候,说明游戏注册成功,这时候SDK会在游戏的短名称目录里面生成sid签名文件。
由于游戏收费模块的相关函数都是在mrc_payment.h里面声明的,因此我们在使用之前需要包含相应的头文件:
6.2道具收费实现方法
在游戏过程中,除了注册收费以外,我们还会以其他形式向用户收取道具费用,例如游戏复活、购买武器、金币等。
道具收费与注册收费的根本区别在于道具收费不会写sid注册文件。
道具收费的具体的实现方法如下所示:
游戏道具收费的时候,我们通过调用PayGameTool函数来实现的,而PayGameTool函数和游戏注册收费一样都是调用SendSms来进行发送短信的,只是传入的参数不一样。
当SendSms函数调用函数MR_SUCCESS时候,说明游戏道具付费成功。
七、按键、触摸屏事件
在游戏开发过程中,我们需要通过处理手机的按键和触摸屏事件来响应用户的请求。
在这一章节中,我们将简要介绍一下按键、触摸屏事件的入口函数和处理方法。
7.1事件入口函数
就像入口函数mrc_init一样,SDK有独立的事件入口函数,就是mrc_appEvent,mrc_appEvent的函数原型如下:
code参数值可能为如下情况:
enum{
MR_KEY_PRESS,//按键按下事件
MR_KEY_RELEASE,//按键释放事件
MR_MOUSE_DOWN,//触摸屏(鼠标)按下事件
MR_MOUSE_UP,//触摸屏(鼠标)抬起/释放事件
MR_MENU_SELECT,//菜单选中事件
MR_MENU_RETURN,//菜单返回事件
MR_DIALOG_EVENT,//对话框/编辑框/文本框事件
MR_EVENT01,//VM保留,请不要使用
MR_EXIT_EVENT,//应用退出事件
MR_EVENT02,//VM保留,请不要使用
MR_LOCALUI_EVENT//本地化接口事件
};
本章节讲述的按键和触摸屏事件,其code值就包括MR_KEY_PRESS、MR_KEY_RELEASE、MR_MOUSE_DOWN和MR_MOUSE_UP。
按键事件包括按键按下和按键释放事件;
触摸屏事件包括触摸屏按下和触摸屏抬起事件。
param0和param1参数值与code是相关的,当code为按键事件(MR_KEY_PRESS或MR_KEY_RELEASE)时候,param0表示按键值,其具体值如下:
MR_KEY_0,//按键0
MR_KEY_1,//按键1
MR_KEY_2,//按键2
MR_KEY_3,//按键3
MR_KEY_4,//按键4
MR_KEY_5,//按键5
MR_KEY_6,//按键6
MR_KEY_7,//按键7
MR_KEY_8,//按键8
MR_KEY_9,//按键9
MR_KEY_STAR,//按键*
MR_KEY_POUND,//按键#
MR_KEY_UP,//按键上
MR_KEY_DOWN,//按键下
MR_KEY_LEFT,//按键左
MR_KEY_RIGHT,//按键右
MR_KEY_POWER,//按键挂机键
MR_KEY_SOFTLEFT,//按键左软键
MR_KEY_SOFTRIGHT,//按键右软键
MR_KEY_SEND,//按键接听键
MR_KEY_SELECT,//按键确认/选择(若方向键中间有确认键,建议设为该键)
MR_KEY_VOLUME_UP,//按键侧键上
MR_KEY_VOLUME_DOWN,//按键侧键下
MR_KEY_NONE//按键保留
当code为触摸屏事件(MR_MOUSE_DOWN或MR_MOUSE_UP)时候,param0为屏幕的x坐标,param1为屏幕的y坐标。
7.2按键事件处理
当我们知道了按键事件的入口函数,那么我们就可以在入口函数里面进行事件处理。
下面我们将以简单的例子来说明按键的处理方法。
下面的例子将把会把用户所按的按键实时打印在屏幕中间。
具体方法如下:
我们在SDK的入口函数mrc_init里面不做任何事情,在SDK的事件入口函数里面调用了按键处理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 杭州 SDK 教程 入门