⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tankclient.java

📁 基于尚学堂坦克大战的基础上开发,支持多人对战,在线聊天,坦克大战网络版.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			button.setLocation(685, 529);
			button.setSize(60, 24);
			this.setResizable(false);
			this.setLocation(270, 240);
			add(username);
			add(IP);
			add(Port);
			add(udpPort);
			add(button);
			setSize(800, 624);

			// 添加窗口关闭事件
			this.addWindowListener(new WindowAdapter() {
				@Override
				public void windowClosing(WindowEvent e) {
					dispose();
					System.exit(0);
				}
			});

			// 点击登陆按钮,用登陆窗口中的参数取点连接
			button.addActionListener(new ActionListener() {

				public void actionPerformed(ActionEvent e) {
					String ServerIp = IP.getText().trim();
					int tcpPort = Integer.parseInt(Port.getText().trim());
					int myUDPPort = Integer.parseInt(udpPort.getText().trim());
					String user = username.getText();
					tank.setUser(user);
					client.setIp(ServerIp);
					client.setUdpport(myUDPPort);
					client.connect(ServerIp, myUDPPort);
					setStarted(true);
					if (!connect) {
						setVisible(false);
					}
				}

			});
		}

		/**
		 * 画出Login窗体,预先加载图片,使之能够在第一次运行时正常显示
		 */
		public void paint(Graphics g) {
			if (init) {
				g.drawImage(icon.getImage(), 0, 0, null);
				init = false;
			}
			g.drawImage(icon.getImage(), 0, 24, null);
		}

	}

	/**
	 * 玩家在游戏中突然退出游戏时,所发出的动作
	 */
	public void exitGame() {
		if (TankClient.this.connect) {
			Socket s2 = null;
			try {
				s2 = new Socket(TankClient.this.client.getIp(),
						TankServer.TCP_EXIT_PORT);
				DataOutputStream dos = new DataOutputStream(s2
						.getOutputStream());
				dos.writeInt(TankClient.this.client.getUdpport());
				dos.writeInt(TankClient.this.tank.getTankId());
				System.out.println("发送了退出请求!!");
				// 退出的时候让坦克死掉,省的烦哈

				// 清除加入窗口上的信息
				TankClient.this.tank.setLive(false);
				Msg TankDeadTankMsg = new TankDeadMsg(TankClient.this.tank);
				TankClient.this.client.send(TankDeadTankMsg);
				TankClient.this.tank.setReady(true);
				Msg removeTankMsg = new RemoveTankMsg(TankClient.this);
				TankClient.this.client.send(removeTankMsg);
				System.out.println("给其他客户端玩家发出移除自己的请求");
				Msg joinRepaintMsg = new JoinRepaintMsg(TankClient.this);
				TankClient.this.client.send(joinRepaintMsg);
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}

	/**
	 * 玩家加入窗体的界面,玩家可进行聊天,准备等,当所有玩家准备就绪,则游戏正式开始
	 */
	class Join extends Frame {

		ImageIcon icon;

		private JScrollPane scrollPane;

		TextField talk;

		Label top;

		Button button;

		JButton start;

		TextArea talkArea;

		public Join() {
			Toolkit tk = Toolkit.getDefaultToolkit();
			icon = new ImageIcon(tk.getImage(Join.class.getClassLoader()
					.getResource("images/Join.jpg")));
			setLayout(null);
			talk = new TextField("我等到花儿也谢了!!", 40);
			talk.setLocation(298, 437);
			talk.setSize(391, 24);
			button = new Button("发送");
			button.setLocation(696, 438);
			button.setSize(60, 24);
			talkArea = new TextArea();
			talkArea.setSize(480, 300);
			talkArea.setLocation(286, 105);
			start = new JButton("准备就绪");
			start.setLocation(21, 548);
			start.setSize(227, 52);
			ImageIcon general = new ImageIcon(Join.class.getClassLoader()
					.getResource("images/start_rollout.gif"));
			/*
			 * start.setIcon(general); start.setRolloverIcon(general);
			 * start.setSelectedIcon(general); start.setPressedIcon(general);
			 */
			start.setOpaque(false); // 设置接钮透明
			this.setResizable(false); // 设置窗体大小不可变
			this.setLocation(270, 240); // 设置窗口的位置
			add(talk);
			add(button);
			add(talkArea);
			add(start);
			setSize(800, 624);
			this.addWindowListener(new WindowAdapter() {
				@Override
				public void windowClosing(WindowEvent e) {
					TankClient.this.exitGame();
					dispose();
					System.exit(0);
				}
			});

			// 点击发送按钮,发送消息
			button.addActionListener(new ActionListener() {

				public void actionPerformed(ActionEvent e) {
					if (talk.getText().length() > 0) {
						setSay(talk.getText());
						Msg msg = new UserTalkMsg(TankClient.this);
						client.send(msg);
						talk.setText(null);
					}
				}

			});

			// 准备就绪的侦听
			start.addActionListener(new ActionListener() {

				public void actionPerformed(ActionEvent e) {
					if (!tank.isReady()) {
						if (playerTanks.size() != 0 && connect) {
							System.out.println("我被按了");
							tank.setReady(true);
							Msg msg = new GameStartMsg(TankClient.this);
							System.out.println("tank:" + tank.isReady());
							client.send(msg);
							System.out.println("我被按了,我被执行到了吗?");
						}
						if (!connect) {
							setVisible(false);
							TankClient.this.setVisible(true);
							createSingleTankandWall();
						}
						repaint();
					}
				}

			});

			// 点击发送按钮,发送消息
			talk.addActionListener(new ActionListener() {

				public void actionPerformed(ActionEvent e) {

					setSay(talk.getText());
					if (talk.getText().length() > 0) {
						Msg msg = new UserTalkMsg(TankClient.this);
						client.send(msg);
						talk.setText(null);
					}
				}

			});

			talk.addFocusListener(new FocusAdapter() {
				public void focusGained(FocusEvent e) {
					talk.setText(null);
				}
			});

			class JoinThread implements Runnable {

				boolean stop = false;

				public void run() {
					while (!stop) {
						repaint();
						try {
							Thread.sleep(50);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}

				public void threadOver() {
					stop = true;
				}

			}
		}

		/**
		 * 画出左侧玩家加入的信息,图片以及玩家昵称,是否准备等
		 */
		public void paint(Graphics g) {

			if (!init) {
				g.drawImage(jointank, -72, -114, null);
				g.drawImage(startButton[0], -172, -114, null);
				g.drawImage(startButton[1], -172, -114, null);
			}
			g.drawImage(icon.getImage(), 0, 24, null);
			g.drawImage(startButton[0], 21, 548, null);
			if (!init) {
				repaint();
				init = true;
			}
			g.setColor(new Color(223, 223, 223));
			drawUser(g, (tank.getTankId() - 1000) % TankServer.totalPlayer,
					tank.getUser(), tank.getLevel(), tank.isReady());
			/*
			 * drawUser(g,0,"","",false); drawUser(g,1,"","",false);
			 * drawUser(g,2,"","",false); drawUser(g,3,"","",false);
			 * drawUser(g,4,"","",false); drawUser(g,5,"","",false);
			 * drawUser(g,6,"","",false); drawUser(g,7,"","",false);
			 */
			g.setColor(new Color(81, 81, 81));

			for (int i = 0; i < playerTanks.size(); i++) {
				Tank t = playerTanks.get(i);
				if (t.getTankId() < 1008) {
					drawUser(g,
							(t.getTankId() - 1000) % TankServer.totalPlayer, t
									.getUser(), t.getLevel(), t.isReady());
				}
			}
		}

		/**
		 * 
		 * @param ready
		 *            显示玩家是否准备就绪
		 * @return
		 */
		public String isReady(boolean ready) {
			String str = null;
			if (ready) {
				str = "准备就绪";
			} else {
				str = "正在装备中...";
			}
			return str;
		}

		/**
		 * 
		 * @param g
		 *            玩家信息的画笔
		 * @param id
		 *            根据tankId%8来计算该用户要显示在哪个位置上
		 * @param user
		 *            玩家的昵称
		 * @param level
		 *            玩家的等级
		 * @param ready
		 *            玩家是否准备就绪
		 */
		public void drawUser(Graphics g, int id, String user, String level,
				boolean ready) {
			switch (id) {
			case 0:
				g.drawImage(jointank, 25, 96, null);
				g.drawString("昵称:" + user, 92, 114);
				g.drawString(isReady(ready), 92, 134);
				break;
			case 1:
				g.drawImage(jointank, 25, 151, null);
				g.drawString("昵称:" + user, 92, 170);
				g.drawString(isReady(ready), 92, 190);
				break;
			case 2:
				g.drawImage(jointank, 25, 206, null);
				g.drawString("昵称:" + user, 92, 226);
				g.drawString(isReady(ready), 92, 246);
				break;
			case 3:
				g.drawImage(jointank, 25, 261, null);
				g.drawString("昵称:" + user, 92, 282);
				g.drawString(isReady(ready), 92, 302);
				break;
			case 4:
				g.drawImage(jointank, 25, 319, null);
				g.drawString("昵称:" + user, 92, 341);
				g.drawString(isReady(ready), 92, 358);
				break;
			case 5:
				g.drawImage(jointank, 25, 377, null);
				g.drawString("昵称:" + user, 92, 397);
				g.drawString(isReady(ready), 92, 414);
				break;
			case 6:
				g.drawImage(jointank, 25, 435, null);
				g.drawString("昵称:" + user, 92, 453);
				g.drawString(isReady(ready), 92, 470);
				break;
			case 7:
				g.drawImage(jointank, 25, 493, null);
				g.drawString("昵称:" + user, 92, 511);
				g.drawString(isReady(ready), 92, 528);
				break;
			}
		}

	}

	/**
	 * 坦克键盘响应的侦听器
	 * 
	 * @author Nightelf暗夜精灵
	 * 
	 */
	private class TankMonitor extends KeyAdapter {

		public void keyPressed(KeyEvent e) {
			// 坦克活着的时候才进行键盘响应,死了就不管他了
			if (tank.isLive()) {
				tank.pressEvent(e);
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// 坦克活着的时候才进行键盘响应,死了就不管他了
			if (tank.isLive()) {
				tank.rollOutEvent(e);
			}
		}

	}

	public static void main(String[] args) {

		new TankClient().lauchFrame();
	}

	public boolean isStarted() {
		return started;
	}

	public void setStarted(boolean started) {
		this.started = started;
	}

	public boolean isConnect() {
		return connect;
	}

	public void setConnect(boolean connect) {
		this.connect = connect;
	}

	public String getSay() {
		return say;
	}

	public void setSay(String say) {
		this.say = say;
	}

	public int getReadyer() {
		return readyer;
	}

	public void setReadyer(int readyer) {
		this.readyer = readyer;
	}

	public int getHostId() {
		return hostId;
	}

	public void setHostId(int hostId) {
		this.hostId = hostId;
	}

	public int getWin() {
		return win;
	}

	public void setWin(int win) {
		this.win = win;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -