一个“雷电”游戏的雏形

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                     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 }
posted @ 2012-07-23 22:40  黑影第13号  阅读(252)  评论(0)    收藏  举报