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 else
107 {
108 starty -= 10;
109 }
110
111 }
112 }
113 };
114
115 gameView.setOnKeyListener(new OnKeyListener()
116 {
117 @Override
118 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(currentY<tableHeight)
135 currentY+=10;
136 break;
137 case KeyEvent.KEYCODE_DPAD_UP:
138 if(currentY>0)
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 @Override
152 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 View
176 {
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 else
208 {
209 // 设置颜色,并绘制小球
210 Bitmap back2 = Bitmap.createBitmap(back, 0, starty
211 , 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 }