书籍介绍
本节书摘来自异步社区《Android 游戏案例开发大全(第4版)》一书中的第5章,第5.4节的一个Android程序——双人联网操控飞机案例,作者 吴亚峰 , 于复兴 , 苏亚光,更多章节内容可以访问云栖社区“异步社区”公众号查看
双人联网操控飞机案例
项目介绍
这个项目是在Android平台下基于socket套接字的网络游戏开发,两个玩家分别点击各自手机上的按钮连接同一局域网,当网络连接成功后,两个手机的屏幕上同时呈现两架飞机,每个玩家控制一架飞机。当任一玩家移动遥杆操控自己的飞机时,手机屏幕都会同步更新飞机的位置。
问题1
运行程序后,屏幕上会出现“等待连接。。。”的字样。如图所示
问题原因
问题的原因就是他所说的,没有连接到服务器,所以解决问题的方法是连接到服务器。
解决办法
1.在自己的电脑上运行服务器端程序。我是在eclipse上运行服务器端程序serverthread。运行结果如下
服务器正在等待客户端的连接。
2.在AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
3.使自己的手机连接与自己的电脑处于同一局域网。方法是电脑开启移动热点,手机连接到电脑的热点。
4.修改IP,在项目中的networkthread.java中的run()方法里,代码中的IP不是自己电脑的IP,所以无法通过IP连接到服务器。
sc=new Socket("192.168.137.1", 9999);//连接服务器
故需要修改IP,方法如下
(1)打开命令提示符(cmd)
(2)通过ipconfig命令,获取本地连接2的IPv4地址。注意这里获取的是本地连接2的IPv4地址,不要弄错了。
(3)用它替换掉书中代码的IP,IP问题就解决了。
5.启动networkthread线程。
书中说王佳点击手机上的菜单键连接同一局域网,然而并没有什么菜单键。通过查资料得知,菜单键只有在早期的安卓手机才有,在Android 4时就没有了。现在已经是Android 10了。所以我在界面上添加按钮,通过单击按钮来启动networkthread线程。
package com.example.client;
import com.example.client.thread.KeyThread;
import com.example.client.thread.NetworkThread;
import com.example.clinet.view.GameView;
import com.example.util.GameData;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity implements View.OnClickListener {
public int KeyDispX=0;//方向x
public int KeyDispY=0;//方向y
public Bitmap planer;
public Bitmap planeg;
public GameData gd=new GameData();
public KeyThread kt=new KeyThread(this);
public NetworkThread nt;
GameView gv;
Button button1;//按钮的引用
public Handler handler=null;//声明Handler对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 = (Button) findViewById(R.id.button1);//得到布局中的按钮引用 button1.setOnClickListener(this);//添加监听
button1.setOnClickListener(this);//添加监听
this.handler=new Handler();//创建属于主线程的handler
planer=BitmapFactory.decodeResource(getResources(), R.drawable.red);//红飞机
planeg=BitmapFactory.decodeResource(getResources(), R.drawable.yellow);//黄飞机
gv=(GameView)this.findViewById(R.id.mf1);
}
public void onClick(View v) {//点击按钮后执行的代码
if(v == button1){
if(this.nt==null)
{//若没有启动networkthread线程,则启动networkthread线程
this.nt=new NetworkThread(MainActivity.this);
this.nt.start();
}
}
}
}
运行结果
客户端
服务器端