站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题我做的蓝牙游戏出了点问题?

我做的蓝牙游戏出了点问题?

摘要: 我做的蓝牙游戏出了点问题?


我做的蓝牙游戏出了点问题?我最近做了一个小的蓝牙游戏,是这样的:

在一个地图中有4个小怪物(由4个sprite实现),它们会随机的移动。每一个方向移动的动画都是由一个线程(4个方向共4个)控制的。当我将其改为联机游戏时是这样想的:关闭掉客户端的随机函数,这样怪物便不会再移动了,而服务端则照常进行,并且每当产生一个随机数时,将随机数传给客户端,客户端得到消息后,根据随机数的值来调用相对的方向移动动画线程来实现客户端的怪物移动。可是在模拟器上运行时,在起初怪物移动都是同步的,但后来就全乱了,不知道这可能是什么方面的原因呢?我的两个主角的移动都是同步的(但有1s的延迟)。是不是和蓝牙的信息传送效率有关啊?这有可能吗?希望有相关经验的高人指点一下。

下面是我设计的客户端与服务端接收信息与发送信息的方法

服务端(负责确保客户端怪物的移动)

class WriteWorkThread extends Thread{ //实时向客户端传送信息的线程
public void run(){
try{
while(!exitFlag){ //当连接未关闭时
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (exitFlag)// 可能因为关闭操作被打断
break;
if(playerState!=null){
System.out.println("写入玩家信息");
System.out.println(playerState);
out.writeUTF(playerState); //写入玩家信息
}
if(enemyState!=null){
System.out.println("写入怪物数据");
out.writeUTF(enemyState); //写入怪物信息
}
out.flush();//刷新数据流
playerState="N";
enemyState="N";
}
}
}catch(IOException e){
if(!exitFlag){
System.out.println("数据写入失败");
}
}
}
}

下面是客户端的接收方法(负责获得服务端怪物移动并向本地enemy类传送移动的命令)

class ReadWorkThread extends Thread{ //实时读取服务器信息的内部类
public void run(){
sMessage=null;
try{
while(!exitFlag){
sMessage=in.readUTF();
if(sMessage!=null){ //当确定有对方信息传来
if(sMessage.equals("U")){
oPlayer.up(sPlayer);
}
else if(sMessage.equals("D")){
oPlayer.down(sPlayer);
}
else if(sMessage.equals("L")){
oPlayer.left(sPlayer);
}
else if(sMessage.equals("R")){
oPlayer.right(sPlayer);
}
else if(sMessage.equals("F")){
oPlayer.slip(sPlayer);
}

//下面开始是怪物的信息与player一样由sMessage接收

// "1U"表示第一个怪物向上移动
if(sMessage.equals("1U")){
oEnemy.oup.set(enemy1,1);
}
if(sMessage.equals("1D")){
oEnemy.odown.set(enemy1,1);
}
if(sMessage.equals("1R")){
oEnemy.oright.set(enemy1,1);
}
if(sMessage.equals("1L")){
oEnemy.oleft.set(enemy1,1);
}

if(sMessage.equals("2U")){
oEnemy.oup.set(enemy2,2);
}
if(sMessage.equals("2D")){
oEnemy.odown.set(enemy2,2);
}
if(sMessage.equals("2R")){
oEnemy.oright.set(enemy2,2);
}
if(sMessage.equals("2L")){
oEnemy.oleft.set(enemy2,2);
}
if(sMessage.equals("3U")){
oEnemy.oup.set(enemy3,3);
}
if(sMessage.equals("3D")){
oEnemy.odown.set(enemy3,3);
}
if(sMessage.equals("3R")){
oEnemy.oright.set(enemy3,3);
}
if(sMessage.equals("3L")){
oEnemy.oleft.set(enemy3,3);
}
if(sMessage.equals("4U")){
oEnemy.oup.set(enemy4,4);
}
if(sMessage.equals("4D")){
oEnemy.odown.set(enemy4,4);
}
if(sMessage.equals("4R")){
oEnemy.oright.set(enemy4,4);
}
if(sMessage.equals("4L")){
oEnemy.oleft.set(enemy4,4);
}
}
}
}
catch(IOException e){
if(!exitFlag){
System.out.println("数据读取失败");
}
}




建议你使用一个消息队列,在执行时把坐标加入到队列中来执行,不要直接的读了就set,而是每次从队列中读取,当然注意队列的互斥问题,还有防止死锁


同上。


路过,友情up...


那末,队列是用字符串数组的形式吗?


这个格式你自己定,因为两端的数据都是你定,所以只要自己知道就行了,可以用String,可以用Integer,还可以自己写一个二元组,封装X和Y坐标


↑返回目录
前一篇: 手机阅读器!帮我解决下,谢谢!
后一篇: 我写了个程序,为什么在电脑上跟手机上输入同一参数运行结果却不同?