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