MIDP+2.0+Game+API快速入门
- 格式:pdf
- 大小:33.67 KB
- 文档页数:6
API入门教程(非常易懂)一、API是什么?这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解。
Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。
所有在Win32平台上运行的应用程序都可以调用这些函数。
使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。
Mircrosoft 的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。
使用Win32 API 不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。
以上为API的相关介绍,不过有些新手看了以后可能还是不怎么明白API到底有什么用?这里请不要着急,如果你有足够耐心的话,请慢慢往下看。
二、如何使用API?估计这才是大家真正关心的,那么如何使用API呢?在了解API之前,先打开你的VB 书,翻到过程函数这章来,在搞清楚API之前应该先搞懂过程函数是怎么一回事!如果你还不知道过程的工作方式,那么请先不要急着往下看,那样容易走很多弯路。
好了,当你理解了过程函数时,也就是你可以使用API的时候了,别把API看得太难,你就像使用过程函数一样使用API就可以了。
首先,让我们看看一个简单的API,以下:Private Declare Sub Sleep Lib "kernel32" Alias "Sleep"(ByVal dwMilliseconds As Long)以上这个API的呢是起一个延时作用。
你如果是刚接触API的话可能会感到API的书写及其复杂,而且会感到很不适应。
其实这没什么的,慢慢习惯就好了。
至于API这些复杂的书写你就不用操心了,在你安装VB的时候微软已经帮我们带上了API浏览器,这些全部都可以利用API浏览器帮我们自动生成。
Android 2.2开发初学者快速入门十一大秘技2010-09-27 14:39本文为一位Android入门级开发者在经过三周学习Android收集整理的一份Android 2.2开发初学者的入门培训教程,从十一个方面把Android 2.2从配置到疑难解答都告诉给大家。
标签:Android一、环境配置和安装(Android 2.2)参考《在Eclipse下搭建Android开发环境教程》1.1 JDK1.2 SDK1.3 Eclipse 3.5 (Galileo)1.4 ADT 0.9.71.5 安装依次下载,按照文章步骤安装即可,注意安装SDK时,需要如下设置下:不然更新不下来,那个链接地址被墙了。
二、Android系统架构2.1Linux内核(Linux Kernel)◆ Android运行在linux kernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的。
◆ Linux 内核是硬件和软件层之间的抽象层。
2.2中间件◆中间件包括两部分:核心库和运行时(libraries & Android runtime)◆核心库包括,SurfaceManager 显示系统管理库,负责把2D或3D内容显示到屏幕;Media Framework 媒体库,负责支持图像,支持多种视频和音频的录制和回放;SQlite 数据库,一个功能强大的轻量级嵌入式关系数据库;WebKit 浏览器引擎等。
◆ Dalvik虚拟机:区别于Java虚拟机的是,每一个Android 应用程序都在它自己的进程中运行,都有一个属于自己的Dalvik 虚拟机,这一点可以让系统在运行时可以达到优化,程序间的影响大大降低。
Dalvik虚拟机并非运行Java字节码,而是运行自己的字节码。
2.3应用程序框架(Application Framework)◆丰富而又可扩展性的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(text boxes),按钮( buttons),可嵌入的web 浏览器。
J2ME 2D小游戏入门之旅(一)游戏的框架[ 录入者:admin | 时间:2006-05-19 17:36:25 | 作者: | 来源: | 点击数:213 ][上一篇] [下一篇]favoyang转载请联系作者响应站长mingjava的号召,我也和大家一起分享一下我的经验,希望大家指教。
同时 欢迎各位高手的原创文章。
前几天看到tony在csdn上发布自己的学习作品“是男人就坚持60s”,觉得创意虽然简单但是却很耐玩,是学习手机游戏制作的入门经典,于是一时兴起,clone了一下,图片依然使用的是tony的图片,纯粹学习之用。
如果大家对这个游戏感兴趣可以与tony联系或访问他的blog。
从发展趋势上说midp2.0是趋势,最便宜的midp2.0手机如ot735i,已经1700元左右;而西门子一年前的高端机cx65,现在也只有2500左右;并且2500-3000这个价位的midp2.0手机有多种选择,西门子、se、N机都有。
我个人挺喜欢cx65,如果将来手机制造商成本不断降低,相信1500元的midp将不是梦…当然还要看应用是否丰富了。
言归正传,我们将使用midp 2.0 来开发我们的游戏,代号fly。
开发工具jbulider。
等文章全写完了,会提供src下载。
目录:一、游戏的框架二、完善周边工具类(图象、GameObject、Font)三、控制飞机的移动四、加入子弹群,实现碰撞运算五、实现爆炸效果、并加入道具导弹六、不足多多,你认为呢?七、源码一、游戏的框架我们的游戏需要一个通用的游戏框架,也方便以后的开发,但实现一个引擎是复杂的。
作为初学者如果要你考虑太多的问题,恐怕会让你偏离主线,这里只给出canvas的代码,不理解可以参看本站的另外一篇系列文章《使用MIDP2.0开发游戏》。
public class MyGameCanvas extends GameCanvasimplements Runnable, CommandListener{private static MyGameCanvas instance;Graphics g;boolean running;Thread t;Command startcmd,exitcmd,restartcmd;int keystate;boolean keyevent;boolean key_up,key_down,key_left,key_right,key_fire;private boolean allowinput;public int screenwidth;public int screenheight;boolean gameover;//define your variable here//define your variable endprotected MyGameCanvas() {super(true);g=getGraphics();running=false;t=null;addCommand(startcmd=new Command("start",Command.OK,1));addCommand(exitcmd=new Command("exit",Command.EXIT,1)); setCommandListener(this);screenwidth=getWidth();screenheight=getHeight();//put your init once code here//put your init once code end}synchronized public static MyGameCanvas getInstance() { if (instance == null) {instance = new MyGameCanvas();System.out.println("new MyGameCanvas");}return instance;}public void run(){System.out.println("MyGameCanvas run start");long st=0,et=0,diff=0;int rate=50;//16-17 frame per secondwhile(running){st=System.currentTimeMillis();gameinput();gameMain();et=System.currentTimeMillis();diff=et-st;if(diff<rate){//System.out.println("Sleep "+(rate-diff));try {Thread.sleep(rate - diff);}catch (InterruptedException ex) {}}else{//System.out.println("rush , and the frame using time: "+diff); }}System.out.println("MyGameCanvas run end");}public void start(){if(!running){running=true;t=new Thread(this);t.start();}}private void gameMain() {g.setColor(0,0,0);//clear screeng.fillRect(0,0,getWidth(),getHeight());flushGraphics();}private void gameInit() {gameover=false;allowinput=true;key_up=key_down=key_left=key_right=key_fire=false;}public void stop(){if(running){running = false;}}public void commandAction(Command c, Displayable d) {String cmdstr=c.getLabel();if(cmdstr.equals("start")){gameInit();start();removeCommand(startcmd);addCommand(restartcmd=new Command("restart",Command.OK,1)); }else if(cmdstr.equals("restart")){stop();while(t.isAlive());gameInit();start();}else if(cmdstr.equals("exit")){stop();Navigate.midlet.destroyApp(false);Navigate.midlet.notifyDestroyed();}}private void gameinput() {if(allowinput){keystate=getKeyStates();keyevent=false;if((keystate & UP_PRESSED)!=0){//upkey_up=true;keyevent=true;//deal your unstop job code here//System.out.println("up press");//deal your unstop job code end}else if((keystate & UP_PRESSED)==0){//release key if(key_up==true){key_up=false;//deal your one press-one job code here//System.out.println("up release");//deal your one press-one job code end}}if((keystate & DOWN_PRESSED)!=0){//downkey_down=true;keyevent=true;//deal your unstop job code here//System.out.println("down press");//deal your unstop job code end}else if((keystate & DOWN_PRESSED)==0){//release key if(key_down==true){key_down=false;//deal your one press-one job code here//System.out.println("down release");//deal your one press-one job code end}}if((keystate & LEFT_PRESSED)!=0){//leftkey_left=true;keyevent=true;//deal your unstop job code here//System.out.println("left press");//deal your unstop job code end}else if((keystate & LEFT_PRESSED)==0){//release key if(key_left==true){key_left=false;//deal your one press-one job code here//System.out.println("left release");//deal your one press-one job code end}}if((keystate & RIGHT_PRESSED)!=0){//rightkey_right=true;keyevent=true;//deal your unstop job code here//System.out.println("right press");//deal your unstop job code end}else if((keystate & RIGHT_PRESSED)==0){//release key if(key_right==true){key_right=false;//deal your one press-one job code here//System.out.println("right release");//deal your one press-one job code end}}if((keystate & FIRE_PRESSED)!=0){//firekey_fire=true;keyevent=true;//deal your unstop job code here//System.out.println("fire press");//deal your unstop job code end}else if((keystate & FIRE_PRESSED)==0){//release keyif(key_fire==true){key_fire=false;//deal your one press-one job code here//System.out.println("fire release");//deal your one press-one job code end}}if(!keyevent){//no keyevent here//System.out.println("NO KEY press");//no keyevent end}}}public static void cleanJob(){instance=null;}}使用singlon实现,因为每个gamecanvas都需要很多的内存空间。
什么是MIDP2.0?小尼克一直在跟着Java博士学习制作N820的Java应用,最近听说他又买了一部新的手机——N840。
1.MIDP博士,我买了一部新手机,N840耶!呵呵,新手机好啊,新机型上市的还挺快的。
这款新手机也是支持Java应用的哦。
以前作的N820应用可以在这上面用么?恩,Java程序当然可以用了,但是,新手机的功能提高了,Java应用也比以前丰富了,另外开发工具也升级了。
是这样啊,真好啊。
N840和N820有什么不同呢?恩,单从Java的功能来讲,不同点在于N840对应的是MIDP2.0,而N820只能对应MIDP1.0。
呃?MIDP是什么呀?以前好像没有听说过呀……。
看,把重要的东西都忘了吧,关于MIDP的说明Java初级讲座的第一讲里面就有,今后要注意复习哦。
好的。
请您稍等一下,我先去复习复习。
请大家也先看一看Java 初级讲座的第一讲,对手机Java 程序的结构进行一下复习吧。
(/cn/lecture/lecture_t1_1.php )复习完啦,让您久等了。
所谓的MIDP ,就是用于手机或者便携机器的profile 的一个。
可是什么是profile 呢…呃,我又不明白了。
所谓Profile ,是指定义使用何种功能的东西。
也就是说,MIDP 定义了手机等可以使用的Java 功能具体都有什么。
是这样的啊。
MIDP 的版本从1.0上升到2.0,是不是就说明手机可使用的功能也升级了呢?恩。
MIDP2.0增加了MIDP1.0没有定义的一些功能。
总而言之,对应MIDP2.0的手机,相比MIDP1.0的手机来说,能用的东西变多了。
2. MIDP1.0和MIDP2.0的不同博士,MIDP 的版本变成了2.0,新增加的功能都有那些呢?恩。
详细情况请参见sun 公司的Web 页面,上面记载了所有的内容,有不少呢。
(/techtopics/mobility/midp/articles/midp20/) 概括起来,MIDP2.0的新功能有以下几个方面,下面先简单介绍一下。
MIDP 2.0: The Game APIby Mikko Kontio-01/09/2003翻译:bolow中国JAVA手机网MIDP 2.0为移动设备提供了众多新的特性,主要表现在媒体的支持,增强的Ui接口,更多的网络协议,OTA以及安全性等方面。
然而最让我们感兴趣的是游戏api的新特性。
本文意在通过一些例子来介绍新的游戏API类及其用法。
例子调试环境为J2ME Wireless Toolkit 2.0 Beta.游戏 API游戏 API 帮助开发者(游戏开发者或者其他需要更好ui界面的开发者)帮助用户快速开发实用并且节省内存以及存储空间的程序界面。
使用MIDP 1.0 game开发者必须定义自己的一套图像类来获得好的界面及程序性能,这必然会增加程序存储方面的开销,使你的jar文件变得更大。
新的游戏api可以解决这些问题。
游戏API的基本思想是游戏界面由图层组成。
背景可以在一个图层上,而游戏人物可以在另一个图层上。
每一个图层都可以分别被游戏API控制。
按照经验,游戏的额场景通常会比手机的屏幕大,所以在传统的方法中控制屏幕的滚动是一件很痛苦的事情。
新的游戏API 一个新的观察窗口(view window),通过它可以看到所有的游戏场景,并且它可以很容易的被移动很定位。
游戏API 的路径为javax.microedition.lcdui.game。
这五个新的类是:GameCanvas, Layer, LayerManager, Sprite, TiledLayer.GameCanvas是一个提供了游戏的基本接口的抽象类。
这个类与Canvas类相比有两个优点:1。
它拥有屏幕缓冲,2。
它可以直接得到设备键盘的物理状态。
Layer是一个定义了游戏元素的抽象类。
Sprite和TiledLayer继承了这个类。
Layer是一个非常常用的类。
LayerManager负责管理Layer对象,并且按照指定的顺序画他们。
Sprite包含了若干帧图像的Layer。
这些帧保存在Image对象中。
通过Sprite类我们可以只使用其中的部分帧,或者通过播放一个帧的序列来创建一个动画。
Sprite类还能检查它是否与其他的Sprite类或者TiledLayers有重合。
TiledLayer和Sprite有点相似,但是它更多的被用来创建背景,比如赛道或者其他更大的区域。
TiledLayer包含一个表格(a grid of cells),我们可以用图像或者文字来填充他。
所以说一个背景或者一个场景是可以用一系列的小图片来创建的。
Handling user input在MIDP 2.0中,传递用户的输入与MIDP 1.0有所不同. 在 1.0 中你需要Canvas的 getGameAction()方法来得到游戏中用户的按键。
在2.0 中你可以调用GameCanvas的getKeyStates()方法来直接得到键盘的状态。
下面是一个示例代码。
首先我们得到键盘的状态,然后通过bit操作判断方向键的状态后作出相应的响应。
protected void keyPressed(int keyCode) {int move = 0;int keyState = getKeyStates();if ((keyState & LEFT_PRESSED) != 0) {// do something}if ((keyState & RIGHT_PRESSED) != 0) {// do something}if ((keyState & UP_PRESSED) != 0) {// do something}if ((keyState & DOWN_PRESSED) != 0) {// do something}}使用屏幕缓存屏幕缓存(off-screen buffer)使得用户可以很方便的创建无闪烁的动画,并且不需要创建额外的类来实现双缓冲。
对象先被画到缓存中,准备好后在刷新到屏幕。
在下面的代码中GameCanvas的getGraphics()用来的到一个显示缓存。
在while 循环中,缓冲用来绘制LayerManager (layers object)的组件. 然后缓存被flushGraphics()方法刷新。
调用flushGraphics(int x, int y, int width, int height)方法可以只把指定的区域刷新到屏幕上。
public void run() {Graphics g = getGraphics();while (play) {try {// First draw all the layerslayers.paint(g, 0, 0);// If the game is on, flush the graphicsif (play) {flushGraphics();}try {mythread.sleep(sleepTime);} catch (ng.InterruptedException e) {}} catch (Exception e) {e.printStackTrace();}}}使用图层在一个游戏中(或者其他的图形程序),显示区域内通常包含不同的内容(图像可能是有关联的或者是没有关联的)。
比如一只蜜蜂可以在森林,陆地,水面上飞翔,但是在一个迷宫中人却不能穿越围墙。
MIDP 2.0游戏 API为此引进了图层。
图层提供了控制屏幕上的对象或者上下文的方法。
图层可以是TiledLayer (比如背景), Sprite (比如飞机), 或者通过继承Layer类自定义的类.下面代码是对图层使用的示例,本例中最重要的类是TiledLayer, LayerManager, 以及Image. Image是用来保存具有相同大小的图像或者图象元素的类。
TiledLayer使用这些图像来布置背景当TiledLayer的实例被创建以时,构造方法要求五个参数,列数,行数,图像,图像元素的宽度和高度。
这里的例子中背景表格包含40 行, 16 列, 图像时Tiles.png并且长宽都是7。
代码开头的一些常量(TILE_GROUND etc.) 表示对图像元素的引用。
当TiledLayer实例被创建后,图像元素的表格可以用fillCells()方法来填充或者fillCell()来填充。
在代码的最后TiledLayer被加入到LayerManager. append()方法用来把图层加入到观察窗口最下面。
使用insert()可以把图层插入到指定位置。
private TiledLayer tiles;private LayerManager layers;private Image tilesImage;public final int TILE_GROUND = 1;public final int TILE_WATER = 2;public final int TILE_SHORE_LEFT = 3;public final int TILE_FOREST = 4;public final int TILE_AIR = 5;public final int TILE_SHORE_RIGHT = 5;// ...// Creating an instance of the TiledLayerlayers = new LayerManager();try {tilesImage = Image.createImage("/Tiles.png");} catch (IOException e) {}tiles = new TiledLayer(40, 16, tilesImage, 7, 7);// ...// Filling the TiledLayer with tilestiles.fillCells(0, 0, 40, 16, TILE_AIR);tiles.fillCells(14, 12, 12, 4, TILE_WATER);tiles.fillCells(0, 10, 14, 6, TILE_GROUND);// and more tiles like FOREST and the shores...layers.append(tiles);效果如下。
使用精灵正如前面提到的那样, 精灵被定义为屏幕上的一个单独的对象. 这个对象可以是推石头的小人, 一架正在射击的飞机。
Sprite类的工作方式有点类似TilesLayer ( 实事上他们都是从Layer类继承来的). Sprite也拥有一个包含几副等大小的图像的Image 对象。
但是这些图像与组成背景的图像元素不同, 他们是表现游戏主角的动画的帧。
因此精灵可以拥有动画效果,并且通过更换其中的一些帧就可以轻松改变精灵的形象。
下面代码展示了怎么创建一个Sprite的实例。
原理其实和TiledLayer一样.try {spriteImage = Image.createImage("/Sprite.png");} catch (IOException e) {}sprite = new Sprite(spriteImage, 7, 7);Layer类中的以下两个方法可以轻松的控制精灵的移动:move(int dx, int dy)setPositions(int x, int y)通过LayerManager来控制精灵的移动,绘制使非常方便的。
下面的代码展示了怎样去控制一个精灵的移动。
精灵的大小为7×7,并且每次移动的幅度也是7个象素public static final int UP = 0;public static final int RIGHT = 1;public static final int DOWN = 2;public static final int LEFT = 3;// ...switch (direction){case UP:sprite.move(0, -7);break;case DOWN:sprite.move(0, 7);break;case RIGHT:sprite.move(7, 0);break;case LEFT:sprite.move(-7, 0);break;default: break;}游戏编写中还有一个重要的任务就是发现精灵间的碰撞。
精灵可能必须呆在某个游戏区域或者指定的迷宫,同时判断精灵间的相互碰撞也是非常重要的。
碰撞在有的游戏中意味着转换方向,有时候却意味着game overSprite提供了以下四个方法,使我们可以对精灵的碰撞作出判断:collidesWith(Image image, int x, int y,boolean pixelLevel)collidesWith(Sprite s, boolean pixelLevel)collidesWith(TiledLayer t, boolean pixelLevel)defineCollisionRectangle(int x, int y,int width, int height)当两个Sprite的实例(也可以时TiledLayer,Sprite,Image)碰撞或者说重合时,我们可以对此作出响应。