`

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;
}

适合新手练习用!
  • 大小: 2.4 KB
分享到:
评论

相关推荐

    android小球自由落体弹跳动画效果的自定义控件

    bounce_count :小球弹跳次数 ball_color:小球颜色 ball_count:小球数量 ball_radius:小球半径 ball_delay:小球出现时间间隔(当小球数大于1时) anim_duration:小球一次动画时长 physic_mode : 开启物理效果(下落...

    Android小球碰撞游戏

    一个小游戏,游戏中玩家通过触屏产生小球,触碰的时间控制小球的大小,释放时的...小球产生过程中被其它小球碰撞则游戏结束。游戏任务是产生有限个小球占满一定比例的空间。游戏中会有各种小道具帮助玩家完成任务……

    高三物理二轮练习精品练习:15.1碰撞和动量守恒.docx

    7. 小球碰撞问题:小球A与静止的小球B碰撞后,小球A的动能变为原来的1/9,这涉及到动能和动量守恒的联合应用。通过动量守恒和动能的改变,可以求出碰撞后B球的速度。 8. 质量不等的碰撞:质量不等的两个物体碰撞时...

    Android 弹力小球实例

    在Android开发中,创建引人入胜的交互式UI元素是一项重要的任务,"Android 弹力小球实例"就是这样一个示例,它结合了物理模拟和动画效果,为用户提供了一个有趣的体验。在这个实例中,我们将深入探讨如何实现小球的...

    app作业十四:棋盘小球.zip

    3. **图形渲染**:可能使用Android的Canvas或OpenGL ES进行棋盘和小球的绘制。 4. **用户交互**:触摸事件处理,使用户可以移动小球或进行其他操作。 5. **多线程**:如果游戏有实时性需求,可能涉及多线程处理。 6....

    PYTHON 游戏:弹跳小球游戏(pygame实现)

    4. **游戏结束**:一旦检测到小球与骷髅头瓷砖碰撞,游戏结束,显示游戏结束界面,并提供重新开始选项。 **优化与扩展** 为了提高游戏体验,可以考虑以下优化和扩展: - **动画效果**:为小球和瓷砖添加动态效果...

    COMSOL光学模型:手性小球

    COMSOL光学模型:手性小球

    android拖动小球demo

    在Android开发中,"android拖动小球demo"是一个典型的触摸事件处理与图形绘制的实践案例...实际项目中,还可以根据需求扩展,例如添加物理模拟效果,使小球有真实的运动轨迹,或者添加碰撞检测,让小球与其他元素互动。

    PYTHON 游戏:旋转小球(pygame实现的躲避障碍物的旋转小球游戏)

    4. **碰撞检测与处理**:判断小球是否与障碍物发生碰撞,碰撞则游戏结束,否则继续游戏。 5. **得分系统**:每当小球成功避开一个障碍物,得分增加,展示实时得分。 【标签】中的"游戏"、"python"和"pygame"进一步...

    小球碰撞小球移动

    在物理学中,小球碰撞是一个常见的力学问题,涉及到动量守恒、能量守恒以及碰撞的类型等基础知识。在这个特定的场景中,我们有两个小球,一个是从上方垂直下落,另一个则是静止在下方。当这两个小球发生碰撞时,它们...

    Android 小球碰撞检测技术

    Android 小球碰撞检测技术

    C++小球碰撞C++ 小球碰撞

    根据提供的信息,我们可以总结出以下有关“C++小球碰撞”的相关知识点: ### C++小球碰撞概述 在计算机编程领域,“C++小球碰撞”通常指的是使用C++语言实现的小球之间的碰撞检测与响应机制。此类程序常用于游戏...

    canvas学习(二):弹跳小球

    - 检查边界碰撞,当小球碰到Canvas边缘时,改变其运动方向。例如,如果`y + radius &gt; canvas.height`,则反转小球的垂直速度`velocityY = -velocityY;`。 5. **事件处理**: - 可以添加鼠标交互,比如点击小球...

    Android小球重力感应运动(有碰撞声)源码

    本项目“Android小球重力感应运动(有碰撞声)源码”提供了一个完整的示例,展示了如何利用Android的传感器API来捕捉设备的重力变化,使屏幕上的小球模拟真实世界的物理运动,并在碰撞时产生声音反馈。 首先,我们...

    VB编写的碰撞小球小游戏

    碰撞检测通常是通过比较两个物体(如小球)的边界距离来判断是否发生碰撞。如果两者的边界距离小于两者半径之和,那么可以认为它们发生了碰撞。 【用户界面设计】 VB中的Form是用户界面的基础,开发者可以通过拖放...

    VC++模拟小球碰撞

    在本文中,我们将深入探讨如何使用VC++6.0中的MFC(Microsoft Foundation Classes)库来模拟小球碰撞的过程。MFC是微软提供的一套C++类库,它简化了Windows应用程序的开发,特别是图形用户界面(GUI)的构建。 首先...

    android游戏开发基础小球运动

    在Android游戏开发的基础阶段,小球运动是一个常见的学习主题,它可以帮助开发者理解基本的游戏物理引擎、碰撞检测以及动画原理。这个教程可能包含了如何创建一个简单的2D游戏,其中一个小球在屏幕上移动并与其他...

    C语言实现的小球碰撞程序

    在本文中,我们将深入探讨如何使用C语言实现小球碰撞的程序。小球碰撞问题是一个经典的动力学问题,常用于游戏开发、物理模拟等领域。它涉及到速度、位置、角度等关键概念,以及动量守恒和能量守恒的物理原理。 ...

    小球碰撞课程设计小球碰撞

    小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 ...

    android 使用SurfaceView实现小球高处落下并弹起的效果

    2. **碰撞检测**:当小球到达地面时,需要检测碰撞,使小球反弹。这可以通过比较小球的中心位置和地面的位置来实现。 3. **弹性碰撞**:碰撞后,小球的速度方向会反转,但速度大小会受到弹性系数(通常小于1)的...

Global site tag (gtag.js) - Google Analytics