📄 tankclient.java
字号:
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 + -