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

射击游戏

开发平台:

Java

  1. import java.awt.*;
  2. public class player implements Actor{
  3. public final int UP = 0;
  4. public final int DOWN = 1;
  5. public final int LEFT = 2;
  6. public final int RIGHT = 3;
  7. public final int size = 12;
  8. public final Rectangle map = new Rectangle(35, 35, 452, 452);
  9. public int scores;
  10. public String type;
  11. public int life;
  12. public int speed;
  13. public int direction;
  14. public int InvulnerableTime;
  15. public int freezed;
  16. public int freezedTime;
  17. public boolean moveUp;
  18. public boolean moveDown;
  19. public boolean moveLeft;
  20. public boolean moveRight;
  21. public boolean fire;
  22. public int numberOfBullet;
  23. public int coolDownTime;
  24. public int status;
  25. public int health;
  26. public int xPos, yPos, xVPos, yVPos;
  27. public Rectangle border;
  28. public Image standardImage;
  29. public Image[] textures;
  30. public ServerModel gameModel;
  31. public player(String type, ServerModel gameModel){
  32. this.type = type;
  33. life = 3;
  34. direction = UP;
  35. status = 1;
  36. health = 1;
  37. numberOfBullet = 1;
  38. InvulnerableTime = 150;
  39. this.gameModel = gameModel;
  40. //setup textures
  41. textures = new Image[4];
  42. if(type.equals( "1P")){
  43. //startup posistion of 1P
  44. xPos  = 198;
  45. yPos = 498;
  46. //images of 1P
  47. for(int i = 0; i < 4; i ++)
  48. textures[i] = gameModel.textures[54+i];
  49. standardImage = textures[0];
  50. }else{
  51. //startup posistion of 2P
  52. xPos  = 323;
  53. yPos = 498;
  54. //images of 2P
  55. for(int i = 0; i < 4; i ++)
  56. textures[i] = gameModel.textures[72+i];
  57. standardImage = textures[0];
  58. }
  59. xVPos = xPos;
  60. yVPos = yPos;
  61. border = new Rectangle(xPos - size, yPos - size, 25, 25);
  62. }
  63. public void move(){
  64.        if(gameModel.gamePaused){
  65.         writeToOutputLine();
  66.     return;
  67. }
  68.        if(coolDownTime > 0)
  69. coolDownTime--;
  70. if(InvulnerableTime > 0)
  71. InvulnerableTime--;
  72.  if(freezed == 1){
  73.          writeToOutputLine();
  74.          return;
  75. }
  76. //if the player is holding the "fire" key, and the fire condition is satisfied, then create a bullet objects (i.e fire a bullet)
  77. if(fire && coolDownTime == 0 && numberOfBullet > 0){
  78. //make bullet direction
  79. int c = direction;
  80. //make bullet position
  81. int a, b;
  82. if(direction == UP){
  83. a = xPos; b = yPos - size;
  84. }else if(direction == DOWN){
  85. a = xPos; b = yPos + size;
  86. }else if(direction == LEFT){
  87. a = xPos - size; b = yPos;
  88. }else{
  89. a = xPos + size; b = yPos;
  90. }
  91. //make bullet speed
  92. int d;
  93. if(status == 1){
  94. numberOfBullet = 1;
  95. d = 7;
  96. }else{
  97. d = 12;
  98. }
  99. //make bullet power
  100. int e;
  101. if(status == 4){
  102. e = 2;
  103. }else{
  104. e = 1;
  105. }
  106. //add bullet
  107. gameModel.addActor(new bullet(a,b,c,d,e, this, gameModel));
  108. //coolDownTime is the time you have to wait until you can fire a second bullet.   (same ides as in warcraft 3)
  109. if(status> 2)
  110. coolDownTime = 5;
  111. else
  112. coolDownTime = 8;
  113. //decrease the number of bullet that is avaliable by 1,  the numberOfBullet will increase when the bullet fired
  114. //by player's  tank hits the target(eg, walls, enemy tanks, etc...);
  115. numberOfBullet--;
  116. }
  117. //save current position  information, if the new move is determined not valid later, then change
  118. //the position back
  119. int xPosTemp = xPos;
  120. int yPosTemp = yPos;
  121. Rectangle borderTemp = new Rectangle(xPosTemp - size, yPosTemp - size, 25,25);
  122. //defind the next border of the player's tank according to player's input, assume its next move is valid;
  123. boolean notMoving = false;
  124. if(moveUp){
  125. if(direction != UP && direction != DOWN)
  126. xPos = xVPos;
  127. yPos-=speed;
  128. direction = UP;
  129. }else if(moveDown){
  130. if(direction != UP && direction != DOWN)
  131. xPos = xVPos;
  132. yPos+=speed;
  133. direction = DOWN;
  134. }else if(moveLeft){
  135. if(direction != LEFT && direction != RIGHT)
  136. yPos = yVPos;
  137. xPos-=speed;
  138. direction = LEFT;
  139. }else if(moveRight){
  140. if(direction != LEFT && direction != RIGHT)
  141. yPos = yVPos;
  142. xPos+=speed;
  143. direction = RIGHT;
  144. }else{
  145. notMoving = true;
  146. }
  147. if(notMoving){
  148. if(speed > 0)
  149. speed--;
  150. }else{
  151. if(speed < 3)
  152. speed++;
  153. }
  154. //update border
  155. border.y = yPos - size;
  156. border.x = xPos - size;
  157. //check if the next border will intersect with map border, if does then dont move to any where
  158. if(!border.intersects(map)){
  159. xPos = xVPos; yPos = yVPos;
  160. border.x  = xPos - size; border.y = yPos - size;
  161. writeToOutputLine();
  162. return;
  163. }
  164. //check if the next border intersects with other objects in the map, eg, player controled tank, wall, powerUps,  etc...
  165. for(int i = 0; i < gameModel.actors.length; i++){
  166. if(gameModel.actors[i] != null){
  167. if(this != gameModel.actors[i] ){
  168. if(border.intersects(gameModel.actors[i].getBorder())){
  169. //with powerUps
  170. if(gameModel.actors[i].getType().equals("powerUp")){
  171. scores+=50;
  172. powerUp temp = (powerUp)gameModel.actors[i];
  173. int function = temp.function;
  174. if(function == 0){  //white star power up
  175. upgrade();
  176. }else if(function == 1){  //steel wall base
  177. base tempe = (base)gameModel.actors[4];
  178. tempe.steelWallTime = 600;
  179. }else if(function == 2){   // kill all enemy tank
  180. for(int j = 0; j < gameModel.actors.length; j++)
  181. if(gameModel.actors[j] != null)
  182. if(gameModel.actors[j].getType().equals("enemy")){
  183. enemy tempe = (enemy)gameModel.actors[j];
  184. gameModel.addActor(new bomb(tempe.xPos, tempe.yPos, "big", gameModel));
  185. gameModel.removeActor(gameModel.actors[j]);
  186. }
  187. level.NoOfEnemy = 0;
  188. level.deathCount = 20 - level.enemyLeft;
  189. }else if(function == 3){   //Invulnerable
  190. InvulnerableTime = 300 + (int)Math.random()*400;
  191. }else if(function == 4){  //freeze all enemy tank
  192. enemy.freezedTime = 300 + (int)Math.random()*400;
  193. enemy.freezedMoment = ServerModel.gameFlow;
  194. }else if(function == 5){ //super star power up
  195. if(status < 3)
  196. numberOfBullet++;
  197. status =4;
  198. health = 2;
  199. if(type.equals("1P"))
  200. for(int j = 0; j < 4; j ++)
  201. textures[j] = gameModel.textures[66+j];
  202. else
  203. for(int j = 0; j < 4; j ++)
  204. textures[j] = gameModel.textures[84+j];
  205. }else if(function == 6){  // add one more life
  206. life++;
  207. }
  208. gameModel.removeActor(gameModel.actors[i]);
  209. }
  210. //with static objects, eg walls, rivers
  211. else if(gameModel.actors[i].getType().equals("steelWall") || gameModel.actors[i].getType().equals("wall")){
  212. if(!gameModel.actors[i].walldestoried()){
  213. for(int j = 0;j < gameModel.actors[i].getDetailedBorder().length; j++){
  214. if( gameModel.actors[i].getDetailedBorder()[j] != null){
  215. if(gameModel.actors[i].getDetailedBorder()[j].intersects(border)){
  216. xPos = xVPos; yPos = yVPos;
  217. border.x  = xPos - size; border.y = yPos - size;
  218. writeToOutputLine();
  219. return;
  220. }
  221. }
  222. }
  223. }
  224. }
  225. else if(gameModel.actors[i].getType().equals("river") || gameModel.actors[i].getType().equals("base")){
  226. xPos = xVPos; yPos = yVPos;
  227. border.x  = xPos - size; border.y = yPos - size;
  228. writeToOutputLine();
  229. return;
  230. }
  231. //with moving objects, eg enemy tanks
  232. else if(gameModel.actors[i].getType().equals("enemy") || gameModel.actors[i].getType().equals("Player") ){
  233. if(!borderTemp.intersects(gameModel.actors[i].getBorder()) || gameModel.actors[i].getType().equals("enemy")){
  234. xPos = xPosTemp;
  235. yPos = yPosTemp;
  236. border.x  = xPos - size; border.y = yPos - size;
  237. writeToOutputLine();
  238. return;
  239. }
  240. }
  241. }
  242. }
  243. }
  244. }
  245. //find the virtual position of the tank,  virtual position is used to adjust tank 's real position when it makes a 90 degrees turning.
  246. int a = (xPos - 10)/25;
  247. int b = (xPos - 10)%25;
  248. if(b < 7)
  249. b = 0;
  250. if(b > 18)
  251. b = 25;
  252. if((b < 19 && b > 6) || xPos < 17 || xPos > 492)
  253. b = 13;
  254. xVPos = a*25 + b + 10;
  255. int c = (yPos - 10)/25;
  256. int d = (yPos - 10)%25;
  257. if(d < 7)
  258. d = 0;
  259. if(d > 18)
  260. d = 25;
  261. if((d < 19 && d > 6) || yPos < 17 || yPos > 492)
  262. d = 13;
  263. yVPos = c*25 + d + 10;
  264. writeToOutputLine();
  265. }
  266. public void writeToOutputLine(){
  267. //write changes to outputLine
  268. gameModel.outputLine+="n"+ xPos + "," + yPos + ",";
  269. int textureIndex = 0;
  270. if(type.equals("1P")){
  271. if(status == 1)
  272. textureIndex = 54 + direction;
  273. else if (status == 2)
  274. textureIndex = 58 + direction;
  275. else if(status == 3)
  276. textureIndex = 62 + direction;
  277. else
  278. textureIndex = 66 + direction;
  279. }else{
  280. if(status == 1)
  281. textureIndex = 72 + direction;
  282. else if (status == 2)
  283. textureIndex = 76 + direction;
  284. else if(status == 3)
  285. textureIndex = 80 + direction;
  286. else
  287. textureIndex = 84 + direction;
  288. }
  289. gameModel.outputLine+= "" + textureIndex + ";";
  290. if(InvulnerableTime > 0)
  291. gameModel.outputLine+="i"+ xPos + "," + yPos + ";";
  292. }
  293. public void draw(Graphics g){
  294. //draw player
  295. g.drawImage(textures[direction], xPos - size, yPos - size, null);
  296. if(InvulnerableTime > 0){
  297. g.setColor(Color.red);
  298. g.drawRect(xPos - 12, yPos - 12, 25,25);
  299. g.drawRect(xPos - 11, yPos - 11, 23,23);
  300. }
  301. //darw other information about the player, e,g, scores, lives...
  302. if(type.equals("1P")){
  303. g.setColor(Color.yellow);
  304. g.drawImage(standardImage,  520, 380, null );
  305. g.drawString("x", 555, 395);
  306. g.drawString(life + "", 565, 396);
  307. String SCORE = "000000000" + scores;
  308. g.drawString(type +" 得分:" + "", 515, 370);
  309. g.drawString(SCORE.substring(SCORE.length() - 7, SCORE.length()) + "", 566, 370);
  310. }
  311. if(type.equals("2P")){
  312. g.setColor(Color.green);
  313. g.drawImage(standardImage,  520, 460, null );
  314. g.drawString("x", 555, 475);
  315. g.drawString(life + "", 565, 476);
  316. String SCORE = "000000000" + scores;
  317. g.drawString(type +" 得分:" + "", 515, 450);
  318. g.drawString(SCORE.substring(SCORE.length() - 7, SCORE.length()) + "", 566, 450);
  319. }
  320. }
  321. public Rectangle getBorder(){
  322. return border;
  323. }
  324. public String getType(){
  325. return "Player";
  326. }
  327. public void hurt(){
  328. if(InvulnerableTime != 0)
  329. return;
  330. //if the tank has only 1 health, then the play lose one life, If the player has no life left, then he lose the game
  331. //the player tank will  have 2 health only whene the player  eats a "super star",
  332. if(health == 1){
  333. gameModel.addActor(new bomb(xPos, yPos, "big",  gameModel));
  334. life--;
  335. if(life == 0){
  336. xPos = 100000; yPos = 100000;           //this will make the player never come back to the main screen, thus looks like "dead"
  337. border = new Rectangle(xPos - size, yPos - size, 25, 25);
  338. xVPos = xPos; yVPos = yPos;
  339. return;
  340. }else{
  341. direction = UP;
  342. status = 1;
  343. health = 1;
  344. numberOfBullet = 1;
  345. InvulnerableTime = 150;
  346. if(type.equals( "1P")){
  347. xPos  = 198;
  348. yPos = 498;
  349. border = new Rectangle(xPos - size, yPos - size, 25, 25);
  350. xVPos = xPos; yVPos = yPos;
  351. for(int i = 0; i < 4; i ++)
  352. textures[i] = gameModel.textures[54+i];
  353. }else{
  354. xPos = 323;
  355. yPos = 498;
  356. border = new Rectangle(xPos - size, yPos - size, 25, 25);
  357. xVPos = xPos; yVPos = yPos;
  358. for(int i = 0; i < 4; i ++)
  359. textures[i] = gameModel.textures[72+i];
  360. }
  361. }
  362. }else{
  363. health--;
  364. status = 3;
  365. if(type.equals( "1P")){
  366. for(int i = 0; i < 4; i ++)
  367. textures[i] = gameModel.textures[62+i];
  368. }else{
  369. for(int i = 0; i < 4; i ++)
  370. textures[i] = gameModel.textures[80+i];
  371. }
  372. }
  373. }
  374. public void upgrade(){
  375. //when the player's tank eats a normal "star", its fire power  will be upgraged to a higher status, and  the tank will have new looks
  376. if(type.equals( "1P")){
  377. if(status == 1){
  378. status = 2;
  379. for(int i = 0; i < 4; i ++)
  380. textures[i] = gameModel.textures[58+i];
  381. }else if(status == 2){
  382. status = 3;
  383. numberOfBullet ++;
  384. for(int i = 0; i < 4; i ++)
  385. textures[i] = gameModel.textures[62+i];
  386. }else if(status == 3){
  387. status = 4;
  388. for(int i = 0; i < 4; i ++)
  389. textures[i] = gameModel.textures[66+i];
  390. }
  391. }else{
  392. if(status == 1){
  393. status = 2;
  394. for(int i = 0; i < 4; i ++)
  395. textures[i] = gameModel.textures[76+i];
  396. }else if(status == 2){
  397. status = 3;
  398. numberOfBullet ++;
  399. for(int i = 0; i < 4; i ++)
  400. textures[i] = gameModel.textures[80+i];
  401. }else if(status == 3){
  402. status = 4;
  403. for(int i = 0; i < 4; i ++)
  404. textures[i] = gameModel.textures[84+i];
  405. }
  406. }
  407. }
  408. public void reset(){
  409. direction = UP;
  410. InvulnerableTime = 150;
  411. if(type.equals( "1P")){
  412. xPos  = 198;
  413. yPos = 498;
  414. }else{
  415. xPos  = 323;
  416. yPos = 498;
  417. }
  418. xVPos = xPos;
  419. yVPos = yPos;
  420. border = new Rectangle(xPos - size, yPos - size, 25, 25);
  421. }
  422. //unused method
  423. public Rectangle[] getDetailedBorder(){return null;}
  424. public boolean walldestoried(){return false;}
  425. }