疯狂java实例-第15章 仿QQ游戏大厅(4)
疯狂java实例-第15章 仿QQ游戏大厅
图15.2 游戏大厅界面
五子棋游戏大厅主要包括一个存放桌子的JPanel,存放所有玩家的JTable对象,主要用于聊天的JPanel,玩家列表的JTable对象与聊天对象界面较为简单,复杂的是大厅对象,该对象在本章中对应的HallPanel对象。
当登录进入五子棋游戏大厅的时候,我们首先会调用ChessGame的start方法,该方法会发送一次请求到服务器取全部的桌子信息,再由客户端的ClentInAction负责创建游戏界面。在服务器响应中我们可以得到所有的桌子信息,然后再根据这些桌子的信息去创建HallPanel。
以下是HallPanel的paint方法,主要用于绘画界面中的桌子与玩家。
代码清单:code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\ui\HallPanel.java
public void paint(Graphics g) { for (int i = 0; i < this.tables.length; i++) { for (int j = 0; j < this.tables[i].length; j++) { Table table = this.tables[i][j]; Seat leftSeat = table.getLeftSeat(); Seat rightSeat = table.getRightSeat(); //画桌子的图片
g.drawImage(tableImage, table.getBeginX(), table.getBeginY(), this); //画左边座位的玩家
if (leftSeat.getUser() != null) { Image head = getHeadImage(leftSeat.getUser().getHeadImage()); g.drawImage(head, table.getLeftSeatBeginX(), table.getLeftSeatBeginY(), this);
疯狂java实例-第15章 仿QQ游戏大厅
}
}
}
}
//画右边座位的玩家
if (rightSeat.getUser() != null) { Image head = getHeadImage(rightSeat.getUser().getHeadImage()); g.drawImage(head, table.getRightSeatBeginX(), table.getRightSeatBeginY(), this); }
HallPanel得到各个桌子的二维数组后,根据这个二维数组去绘画桌子,如果桌子中的座位有玩家的话,就画上相应的玩家头像。画完桌子后,我们需要处理鼠标事件,当鼠标的指针移动到某个位置上面的时候,就需要帮这个位置更换图片,让其做到有阴影的效果。
为鼠标移动添加事件。
代码清单:code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\ui\HallPanel.java
this.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { moveMouse(e); } });
玩家移动鼠标的时候,就触发mouseMove方法,该方法的主体代码如下。
代码清单:code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\ui\HallPanel.java
if (table.getLeftSeat().getRange().contains(x, y)) { //左边座位
this.setCursor(HAND_CURSOR); //如果位置上没有人才更换图片
if (table.getLeftSeat().getUser() == null) { g.drawImage(seatSelectImage, table.getLeftSeatBeginX(), table.getLeftSeatBeginY(), this); }
} else if (table.getRightSeat().getRange().contains(x, y)) { //右边座位
this.setCursor(HAND_CURSOR); //如果位置上没有人才更换图片
if (table.getRightSeat().getUser() == null) { g.drawImage(seatSelectImage, table.getRightSeatBeginX(), table.getRightSeatBeginY(), this); } } else { this.setCursor(DEFAULT_CURSOR); this.repaint(); }
当鼠标移动到有人的位置时,就不更改阴影图片,如果鼠标移动到没有人的座位时,才更换座位的阴影图片与鼠标指针,具体的效果如图15.3所示。
疯狂java实例-第15章 仿QQ游戏大厅
15.3 鼠标指针移动到空座位上时
15.3.5 创建玩家列表与聊天界面
玩家登录进入游戏大厅的时候,服务器需要将所有玩有的信息发送给登录的玩家,界面得到这些玩这有信息后,就将所有的玩家设置到玩家列表中。在本章,玩家列表使用的是UserTable来表示。UserTable的实现较为简单,只需要得到具体的五子棋玩家列表,就可以根据这些玩家来创建列表。该列表需要注意的是,列表的单元格并不可以编辑。需要将自己放到所有玩家的最前面。
由于玩家列表中涉及图片的显示,同样也是需要提供一个DefaultTableCellRenderer来显示相应列的图片。编写一个DefaultTableCellRenderer的子类来处理显示头像图片:
代码清单:
code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\ui\UserTableCellRenderer.java
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setHorizontalAlignment(SwingConstants.CENTER); //设置显示图片 }
if (value instanceof Icon) this.setIcon((Icon)value); else this.setText(value.toString()); //设置单元格的北景颜色
if (isSelected) this.setBackground(Color.YELLOW); else this.setBackground(Color.WHITE); return this;
最后将各个玩家的信息转换成列表显示的数据类型显示到列表中,在UserTable中,我们使用一个List来保存所有的玩家信息,提供一个getDatas的方法来转换玩家集合。
代码清单:code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\ui\UserTable.java
//得到玩家列表的数据格式
private Vector<Vector> getDatas() { Vector<Vector> result = new Vector<Vector>(); for (ChessUser user : ers) { Vector v = new Vector(); v.add(user.getId()); v.add(getHead(user.getHeadImage())); v.add(user.getName()); v.add(getSex(user.getSex())); result.add(v); } return result; }
如图15.2所示,除了玩家列表外,还有聊天的界面,聊天界面在本章中使用ChatPanel表示。在ChatPanel中,只需要创建一些基本的界面组件即可,包括一个JTextArea、一个JTextField和一个发送的按钮。需要游戏的是,构建ChatPanel时,也需要将所有的玩家与当前的玩家都作为构造参数传入,这是由于如果进行聊天,就需要让玩家选择聊天的对象,再发送给服务器。
疯狂java实例-第15章 仿QQ游戏大厅
玩家列表与聊天界面已经创建完成,这两个界面组件可以在游戏界面重用,游戏界面的实现将在下面章节讲述。
15.3.6 使用服务器的数据创建游戏大厅
建立游戏大厅的各个界面,都离不开玩家的信息。在15.3.3中,我们还没有实现ClientInAction,这个客户端处理类主要用于得到服务器传过来的大厅信息、玩家信息,我们可以根据这些信息来创建游戏大厅的界面。
代码清单:
code\fivechess-client\src\org\crazyit\gamehall\fivechess\client\action\ClientInAction.java
public void execute(Response response) { //从服务器中得到大厅信息并封装成一个GameHallInfo对象 }
GameHallInfo hallInfo = getGameHallInfo(response); //得到全部玩家的信息
List<ChessUser> users = getUsers(response); //得到进入游戏的玩家信息
…… 此处隐藏:4306字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教育文库]夜场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(傲慢与偏见)




