疯狂java实例-第15章 仿QQ游戏大厅(5)
代码清单:
code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\action\ReceiveInAction.java
public void execute(Response response) { //得到新进入的玩家 }
ChessUser newUser = (ChessUser)response.getData("newUser"); //向玩家列表中加入一个新玩家
UserTable userTable = (UserTable)UIContext.modules.get(UIContext.HALL_USER_TABLE); userTable.addUser(newUser); //向聊天内容中添加
ChatPanel chatPanel = (ChatPanel)UIContext.modules.get(UIContext.HALL_CHAT_PANEL); chatPanel.appendContent(newUser.getName() + " 进来了"); chatPanel.refreshJComboBox();
以上代码需要注意的是,新建一个UIContext来保存各个界面组件,UIContext中提供一个Map对象来保存界面组件,当有新的界面组件被创建时,就需要加入到Map中,并为该组件提供一个唯一的名称。
ReceiveInAction是玩家用玩接收其他玩家进入游戏大厅的消息,一旦有新的玩家进入,服务器就会向所有玩家发送消息,有新的玩家进入,需要更新玩家列表,更新聊天界面组件的下拉框,最后在ChatPanel添加消息提示。具体的效果如图15.4所示。
疯狂java实例-第15章 仿QQ游戏大厅
图15.4 新的玩家进入游戏大厅
在本小节中,我们编写了游戏大厅的各个界面组件与对象,并实现了用户进入游戏大厅的功能,在下面章节,我们将实现游戏大厅的其他功能。
15.4 实现聊天功能
在游戏大厅中,我们提供了一个聊天的界面,玩家可以在上面进行聊天,发送或者接收聊天信息,需要注意的是,聊天界面是可以共用的,除了在游戏大厅中使用聊天界面外,还可以在游戏界面中使用。本小节实现游戏大厅中的聊天功能。
15.4.1 发送聊天信息
在聊天界面(ChatPanel)中,当玩家选择了某个聊天的对象,输入内容再点击发送按钮后,就可以创建一次请求,将该请求发送到服务器,告诉服务器:我对某个人(所有人)发送了聊天内容,请帮我转发。服务器得到这个请求后,就执行某个服务器处理类,该处理类就将聊天内容转发给相应的玩家。
以下是ChatPanel发送聊天内容的方法。
代码清单:code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\ui\ChatPanel.java
//发送信息
public void send() { //得到发送的内容
疯狂java实例-第15章 仿QQ游戏大厅
}
String content = this.conentField.getText(); //得到接收玩家
ChessUser receiver = (ChessUser)this.target.getSelectedItem(); //构造请求
Request request = new Request(this.serverAction, this.clientAction); //设置参数
request.setParameter("receiverId", receiver.getId()); request.setParameter("senderId", er.getId()); request.setParameter("content", content); //发送请求
er.getPrintStream().println(XStreamUtil.toXML(request)); appendContent("你对 " + receiver.getName() + " 说: " + content);
以上的代码中,构造Request对象时,我们使用的是serverAction与clientAction这两个类属性,由于这个ChatPanel是可以重用的,因此serverAction与clientAction也是由使用者来提供。游戏大厅中发送聊天请求的服务器处理类是SendMessageAction,客户端处理类是ReceiveMessageAction。Request中包括了接收人id、发送人id和聊天内容的信息。服务器中的SendMessageAction得到这些信息后,就可以将内容发送给相关的玩家,以下是SendMessageAction的具体实现。玩家发送聊天信息,由服务器的SendMessageAction接收,再由该Action转发,让客户端的ReceiveMessageAction负责处理。
代码清单:
code\GameHall-Server\src\org\crazyit\gamehall\server\action\SendMessageAction.java
public void execute(Request request, Response response, Socket socket) { String receiverId = (String)request.getParameter("receiverId"); String senderId = (String)request.getParameter("senderId"); ChessUser sender = ers.get(senderId); String content = (String)request.getParameter("content"); if (receiverId == null) { //向所有人发 }
for (String id : ers.keySet()) { if (id.equals(senderId)) continue; ChessUser cu = ers.get(id); response.setData("content", sender.getName() + " 对 所有人 说:" + content);
cu.getPrintStream().println(XStreamUtil.toXML(response)); } } else { //得到接收人 }
ChessUser receiver = ers.get(receiverId); if (receiver.getId().equals(sender.getId())) return;
response.setData("content", sender.getName() + " 对你说:" + content); receiver.getPrintStream().println(XStreamUtil.toXML(response));
SendMessageAction中根据请求的参数来发送相应的信息,需要注意的是,如果接收人id为空的话,那么就意味着向所有人发送聊天内容。
15.4.2 接收聊天信息
接收聊天信息由ReceiveMessageAction负责处理,该类属于客户端处理类,在fivechess-client
疯狂java实例-第15章 仿QQ游戏大厅
模块中,某个玩家得到聊天内容后,就可以获得界面组件,再将这些聊天内容追加到聊天界面组件的文本域中。 代码清单:
code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\action\ReceiveMessageAction.java
public void execute(Response response) { //
得到聊天的界面组件 }
ChatPanel chatPanel = (ChatPanel)UIContext.modules.get(UIContext.HALL_CHAT_PANEL); //从服务器响应中得到内容
String content = (String)response.getData("content"); chatPanel.appendContent(content);
聊天的具体效果如图15.5所示。
图15.5 聊天效果
15.5 启动游戏
玩家选择了某一个位置坐下的时候,需要对位置进行判断,看下该位置是否有人,还要对玩家当前的状态进行判断,判断其是否已经坐下了,如果玩家没有坐到任何位置上并且当前所选择的位置没有玩家,就可以坐到位置上并展现游戏界面。
…… 此处隐藏:2054字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教育文库]夜场KTV服务员的岗位职责及工作流程[1]
- [教育文库]企划、网络、市场绩效考核方案
- [教育文库]学党史、知党情、强党性--“党的基本理
- [教育文库]2016年高考物理大一轮总复习(江苏专版
- [教育文库]干部廉洁自律自查自纠的报告
- [教育文库]2010年北京大学心理学系拟录取硕士研究
- [教育文库]资金时间价值练习题及答案
- [教育文库]保护环境的心得体会
- [教育文库]英语角内容:英语趣味小知识
- [教育文库]档案收集与管理工作通知
- [教育文库]劳动规章制度范本范本
- [教育文库]高考物理一轮复习课后限时作业1运动的
- [教育文库]机械工艺夹具毕业设计195推动架设计说
- [教育文库]通用技术教学比赛说课稿2
- [教育文库]2018年四年级英语下册 Module 7 Unit 2
- [教育文库]第2章 宽带IP网络的体系结构
- [教育文库]九年级化学第五单元课题3《根据化学方
- [教育文库]小学英语六年级情态动词用法归纳
- [教育文库]甲级单位编制窑井盖项目可行性报告(立
- [教育文库]2016-2021年中国城市规划行业全景调研
- 高考英语听力十大场景词汇总结
- 全省领导班子思想政治建设座谈会会议精
- 人教版新课标高一英语提优竞赛试题 下
- 江西省2014年生物中考试题
- 长沙镇食品药品安全事故应急预案
- 《金刚石、石墨和C60》片段教学设计
- 福州教育学院(王旭东)
- 基于EDA音乐播放器的设计
- 9、古诗两首《夜书所见》《九月九日忆
- 小学语文课外阅读有效策略探讨
- 贵州文化产业发展成支柱产业的问卷调查
- 膀胱类癌的诊治体会(附3例报告)
- 发动机积碳产生的原因
- Configuring Code Composer Studio for
- 学生良好的心理素质如何培养点滴谈
- 46 电沉积法制备锂离子电池用硅-锂薄膜
- 美舍雅阁公司管理中各部门职责
- 去壳剥皮的小妙招
- 六自由度运动平台的仿真研究
- Pride and Prejudice(傲慢与偏见)




