Tank.java
上传用户:kikomiki
上传日期:2021-10-31
资源大小:373k
文件大小:4k
源码类别:

游戏

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class Tank {
  4. public static final int XSPEED = 5;
  5. public static final int YSPEED = 5;
  6. public static final int WIDTH = 30;
  7. public static final int HEIGHT = 30;
  8. private boolean live = true;
  9. TankClient tc;
  10. private boolean good;
  11. private int x, y;
  12. private boolean bL=false, bU=false, bR=false, bD = false;
  13. enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};
  14. private Direction dir = Direction.STOP;
  15. private Direction ptDir = Direction.D;
  16. public Tank(int x, int y, boolean good) {
  17. this.x = x;
  18. this.y = y;
  19. this.good = good;
  20. }
  21. public Tank(int x, int y, boolean good, TankClient tc) {
  22. this(x, y, good);
  23. this.tc = tc;
  24. }
  25. public void draw(Graphics g) {
  26. if(!live) {
  27. if(!good) {
  28. tc.tanks.remove(this);
  29. }
  30. return;
  31. }
  32. Color c = g.getColor();
  33. if(good) g.setColor(Color.RED);
  34. else g.setColor(Color.BLUE);
  35. g.fillOval(x, y, WIDTH, HEIGHT);
  36. g.setColor(c);
  37. switch(ptDir) {
  38. case L:
  39. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT/2);
  40. break;
  41. case LU:
  42. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y);
  43. break;
  44. case U:
  45. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y);
  46. break;
  47. case RU:
  48. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y);
  49. break;
  50. case R:
  51. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT/2);
  52. break;
  53. case RD:
  54. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT);
  55. break;
  56. case D:
  57. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y + Tank.HEIGHT);
  58. break;
  59. case LD:
  60. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT);
  61. break;
  62. }
  63. move();
  64. }
  65. void move() {
  66. switch(dir) {
  67. case L:
  68. x -= XSPEED;
  69. break;
  70. case LU:
  71. x -= XSPEED;
  72. y -= YSPEED;
  73. break;
  74. case U:
  75. y -= YSPEED;
  76. break;
  77. case RU:
  78. x += XSPEED;
  79. y -= YSPEED;
  80. break;
  81. case R:
  82. x += XSPEED;
  83. break;
  84. case RD:
  85. x += XSPEED;
  86. y += YSPEED;
  87. break;
  88. case D:
  89. y += YSPEED;
  90. break;
  91. case LD:
  92. x -= XSPEED;
  93. y += YSPEED;
  94. break;
  95. case STOP:
  96. break;
  97. }
  98. if(this.dir != Direction.STOP) {
  99. this.ptDir = this.dir;
  100. }
  101. if(x < 0) x = 0;
  102. if(y < 30) y = 30;
  103. if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;
  104. if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;
  105. }
  106. public void keyPressed(KeyEvent e) {
  107. int key = e.getKeyCode();
  108. switch(key) {
  109. case KeyEvent.VK_LEFT :
  110. bL = true;
  111. break;
  112. case KeyEvent.VK_UP :
  113. bU = true;
  114. break;
  115. case KeyEvent.VK_RIGHT :
  116. bR = true;
  117. break;
  118. case KeyEvent.VK_DOWN :
  119. bD = true;
  120. break;
  121. }
  122. locateDirection();
  123. }
  124. void locateDirection() {
  125. if(bL && !bU && !bR && !bD) dir = Direction.L;
  126. else if(bL && bU && !bR && !bD) dir = Direction.LU;
  127. else if(!bL && bU && !bR && !bD) dir = Direction.U;
  128. else if(!bL && bU && bR && !bD) dir = Direction.RU;
  129. else if(!bL && !bU && bR && !bD) dir = Direction.R;
  130. else if(!bL && !bU && bR && bD) dir = Direction.RD;
  131. else if(!bL && !bU && !bR && bD) dir = Direction.D;
  132. else if(bL && !bU && !bR && bD) dir = Direction.LD;
  133. else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
  134. }
  135. public void keyReleased(KeyEvent e) {
  136. int key = e.getKeyCode();
  137. switch(key) {
  138. case KeyEvent.VK_CONTROL:
  139. fire();
  140. break;
  141. case KeyEvent.VK_LEFT :
  142. bL = false;
  143. break;
  144. case KeyEvent.VK_UP :
  145. bU = false;
  146. break;
  147. case KeyEvent.VK_RIGHT :
  148. bR = false;
  149. break;
  150. case KeyEvent.VK_DOWN :
  151. bD = false;
  152. break;
  153. }
  154. locateDirection();
  155. }
  156. public Missile fire() {
  157. int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
  158. int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;
  159. Missile m = new Missile(x, y, ptDir, this.tc);
  160. tc.missiles.add(m);
  161. return m;
  162. }
  163. public Rectangle getRect() {
  164. return new Rectangle(x, y, WIDTH, HEIGHT);
  165. }
  166. public boolean isLive() {
  167. return live;
  168. }
  169. public void setLive(boolean live) {
  170. this.live = live;
  171. }
  172. }