ClientModel.java
上传用户:jhzhutan
上传日期:2021-03-28
资源大小:374k
文件大小:6k
源码类别:

射击游戏

开发平台:

Java

  1. import java.net.*;
  2. import java.io.*;
  3. import java.awt.event.*;
  4. import java.awt.*;
  5. public class ClientModel implements ActionListener{
  6. public ClientView view;
  7. //connection variables
  8. public Socket clientSocket;
  9. public PrintWriter out;
  10. public BufferedReader in;
  11. public String fromServer,  fromUser;
  12. public String serverIP;
  13. //client status
  14. public boolean serverConnected;
  15. public boolean gameStarted;
  16. public boolean gamePaused;
  17. public boolean gameOver;
  18. public boolean serverVoteYes, serverVoteNo;
  19. public boolean clientVoteYes, clientVoteNo;
  20. public boolean pausePressed;
  21. //ingame message
  22. public String[] messageQueue;
  23. public int messageIndex;
  24. public String playerTypedMessage = "";
  25. //textures
  26. public Image[] textures;
  27. //the actual game is running on this thread, while the main thread listen to user's input
  28. public Ticker t;
  29. //gameVariables
  30. public static int gameFlow;
  31. public Actor[] drawingList;
  32. public boolean moveUp;
  33. public boolean moveDown;
  34. public boolean moveLeft;
  35. public boolean moveRight;
  36. public boolean fire;
  37. public ClientModel(ClientView thisview){
  38. view = thisview;
  39. messageQueue = new String[8];
  40. view.mainPanel.messageQueue = messageQueue;
  41. addMessage("欢迎来到坦克大战用户端!请输入主机IP地址然后点击"连接主机"按钮开始游戏");
  42. t = new Ticker(1000);
  43. t.addActionListener(this);
  44. }
  45. public void connectServer(){
  46. addMessage("正在连接主机");
  47. try{
  48.   serverIP = view.IPfield.getText();
  49.   InetAddress addr = InetAddress.getByName(serverIP);
  50. clientSocket = new Socket(addr, 4321);
  51. out = new PrintWriter(clientSocket.getOutputStream(), true);
  52.             in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  53. }catch(Exception e){
  54. t.stop();
  55. System.out.println(e);
  56. addMessage("连接中出现错误, 请确认 1. 输入的IP是否正确,   2. 主机端已存在");
  57. return;
  58. }
  59. serverConnected = true;
  60. addMessage("已成功连接到主机,开始载入游戏");
  61. view.IPfield.setFocusable(false);
  62. view.IPfield.setEnabled(false);
  63. //load game texture
  64. textures = new Image[88];
  65. for(int i = 1; i < textures.length+1; i++)
  66. textures[i-1] = Toolkit.getDefaultToolkit().getImage("image\" + i + ".jpg");
  67. drawingList = new Actor[400];
  68. gameStarted = true;
  69. view.mainPanel.gameStarted = gameStarted;;
  70. view.mainPanel.drawingList = drawingList;
  71. view.messageField.setEnabled(true);
  72. addMessage("载入完毕,游戏开始了!");
  73. }
  74. public void actionPerformed(ActionEvent e){
  75. connectServer();
  76. //if the program fail to connect to the server then do nothing
  77. if(!serverConnected)
  78. return;
  79. //game logic loop, the client program actually dont perform any logic calculation, it only accepts the drawing-instructions
  80. //from the server
  81. try{
  82. while ((fromServer = in.readLine()) != null) {
  83.                 fromUser = "";
  84.                 gameFlow++;
  85. if(pausePressed){
  86. fromUser+= "x;";
  87. pausePressed = false;
  88. }
  89. if(gameOver){
  90. if(clientVoteNo)
  91. System.exit(0);
  92. if(clientVoteYes){
  93. fromUser+="j;";
  94. if(serverVoteYes){
  95. addMessage("主机端玩家决定再玩一次,游戏重新开始了...");
  96. gameOver = false;
  97. clientVoteYes = false;
  98. serverVoteYes = false;
  99. }
  100. }
  101. }
  102. //make feedback instruction-string, tell the server what the client is doing
  103. fromUser +="m";
  104. if(moveUp)
  105. fromUser+= "1";
  106. else
  107. fromUser+= "0";
  108. if(moveDown)
  109. fromUser+="1";
  110. else
  111. fromUser+= "0";
  112. if(moveLeft)
  113. fromUser+="1";
  114. else
  115. fromUser+= "0";
  116. if(moveRight)
  117. fromUser+="1";
  118. else
  119. fromUser+= "0";
  120. if(fire)
  121. fromUser+="1";
  122. else
  123. fromUser+= "0";
  124. fromUser+=";";
  125. //process instruction from server
  126. instructionHandler.handleInstruction(this, fromServer);
  127. //delete one message from the message queue every 10 secs, (if there is any)
  128. if(gameFlow%300 == 0)
  129. removeMessage();
  130. //wtire player typed message to the outputLine
  131. if(!playerTypedMessage.equals("")){
  132. fromUser+=playerTypedMessage;
  133. playerTypedMessage = "";
  134. }
  135. //send feedback instructions
  136. out.println(fromUser);
  137. //call view to repaint itself
  138. view.mainPanel.repaint();
  139. //if the player switch to dialoge mode, then stop all tank actions
  140. if(!view.mainPanel.hasFocus()){
  141. moveLeft = false;
  142. moveUp = false;
  143. moveDown = false;
  144. moveRight = false;
  145. fire = false;
  146. }
  147.          }
  148. }catch(Exception ex){
  149. ex.printStackTrace();
  150. t.stop();
  151. view.messageField.setEnabled(false);
  152. serverConnected = false;
  153. gameStarted = false;
  154. view.mainPanel.gameStarted = false;
  155. gameOver = false;
  156. addMessage("主机端退出了");
  157. view.IPfield.setFocusable(true);
  158. view.IPfield.setEnabled(true);
  159. //when something goes wrong, shut down any thing that has been created
  160. try{
  161. out.close();
  162. in.close();
  163. clientSocket.close();
  164. }catch(Exception exc){
  165. System.out.println(exc);
  166. }
  167. }
  168. }
  169. //display a line of message on the screen
  170. public void addMessage(String message){
  171. if(messageIndex < 8){
  172. messageQueue[messageIndex] = message;
  173. messageIndex++;
  174. }
  175. else{
  176. for(int  i = 0; i < 7; i++)
  177. messageQueue[i] = messageQueue[i+1];
  178. messageQueue[7] = message;
  179. }
  180. //call view to repaint the screen if game not started
  181. if(!gameStarted)
  182. view.mainPanel.repaint();
  183. }
  184. //remove the earliest message on the screen
  185. public void removeMessage(){
  186. if(messageIndex == 0)
  187. return;
  188. messageIndex--;
  189. for(int  i = 0; i < messageIndex; i++)
  190. messageQueue[i] = messageQueue[i+1];
  191. messageQueue[messageIndex] = null;
  192. //call view to repaint the screen if game not started
  193. if(!gameStarted)
  194. view.mainPanel.repaint();
  195. }
  196. //add a game object (eg, tanks, bullet etc...) to the drawing list
  197. public void addActor(Actor actor){
  198. for(int i = 0; i < drawingList.length; i ++ )
  199. if(drawingList[i] == null){
  200. drawingList[i] = actor;
  201. break;
  202. }
  203. }
  204. //remove a game object from the drawing list
  205. public void removeActor(Actor actor){
  206. for(int i = 0; i < drawingList.length; i ++ )
  207. if(drawingList[i] == actor){
  208. drawingList[i] = null;
  209. break;
  210. }
  211. }
  212. }