引言:俄罗斯方块这款游戏是由苏联的游戏制作人阿列克谢·帕基特诺夫在1985年发明的,那年偶才出生,这23年间相信这款老游戏被无数新人重做过,所以说我们是站在巨人的肩上的,我们在继承他们的成果的同时,企求我们能不断创新,让这款经典游戏更好玩,让更多的人喜欢玩!我之所以把它贴在我博客里,是想让自己能够在这个项目中得到更好的锻炼,各位大牛不妨多拍拍砖,你们所拍的每一砖都是我前进的动力!我会把每天的项目进度都贴在这里。。。
1.关于“蓝牙技术”
蓝牙技术应用了plonk and play 的概念,有点类似“即插即用”(打个比方)。蓝牙技术是一种无线数据与语音通讯的开放性标准,它以近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接,其有效传输距离是33英尺(10米)。 想详细了解蓝牙技术的朋友请自己Google一下,如果不想Google可以看这个“百度百科全书——蓝牙技术”。
2.JSR82(JABWT)规范
02年4月5日,JCP发布了J2ME平台的蓝牙API规范JSR82(Java蓝牙无线技术APIs,Java APIs for Bluetooth Wireless Technology).JSR82规范定义的API中包括21个类和接口,最小需求是CLDC,CDC是CLDC的超集(偶的理解),所以JABWT可以同时在CLDC和CDC上实现,JSR82在核心协议中支持L2CAP、RFCOMM、SDP和OBEX。从便于开发的角度将API分为设备/服务发现(Discovery)、通信(Communication)和设备管理(DeviceManagement)3大类。发现类包括设备发现、服务发现和服务注册的类和接口;通信类包括在串行剖面层次、RFCOMM层次、L2CAP层次和OBEX层次建立连接和使用连接的类和接口;设备管理类包括代表控制和管理的类和接口。这使得我们在开发的时候不再需要很多蓝牙技术的细节;而是可以从功能角度来理解蓝牙技术,在响应的功能类中选择合适的API和接口。
基于JSR82的协议栈如图1所示,Bluetooth Host Protocol Stack(software)部分为JSR82规范提供给java平台开发者的蓝牙软件协议栈。
图1:基于JSR82的协议栈
典型的蓝牙应用程序实例 一个开启蓝牙功能的应用可以作为一个服务端或是一个客户端-- 一个服务的提供者或是消费者,或者它可以作为一个真正的点对点终端同时表现出服务和客户的行为。图2所示一个蓝牙规范用例:
图2:一个典型的具有蓝牙功能的实际用例
.初始化-- 所有具备蓝牙功能的应用程序必须先要初始化蓝牙栈。
.客户端-- 一个客户对远端服务进行消费。首先它要发现所有附近的设备,然后对于每一个发现的设备搜索它感兴趣的服务。
.服务器端-- 一个为客户端提供服务的服务器。它在服务发现数据库(SDDB)中对客户端进行注册,对他们进行有效广播。然后等待引入的连接,在他们进入时接受他们并为他们提供服务。最后,当不再需要服务时,应用程序会在服务发现数据库(SDDB)中将他们移除。
图 3: 蓝牙应用程序活动图
蓝牙应用程序中的元素
图4显示了在MIDlet中一个典型蓝牙功能应用程序中的一些元素:
图4: 具有蓝牙功能的 MIDlet (高端组织)
中间的是核心应用程序My Bluetooth MIDlet,它扩展自javax.microedition.midlet.MIDlet。没有显示出来的还有MIDlet中实现的javax.microedition.lcdui.CommandListener以监听从用户接口中输入的命令。应用程序使用的剩余的类和接口都包含在了蓝牙规范中,像设备发现和服务,连接和服务消费,还有广播和提供服务。
使用诸如MVC等设计模式是很好的实践。MVC把应用程序分解成用户接口(视图),应用程序行为和导航(控制器),以及数据(模型),当然在我们的案例中还要加上蓝牙API的支撑类和接口。像将分离的客户端、服务端行为构建成独立的类以便以后可以重用这些组件,也是很好的设计。
3.Java蓝牙API核心概述
在JSR82规范中已说过了Java蓝牙API可以被分解为三个部分:发现、设备管理和通信。
a.蓝牙发现API
客户端程序使用蓝牙发现API以搜索在其附近的设备和服务。服务代理类(DiscoveryAgent)同时支持设备与服务的发现。当设备和服务被发现时,想得到通知的客户端应用程序必须实现并注册DiscoveryListener接口,这个接口定义了设备发现通知和服务发现通知的回调。
发现代理(DiscoveryAgent)与蓝牙客户端应用程序之间是典型的一对一的关系:
图 5: DiscoveryAgent类和DiscoveryListener接口
b.设备发现API
你使用DiscoveryAgent类的"设备发现"方法来开始和取消设备发现:
.retrieveDevices()重新获得已经发现或者附近的已知设备
.startInquiry() 启动发现附近设备,也叫inquiry
.cancelInquiry()取消当前进行的任何请求
蓝牙发现代理在请求阶段的不同时候会分别调用DiscoveryListener(发现监听器)不同的回调方法:
.deviceDiscovered() 指出是否有设备被发现。
.inquiryCompleted() 指出是否请求已经成功、触发一个错误或已被取消。
图6中的状态图表阐明了设备发现的状态改变结束于相应的回调方法的返回。
图 6: 设备发现状态表
设备发现以调用startInquiry()函数开始。在请求进行时,蓝牙发现代理会在适当的时候调用回调方法DeviceDiscovered()和inquiryCompleted()。
c.服务发现API 你可以使用发现代理的服务发现方法来开始或取消服务发现:
. selectService()启动服务发现搜索。(原文有误,根据API手册应为尝试定位一个服务)
. searchServices()启动服务发现搜索。
. cancelServiceSearch()取消在正在进行中的任何的服务发现搜索操作。
蓝牙发现代理在服务发现阶段的不同时候会分别调用DiscoveryListener的服务发现回调方法:
. servicesDiscovered() 表示是否服务已被发现。
. serviceSearchCompleted()表示服务发现是否已经完成。
图7阐明了服务发现的状态改变结束于DiscoveryListener的回调方法的返回。
图 7: 服务发现状态图表
服务发现开始于对searchServices()的调用。当服务搜索进行时,蓝牙发现代理会在适当的时候回调servicesDiscovered()和 serviceSearchCompleted()方法。
除了DiscoveryAgent和 DiscoveryListener了,你在服务发现过程中还要使用到的类有UUID,ServiceRecord以及DataElement等。
UUID类
在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (UUID)来校验。正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。UUID类可表现为短整形(16或32位)和长整形(128位)UUID。他提供了分别利用String和16位或32位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128位)的方法,还有一个可以转换一个UUID为一个字符串的方法。UUID实例是不可改变的(immutable),只有被UUID标示的服务可以被发现。
在Linux下你用一个命令uuidgen -t可以生成一个UUID值;在Windows下则执行命令uuidgen 。UUID看起来就像如下的这个形式:2d266186-01fb-47c2-8d9f-10b8ec891363。当使用生成的UUID去创建一个UUID对象,你可以去掉连字符。
SDDB和ServiceRecord接口 在服务发现的中心是服务发现数据库(SDDB)和服务发现协议(SDP)。SDDB由蓝牙实现负责维护的数据库。它包含了服务记录(service records),后者代表了对客户端有效的服务。SDP对于基于JABWT应用程序来说是透明的;可以这么说,SDP是用于服务发现的。为重新获取服务纪录,一个本地设备SDP客户端会向一个远端设备上SDP服务器发出请求。
图 8: SDDB
每一笔服务记录都会由一个ServiceRecord的实例来表现。这个记录包含了描述服务细节的属性。这个类提供了几种有用的方法:
.getAttributeIDs() 和 getAttributeValue()方法返回服务记录的属性。
.getConnectionURL()方法获取链接的URL地址给服务器主机来收集服务记录。
.getHostDevice() 方法获取提供服务的远端设备。
.populateRecord() 和 setAttributeValue()方法用来设置设备记录的属性。
.setDeviceServiceClasses()方法设置服务的类。
图9显示了蓝牙本地设备和远端设备,以及SDDB还有服务记录之间的关系:
图 9: 使用远端设备,SDDB和服务记录进行服务发现
为使服务端可以被客户端来使用,服务应用程序要通过如下方法建立一个服务记录,首先要创建一个连接通知器(connection notifier),然后由调用连接通知器的acceptAndWait()方法来向SDDB中插入记录。服务端程序能够在适当的时候获得记录和更新。客户端应用程序向远端SDDB请求可以使用的服务,会发现服务记录.
未完待续。。。
分享到:
相关推荐
总结来说,"J2ME例子:俄罗斯方块"不仅是一个学习J2ME编程的实践项目,也是提升游戏开发技能的良好途径。通过这个过程,开发者可以掌握移动平台上的图形编程、事件处理、游戏逻辑设计等多方面的知识,同时还能了解到...
《J2ME游戏:俄罗斯方块》是一款基于Java 2 Micro Edition(J2ME)平台开发的经典游戏。J2ME是Java技术的一个分支,主要用于移动设备、嵌入式设备等小型计算平台,提供了丰富的功能和良好的跨平台能力,使得开发者...
1. **俄罗斯方块**:游戏玩法是不同形状的方块从屏幕顶部落下,玩家通过旋转和横向移动这些方块,使得它们在底部形成完整的水平线,从而消除得分。随着游戏进行,方块下落速度加快,挑战性提高。 2. **J2ME**:J2ME...
在本项目中,我们探讨的是一个使用J2ME技术开发的“俄罗斯方块”游戏,这是一个在移动设备上非常受欢迎的经典游戏。 “俄罗斯方块”游戏的基本原理是,不同形状的方块会从屏幕顶部连续落下,玩家需要通过旋转和移动...
《使用J2ME编程的游戏——俄罗斯方块》 在移动设备和嵌入式系统中,J2ME(Java 2 Micro Edition)是一个广泛使用的平台,用于开发轻量级的应用程序,尤其是游戏。在这个主题中,我们将深入探讨如何利用J2ME来编写...
《J2ME-OPPOF15俄罗斯方块》是一款基于Java 2 Micro Edition (J2ME) 平台开发的、适用于OPPO F15手机的经典游戏。它以其独特的可扩展性和源码开放性,为开发者提供了学习和研究移动游戏开发的宝贵资源。 首先,我们...
根据给定的信息,我们可以分析并总结出关于J2ME(Java 2 Micro Edition)手机游戏——俄罗斯方块的重要知识点。 ### J2ME简介 J2ME(Java 2 Platform, Micro Edition)是Sun Microsystems为嵌入式设备和移动设备...
《J2ME版俄罗斯方块游戏源码解析》 在移动设备尚未普及智能手机的时代,Java ME(J2ME)作为一款跨平台的开发环境,广泛应用于功能手机的游戏开发。其中,经典游戏“俄罗斯方块”因其简单易懂的规则和高度上瘾的...
在这个特定的压缩包中,我们拥有的是一款基于J2ME开发的俄罗斯方块游戏的源代码。通过研究这个源码,我们可以深入理解如何在移动设备上构建游戏应用。 首先,我们要了解J2ME的基本结构。J2ME由配置(Configurations...
《J2ME版俄罗斯方块:游戏开发与技术解析》 在移动通信技术飞速发展的今天,J2ME(Java 2 Micro Edition)作为一种轻量级的Java平台,广泛应用于移动设备,如早期的智能手机和平板电脑。本项目——"j2me俄罗斯方块...
### J2ME与LUA结合开发俄罗斯方块游戏 #### 一、项目背景与技术选型 本项目基于2007年底开发的一款经典游戏——俄罗斯方块,它利用了J2ME(Java 2 Micro Edition)作为底层的运行环境,并结合了LUA脚本来实现游戏...
**J2ME游戏源码详解:打造移动版俄罗斯方块** **一、J2ME简介** J2ME(Java 2 Platform, Micro Edition)是Java平台的一个子集,专为资源有限的移动设备如手机、PDA等设计。它提供了一个可移植的运行环境,使得...
今天,我们有机会深入研究一个基于J2ME的俄罗斯方块游戏源码,这为我们提供了宝贵的教育资源,让我们一起探索这个经典游戏在移动环境下的实现细节。 首先,我们要了解J2ME的基本框架。J2ME主要由Configuration、...
在移动设备普及的年代,J2ME(Java Micro Edition)作为一款跨平台的开发工具,广泛应用于手机游戏开发,其中包括经典游戏——俄罗斯方块。本篇文章将深入探讨如何使用J2ME技术实现这个深受玩家喜爱的游戏。 首先,...
/* * 一个简单的俄罗斯方块游戏代码,代码中主要包含3个类: *TerrisMIDlet——MIDlet类 *GameCanvas——游戏界面类 *GameEngine——游戏逻辑类 *已经使用WTK2.5.2运行通过. */
10. **案例分析与实践**:教材可能会包含一些基础游戏的实例,如贪吃蛇、俄罗斯方块等,帮助读者将理论知识转化为实际操作能力。 总的来说,“J2ME&Gaming中文版”是一本引导初学者进入J2ME游戏开发领域的教程,它...
本文将深入探讨一个基于J2ME的俄罗斯方块游戏,它利用数组作为核心数据结构来实现游戏逻辑。 俄罗斯方块是一款经典的益智游戏,由不同形状的方块组成,玩家需要通过旋转和移动这些方块使其在水平方向形成完整的行,...
在JBuilder 2006环境下开发J2ME应用时,如果你遇到了这个错误,可能是由于以下原因导致的: 1. **JDK版本不匹配**:JBuilder 2006可能与你系统中安装的JDK版本不兼容。确保你的JDK版本与JBuilder支持的版本一致。...
《J2ME实战:探索俄罗斯方块的编程艺术》 J2ME,全称为Java Micro Edition,是Java平台的一个重要分支,主要用于移动设备和嵌入式系统的开发。在这个专题中,我们将深入探讨如何使用J2ME来实现经典游戏——俄罗斯...