您的位置:首页 > 其它

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

2009-02-08 22:19 447 查看
1.数据传输序列化模块(Serialization接口)

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

该接口的具体代码如下:

Java代码



/*

* 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;

}

/*
* 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:后续章节将讲到)调用,把方法绘制到屏幕上。

具体代码如下:

Java代码



/*

* 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();

}

}

http://supersun.javaeye.com/blog/261794
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: