教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

疯狂java实例-第15章 仿QQ游戏大厅(4)

来源:网络收集 时间:2026-08-31
导读: 疯狂java实例-第15章 仿QQ游戏大厅 图15.2 游戏大厅界面 五子棋游戏大厅主要包括一个存放桌子的JPanel,存放所有玩家的JTable对象,主要用于聊天的JPanel,玩家列表的JTable对象与聊天对象界面较为简单,复杂的是大

疯狂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字,全部文档内容请下载后查看。喜欢就下载吧 ……

疯狂java实例-第15章 仿QQ游戏大厅(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/279657.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)