1 文档简介

 

背景

2012年5月2日,Research In Motion(RIM)与其子公司QNX在2012黑莓世界大会上宣布,将面向中国广大高校学生举办基于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),这样二者才会保持正常的通信。

(3)BlackBerry NativeSDK与BlackBerryPlayBookSimulator下载地址为:软件下载地址: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是指图片的路径和图片名。

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

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

tex是指向图片的句柄。

返回值

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

调用此工具函数载入一张图片后,我们用到的数据是tex_x,tex_y及tex,在调用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_x及tex_y是从bbutil_load_texture函数返回来的值,width和height是获取到的屏幕的宽度和高度,分别为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,GLsizeistride,constGLvoid *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,constGLvoid *pointer);

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

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

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

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

glBindTexture(GLenum target,GLuint texture );

target :纹理被绑定的目标,它只能取值GL_TEXTURE_1D、GL_TEXTURE_2D、GL_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_POINTS、GL_LINES、GL_LINE_LOOP、GL_LINE_STRIP、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_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

此次笔记记录完毕。

[2012黑莓赛]黑莓BB10程序开发 [大二THS_201]相关推荐

  1. [2012黑莓赛] *.bar应用签名步骤 [大二THS_201]

    开发平台:BlackBerry Native SDK 开发语言:C语言 一.在应用开发完成之后,我们需要对应用签上自己的信息之后,才能发布应用.也就是说,只有签过名的应用才能在除开发者之外的平板上运行 ...

  2. 微信小程序开发笔记二(WXSS和CSS样式美化)

    微信小程序开发笔记二(WXSS和CSS样式美化) 一.CSS基本知识 1.Class选择器的定义 2.ID选择器的定义 3.ID选择器和class选择器的区别 4.CSS中设置颜色 5.CSS中的文本 ...

  3. 嵌入式客户端程序开发大汇总

    先不说嵌入式客户端程序开发,先看发展最好的客户端程序开发领域:PC端(Win.IOS).浏览器.移动端(Android.IOS).这些客户端开发程序员人数众多.生产力极高的工具.良好的生态环境.客户端 ...

  4. 校友会小程序开发笔记二十九:小程序启动性能评测与优化(2)

    校友会小程序定位是大量校友的社交类应用,因此对于性能,用户体验,交互体验要求很高,对于小程序的打开,流畅性, 数据的渲染都必须做尽可能的优化 运行时性能 setData setData 是校友会小程序 ...

  5. WordPress版微信小程序开发系列(二):安装使用问答

    自WordPress版微信小程序发布开源以来,受关注的程度超过我原来的想象.这套程序主要面对的用户是wordpress网站的站长,如果wordpress站想在微信的生态圈得到推广,小程序成为一种重要的 ...

  6. Python+微信小程序开发(二)代码构成和宿主环境

    一.小程序代码构成 ​在上一篇文章中,我们通过开发者工具载入模板快速创建了一个QuickStart项目.这个项目里边生成了不同类型的文件: .json 后缀的 JSON 配置文件 .wxml 后缀的  ...

  7. 现学现卖微信小程序开发(二)

    现学现卖微信小程序开发(一) 现学现卖微信小程序开发(三):引入Rx,为小程序插上翅膀 一个Todo应用的小程序版 好的,那么下一步我们就先照猫画虎,新建一个todos文件夹,然后一套四样同名文件准备 ...

  8. 微信小程序开发系列二:微信小程序的视图设计

    大家如果跟着我第一篇文章 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 一起动手,那么微信小程序的开发环境一定搭好了.效果就是能把该小程序的体验版以二维码的方式发送给其他朋友使用. 这个系列 ...

  9. 小程序数据框有重影_小程序开发(二):数据绑定

    前言: 第一章讲到了如何去创建一个项目,并且在模拟器上显示出来hello world,但是程序开发中,很多的数据都是从服务器去获取或者显示的数据会根据用户的操作来变化的,所以我们需要用到数据绑定. 数 ...

最新文章

  1. c语言50行以内有趣的代码,分享一段有趣的小代码
  2. go在方法中修改结构体的值_golang修改结构体中的切片值方法
  3. ubuntu 16.04 安装TensorFlow GPU版本
  4. 设置ComboBox控件的小箭头颜色.
  5. 数字滤波器的差分方程和传递函数
  6. wpf 使用位图画图为什么断断续续_WPF的未来是微软WinUi!
  7. 无法将 DBNull.Value 强制转换为类型“System.DateTime”。请使用可空类型
  8. numpy 索引,切片 ,转置,变值,多个数组的拼接
  9. micropython入门指南-电子工业出版社-网上书店
  10. python三种基本的数据类型有_python基本数据类型一
  11. K均值聚类算法以及模糊K均值算法研究,matlab
  12. 外贸建站需要注意的事项
  13. proftpd mysql_虚拟主机与Proftpd和MySQL(包括配额)在Ubuntu 8.04 LTS
  14. 万柳少爷背后,大批有钱人正在自媒体上发着横财。
  15. cocos2d-x ui::Button 的setEnabled 和 setVisible 的区别,setEnabled后按钮却不见了
  16. python用来查看变量类型的函数是什么_python查看变量类型的函数
  17. navicate如何画数据库关系图
  18. linux网络编程一
  19. Spring Boot 入门笔记
  20. C++ Type Trait

热门文章

  1. OpenMV:17笑脸检测
  2. SAP OData 编程指南
  3. PF-EPF-UPF的对比仿真
  4. 线性二自由度汽车模型对前轮角阶跃输入的稳态响应分析(matlab/simulink)
  5. KDDAC-10kV 电缆交流耐压及振荡波局放测试系统
  6. Unable to create project from archetype Error merging veloci
  7. D80说明书翻译PDF下载
  8. 在调用股票购买接口时要注意什么事项?
  9. idea开发工具初始化相关设置
  10. 思考会让事情变得有趣