JAVA与AS2制作一个2D多人游戏(3)

要进行信息交互,首先要建立一对互相连接的Socket

客户端代码如下

	public function Client()
	{
		Socket = new XMLSocket();
		Socket.connect(IP, port);
		Socket.onClose = ServerClose;
		Socket.onConnect = ConnectSuccess;
		Socket.onData = ReceiveData;
		}
服务器端侦听连接请求的ServerSocket类

public void run()
	{
		while(true&&!ss.isClosed())
		{
			try {
				Socket socket=ss.accept();
				HashMap hm=new HashMap();
				hm.put("Socket", socket);
				hm.put("Name", "未登录");
				hm.put("Live",3);
				ClientThread cThread=  new ClientThread(hm);
				hm.put("Thread",cThread);
				cThread.start();
				Main.SocketList.add(hm);
				 PrintStream ps=new PrintStream(socket.getOutputStream());
				   ps.println
				   ("<cross-domain-policy>"  
			       +"<allow-access-from domain='*' to-ports='34567'/>"   
			    +"</cross-domain-policy>"+"\0"
						   );
				   ps.println(Main.ConnectSuccess_Key+"\0");
				
			
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		
	}
上面有一段看起来有些不明所以的XML格式代码,这是因为Flash要访问网络资源时,需要服务器返回这样一段信息,否则就不能建立通信

这个意思是所有来源的IP都可以连接该服务器

allow-access-from domain='*'
这里是可以连接的端口
to-ports='34567'



建立起Socket连接后,就可以进行信息的发送了

我们现在来制作注册功能,先讲一下思路。

客户端先对账号密码框中的输入进行简单验证,这边为了简单起见,只要长度大于0即可。

接下来客户端打包字符串消息发送给服务器的ClientThread类,服务器进行拆解。

ClientThread类将拆解后的信息转发给DBEngine类,该类进行数据库查询,如果该账号已经存在,返回注册失败,如果成功返回注册成功,同时初始化该账号信息,服务器再将该消息返回客户端,客户端负责显示结果的GUI再显示出结果。

代码如下

客户端验证输入后发送

public function Register(Account:String,Password:String)
	{
		if (Account != null && Password != null&&Connected==true)
		{
              Socket.send(Client.Register_Key + Account.length + Password.length + Account + Password+"\n");
			 _root.LoginInfo.text = "正在注册中...";
			}
	
		
		}
服务器ClientThread类

//注册
					if(line.startsWith(Main.Register_Key))
					{
					    String[] lines=Main.decodeString(2,line);
					    String Account=lines[0];
					    String Password=lines[1];
					    boolean ok=DBEngine.Register(Account,Password);
					    
					    if(ok==true)
					    {
					    	//注册成功
					    	printStream.println(Main.Register_Key+1+"\0");
					    }
					    else
					    {
					    	//失败
					    	printStream.println(Main.Register_Key+0+"\0");
					    }
					}

DBEngine类

public static boolean Register(String account, String password) {
		boolean a = false;
		try {
			Class.forName("com.hxtt.sql.access.AccessDriver");
			Connection c=DriverManager.getConnection(url);
			Statement s=c.createStatement();
			
			ResultSet rs=s.executeQuery("Select * From 玩家账号密码表 Where 账号='"+account+"'");
			a=rs.next();
			if(a==true)
			{
				//账号重复
			}
			else
			{
				//创建新账号
				s.executeUpdate("Insert into 玩家账号密码表 Values('"+account+"','"+password+"')");
				s.executeUpdate("Insert into 玩家数据表 Values('"+account+"','"+"无..."+"','"+"武器1,"+"','"+""+"','"+"测试系统留言,"+"','"+"0胜0败"+"','"+0+"')");
				
			}
			
			
			rs.close();
			s.close();
			c.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
至此我们就完成了注册功能的开发


登录功能也类似,过程如下

客户端先对账号密码框中的输入进行简单验证

接下来客户端打包字符串消息发送给服务器的ClientThread类,服务器进行拆解。

ClientThread类将拆解后的信息转发给DBEngine类,该类进行数据库查询,如果账号密码正确,则登录成功,如果没有该账号或者账号对了密码不对,返回登录失败

代码如下

客户端

	public function Login(Account:String,Password:String)
	{
		if (Account != null && Password != null&&Connected==true)
		{
			//Key|账号长度|密码长度|账号|密码
              Socket.send(Client.Login_Key + Account.length + Password.length + Account + Password+"\n");
			 _root.LoginInfo.text = "正在登录中...";
			}
		}
服务器ClientThread类


//登录
					if(line.startsWith(Main.Login_Key))
					{
						String[] lines=Main.decodeString(2,line);
					    String Account=lines[0];
					    String Password=lines[1];
					    String data=DBEngine.Login(Account,Password);
					    
					    if(data!=null)
					    {
                                                //这里把客户端的一些信息保存在该线程对应的HashMap中
                                               this.hm.put("Name", Account);
					    	this.hm.put("Pos", "Hall");
					    	printStream.println(Main.Login_Key+1+"\0");
					    	printStream.println(data+"\0");
					    	Main.SocketList.forEach(a-> {PrintStream ps=(PrintStream)a.get("ps");
					    	if(ps!=null){
                                            //这里转发进入大厅消息给所有人,用于在大厅   
                                           ps.println(Main.EnterHall_Key+Account.length()+Account+"\0");}
					    });
		
					    }
					    else
					    {

					    	printStream.println(Main.Login_Key+0+"\0");
					    }
					 
					}

DBEngine类

<pre name="code" class="plain">public static String Login(String account, String password) {
		String line =null;
		try {
			Class.forName("com.hxtt.sql.access.AccessDriver");
			Connection c=DriverManager.getConnection(url);
			Statement s=c.createStatement();
			
			ResultSet rs=s.executeQuery("Select * From 玩家账号密码表 Where 账号='"+account+"'and 密码='"+password+"'");
			boolean a=rs.next();
			if(a==true)
			{
				ResultSet rs2=s.executeQuery("Select * From 玩家数据表 Where 账号='"+account+"'");
				rs2.next();
				String Account=rs2.getString("账号");
				String GRSM=rs2.getString("个人说明");
				String WPCK=rs2.getString("物品仓库");
				String HYLB=rs2.getString("好友列表");
				String LXLY=rs2.getString("离线留言");
				String ZJ=rs2.getString("战绩");
				String JB=rs2.getString("金币");
				
				//更新人物数据到客户端
				line=Main.Data_Key+Account.length()+GRSM.length()+WPCK.length()+HYLB.length()+LXLY.length()+ZJ.length()+JB.length()
				+Account+GRSM+WPCK+HYLB+LXLY+ZJ+JB;
				rs2.close();
				
			}
			
			
			
			rs.close();
			s.close();
			c.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		return line;
	}

 这里就完成了登录功能的开发,是不是挺简单的? 

下一期将介绍游戏大厅中的一些信息交互




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 2D多人射击游戏目前正在快速发展,可以为玩家提供趣味性十足的游戏体验。采用Cocos Creator引擎开发2D多人射击游戏是完全可行的,它具有强大的功能,可以实现快速、简单和高效的游戏开发。此外,Cocos Creator还提供许多实用的工具,可以帮助开发者快速完成2D多人射击游戏的设计和开发。 ### 回答2: 目前,2D多人射击游戏游戏市场上受到广泛的欢迎。与传统的3D多人射击游戏相比,2D多人射击游戏更简单易上手,并能在较低的技术要求下提供较好的游戏体验。这类游戏通常以俯视或侧面视角展现,玩家可以选择不同的角色来进行战斗,同时与其他玩家或电脑角色进行对战。 2D多人射击游戏的现状是非常火爆的。许多热门的移动游戏平台都有大量的2D多人射击游戏,例如"王者荣耀"和"穿越火线"等。这些游戏不仅拥有庞大的用户群体,而且在竞技游戏领域也有着广泛的影响力。 采用Cocos Creator引擎来开发2D多人射击游戏是完全可行的。Cocos Creator是一款强大的2D游戏开发引擎,具有快速开发、跨平台等优势。它提供了可视化的编辑器,让开发者可以方便地进行场景设计、精灵控制和动画制作。另外,Cocos Creator具有强大的网络支持,可以方便地实现游戏中的多人对战功能。 采用Cocos Creator引擎开发2D多人射击游戏的优势在于其易学易用的特点。即使是没有编程经验的开发者,也可以通过学习Cocos Creator提供的一些简单的脚本语言来实现游戏逻辑。同时,Cocos Creator支持多平台导出,可以将开发的游戏发布到多个平台,例如iOS、Android和Web等,极大地扩展了游戏的用户群体。 综上所述,2D多人射击游戏在市场上呈现出良好的现状,并且采用Cocos Creator引擎进行开发是可行的选择。开发者可以根据自己的需求和技术水平,借助Cocos Creator的强大功能和便捷优势,打造出具备竞争力的2D多人射击游戏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值