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