MyGameCanvas.java
上传用户:pyly5030
上传日期:2021-09-17
资源大小:174k
文件大小:6k
源码类别:

射击游戏

开发平台:

Java

  1. import java.io.IOException;
  2. import java.util.*;
  3. import javax.microedition.lcdui.Command;
  4. import javax.microedition.lcdui.CommandListener;
  5. import javax.microedition.lcdui.Displayable;
  6. import javax.microedition.lcdui.Font;
  7. import javax.microedition.lcdui.Graphics;
  8. import javax.microedition.lcdui.Image;
  9. import javax.microedition.lcdui.game.GameCanvas;
  10. import javax.microedition.lcdui.game.LayerManager;
  11. import javax.microedition.lcdui.game.Sprite;
  12. import javax.microedition.lcdui.game.TiledLayer;
  13. public class MyGameCanvas extends GameCanvas implements Runnable{
  14. private static final int MILLS_PER_TICK = 50;
  15. private Thread t;
  16. private boolean isPlay;
  17. private long delay;
  18. private int currentX,currentY;
  19. private int width;
  20. private int height;
  21. private LayerManager layerManager;
  22. private MyPlayerSprite player;
  23. private TiledLayer terrain;
  24. private int animatedIdx;
  25. private boolean switchTile = true;
  26. private int bgY = -320;
  27. private Vector bullets;
  28. private Image bulletImage;
  29. private int gameCount;
  30. private int bulletSpeed = 5;
  31. private boolean flag = true;
  32. private Command startCommand = new Command("Start", Command.OK, 1);
  33. private Command pauseCommand = new Command("Pause", Command.EXIT, 1);
  34. private Command exitCommand  = new Command("Exit", Command.OK, 2);
  35. protected MyGameCanvas() throws Exception {
  36. super(true);
  37. width = getWidth();
  38. height = 320;//getHeight();
  39. currentX = width/2;
  40. currentY = height/2;
  41. delay = 30;
  42. player = new MyPlayerSprite(Image.createImage("/xiaoji.png"), 30, 30, width, height);
  43. player.startPosition();
  44. terrain = getBackground();
  45. bullets = new Vector();
  46. bulletImage = Image.createImage("/bullet.png");
  47. layerManager = new LayerManager();
  48. layerManager.append(player);
  49. layerManager.append(terrain);
  50. this.setFullScreenMode(true);
  51. this.start();
  52. }
  53. public void run() {
  54. Graphics g = getGraphics();
  55. Thread currentThread = Thread.currentThread();
  56. long startTime = System.currentTimeMillis();
  57. try{
  58. while(currentThread == t){
  59. if(isPlay){
  60. input();
  61. drawScreen(g);
  62. if(gameCount > 30)
  63. gameCount = 0;
  64. else
  65. gameCount++;
  66. Thread.sleep(delay);
  67. }
  68. long useTime = System.currentTimeMillis() - startTime;
  69. if(useTime < MILLS_PER_TICK){
  70. synchronized(this){
  71. wait(MILLS_PER_TICK - useTime);
  72. }
  73. }else{
  74. currentThread.yield();
  75. }
  76. }
  77. }catch(Exception e){
  78. e.printStackTrace();
  79. }
  80. }
  81. public void start(){
  82. isPlay = true;
  83. t = new Thread(this);
  84. t.start();
  85. }
  86. public void drawScreen(Graphics g){
  87. Font font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN,Font.SIZE_SMALL);
  88. g.setColor(0x000000);
  89. g.fillRect(0, 0, width, height);
  90. g.setColor(0x4169E1);
  91. g.setFont(font);
  92. //player.nextFrame();
  93. //player.setPosition(currentX, currentY);
  94. //用静态图片索引2和3轮换
  95. if(switchTile)
  96. terrain.setAnimatedTile(animatedIdx, 2);
  97. else
  98. terrain.setAnimatedTile(animatedIdx, 3);
  99. //switchTile = !switchTile;
  100. //layerManager.setViewWindow(0, bgY, 240, 320); //这样的缺点是让与layerManager有关的对象也会滚动
  101. terrain.setPosition(0,bgY);
  102. bgY+=2;
  103. if(bgY>0)
  104. bgY = -320;
  105. layerManager.paint(g,0,0);
  106. //bullet
  107. for(int i=0;i<bullets.size();i++){
  108. for (int j = 0; j < 2; ++j) {
  109. Sprite bullet = (Sprite) bullets.elementAt(i);
  110. bullet.move(0, -3);
  111. if (bullet.getY() < 0) {
  112. bullets.removeElementAt(i);
  113. layerManager.remove(bullet);
  114. i--;
  115. break;
  116. }
  117. }
  118. }
  119. g.drawString(currentX+"/"+currentY, 180, 10, g.TOP|g.LEFT);
  120. flushGraphics();
  121. }
  122. private void input(){
  123. int keyStatus = getKeyStates();
  124. if(keyStatus == LEFT_PRESSED){
  125. //currentX = Math.max(0, currentX-moveSpeed);
  126. player.setFrame(1);
  127. player.moveLeft();
  128. }
  129. else if(keyStatus == RIGHT_PRESSED){
  130. //currentX = Math.min(width-30,currentX+moveSpeed);
  131. player.setFrame(2);
  132. player.moveRight();
  133. }
  134. else if(keyStatus == UP_PRESSED){
  135. //currentY = Math.max(0, currentY-moveSpeed);
  136. player.setFrame(3);
  137. player.moveUp();
  138. }
  139. else if(keyStatus == DOWN_PRESSED){
  140. //currentY = Math.min(height-30, currentY+moveSpeed);
  141. player.setFrame(4);
  142. player.moveDown();
  143. }
  144. else if(keyStatus == FIRE_PRESSED){
  145. }else {
  146. if(flag)
  147. player.setFrame(0);
  148. else
  149. player.setFrame(1);
  150. }
  151. if(gameCount % bulletSpeed != 0){
  152. return;
  153. }else{
  154. Sprite bullet = player.fire(bulletImage);
  155. flag = !flag;
  156. bullets.addElement(bullet);
  157. layerManager.insert(bullet, 1);
  158. }
  159. }
  160. public void paint(Graphics g) {
  161. //添加响应命令及监听器
  162.         this.addCommand(pauseCommand);
  163.         this.addCommand(exitCommand);
  164.         //this.setCommandListener(this);
  165. super.paint(g);
  166. }
  167. /**
  168.  * 创建背景
  169.  * @throws IOException 
  170.  */
  171. protected TiledLayer getBackground() throws IOException {
  172. Image image = Image.createImage("/di.jpg");
  173. TiledLayer bglayer = new TiledLayer(6, 16, image, 40, 40);
  174. int[] map = { 2, 3, 6, 7, 8, 7, 6, 8, 3, 6, 7, 8, 7, 6, 8, 4
  175. , 3, 6, 7, 8, 7, 6, 8, 4, 3, 6, 7, 8, 7, 6, 8, 4
  176. , 3, 6, 7, 8, 7, 6, 8, 4, 3, 6, 7, 8, 7, 6, 8, 4
  177. , 2, 3, 6, 7, 8, 7, 6, 8, 3, 6, 7, 8, 7, 6, 8, 4
  178. , 3, 6, 7, 8, 7, 6, 8, 4, 3, 6, 7, 8, 7, 6, 8, 4
  179. , 3, 6, 7, 8, 7, 6, 8, 4, 3, 6, 7, 8, 7, 6, 8, 4};
  180. for (int i = 0; i < map.length; i++) {
  181. int col = i % 6;
  182. int row = (i - col)/6;
  183. bglayer.setCell(col, row, map[i]);
  184. }
  185. animatedIdx = bglayer.createAnimatedTile(2); //设置初始的静态图片索引
  186. bglayer.setCell(1, 1, animatedIdx);
  187. return bglayer;
  188. }
  189. }