View Code
1 package org.crazyit.event; 2 import java.util.Random; 3 import java.util.Timer; 4 import java.util.Timer; 5 import java.util.TimerTask; 6 7 import android.app.Activity; 8 import android.content.Context; 9 import android.graphics.Bitmap; 10 import android.graphics.BitmapFactory; 11 import android.graphics.Canvas; 12 import android.os.Bundle; 13 import android.os.Handler; 14 import android.os.Message; 15 import android.view.View; 16 17 import java.util.TimerTask; 18 import android.content.Context; 19 import android.graphics.Bitmap; 20 import android.graphics.BitmapFactory; 21 import android.graphics.Canvas; 22 import android.graphics.Paint; 23 import android.util.AttributeSet; 24 import android.view.View; 25 import android.app.Activity; 26 import android.content.Context; 27 import android.graphics.Bitmap; 28 import android.graphics.BitmapFactory; 29 import android.graphics.Canvas; 30 import android.graphics.Color; 31 import android.graphics.Paint; 32 import android.os.Bundle; 33 import android.os.Handler; 34 import android.os.Message; 35 import android.view.Display; 36 import android.view.KeyEvent; 37 import android.view.View; 38 import android.view.View.OnKeyListener; 39 import android.view.Window; 40 import android.view.WindowManager; 41 public class plane extends Activity{ 42 Bitmap plane; 43 Bitmap plane1; 44 private int back_height=1700; 45 private int width = 320; 46 private int height = 480; 47 Bitmap back; 48 int starty = back_height-height; 49 // 桌面的宽度 50 private int tableWidth; 51 // 桌面的高度 52 private int tableHeight; 53 // 飞机的坐标 54 public float currentX; 55 public float currentY; 56 // 敌机小球纵向的运行速度 57 private int ySpeed = 10; 58 Random rand = new Random(); 59 // 返回一个-0.5~0.5的比率,用于控制小球的运行方向。 60 private double xyRate = rand.nextDouble() - 0.5; 61 // 小球横向的运行速度 62 private int xSpeed = (int) (ySpeed * xyRate * 2); 63 // ballX和ballY代表小球的座标 64 private int ballX = rand.nextInt(200) + 20; 65 private int ballY = rand.nextInt(10) + 20; 66 // 游戏是否结束的旗标 67 private boolean isLose = false; 68 69 @Override 70 public void onCreate(Bundle savedInstanceState) 71 { 72 super.onCreate(savedInstanceState); 73 // 去掉窗口标题 74 requestWindowFeature(Window.FEATURE_NO_TITLE); 75 // 全屏显示 76 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 77 WindowManager.LayoutParams.FLAG_FULLSCREEN); 78 // 创建PlaneView组件 79 final GameView gameView = new GameView(this); 80 setContentView(gameView); 81 // 获取窗口管理器 82 WindowManager windowManager = getWindowManager(); 83 Display display = windowManager.getDefaultDisplay(); 84 85 // 获得屏幕宽和高 86 tableWidth = display.getWidth(); 87 tableHeight = display.getHeight(); 88 currentX = tableWidth/2; 89 currentY = tableHeight-40; 90 91 // TODO Auto-generated constructor stub 92 //定义飞机图片 93 94 95 final Handler handler = new Handler() 96 { 97 public void handleMessage(Message msg) 98 { 99 if (msg.what == 0x123)100 {101 gameView.invalidate();102 if (starty <= 0)103 {104 starty = back_height-height;105 }106 else107 {108 starty -= 10;109 }110 111 }112 }113 };114 115 gameView.setOnKeyListener(new OnKeyListener()116 {117 @Override118 public boolean onKey(View source, int keyCode, KeyEvent event)119 {120 // 获取由哪个键触发的事件121 switch (event.getKeyCode())122 {123 // 控制挡板左移124 case KeyEvent.KEYCODE_DPAD_LEFT:125 if (currentX > 0)126 currentX -= 10;127 break;128 // 控制挡板右移129 case KeyEvent.KEYCODE_DPAD_RIGHT:130 if (currentX < tableWidth)131 currentX += 10;132 break;133 case KeyEvent.KEYCODE_DPAD_DOWN:134 if(currentY0)139 currentY-=10;140 break;141 }142 // 通知planeView组件重绘143 gameView.invalidate();144 return true;145 }146 });147 final Timer timer = new Timer();148 timer.schedule(new TimerTask()149 {150 151 @Override152 public void run()153 {154 // 如果小球碰到左边边框155 if (ballX <= 0 || ballX >= tableWidth)156 {157 xSpeed = -xSpeed;158 }159 // 如果小球高度超出了球拍位置,且横向不在球拍范围之内,游戏结束。160 if (ballY >= tableHeight||(ballY == currentY && ballX ==currentX))161 {162 timer.cancel();163 // 设置游戏是否结束的旗标为true。164 isLose = true;165 }166 // 小球座标增加167 ballY += ySpeed;168 ballX += xSpeed;169 // 发送消息,通知系统重绘组件170 handler.sendEmptyMessage(0x123);171 }172 }, 0, 100);173 }174 175 class GameView extends View176 {177 public GameView(Context context)178 {179 super(context);180 setFocusable(true);181 plane = BitmapFactory.decodeResource(context.getResources()182 , R.drawable.plane);183 setFocusable(true);184 plane1 = BitmapFactory.decodeResource(context.getResources()185 , R.drawable.plane1);186 setFocusable(true);187 back =BitmapFactory.decodeResource(context.getResources()188 , R.drawable.back_img);189 setFocusable(true);190 191 }192 193 194 // 重写View的onDraw方法,实现绘画195 public void onDraw(Canvas canvas)196 {197 Paint paint = new Paint();198 199 // 如果游戏已经结束200 if (isLose)201 {202 paint.setColor(Color.RED);203 paint.setTextSize(40);204 canvas.drawText("游戏已结束", 50, 200, paint);205 }206 // 如果游戏还未结束207 else208 {209 // 设置颜色,并绘制小球210 Bitmap back2 = Bitmap.createBitmap(back, 0, starty211 , width , height);212 canvas.drawBitmap(back2, 0, 0, paint);213 canvas.drawBitmap(plane1 , ballX , ballY , paint); 214 canvas.drawBitmap(plane , currentX , currentY , paint); 215 }216 }217 }218 219 220 }