MRP开发帮助文档

4.54 游戏自Applist启动时,提示“not enough memory” 原因:请检查游戏分包中LIB库的大小,大于300K会造成游戏初始化加载LIB内存需求过大。 解决办法:1)压缩LIB大小;

2)在Project 下的MPR工程中添加Loader=C,详见:2.41.

4.55 部分游戏vigor-v629机型外部事件结束以后,手机画面信息残留问题。

原因:该问题存在于一些在计费或者别处使用新窗体的游戏,由于手机自身动画时间较长,造成虚拟机执行完resume事件后,游戏画面有部分界面残留。

解决:启动定时器在1-2s后重新绘制画面,需考虑用户当前画面退出但定时器时间未到的情况。

4.56 计费短信发送成功判断。

计费接口mrc_scoreConfirm返回值若失败则短信发送失败,返回成功并不是表示短信发送成功。后续底层发送短信,若发送超时或第一条短信发送成功,则会执行第一个回调函数,表示计费成功,购买记录在该函数内保存即可。

4.57 在模拟器上编译正常,交叉编译的时候,却提示“Error: L6218E: Undefined symbol new_gameC1 (referred from mr_src_mygamecanvas.o)”的错误,可能是什么原因?

答:1、检查一下工程文件里面,这个new_gameC1函数所在的c文件是否已经包含到工程文件里面。

2、检查一下,使用这个函数的文件是否已经包含了相关的h头文件。

3、检查一下,相关的代码文件是否过长。单文件超过一万行,可能也会引起编译错误。

4.58 怎样查看游戏MRP包的SDK的版本号?

答:可以通过手机抓TRACE的方法来查看。SDK的计费模块初始化的时候,会输出SDK的版本号。例如:SDK ver:v1.0.3.19,表示这个SDK是1.0.3.19版本的。

4.59 我们这个平台,存储一些游戏相关的数据,一般都是直接写文件吗?

答:是的。游戏相关的一些存档文件和设置文件,都是以文件的形式保存在以游戏短名称命名的文件夹下。

4.60 斯凯平台MRP运行的真机如何获取?

答:1、手机卖场购买 手机大卖场里面问促销员,找支持MRP格式游戏的手机;或手机待机状态下输入“*#220807#”将进入游戏下载中心,里面有“斯凯”的客服联系方式400-686-9028。

2、通过斯凯购买 可以确保不会买错;同时可以获取供调试版本,供真机下调试用。 以上途径获取的机型,可以支持当前的SDK开发。

4.61游戏过程中,插入USB线,在存储提示界面按“返回”,继续游戏,稍侯显示“USB移除”导致游戏花屏。

答:1)游戏过程中,插入USB线,会触发一次mrc_pause()的调用; 2)在提示界面按“返回”,对应将触发一次mrc_resume()的调用,回到游戏状态; 3)系统显示“USB移除”,再次触发一次mrc_pause()的调用; 4)显示Timer到,第二次触发mrc_resume()的调用。 对应此花屏情况,建议处理:

Mrc_pause中调用mrc_clearScreen();

Mrc_resume中调用mrc_clearScreen(); 重绘屏调用;mrc_refreshScreen();

4.62 游戏过程中调用mrc_exit死机重启?

答:请检查调用mrc_exit的作用域中有无资源释放处理。

游戏中调用mrc_exit后,会继续完成本体的功能处理,然后由VM调用mrc_exitApp通知游戏真正退出。

一般在mrc_exit附近不要做资源释放处理,对应在mrc_exitApp中统一做退出清场再处理。

4.63 模拟器下提示:The program 'D:\\Sky_SDK\\Sky_SDK\\simulator\\Debug\\simulator.exe' has exited with code 0 (0x0).

答:可能在代码中访问了空地址,请检查指针处理。

4.64、一些游戏中的对话框,做得比较漂亮,还带有圆角的,这个是怎么实现的?

答:这种带有圆角的对话框,用的基本上都是图片。先用图片绘制对话框的外框,然后在图片的框内显示文字。

4.65、用VS2005模拟器,编译的时候mrc_drawTextLeft报错,如何处理?

答:这是模拟器的库文件没有更新过引起的。到原来VC6模拟器的目录下,拷贝simlib.lib这个文件,到C:\\SKYMOBI\\SDS4CPv1.0\\Simulator\\lib目录下,覆盖同名的文件。

4.66、VS2005环境下,如何添加自己的LIB文件?

答:把对应的LIB文件拷贝到C:\\SKYMOBI\\SDS4CPv1.0\\Simulator\\lib目录下。然后选择模拟器工程,右击选择“属性”,在配置属性-链接器-输入,里面有个附加依赖项,把LIB的名称加到最后面。

4.67、mrc_strcmp是否支持UNICODE值比较?

答:不支持;mrc_strcmp比较时遇到0,即结束比较。

如有Unicode字符串比较需求,请使用mrc_unicodeToGb2312将Unicode码转化为中间非0的GB串即可。

4.68 使用vs2005运行自动生成的helloworld时,模拟器上显示“start.mr242: cann`t find sdk key”,是什么问题? 答:这是由于模拟器的厂商机型不对引起的。到C:\\SKYMOBI\\SDS4CPv1.0\\Simulator目录下,打开config.ini文件,修改manufactory和type都为sdk。如下: manufactory=sdk type=sdk

4.69 Sky-mobi平台可以使用pow函数吗?可以使用stdlib.h里面的函数吗?

答:都不可以的。目前只能使用平台提供的这些函数。平台没有提供的,开发人员需自己通过现有的平台函数来实现。

4.70 ACC文件读取,执行以下流程mrc_getSoundTotalTime获取的文件时间为无效时长: mrc_playSoundExLoadFile(ACI_M4A_DEVICE, \mrc_getSoundTotalTime(ACI_M4A_DEVICE, (uint8**)&p); mrc_printf(accLen,\

mrc_drawText(accLen,10,100,200,100,200,0,MR_FONT_BIG); mrc_playSoundExInit(ACI_M4A_DEVICE);

mrc_playSoundEx(ACI_M4A_DEVICE,1,0,NULL); ?

答:ACC文件读取异常是SDK的原因。一般读取出来的时间会是真实时间的2倍/0.5倍。 规避措施:

1、 应用中添加一个标准时长文件,如1.acc,时长4S

2、 调用mrc_getSoundTotalTime获取1.acc时间,如结果为3s,那算比例为:size=4/3 3、 调用mrc_getSoundTotalTime获取真实文件时长,如结果为6s,那么其时间约为:6s*size=8s

4.71 屏幕缓存如何操作?如果使用自己建立屏幕缓存?

答:1、uint16* pScreenBuf = w_getScreenBuffer API获取屏幕缓存起始指针. 3、 自己建立屏幕缓存流程:

)1:获取原始屏幕缓存,并保存:uint16* pScreenBuf = w_getScreenBuffer(); )2:创建图片缓存,如:mrc_bitmapNew(0,300,400);

) 3:获取图片缓存起始地址int32 mrc_bitmapGetInfo(uint32 di,mr_bitmapSt *bitmapInfo);

) 4:设置图片缓存为新的屏幕缓存:void w_setScreenBuffer(uint16 *ptr); )5:设置新的屏幕缓存尺寸:void mrc_setScreenSize(int32 w, int32 h);

)6:刷新屏幕:void mrc_refreshScreen(int16 x, int16 y, uint16 w, uint16 h); )7:恢复原始屏幕缓存:w_setScreenBuffer(pScreenBuf)

4.72 使用mrc_platTextNew新建一个文本窗口,按右软键退出文本框时,手机重启,可能是什么原因?

答:应该是使用前,没有调用mrc_winInit函数进行初始化引起的。使用本地UI界面前,都必须在使用前先调用mrc_winInit进行初始化。

4.73 把编译好的mrp包放在applist目录下,列表里却看不到这个游戏,什么原因? 答:把mrp包名称改短一点试试。

4.74如何在写文件的时候,追加文件内容?

答:打开文件时,用mrc_seek(f, 0, MR_SEEK_END)把文件的指针移动文件的末尾,然后再写入数据。

4.75 为什么我获取一段的文字的宽高,不管我把字体大小设置成MR_FONT_MEDIUM,还是MR_FONT_SMALL,获取到的宽高都是一样的?

答:因为基本上所有的MTK手机,都只会放一种字体大小的汉字字库,所以不管把字体设置为大中小,它的宽高都是一样的。英文和数字的话,可能会有两种以上的字库,不同字体大小,宽高会不一样。

4.76 游戏是不是大多都采用256色的BMP图片?

答:我们平台上使用的图片基本上都是16bit的BMP图片。强烈建议不要使用8bit(256色)的BMP图片,因为8bit的图片,显示效率会非常慢。

4.77 用mrc_textWidthHeight(str, SFFalse, MR_FONT_SMALL, (int32 *) &fntw,(int32 *) &fnth)在SPR展讯手机上获得到的宽高fntw和fnth都是0? 答:fntw和fnth这两个参数的数据类型必须为int32。以地址传送的参数,数据类型不一致,很可能会引起内存越界。

4.78 MTK上每个指针变量本身占用多少字节空间? 答:4个字节。

4.79 编译好的mrp包,如何放到真机上测试?

答:MTK手机,一般是把mrp包放到“mythroad”、“mythroad\\applist”、“mythroad\\applist240x320”这几个目录下。还有一个简便的方法,如果手机上本来就已经有其它游戏的话,直接搜索“*.mrp”,然后跟搜索到的mrp包放在一起就可以了。 SPR手机的话,一般在“mrapp”、“mrapp\\qqlist”、“mrapp\\neslist”这几个目录下。

4.80编译时提示“Error: C3028E: : implicit cast of pointer to non-equal pointer”,这是什么错误?

答:mrc_unicodeTextWidthHeight调用时的第一个参数的类型不对,确定参数没问题的话,用(uint16*)进行一下强制类型转换即可。例如:mrc_unicodeTextWidthHeight((uint16*)pStr, MR_FONT_MEDIUM, &tw, &th);

4.81 mrc_readFileFromMrpEx函数的第三个参数为什么是“uint8 ** filebuf”,为什么要用二级指针?

答:二级指针是一个指向指针变量的指针,为的是把申请的资源空间的指针传回来。

4.82 mrc_readFileFromMrpEx函数,第一个参数packname填NULL时,是不是就会从默认包去找了?

答:是的,第一个参数填NULL,函数就会从当前运行的mrp里读取指定的文件。

4.83为什么我在mrc_init(void)中声明字符串char *string=\它会提示错误 error C2143: 语法错误 : 缺少“;”? int32 mrc_init(void){

mrc_clearScreen( 0,0,0 ); char *string=\

mrc_refreshScreen(0, 0, 240, 320); return MR_SUCCESS; }

答:我们平台和标准的C编译器一样,变量定义的时候,一定要把定义的语句放到代码区域的头部,不能在两个执行语句中间。像上面的代码,只要把char *string=\放到mrc_clearScreen( 0,0,0 );前面即可。

4.84 mrc_readFileFromMrpEx打开的文件如何关闭?

答:不需要关闭文件的。不过读取的文件资源所占的内存空间,不用时,需要开发人员手动去释放。

4.85资源编译打包的时候,对bmp是不是有压缩?

答:编译打包的时候,对于bmp格式的图片会将其头信息去掉,然后压缩打包到mrp文件中。

4.86 短信中心号码为空时,mrc_scoreConfirm()函数返回成功是BUG吗?

答:不是,这个是正常的。大部分移植版本的手机,短信中心号码为空的时候,付费是会返回成功的,属于正常现象。

4.87 对一个全局的结构体数组进行初始化的时候,如果要保留里面的数据,是不是每个结构体成员都要const呢?

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4