Android之Box2D学习(二)——简单的跑跳游戏模型(含代码)

本文地址:http://blog.csdn.net/you_and_me12/article/details/8248529


2012-12-02

自从学习了一段时间的Box2d,初步了解了。本想做个简单的游戏练习,但是后来太忙(也太懒)就没继续了。现在把代码共享,不要喷,不要砸!高人请绕道,有兴趣的参考参考。

感想:Box2d是物理世界引擎,感觉自己做个小游戏也没用到那么多逻辑,游戏运行似乎会比较慢。还是要具有较多的物理世界观的游戏才适合(愤怒的小小鸟就是了)。


文章给出了一些代码及模型,最后给出相应代码

Box2d环境搭建

请看:Android之Box2D学习(一)——HelloWorld


游戏代码框架

Android之Box2D学习(二)——简单的跑跳游戏模型(含代码)_第1张图片

说明:分为通用的抽象类、游戏主线程、物体、场景四大模块

(PS:我自己简单搭建的,可以再细分,或者扩展。游戏编程尚需学习……)


MainActivity.java

这个是app的主界面,主要是用来切换界面等主要操作的框架

说明:定义一些常量、标识,游戏界面SurfaceView类,Create场景,启动线程等等。

public class MainActivity extends Activity {
	/**the width and height of screen*/
	public static float gScreenW, gScreenH;
	/**the global world time step*/
	public static final float g_STEP_TIME = 1f/60f;
	/**the handler of view going*/
	private Handler mHandler;
	/**the view*/
	private MainView mMainView;
	/**game state*/
	public static final int GAME_STATE_RUNNING = 1, GAME_STATE_PAUSE = 2, GAME_STATE_OVER = 3;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
		gScreenW = getWindowManager().getDefaultDisplay().getWidth();
		gScreenH = getWindowManager().getDefaultDisplay().getHeight();
		mHandler = new Handler();
		mMainView = new MainView(this);
		setContentView(mMainView);
    }
    @Override
	protected void onResume() {
		super.onResume();
		mHandler.post(mMainView);
	}

	@Override
	protected void onPause() {
		super.onPause();
		mHandler.removeCallbacks(mMainView);
	}

	/**
     * 
     * @author K
     *
     */
    public class MainView extends SurfaceView implements SurfaceHolder.Callback, Runnable{
    	private SurfaceHolder mSurfaceHolder;
    	private Canvas mCanvas;
    	private Context mContext;
    	//
    	private CommonScene mScene;
    	/**test now*/
    	//private CommonScene mSceneBg;
		public MainView(Context context) {
			super(context);
			mContext = context;
			setKeepScreenOn(true);
			setFocusable(true);
			setFocusableInTouchMode(true);
			mSurfaceHolder = getHolder();
			mSurfaceHolder.addCallback(this);
			//create scene
			mScene = new GameScene(mContext);
			//init data of the view
			mScene.create();
//			mSceneBg.create();
		}
		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			//start handler
			mHandler.postDelayed(this, (long) (g_STEP_TIME*1000));
		}
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		}
		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			mHandler.removeCallbacks(this);
		}
		/**
		 * every is running here
		 */
		@Override
		public void run() {
			long start, end;
			start = System.currentTimeMillis();
			mScene.step();//go to next step
			if(mScene instanceof GameScene) {
				GameScene gs = (GameScene)mScene;
				if(gs.getmGameState() == MainActivity.GAME_STATE_OVER) {
					return;//the world stop
				}
			}
			//mSceneBg.step();
			try{
				mCanvas = mSurfaceHolder.lockCanvas();
				mCanvas.drawColor(Color.BLACK);/**need to draw bg image*/
				mScene.draw(mCanvas);
//				mSceneBg.draw(mCanvas);
				mSurfaceHolder.unlockCanvasAndPost(mCanvas);
			}catch(Exception e){
				e.printStackTrace();
			}
			end = System.currentTimeMillis();
			if(end - start < 0)System.out.println("end-start:" + (end-start));//for test
			mHandler.postDelayed(this, (long) (g_STEP_TIME*1000) - (end - start));
		}
		@Override
		public boolean onTouchEvent(MotionEvent event) {
			mScene.onTouchEvent(event);
			return true;
		}
    }
}

CommonSence.java

这个是游戏场景的抽象类,定义了通用的接口

创建、绘图、迭代、触屏等功能接口,主要供给MainActivity调用

public abstract class CommonScene {
	/** common use: the context of activity*/
	protected Context mContext;
	/**
	 * constructor
	 * @param context
	 */
	public CommonScene(Context context){
		mContext = context;
	}
	/**
	 * create and init
	 */
	abstract public void create();
	/**
	 * the logic go to next step
	 */
	abstract public void step();
	/**
	 * draw the view
	 */
	abstract public void draw(Canvas canvas);
	/**
	 * on touch
	 */
	abstract public boolean onTouchEvent(MotionEvent event);
	/**
	 * the logic go to next n step
	 */
	public void step(int n){
		while(n-- != 0){
			step();
		}
	}
}

CommonBody.java

这个是游戏物体(人物、地板等)的抽象类,定义了通用的接口

由于只是个游戏初步模型,只有创建、绘制、检测销毁的接口

public abstract class CommonBody {
	/**create the body by world, and return the body*/
	abstract public Body createByWorld(World world);
	/**draw the body*/
	abstract public void draw(Canvas canvas, Paint paint);
	/**check if the body is out of screen, will remove from the world*/
	abstract public boolean isOutScreen();
}

场景及物体的实现

详细的请看代码研究吧,比较粗略。只是用方块构造。


碰撞检测

这个主要是在场景中实现的,不同场景具有不同游戏设计。还有物体的碰撞监听器(如下代码),初步写了,但是还没用上,大家研究研究吧!!!

public class GameContactListener implements ContactListener{

	@Override
	public void beginContact(Contact contact) {
		Body bodyA = contact.getFixtureA().getBody();
		Body bodyB = contact.getFixtureB().getBody();
		if(bodyA.getUserData() instanceof Person && bodyB.getUserData() instanceof Ground){
		}
	}

	@Override
	public void endContact(Contact contact) {
		Body bodyA = contact.getFixtureA().getBody();
		Body bodyB = contact.getFixtureB().getBody();
		if(bodyA.getUserData() instanceof Person && bodyB.getUserData() instanceof Ground){
			
		}
	}

	@Override
	public void postSolve(Contact contact, ContactImpulse arg1) {
		
	}

	@Override
	public void preSolve(Contact arg0, Manifold arg1) {
		
	}

}

游戏截图介绍

这个简单模型,主要是世界重力向下,由人物不断向前移动,而手机界面一直保持人物的位置X坐标不变,实现一直向前跑的模拟。给以一个向上的速度则为跳跃。(没有渲染,见笑啦)

Android之Box2D学习(二)——简单的跑跳游戏模型(含代码)_第2张图片


代码下载地址:http://download.csdn.net/detail/you_and_me12/4837127


结尾:Ⅰ)Box2D是物理世界构成了,挺强大的,学的不深;

      Ⅱ)工作比较忙,都没时间学习,其实自己也懒;

      Ⅲ)不要让任何事情成为你不学习的理由(引);

      Ⅳ)学习吧!这篇文章分享给大家,技术含量不好,大家互相学习,学习!

你可能感兴趣的:(Android之Box2D学习(二)——简单的跑跳游戏模型(含代码))