`
wuhua
  • 浏览: 2110956 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于j2me game双缓冲实现探讨

阅读更多
      双缓冲技术的应用很广泛,设计游戏的时候更是需要它,
     在midp1.0中,api中并没有game这个包,看到网上很多人在讨论设计游戏的时候会出现图片断裂,屏幕闪烁等问题。
     我经过这几天的学习整理下自己的学习心得,用来抛砖,希望对此有研究高手们相互讨论。让我也学习学习。
    
     双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘 制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。
    对于手机来说。具体的过程就是通过extends Canvas。然后获取bufferImage。再然后就getGraphics。最后就是在这个graphics中绘制图片等,再最后就是把这个绘制好的bufferImage绘制的屏幕上。
     说归说。具体还是要看代码的。里面的代码参照了一些开源的代码。
java 代码
 
  1. /******************************************************************** 
  2.  * 项目名称             :足球项目j2me客户端         
     
  3.  *  
  4.  * Copyright 2005-2006 Teesoo. All rights reserved 
  5.  ********************************************************************/  
  6. package org.wuhua.game;  
  7.   
  8. import javax.microedition.lcdui.Canvas;  
  9. import javax.microedition.lcdui.Graphics;  
  10. import javax.microedition.lcdui.Image;  
  11.   

  12.  
  13.   
  14. /** 
  15.  * 类名:GameCanvas.java 
     编写日期: 2006-11-29 
     程序功能描述:
     
  16.  * 实现双缓冲的Game画布。实现原理是创建一个BufferImage。然后绘制,最后显示出来。就这么简单。
     Demo: 
     Bug:
     
  17.  * 
     
  18.  *  
  19.  * 程序变更日期 :
     变更作者 :
     变更说明 :
     
  20.  *  
  21.  * @author wuhua 
     
     
  22.  */  
  23. public abstract class GameCanvas extends Canvas {  
  24.   
  25.     /** 
  26.      * 绘制缓冲的图片。用户绘制资源的时候都是操作这个图片来进行的 
  27.      */  
  28.     private Image bufferImage;  
  29.   
  30.     private int height;  
  31.   
  32.     private int width;  
  33.   
  34.     private int clipX, clipY, clipWidth, clipHeight;  
  35.   
  36.     private boolean setClip;  
  37.   
  38.     protected GameCanvas() {  
  39.   
  40.         super();  
  41.   
  42.         width = getWidth();  
  43.         height = getHeight();  
  44.   
  45.         this.bufferImage = Image.createImage(width, height);  
  46.   
  47.     }  
  48.   
  49.     protected void paint(Graphics g) {  
  50.         //如果要求绘制指定区域的话就需要这样了  
  51.         if (this.setClip) {  
  52.             g.clipRect(this.clipX, this.clipY, this.clipWidth, this.clipHeight);  
  53.             this.setClip = false;  
  54.         }  
  55.         g.drawImage(this.bufferImage, 00, Graphics.TOP | Graphics.LEFT);  
  56.   
  57.     }  
  58.   
  59.     public void flushGraphics(int x, int y, int width, int height) {  
  60.         this.setClip = true;  
  61.         this.clipX = x;  
  62.         this.clipY = y;  
  63.         this.clipWidth = width;  
  64.         this.clipHeight = height;  
  65.   
  66.         repaint();  
  67.         serviceRepaints();  
  68.     }  
  69.   
  70.     public void flushGraphics() {  
  71.         repaint();  
  72.         serviceRepaints();  
  73.     }  
  74.   
  75.     /** 
  76.      * 设计者主要是通过调用这个方法获取图片。然后就可以绘制了 
  77.      * @return 
  78.      */  
  79.     protected Graphics getGraphics() {  
  80.         return this.bufferImage.getGraphics();  
  81.     }  
  82.   
  83.     /** 
  84.      * 这个方法主要是处理Nokia平台,用户调用setFullScreenMode(boolean enable) 时重新按照新的w & h创建缓冲图片 
  85.      */  
  86.     protected final void sizeChanged(int w, int h) {  
  87.         if (h > height) {  
  88.             this.bufferImage = Image.createImage(w, h);  
  89.         }  
  90.     }  
  91. }  
分享到:
评论
6 楼 redduke1202 2007-03-05  
事实上很多机器本身就实现了双缓冲
再缓冲一次意义不大
5 楼 whycloud 2006-11-29  
碰撞检测,在2d游戏中一般情况都是采用位置检测,假设一个精灵12*12的话可以把精灵考虑成12*12的正方形检测,或者是半径6的圆来检测
一般在飞机类游戏是采用后者,这样计算子弹和飞机中心的距离平方小于一个值的时候就认为发生碰撞,而这个距离可以采用勾股定理直接得到。
另外可以将真个游戏画面划分成N个区域,只检测可能发生碰撞的精灵内的部分
例如在飞机游戏中,敌人的子弹和player的飞机,检测过程中,遍历和飞机在一个区域的子弹精灵就可以了。这样可以减少检验过程中的运算量。
如果是横版游戏,一般都是采用正方形的检测
其实像素不是非常大,就没有必要精确到像素检验了
如果是3d碰撞就要稍微的复杂了。到现在一直都没具体时间整理,上次我写的那个3d教程碰撞检测的后半部分
4 楼 wuhua 2006-11-29  
whycloud 写道
wuhua 写道
而起如果采用这样的技术的话,会不会造成得不尝失呢。
如果是二重缓冲,一半来讲不会有过大的负担,整个二重缓冲的实现,在J2ME中最慢的应该是
Image.createImage(width, height);
其他的到没什么,而且对于游戏来说,帧率不要求太高,能保持在12帧就可以了


兄弟讨论的不错。对了,你有没有具体研究关于两个物体碰撞。
我知道有个方法是位置的检测。这对于非透明跟效果不要求很真实的来说是可以接收的。
但如果要求效果很真实,就就需要真实像素检测。请问有没相关的实现,或者想法。
虽然game Sprite类已有相关实现,但我还是想了解下。
3 楼 whycloud 2006-11-29  
wuhua 写道
而起如果采用这样的技术的话,会不会造成得不尝失呢。
如果是二重缓冲,一半来讲不会有过大的负担,整个二重缓冲的实现,在J2ME中最慢的应该是
Image.createImage(width, height);
其他的到没什么,而且对于游戏来说,帧率不要求太高,能保持在12帧就可以了
2 楼 wuhua 2006-11-29  
而起如果采用这样的技术的话,会不会造成得不尝失呢。
1 楼 whycloud 2006-11-29  
图形绘制方面还有一个叫"翻页"技术,是开辟了2块缓冲区,交替绘制,不过对于J2ME来说内存是个问题,所以很少使用

相关推荐

    J2ME实现双缓冲解决屏幕闪烁代码!!!!

    本文将详细解释双缓冲的概念、工作原理,并提供一个简单的J2ME实现双缓冲解决屏幕闪烁的代码示例。 双缓冲是一种图形绘制优化技术,主要目的是减少屏幕闪烁和图像撕裂。在单缓冲系统中,每次图形绘制完成后立即显示...

    《J2ME Game Programming》的源码

    《J2ME Game Programming》的源码是一份珍贵的学习资源,专为那些希望在Java平台上开发移动游戏的程序员设计。J2ME(Java Micro Edition)是Java技术的一个分支,主要用于嵌入式设备和移动设备,如早期的智能手机和...

    J2ME Game Programming 英文版

    "J2ME Game Programming"这本书很可能是详细讲解了以上这些J2ME游戏开发的各个方面,涵盖了从基础概念到高级技巧,帮助开发者利用J2ME平台创建引人入胜的移动游戏。学习这本书将提升开发者在低资源设备上的编程技能...

    动画线程双缓冲(j2me)

    总结来说,"动画线程双缓冲"是J2ME开发中提高图形性能的重要手段,结合多线程编程和双缓冲技术,能够实现高效且平滑的动画,为用户带来更好的交互体验。通过对提供的源程序进行深入研究,开发者可以进一步提升自己的...

    J2ME Game Programming.chm

    《J2ME Game Programming》是一本专为有基础的开发者准备的关于在Java 2 Micro Edition(J2ME)平台上进行游戏开发的指南。J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如早期的智能手机和平板电脑。...

    j2ME 关于j2me的相关资料

    关于j2me的相关资料 ublic class Person implements KSerializable { private String _name; private String _answer; private String _userid;

    j2me游戏开发及其源码.rar_J2ME游戏_j2me_j2me game source_j2me 游戏_j2me游戏开发

    3. **Game API**:J2ME并没有专门的游戏API,但可以使用MIDP的Canvas类来创建自定义图形界面,实现游戏逻辑。Canvas类允许开发者绘制图形、处理事件,是构建游戏画面的基础。 4. **图形与动画**:开发者需要掌握...

    J2Me Game Programming.chm

    《J2ME Game Programming》这本书深入浅出地介绍了如何在J2ME平台上创建游戏,对于想要进入移动游戏开发领域的开发者来说,是一本非常有价值的资源。 **J2ME架构** J2ME架构由配置(Configurations)和 profiles...

    xiaomifeng.rar_J2ME game

    本文将通过对"xiaomifeng.rar"压缩包中的"模拟小蜜蜂"游戏源代码的分析,深入探讨J2ME游戏开发的相关知识点。 一、J2ME基础架构 J2ME由一组配置和 profiles 组成,用于适应不同的设备能力。在“模拟小蜜蜂”游戏中...

    zdr.rar_J2ME game_j2me bubble_泡泡

    "J2ME game" 指的是这个项目是用J2ME开发的,这是一个专门用于小型设备,如早期的移动电话和智能设备的Java平台。"j2me_bubble_泡泡" 进一步明确了游戏的主题,即"泡泡",可能是一款类似于消除或射击泡泡的游戏。 ...

    J2ME-MyCS.zip_CSMidl_counter strike j2me_j2me_platform j2me game

    这个压缩包“J2ME-MyCS.zip”包含了一个基于J2ME的手机游戏,名为“CSMidl”,它是对经典第一人称射击游戏Counter-Strike(CS)的2D版本实现。** **1. J2ME环境配置:** 在开发J2ME应用之前,开发者需要设置J2ME...

    J2ME code for game Maze 3D

    今天,我们来深入探讨一个特定的项目——“Maze 3D”,这是一款基于J2ME的游戏源代码,它为我们提供了宝贵的3D迷宫游戏开发经验。 J2ME是Java平台的一个子集,设计用于资源有限的设备,如早期的智能手机和平板电脑...

    j2me Game Development with MIDP2.0

    《J2ME游戏开发与MIDP2.0》是一本深入探讨Java 2 Micro Edition (J2ME) 平台上游戏开发的专业书籍,尤其针对Mobile Information Device Profile 2.0 (MIDP2.0) 规范进行了详尽的讲解。J2ME是Java在嵌入式设备和移动...

    bianselong.zip_chameleon_free j2me game_j2me

    变色龙游戏,一个以J2ME(Java 2 Platform, Micro Edition)技术实现的免费移动平台游戏,吸引了众多玩家的关注与喜爱。这款名为“Chameleon Free”的游戏,不仅展示了J2ME平台的强大功能,还体现了开发者在游戏设计...

    J2ME Game Programming_javaprogramming_java_

    《J2ME Game Programming》是一本专为Java Mobile Edition(J2ME)平台设计的游戏编程指南,对于希望涉足Java手机游戏开发的程序员来说,这本书及其配套的源代码提供了丰富的学习资源。J2ME是Java的一个子集,主要...

    非常好的关于j2me学习概要

    ### 非常好的关于J2ME学习概要 #### J2ME简介与学习路径 J2ME(Java 2 Platform, Micro Edition)是Sun Microsystems为嵌入式设备和移动设备设计的一种Java平台版本。本文章旨在为初学者提供一份详尽的J2ME学习...

    J2ME Alybaba Game SourceCodes

    本篇将围绕“J2ME Alibaba Game SourceCodes”这一主题,深入探讨其中蕴含的技术知识点,帮助对J2ME游戏开发感兴趣的读者理解和学习。 首先,J2ME是Java平台的一个子集,主要针对嵌入式和移动设备,如早期的智能...

    《J2ME Game Programming》随书源代码

    《J2ME Game Programming》是一本专为Java Mobile Edition(J2ME)游戏开发而编写的书籍,其随书源代码提供了丰富的实例和练习,帮助读者深入理解和掌握J2ME平台上的游戏编程技术。J2ME是Java在移动设备上应用的一种...

Global site tag (gtag.js) - Google Analytics