`

J2ME实战:蓝牙联网俄罗斯方块(4)—数据传输序列化与游戏地图存储模块( 未完待续。。。)

阅读更多

1.数据传输序列化模块(Serialization接口)


在游戏的过程中需要将地图数据传输到远端玩家的手机上,故需进行数据的序列化和反序列化,因此我们这里定义了Serialization接口。

 

该接口的具体代码如下:

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package game.teris;
import java.io.*;

/**
 *
 * @author dongdong
 */
public interface Serialization {
    public byte[] serialize() throws IOException;
    public void deserialize(byte[] data) throws IOException;

}
 

 

该接口中定义的serialize()方法和deserialize()方法会在游戏地图存储模块(TetrisMap)类中作具体的实现。定义Serialization接口的目的是为了对序列化进行规范,使所有的进行序列化传输的类都遵守相同的规则,并不是说不实现Serialization接口就不可以进行传输了。



2.游戏地图存储模块(TetrisMap类)



TetrisMap类提供了如下的功能:


a.通过mapdata[][]和mapBlockExist[]两个数组提供了对游戏地图在数组上的逻辑表示;

b.提供了对游戏地图中对应的方块的消除和添加算法;

c.提供了对方块的绘制方法paint(),供游戏逻辑控制模块TetrisCanvas类(tips:后续章节将讲到)调用,把方法绘制到屏幕上。


具体代码如下:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package game.teris;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;

/**
 *
 * @author dongdong
 */
public class TetrisMap {
    int gamearea_x;
    int gamearea_y;
    int brick_Width;
    private TetrisCanvas canvas;
    private int[][] mapdata;
    private boolean[] mapBlockExist;
    private boolean _isSlave;
    private boolean isMaster;
    private int score;
    private int deleteRowNum;
    private Player player;
    private Font SCOREFONT;
    public TetrisMap(TetrisCanvas canvas, boolean _isMater) {
        this.canvas=canvas;
        //定义游戏地图为一个高16、宽12的数组,mapBlockExist代表每一行
        mapdata=new int[16][12];
        mapBlockExist=new boolean[16];
        setParameters(_isSlave);
    }
    public void setParameters(boolean _isMaster){
        isMaster=_isMaster;
        if(isMaster)
        {
            gamearea_x=canvas.GAMEAREA_X;
            gamearea_y=canvas.GAMEAREA_Y;
            brick_Width=canvas.BRICK_WIDTH;
        }else
        {
            gamearea_x=canvas.GAMEAREA_X_REMOTE;
            gamearea_y=canvas.GAMEAREA_Y_REMOTE;
            brick_Width=canvas.BRICK_WIDTH_REMOTE;
        }
    }
    public void init() {//初始化TetrisMap实例中mapdata和mapBlockExist数据
        //清除计分
        score=0;
        //先把全部元素清0
        for(int i=0; i<16; i++)
        {
            for(int j=0; j<12; j++)
            {
                mapdata[i][j]=0;
            }
            mapBlockExist[i]=false;
        }
        //设置两堵墙
        for(int i=0; i<16; i++)
        {
            mapdata[i][0]=8;
            mapdata[i][11]=8;
        }
        //设置容器底
        for(int i=0;i<12;i++)
        {
            mapdata[15][i]=8;
        }
        mapBlockExist[15]=true;
        
    }

    public int get(int x, int y) {//地图数据的提取
        int data =mapdata[y][x];
        return data;
       
    }
    public void  set(int x, int y, int val){
        if(x >= 0 && y >= 0)
        {
            mapdata[y][x]= val;
            mapBlockExist[y]=true;
        }
    }
    public void paint(Graphics g) {/*首先根据TetrisMap代表的是主屏还是附屏清处不同
     的区域然后绘制非运动砖块*/
        //清屏
        if(isMaster)
        {
            TetrisCanvas.clear(g);
        }
        else
        {
            TetrisCanvas.clear_Remote(g);
        }
        for(int i=0; i<16; i++)
        {
            for(int j=0; j<12; j++)
            {
                if(mapdata[i][j] == 8)
                {
                    block.drawBrick(gamearea_x + j * brick_Width,
                            gamearea_y + i * brick_Width, g,7);
                }
            }
        }
        
    }
    public boolean check(Graphics g, int row){
        boolean deleteFlag=false;
        deleteRowNum=0;
        //最多可以连销4行
        int tmpRowNo;
        if(row + 4>= 15)
        {
            tmpRowNo=15;
        }
        else{
            tmpRowNo=row+4;
        }
        
        for(int y=row; y<tmpRowNo; y++)
        {
            boolean flag = true;
            
            for(int x=1; x<11; x++)
            {
                if(mapdata[y][x]==0)
                {
                    //空白区
                    flag=false;
                }
            }
            //需要消行
            if(flag)
            {
                mapBlockExist[y] = false;
                for(int x=1; x<11; x++)
                {
                    mapdata[y][x] = 0;
                }//这一行的地图数据全部置0
                
                deleteRow(g,y);
                
                deleteFlag=true;
                
                deleteRowNum ++;
                
                //加分
                score += 10;
                paintScore(g);
                //发声
                try{
                    if(player != null)
                    {
                        player.start();
                    }
                }
                catch (MediaException me){ }
            }
        }// end for
        return deleteFlag;
    }

    public void deleteRow(Graphics g, int y) {//本地方法,用来将需要消去的行简单置黑
      g.setColor(TetrisCanvas.BACKGROUND);
      g.fillRect(gamearea_x + brick_Width, gamearea_y + y*brick_Width, 
              10 * brick_Width, brick_Width);
    }
    
    public void repaintMap(Graphics g){/*对mapdata和mapBlockExist的值进行检查,几行方块被消完
        上面的方块依次下降几行*/
        //从容器底开始
        for(int i =14; i>0;i--)
        {
            int tmp;
            
            //有砖块的行才移动
            if(mapBlockExist[i]){
                //只有下一行为空白行才进行移动
                if(!mapBlockExist[i+1]){
                    tmp= i+1;
                    
                    if(!mapBlockExist[i+2]){
                        tmp=i+2;
                        
                        if(!mapBlockExist[i+3]){
                             tmp=i+3;
                        }//end if(!mapBlockExist[i+3])
                    }//end if(!mapBlockExist[i+2])
                    deleteRow(g,i);
                    //行复制
                    for(int j=1; j<11; j++){
                        mapdata[tmp][j] = mapdata[i][j];
                        mapdata[i][j] = 0;
                    }
                    mapBlockExist[i]= false;
                    mapBlockExist[tmp]= true;
                    
                    drawBlock(g,tmp);
                }//end  if(!mapBlockExist[i+1])
            }//end  if(!mapBlockExist[i])
        }//end for
        
    }
    
    public void repaintMap_Remote(Graphics g){/*负责远端屏幕绘制,非实时更新,仅本地有方块
     落下及消去时才被调用*/
        for(int i=15; i>0; i--)
        {
            drawBlockAll(g,i);
        }
        paintScore(g);
    }

    public void drawBlock(Graphics g, int y) {//绘制主屏
       for(int x=1;x<11;x++)
       {
           if(mapdata[y][x]!=0)
           {
               block.drawBrick(gamearea_x + x*brick_Width, 
                       gamearea_y + y*brick_Width,
                       g, mapdata[y][x] -1);
           }
       }
    }

    public void drawBlockAll(Graphics g, int y) {//绘制附屏
        for(int x=1; x<11; x++)
        {
            if(mapdata[y][x] !=0)
            {
                block.drawBrick(gamearea_x + x*brick_Width, gamearea_y + y*brick_Width, 
                        g, mapdata[y][x] -1);
            }else
            {
                g.setColor(TetrisCanvas.BACKGROUND);
                g.fillRect(gamearea_x + x*brick_Width, gamearea_y + y*brick_Width, 
                        brick_Width, brick_Width);
            }
        }
    }

    private void paintScore(Graphics g) {//绘制分数
       
        if(0 == score)
        {
            return;
        }
        
        //清除记分牌
        g.setColor(TetrisCanvas.BACKGROUND);
        g.fillRect(gamearea_x + 12*brick_Width, gamearea_y + 6*brick_Width, 
                brick_Width * 7, brick_Width * 7);
        //计分
        g.setColor(0, 255, 0);
        g.setFont(SCOREFONT);
        g.drawString("" + score, 
                gamearea_x + 14*brick_Width,
                gamearea_y + 8*brick_Width,
                g.TOP | g.HCENTER);
    }
    
    public void caculateScore(){//计算分数
        score += deleteRowNum * 10;
    }
    
     public byte[] serialize() throws IOException{/*实现Serialization接口的
         serialize()方法*/
         
         ByteArrayOutputStream byteArrayOutStream = new
                 ByteArrayOutputStream();
         DataOutputStream dataOutputStream = new 
                 DataOutputStream(byteArrayOutStream);
         
         for( int i=0; i<16; i++)
         {
             for(int j=0; j<12; j++)
             {
                 dataOutputStream.writeInt(mapdata[i][j]);
             }
         }
         dataOutputStream.writeInt(deleteRowNum);
         
         return byteArrayOutStream.toByteArray();
         
     }
     
     public void deserialize(byte[] data) throws IOException{/*实现Serialization
      接口的deserialize()方法*/
         ByteArrayInputStream byteArrayInputStream = new 
                 ByteArrayInputStream(data);
         DataInputStream dataInputStream = new 
                 DataInputStream(byteArrayInputStream);
         for(int i=0; i<16; i++)
         {
             for(int j=0;j<12;j++)
             {
                 mapdata[i][j]= dataInputStream.readInt();
             }
         }
         deleteRowNum= dataInputStream.readInt();
         caculateScore();
         
     }

}

 

  未完待续。。。

分享到:
评论
2 楼 wuhua 2008-11-09  
jiyanliang 写道
不知道bluetooth对svg的地图传输效果如何,特别当数据量大的时候。

svg 其实瓶颈不再传输,瓶颈应该在你对数据的缓存以及解码的效率吧。
1 楼 jiyanliang 2008-11-07  
不知道bluetooth对svg的地图传输效果如何,特别当数据量大的时候。

相关推荐

    j2me例子:俄罗斯方块

    例如,开发者需要设计一个数据结构来存储当前的游戏板状态,并编写算法来判断新方块的放置位置、旋转后的形状,以及何时达到消除条件。 【帧率管理】 为了保持游戏流畅,你需要控制每秒渲染的帧数。J2ME中的线程...

    J2me 游戏《俄罗斯方块》

    《J2ME游戏:俄罗斯方块》是一款基于Java 2 Micro Edition(J2ME)平台开发的经典游戏。J2ME是Java技术的一个分支,主要用于移动设备、嵌入式设备等小型计算平台,提供了丰富的功能和良好的跨平台能力,使得开发者...

    俄罗斯方块J2ME下载

    4. **游戏编程**:在J2ME中开发俄罗斯方块,需要理解基本的图形绘制、事件处理、定时器管理等编程概念。例如,使用Java的Graphics类绘制方块,监听键盘输入控制方块移动和旋转,通过Timer类控制方块的下落速度。 5....

    j2me版俄罗斯方块

    《J2ME版俄罗斯方块:移动平台的经典重构》 J2ME,全称为Java 2 Micro Edition,是Java平台上针对嵌入式设备和移动设备的一种编程框架,它为开发者提供了在各种小型设备上创建应用的能力,包括手机、PDA等。在本...

    使用j2me编程的游戏——俄罗斯方块

    4. **数据结构**:为了存储游戏状态,如当前方块的位置和旋转状态,以及游戏板上的已堆积方块,我们需要合理的数据结构,如二维数组或链表。 5. **算法**:游戏的核心算法包括方块的生成、旋转和碰撞检测。生成算法...

    j2me手机游戏——俄罗斯方块!

    根据给定的信息,我们可以分析并总结出关于J2ME(Java 2 Micro Edition)手机游戏——俄罗斯方块的重要知识点。 ### J2ME简介 J2ME(Java 2 Platform, Micro Edition)是Sun Microsystems为嵌入式设备和移动设备...

    J2me 俄罗斯方块游戏 源程序 java

    《J2ME版俄罗斯方块游戏源码解析》 在移动设备尚未普及智能手机的时代,Java ME(J2ME)作为一款跨平台的开发环境,广泛应用于功能手机的游戏开发。其中,经典游戏“俄罗斯方块”因其简单易懂的规则和高度上瘾的...

    J2ME-OPPOF15俄罗斯方块

    《J2ME-OPPOF15俄罗斯方块》是一款基于Java 2 Micro Edition (J2ME) 平台开发的、适用于OPPO F15手机的经典游戏。它以其独特的可扩展性和源码开放性,为开发者提供了学习和研究移动游戏开发的宝贵资源。 首先,我们...

    j2me俄罗斯方块

    《J2ME版俄罗斯方块:游戏开发与技术解析》 在移动通信技术飞速发展的今天,J2ME(Java 2 Micro Edition)作为一种轻量级的Java平台,广泛应用于移动设备,如早期的智能手机和平板电脑。本项目——"j2me俄罗斯方块...

    j2me-俄罗斯方块(源码)

    《J2ME版俄罗斯方块:解构与学习》 在移动设备的早期时代,Java 2 Micro Edition(J2ME)是开发游戏和应用程序的主流平台之一。今天,我们有机会深入研究一个基于J2ME的俄罗斯方块游戏源码,这为我们提供了宝贵的...

    俄罗斯方块源程序 j2me

    《J2ME版俄罗斯方块源程序解析》 在移动设备普及的年代,J2ME(Java Micro Edition)作为一款跨平台的开发工具,广泛应用于手机游戏开发,其中包括经典游戏——俄罗斯方块。本篇文章将深入探讨如何使用J2ME技术实现...

    J2ME手机游戏源码_俄罗斯方块

    在这个特定的压缩包中,我们拥有的是一款基于J2ME开发的俄罗斯方块游戏的源代码。通过研究这个源码,我们可以深入理解如何在移动设备上构建游戏应用。 首先,我们要了解J2ME的基本结构。J2ME由配置(Configurations...

    j2me 俄罗斯方块 数组版

    《J2ME版俄罗斯方块:数组实现与技术解析》 在移动设备上,游戏开发一直是一大热门领域,尤其在Java ME(J2ME)时代,轻量级的平台和广泛的设备支持使得开发者能够创建出各种各样的游戏。本文将深入探讨一个基于...

    J2ME游戏源码之俄罗斯方块

    **J2ME游戏源码详解:打造移动版俄罗斯方块** **一、J2ME简介** J2ME(Java 2 Platform, Micro Edition)是Java平台的一个子集,专为资源有限的移动设备如手机、PDA等设计。它提供了一个可移植的运行环境,使得...

    J2me俄罗斯方块,设计报告

    《J2me俄罗斯方块设计报告》是一份深入解析如何使用Java 2 Micro Edition (J2ME) 技术开发经典游戏俄罗斯方块的详细文档。这份报告涵盖了从项目规划到实现过程的各个环节,旨在帮助学习者理解移动平台游戏开发的基础...

    J2ME游戏代码:俄罗斯方块

    /* * 一个简单的俄罗斯方块游戏代码,代码中主要包含3个类: *TerrisMIDlet——MIDlet类 *GameCanvas——游戏界面类 *GameEngine——游戏逻辑类 *已经使用WTK2.5.2运行通过. */

    J2ME教材:J2ME&Gaming中文版

    10. **案例分析与实践**:教材可能会包含一些基础游戏的实例,如贪吃蛇、俄罗斯方块等,帮助读者将理论知识转化为实际操作能力。 总的来说,“J2ME&Gaming中文版”是一本引导初学者进入J2ME游戏开发领域的教程,它...

    J2ME练习--俄罗斯方块

    《J2ME实战:探索俄罗斯方块的编程艺术》 J2ME,全称为Java Micro Edition,是Java平台的一个重要分支,主要用于移动设备和嵌入式系统的开发。在这个专题中,我们将深入探讨如何使用J2ME来实现经典游戏——俄罗斯...

    基于J2ME的手机蓝牙联网游戏的研究及实现

    《基于J2ME的手机蓝牙联网游戏的研究及实现》这篇文档深入探讨了如何利用Java Micro Edition(J2ME)技术开发手机蓝牙联网游戏。J2ME是Java平台的一个子集,专为资源有限的移动设备设计,如早期的智能手机和平板电脑...

Global site tag (gtag.js) - Google Analytics