Asteroids.java
上传用户:haoxsx
上传日期:2022-03-22
资源大小:20k
文件大小:8k
源码类别:

Applet

开发平台:

Java

  1. package asteroids;
  2. import java.applet.Applet;
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.HeadlessException;
  7. import java.awt.event.KeyEvent;
  8. import java.awt.event.KeyListener;
  9. import java.awt.geom.AffineTransform;
  10. import java.awt.image.BufferedImage;
  11. import java.util.Random;
  12. import javax.sound.sampled.*;
  13. public class Asteroids extends Applet implements Runnable, KeyListener {
  14. Thread gameloop;
  15. BufferedImage backbuffer;
  16. Graphics2D g2d;
  17. boolean showBounds =false;
  18. int ASTEROIDS=20;
  19. Asteroid[] asteroid=new Asteroid[ASTEROIDS];
  20. int currentBullet = 0;
  21. int BULLETS=10;
  22. Bullet[] bullet=new Bullet[BULLETS];
  23. Ship ship =new Ship();
  24. AffineTransform identity=new AffineTransform();
  25. Random rand=new Random();
  26. SoundClip shoot;
  27. SoundClip explode;
  28. public void init(){
  29. backbuffer=new BufferedImage(640,480,BufferedImage.TYPE_INT_RGB);
  30. g2d = backbuffer.createGraphics();
  31. ship.setX(320);
  32. ship.setY(240);
  33. for(int i=0;i<BULLETS;i++){
  34. bullet[i]=new Bullet();
  35. }
  36. for(int i=0;i<ASTEROIDS;i++){
  37. asteroid[i]=new Asteroid();
  38. asteroid[i].setRotationVelocity(rand.nextInt(3)+1);
  39. asteroid[i].setX((double)rand.nextInt(600)+20);
  40. asteroid[i].setY((double)rand.nextInt(440)+20);
  41. asteroid[i].setMoveAngle(rand.nextInt(360));
  42. double ang =asteroid[i].getMoveAngle()-90;
  43. asteroid[i].setVelX(calcAngleMoveX(ang));
  44. asteroid[i].setVelY(calcAngleMoveY(ang));
  45. }
  46. shoot = new SoundClip("shoot.WAV");
  47. explode = new SoundClip("explode.WAV");
  48. addKeyListener(this);
  49. }
  50. public double calcAngleMoveY(double angle) {
  51. // TODO Auto-generated method stub
  52. return (double)(Math.sin(angle*Math.PI/180));
  53. }
  54. public double calcAngleMoveX(double angle) {
  55. // TODO Auto-generated method stub
  56. return (double)(Math.cos(angle*Math.PI/180));
  57. }
  58. public void update(Graphics g){
  59. g2d.setTransform(identity);
  60. g2d.setPaint(Color.BLACK);
  61. g2d.fillRect(0, 0, getSize().width, getSize().height);
  62. g2d.setColor(Color.WHITE);
  63. g2d.drawString("ship:"+Math.round(ship.getX())+","+Math.round(ship.getY()),5,10);
  64. g2d.drawString("Move angle:"+Math.round(ship.getMoveAngle())+90, 5, 25);
  65. g2d.drawString("Face angle:"+Math.round(ship.getFaceAngle()),5,40);
  66. drawShip();
  67. drawBullets();
  68. drawAsteroids();
  69. paint(g);
  70. }
  71. public void drawAsteroids() {
  72. // TODO Auto-generated method stub
  73. for(int n=0;n<ASTEROIDS;n++){
  74. if(asteroid[n].isAlive()){
  75. g2d.setTransform(identity);
  76. g2d.translate(asteroid[n].getX(), asteroid[n].getY());
  77. g2d.rotate(Math.toRadians(asteroid[n].getMoveAngle()));
  78. g2d.setColor(Color.DARK_GRAY);
  79. g2d.fill(asteroid[n].getShape());
  80. if(showBounds){
  81. g2d.setTransform(identity);
  82. g2d.setColor(Color.BLUE);
  83. g2d.draw(asteroid[n].getBounds());
  84. }
  85. }
  86. }
  87. }
  88. public void drawBullets() {
  89. // TODO Auto-generated method stub
  90. for(int n=0;n<BULLETS;n++){
  91. if(bullet[n].isAlive()){
  92. g2d.setTransform(identity);
  93. g2d.translate(bullet[n].getX(), bullet[n].getY());
  94. g2d.setColor(Color.MAGENTA);
  95. g2d.draw(bullet[n].getShape());
  96. }
  97. }
  98. }
  99. public void drawShip() {
  100. // TODO Auto-generated method stub
  101. g2d.setTransform(identity);
  102. g2d.translate(ship.getX(), ship.getY());
  103. g2d.rotate(Math.toRadians(ship.getFaceAngle()));
  104. g2d.setColor(Color.ORANGE);
  105. g2d.fill(ship.getShape());
  106. if(showBounds){
  107. g2d.setTransform(identity);
  108. g2d.setColor(Color.BLUE);
  109. g2d.draw(ship.getBounds());
  110. }
  111. }
  112. public void paint(Graphics g){
  113. g.drawImage(backbuffer,0,0,this);
  114. }
  115. public void start(){
  116. gameloop=new Thread(this);
  117. gameloop.start();
  118. }
  119. @Override
  120. public void run() {
  121. // TODO Auto-generated method stub
  122. Thread t=Thread.currentThread();
  123. while(t==gameloop){
  124. try {
  125. gameUpdate();
  126. Thread.sleep(20);
  127. } catch (InterruptedException e) {
  128. // TODO Auto-generated catch block
  129. e.printStackTrace();
  130. }
  131. repaint();
  132. }
  133. }
  134. public void stop(){
  135. gameloop=null;
  136. }
  137. public void gameUpdate() {
  138. // TODO Auto-generated method stub
  139. updateShip();
  140. updateBullets();
  141. updateAsteroids();
  142. checkCollisions();
  143. }
  144. public void checkCollisions() {
  145. // TODO Auto-generated method stub
  146. for(int m=0;m<ASTEROIDS;m++){
  147. if(asteroid[m].isAlive()){
  148. for(int n=0;n<BULLETS;n++){
  149. if(bullet[n].isAlive()){
  150. if(asteroid[m].getBounds().contains(bullet[n].getX(),bullet[n].getY())){
  151. bullet[n].setAlive(false);
  152. asteroid[m].setAlive(false);
  153. explode.play();
  154. continue;
  155. }
  156. }
  157. }
  158. if(asteroid[m].getBounds().intersects(ship.getBounds())){
  159. asteroid[m].setAlive(false);
  160. explode.play();
  161. ship.setX(320);
  162. ship.setY(240);
  163. ship.setFaceAngle(0);
  164. ship.setVelX(0);
  165. ship.setVelY(0);
  166. continue;
  167. }
  168. }
  169. }
  170. }
  171. public void updateAsteroids() {
  172. // TODO Auto-generated method stub 
  173. for(int n=0;n<ASTEROIDS;n++){
  174. if(asteroid[n].isAlive()){
  175. asteroid[n].incX(asteroid[n].getVelX());
  176. if(asteroid[n].getX()<-20)
  177. asteroid[n].setX(getSize().width+20);
  178. else if(asteroid[n].getX()>getSize().width+20)
  179. asteroid[n].setX(-20);
  180. asteroid[n].incY(asteroid[n].getVelY());
  181. if(asteroid[n].getY()<-20)
  182. asteroid[n].setY(getSize().height+20);
  183. else if(asteroid[n].getY()>getSize().height+20)
  184. asteroid[n].setY(-20);
  185. asteroid[n].incMoveAngle(asteroid[n].getRotationVelocity());
  186. if(asteroid[n].getMoveAngle()<0)
  187.        asteroid[n].setMoveAngle(360-asteroid[n].getRotationVelocity());
  188. else if (asteroid[n].getMoveAngle()>360)
  189. asteroid[n].setMoveAngle(asteroid[n].getRotationVelocity());
  190. }
  191. }
  192. }
  193. public void updateBullets() {
  194. // TODO Auto-generated method stub
  195. for(int n=0;n<BULLETS;n++){
  196. if(bullet[n].isAlive()){
  197.           bullet[n].incX(bullet[n].getVelX());
  198.           if(bullet[n].getX()<0||bullet[n].getX()>getSize().width){
  199.            bullet[n].setAlive(false);
  200.           }
  201.           bullet[n].incY(bullet[n].getVelY());
  202.           if(bullet[n].getY()<0||bullet[n].getY()>getSize().height){
  203.            bullet[n].setAlive(false);
  204.           }
  205. }
  206. }
  207. }
  208. public void updateShip() {
  209. // TODO Auto-generated method stub
  210. ship.incX(ship.getVelX());
  211. if(ship.getX()<-10)
  212. ship.setX(getSize().width+10);
  213. else if(ship.getX()>getSize().width+10)
  214.      ship.setX(-10);
  215. ship.incY(ship.getVelY());
  216. if(ship.getY()<-10)
  217. ship.setY(getSize().height+10);
  218. else if(ship.getY()>getSize().height+10)
  219.           ship.setY(-10);
  220.           
  221. }
  222. @Override
  223. public void keyPressed(KeyEvent k) {
  224. // TODO Auto-generated method stub
  225. int keyCode = k.getKeyCode();
  226. switch(keyCode){
  227. case KeyEvent.VK_LEFT:
  228. ship.incFaceAngle(-5);
  229. if(ship.getFaceAngle()<0)ship.setFaceAngle(360-5);
  230. break;
  231. case KeyEvent.VK_RIGHT:
  232. ship.incFaceAngle(5);
  233. if(ship.getFaceAngle()>360)ship.setFaceAngle(5);
  234. break;
  235. case KeyEvent.VK_UP:
  236. ship.setMoveAngle(ship.getFaceAngle()-90);
  237. ship.incVelX(calcAngleMoveX(ship.getMoveAngle())*0.1);
  238. ship.incVelY(calcAngleMoveY(ship.getMoveAngle())*0.1);
  239. break;
  240. case KeyEvent.VK_CONTROL:
  241. case KeyEvent.VK_ENTER:
  242. case KeyEvent.VK_SPACE:
  243. currentBullet++;
  244. if(currentBullet>BULLETS-1)currentBullet=0;
  245. bullet[currentBullet].setAlive(true);
  246. bullet[currentBullet].setX(ship.getX());
  247. bullet[currentBullet].setY(ship.getY());
  248. bullet[currentBullet].setMoveAngle(ship.getFaceAngle()-90);
  249. double angle = bullet[currentBullet].getMoveAngle();
  250. double svx=ship.getVelX();
  251. double svy=ship.getVelY();
  252. bullet[currentBullet].setVelX(svx+calcAngleMoveX(angle)*2);
  253. bullet[currentBullet].setVelY(svy+calcAngleMoveY(angle)*2);
  254. shoot.play();
  255. break;
  256. case KeyEvent.VK_B:
  257. showBounds =!showBounds;
  258. break;
  259. }
  260. }
  261. @Override
  262. public void keyReleased(KeyEvent k) {
  263. // TODO Auto-generated method stub
  264. }
  265. @Override
  266. public void keyTyped(KeyEvent k) {
  267. // TODO Auto-generated method stub
  268. }
  269. }