[2012黑莓赛]黑莓BB10程序开发 [大二THS_201]

news/2024/11/8 0:38:39/

1 文档简介

 

背景

        201252日,Research In MotionRIM)与其子公司QNX2012黑莓世界大会上宣布,将面向中国广大高校学生举办基于BlackBerry操作系统平台的应用开发竞赛。那一年,我也是参赛者。

 
 

内容

        此文档主要介绍在BB10(BlackBerry10)平台上的二维开发,适合黑莓初开发者,能让初学者快速入门以不走弯路。内容包括开发平台简介、BB10程序开发流程概述、BB10二维界面开发的关键技术、往程序中添加音效及应用程序签名。

 

2 开发环境

 

开发平台

BlackBerry Native SDK
 

调试、应用平台

Playbook 10 或者 BlackBerryPlayBookSimulator
 

开发语言

C 语言。
 

说明

1)如果采用“SDK+ Playbook搭配,在建立第一个工程项目时则需要配置好开发环境,具体包括“Device Setup,”SigningRegistration”,”Debug Tokens”配置,这些只要按照提示一步一步往下做即可。配置好后就可以调试、运行程序了。

2)如果采用“SDK +BlackBerryPlayBookSimulator”搭配,在安装模拟器之前需要安装java虚拟机,如果使用模拟器调试则需要安装“BlackBerryPlayBookSimulator”版本与“BlackBerryNativeSDK”保持一致(我的是2.0.1),这样二者才会保持正常的通信。

3BlackBerry NativeSDKBlackBerryPlayBookSimulator下载地址为:软件下载地址:http://bdsc.webapps.blackberry.com/native/download/ 

 

3 BB10程序执行流程

 

概述

         由于我选的开发工具为C语言,所以main函数是整个程序运行的入口点。在main函数中主要分为“系统初始化”,“主消息循环”,“程序释放”三个部分。程序开始运行后,首先进行“系统初始化”,包括开启“系统(平板)接收导航器和屏幕事件”、“系统(平板)接收导航事件”、“系统(平板)接收导航定位”等,这是在程序正式呈现界面之前需要做的初始化操作;然后程序才真正的步入用户程序,包括“事件检测和事件响应”、“数据更新”及“界面呈现”等;在事件检测中包含了是否“退出程序”这个事件,如果检测到了这个事件,则退出程序;在退出程序后,系统会自动的运行“程序释放”部分,包括“动态内存释放”、“停止事件请求”、“关闭bps”、“关闭系统屏幕环境初始化”,释放顺序不可颠倒。否则可能会造成内存泄露。

 

(1)程序运行整流程图

 

图1.黑莓BB10程序执行流程 流程图

 

(2)平板支持事件包含图

        根据自己程序需要,需要屏幕支持的事件为:

图2.屏幕事件包含图

 

4 黑莓BB10程序开发的关键技术

 

概述 

        此次黑莓移动应用开发是选用二维来展现图形界面,主要思想是载入已经存在的图片到内存中,然后再通过此段内存把图像按照需求显示出来。在这个过程中,采用黑莓特有的绘制图形的方法来展现图片---------顶点数组法。

  顶点数组法的主要步骤为:

(1)  编写图片解析函数,把图片载到内存之中,返回图片句柄等信息。

(2)  指定已初始化的用来绘制图片的“顶点数组”与“纹理数组”。

(3)  调用OpenGL函数绘制图片。

 

(1) 解析图片

        为了提升开发速度,请原谅我调用了样例中自带的图片解析函数:int bbutil_load_texture (const char   *filename, int  *width,int *height,  float  *tex_x,  float  *tex_y, unsignedint   *tex);。

 

函数功能

载入一张png格式的图片。

 

参数: 

 filename是指图片的路径和图片名。

 widthheight用来返回图片的宽和高,使用时可设置为NULL。

 tex_xtex_y用来返回对纹理数组进行初始化的值。

 tex是指向图片的句柄。

 

返回值

如果纹理图片被载成功返回EXIT_SUCCESS否则返回EXIT_FAILURE。

        调用此工具函数载入一张图片后,我们用到的数据是tex_x,tex_ytex,在调用OpenGL函数绘制图片时会涉及到。我们也可以自己编写函数来载入其它格式的图片,我们只需要知道对应格式图片的格式就可以了。类似的工具函数还有载入字体显示的函数,用户都是可以根据需求对其加以应用的。

 

 

(2) 初始化顶点数组和纹理数组

        我们需要把顶点数组和纹理数组定义成全局变量,因为我们在其它函数中还要用到这两个重要的数据结构。然后在初始化全局变量函数中初始化这两个数据结构如下:

纹理数组初始化。

//初始化纹理数组  
tex_coord[0]= 0.0f;  
tex_coord[1]= 0.0f; tex_coord[2]= tex_x;    
tex_coord[3]= 0.0f;    tex_coord[4]= 0.0f;  
tex_coord[5]= tex_y;  tex_coord[6]= tex_x;  
tex_coord[7]= tex_y;  

 

顶点坐标数组初始化

//初始化顶点坐标数组
f_background_vertices[0]= 0.0f;
f_background_vertices[1]= 0.0f;f_background_vertices[2]=width;
f_background_vertices[3]= 0.0f;f_background_vertices[4]= 0.0f;
f_background_vertices[5]=height;f_background_vertices[2]=width;
f_background_vertices[5]=height;

纹理数组中的tex_xtex_y是从bbutil_load_texture函数返回来的值,widthheight是获取到的屏幕的宽度和高度,分别为640,1024。

 

(3) 顶点数组法绘制图形

        采用顶点数组法绘制图形遵循这样的步骤:

<1> 开启二维纹理、顶数组绘制法和纹理功能。

<2> 指定顶点数组和纹理数组。

<3> 绘制图片。

<4> 关闭顶点数组绘制法和纹理功能,关闭二维纹理。

下面分别来展示这4个步骤。

 

<1> 开启二维纹理、顶点数组绘制法和纹理功能

        完成这一步需要三个函数来完成

//1>.-----------------------------//To support 2D texturing//Enable Vertex dreaw//Enable Texture  coorddraw//1>.--------------------------------glEnable(GL_TEXTURE_2D);glEnableClientState(GL_VERTEX_ARRAY);GlEnableClientState(GL_TEXTURE_COORD_ARRAY);  

个函数的参数代表开启对应的模式。

 

<2> 指定顶点数组,纹理数组和图片

        完成这一步需要三个函数来完成

//2>.-----------------------------// Point  vertex array// Point  texture coord array//2>.-------------------------------glVertexPointer (2, GL_FLOAT, 0, vertex_array);glTexCoordPointer (2, GL_FLOAT, 0, tex_coord);glBindTexture (GL_TEXTURE_2D, handle);
 
函数原型参数解释
glVertexPointer ( GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);

size :指定了每个顶点对应的坐标个数,只能是2,3,4中的一个,默认值是4

type :指定数组每个顶点坐标数据类型可取常量:GL_BYTE,GL_SHORT,GL_FIXED,GL_FLOAT

stride:指定了连续顶点间的字节排列方式,如果为0数组的顶点就会被认为是按照紧凑方式排列的,默认值为0

pointer:制订了数组中第一个顶点的首地址,默认值为0,一般给一个IntBuffer就可以了。

 

glTexCoordPointer ( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

size:纹理顶点坐标的分量个数。

type:纹理坐标的数据类型。

stride:位图的宽度,可以理解为相邻的两个纹理之间跨多少个字节,一般为0,因为一般不会在纹理中再添加其他的信息。

pointer:存放纹理坐标的数组。

 

glBindTexture ( GLenum target, GLuint texture );

target 纹理被绑定的目标,它只能取值GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_3D或者GL_TEXTURE_CUBE_MAP。

texture 纹理名称即bbutil_load_texture函数返回的tex参数,并且,该纹理的名称在当前的应用中不能被再次使用。

 

 

<3> 绘制图片

//3>.-----------------------------// Draw texture//3>.-------------------------------glDrawArrays ( GL_TRIANGLE_STRIP, 0, 4);


函数解释

glDrawArrays (GLenum mode,GLint first,GLsizei count);

mode,绘制方式,OpenGL2.0以后提供以下参数:GL_POINTSGL_LINESGL_LINE_LOOPGL_LINE_STRIPGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN

first,从数组缓存中的哪一位开始绘制,一般为0

count,数组中顶点的数量。

<4>关闭顶点数组绘制法和纹理功能,关闭二维纹理

        跟开启这些功能时相对应,我们需要按照对应顺序关闭这些功能:

glDisableClientState(GL_VERTEX_ARRAY);glDisableClientState(GL_TEXTURE_COORD_ARRAY);glDisable(GL_TEXTURE_2D);

函数参数含义为对应的模式

 

 

顶点数组法总述

        掌握了顶点数组法绘制图片之后,需要将这几个步骤放在“主消息循环”中才能显示图像。为体现程序模块化,我们将顶点数组法绘制图片这一部分放在“重新绘制屏幕”函数中。

        根据顶点数组法各函数参数的含义,我们可以领悟到“顶点数组”是一个很重要的数据结构,当我们利用代码不断改变顶点数组元素的值时就能产生动画,图片就能在屏幕上面移动了!这个发现无疑能让用户通过事件来触发界面切换的结果。然后再利用标志变量就可以控制多张图片在界面上显示,就能形成多个界面。

 
 

5 往程序中增添音效

        对于音效这一块,首先不得不惭愧一下,在开发二维游戏界面时就已经花费了很多的时间,包括搭建平台和探索黑莓程序的执行流程(请原谅我大二是第一次做这样的开发,那个时候连主消息循环是什么样的概念都不清楚)。所以,对于往程序中添加音效这一块并没有收获太多的东西,但是兴许是我们的勤劳精神感动了上帝,我们学校另一同学“抽象”出了可以播放音效的程序模型,但不是游戏背景音乐那样子的。只能把歌曲播放完之后才能继续运行下面的程序,所以我们采用播放一段很短的音效来增添应用程序的一点小乐趣。鉴于后来上了大三之后时间较紧,没有回头过去将音效播放研究一番,所以在此就介绍一下怎么在程序中播放一段甚短的音效。

 

步骤1

         在样例程序中找到包含工具函数int Play(char*input_file)的文件。

 

步骤2

        在此文件中添加如下类似的代码:

int playwav()
{char input_file[PATH_MAX];char cwd[PATH_MAX];getcwd(cwd, PATH_MAX);snprintf(input_file, PATH_MAX, "%s%s", cwd, WAV_RELATIVE_PATH);Play(input_file);return 0;
}

 

步骤3

        把int   playwav()函数声明在工程的头文件中,保证此头文件被包含mian函数的文件所包含。

 

步骤4

        在main函数中调用playwav()函数,然后就可以播放WAV_RELATIVE_PATH这个音效了,这个音效是playwav()函数中snprintf函数的最后一个参数。

 

        如此以来,我们就可以播放多个音效了,只需要再定义类似于playwav()的函数,然后按照以上步骤调用即可。此函数内snprintf的最后一个参数就是需要播放的音效的路径和音效名。如将某个音效用于当有触屏事件发生时我们调用“播放叮一声这个音效”,当有划屏操作时我们调用另一个函数“播放划屏音效”,当然音效的时间不能过长,不然会给平板界面带来停滞的画面。

 
 

6 应用程序签名

        在提交应用的过程中,我们最开始没有“应用程序签名”的意识。后来得到反馈说我们的程序不能够被安装到平板之上,经过讨论和探索才知道是需要应用程序签名。作为一个新的意识,当时我就将“应用程序签名记载到了博客之上”,博客中有介绍“应用程序签名”的由来,应用程序签名详情参见:应用签名地址:http://blog.csdn.net/misskissc/article/details/7997432

 

此次笔记记录完毕。


http://www.ppmy.cn/news/335217.html

相关文章

Others6_USB Type-C到底是什么

1 多功能正反插 苹果让大众认识Type-C “Type-C”这个名称随着苹果全新一代MacBook笔记本电脑的发布而变得人尽皆知&#xff0c;很多人都惊呼“哇&#xff01;一个接口就可以充当USB、视频输出及电源如此多接口的作用&#xff0c;真是神了&#xff01;” Type-C接口的出现似乎…

云终端处理器——Atom

由于上周展会的缘故&#xff0c;开始对云终端【I】处理器产生兴趣&#xff0c;接下来在“物理层”【II】来理解下X86-Atom&#xff0c;ARM&#xff0c;MIPS三种处理器&#xff0c;这是第一篇&#xff0c;主Atom Intel公司的官网简单介绍了一句 “英特尔 凌动【III】 处理器&am…

龙讯7号 国芯发布龙芯电脑引争议

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; LSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLS …

关于Windows7下无线共享上网的几种方法

学校宿舍网使用的是锐捷认证客户端&#xff0c;限制多网卡&#xff0c;一旦检测到就会断开认证链接&#xff0c;想共享上网不是很容易啊~~后来宿舍有人买来了一台TP-Link无线路由器想用它来共享上网。可是只要把宿舍网线插进WAN口&#xff0c;无论如何都没法认证成功&#xff0…

无线串口服务器的辐射范围,揭真相!无线路由器的辐射到底可怕不?

今天&#xff0c;伴随着智能移动终端的高速普及&#xff0c;无线路由器已经成为不少用户家中的必备之物。通过一台小小的无线路由器&#xff0c;即可实现全家的无线网络覆盖&#xff0c;让你尽享移动生活的精彩。然而正是在这样一幅美好的无线应用场景下&#xff0c;却引发了部…

大学生计算机怎么挑,萌新福利!准大学生如何挑选笔记本电脑?

高考结束&#xff0c;许多同学都开始慢慢着手填写志愿&#xff0c;选择心仪的学校&#xff0c;也开始慢慢准备大学生活的东西&#xff0c;比如手机&#xff0c;电脑等设备&#xff0c;今天我们讲讲电脑该如何选择&#xff1f; 明确使用场景 先确定大学的志愿方向&#xff0c;来…

Python爬虫利器--异步async框架

这里写目录标题 请求逻辑装饰器使用方法定义指定并发量的协程获得协程返回的结果给task 添加回调函数task 运行结果 分享一个爬虫&#xff0c;其实只用修改一下爬虫的请求逻辑就会很通用了。在工作中&#xff0c;尽管python慢&#xff0c;但是异步加载的协程可不慢&#xff0c;…

六大项目权威对比 三款互联网电视横评(手机平板点餐系统应用开发)

来源&#xff1a; http://tv.zol.com.cn/469/4691076_all.html 编辑 六大项目权威对比 三款互联网电视横评 2014-08-11 05:57:00 [ 中关村在线 原创 ] 作者&#xff1a; 潘斌强 | 责编&#xff1a;毛俊霆 收藏文章 分页阅读 分享到 新浪微博 QQ空间 腾讯微博 人人网 QQ…