亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

android練習:碰撞的小球

系統 1901 0
先看圖:
android練習:碰撞的小球
小球碰到邊上反彈,下面的橫桿接住小球讓其再反彈上去。很簡單,大家都見過的啦。
這里主要練習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;
}

  

適合新手練習用!

android練習:碰撞的小球


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 四虎影院永久在线观看 | 久久国产精品男女热播 | 美国黑人特大一级毛片 | 91尤物国产尤物福利 | 免费国产a国产片高清不卡 免费国产阿v视频在线观看 | 精品麻豆国产 | 精品亚洲欧美高清不卡高清 | 一级毛片在线免费观看 | 狠狠视频| 日韩色中色 | 日本国产一区 | 久久国产精品久久国产片 | 蜜月tv | 亚洲人成影院在线高清 | 久草最新 | 狠狠干图片 | 日本又黄又爽又色的免费视频 | 狼人综合干伊人 | 成在线人永久免费播放视频 | 一级无毛片 | 亚洲激情在线播放 | 韩国色三级伦不卡高清在线观看 | 色综合久久天天综合观看 | 新四虎影院 | 宅男看片午夜大片啪啪mv | 亚洲成a人片在线v观看 | 五月婷综合 | 国产网红在线视频 | 伊人久久在线 | 添bbb免费观看高清视频 | 九九九九在线精品免费视频 | 亚洲综合伊人色一区 | 久久人人精品 | 国产亚洲日本 | 男人的天堂在线视频 | 欧美综合成人 | 欧美男女爱爱视频 | 国产精品探花一区在线观看 | 99热这里只有成人精品国产 | 色吧在线视频 | 狠狠操美女 |