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