先看圖:
小球碰到邊上反彈,下面的橫桿接住小球讓其再反彈上去。很簡單,大家都見過的啦。
這里主要練習SurfaceView,Callback以及在SurfaceView中使用線程,看主要的View類:
Activity類:
其他輔助類如下:
適合新手練習用!
小球碰到邊上反彈,下面的橫桿接住小球讓其再反彈上去。很簡單,大家都見過的啦。
這里主要練習SurfaceView,Callback以及在SurfaceView中使用線程,看主要的View類:
package com.wt.app;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.FontMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class GameView extends SurfaceView implements Callback,Runnable{
private static final String TAG="GameView";
SurfaceHolder holder=null;
int x,y=0;
int speedX=0,speedY=0;
int ball_x,ball_y=0;
int ball_speedX=5,ball_speedY=5;
int r=5;
public GameView(Context context) {
super(context);
// TODO Auto-generated constructor stub
holder=this.getHolder();
holder.addCallback(this);
this.setFocusable(true);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
x=(Consts.screenWidth-50)>>1;
y=(Consts.screenHeight-10);
ball_x=10;
ball_y=10;
new Thread(this).start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
boolean isKeyDown=false;
boolean isRunning=true;
public void run() {
// TODO Auto-generated method stub
Paint paint=new Paint();
while(isRunning){
move();
paint(paint);
try {
Thread.sleep(15);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void paint(Paint paint) {
// TODO Auto-generated method stub
Canvas canvas=holder.lockCanvas();
//刷屏
canvas.drawColor(Color.WHITE);
// paint.setColor(Color.WHITE);
// canvas.drawRect(0, 0, Consts.screenWidth, Consts.screenHeight, paint);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);
canvas.drawRect(x, y, x+50, y+10, paint);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setColor(Color.RED);
canvas.drawCircle(ball_x, ball_y, r, paint);
if(gameOver){
paint.setStrokeWidth(1);
paint.setColor(Color.RED);
paint.setTextSize(25);
FontMetrics fm=paint.getFontMetrics();
int textHeight=(int)Math.ceil((fm.descent-fm.top));
float textWidth = paint.measureText("Game Over");
canvas.drawText("Game Over", (Consts.screenWidth-textWidth)/2, (Consts.screenHeight-textHeight)/2, paint);
}
holder.unlockCanvasAndPost(canvas);
}
boolean gameOver=false;
public void move(){
if(isKeyDown){
x+=speedX;
if(x<0){
x=0;
}
if(x>Consts.screenWidth-50){
x=Consts.screenWidth-50;
}
}
ball_x+=ball_speedX;
ball_y+=ball_speedY;
if(ball_x<r) ball_speedX=-ball_speedX;
if(ball_x>Consts.screenWidth-r) ball_speedX=-ball_speedX;
if(ball_y<r) ball_speedY=-ball_speedY;
Rect r1=new Rect();
r1.set(x, y, x+50, y+10);
Rect r2=new Rect();
r2.set(ball_x-r, ball_y-r, ball_x+r, ball_y+r);
if(Tools.isCollideWith(r1, r2)){
ball_speedY=-ball_speedY;
}
if(ball_y>Consts.screenHeight){
gameOver=true;
isRunning=false;
}
}
}
Activity類:
package com.wt.app;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.Window;
import android.view.WindowManager;
public class GameActivity extends Activity {
/** Called when the activity is first created. */
private static final String TAG="GameActivity";
GameView view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//無標題欄
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//窗口寬高
DisplayMetrics dm=new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
Consts.screenWidth=dm.widthPixels;
Consts.screenHeight=dm.heightPixels;
// Consts.screenWidth = this.getWindowManager().getDefaultDisplay().getWidth();
// Consts.screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
Log.i(TAG,"Consts.screenWidth="+Consts.screenWidth);
Log.i(TAG,"Consts.screenHeight="+Consts.screenHeight);
// setContentView(R.layout.main);
view=new GameView(this);
setContentView(view);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
view.isKeyDown=true;
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
view.speedX=-5;
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
view.speedX=5;
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
view.isKeyDown=false;
view.speedX=0;
return super.onKeyUp(keyCode, event);
}
}
其他輔助類如下:
package com.wt.app;
import android.graphics.Rect;
public class Tools {
public static final boolean isCollideWith(int ax,int ay,int aw,int ah,int bx,int by,int bw,int bh){
if(ay-by>bh||ax-bx>bw||by-ay>ah||bx-ax>aw){
return false;
}
return true;
}
public static final boolean isCollideWith(Rect r1,Rect r2){
if(r2.left-r1.left>=r1.width()||r1.left-r2.left>=r2.width()||r2.top-r1.top>=r1.height()||r1.top-r2.top>=r2.height()){
return false;
}
return true;
}
}
package com.wt.app;
public class Consts {
public static int screenWidth;
public static int screenHeight;
}
適合新手練習用!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

