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

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


2012-12-02

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

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


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

Box2d环境搭建

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


游戏代码框架


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

(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坐标不变,实现一直向前跑的模拟。给以一个向上的速度则为跳跃。(没有渲染,见笑啦)



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


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

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

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

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

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Blend Tree(混合树)是在游戏动画中用于混合不同动画状态的工具。在角色控制时,可以使用 Blend Tree 来平滑地过渡不同的动画,以便实现更自然的运动。例如,使用 Blend Tree 可以将角色的走、跑和跳三种动作混合在一起,根据角色的移动速度和跳跃高度来实现平滑的动作过渡。 具体来说,Blend Tree 可以使用一个维平面来表示不同的动画状态,其中一个轴表示角色的移动速度,另一个轴表示角色的跳跃高度。通过在这个平面上设置不同的动画状态,可以实现不同状态之间的平滑过渡,从而实现更自然的角色动画。 ### 回答2: Blend Tree是一个游戏开发中常用的动画过渡技术,在角色控制方面具有重要的作用。它可以通过混合不同的动画片段,实现角色在走、跑和跳等不同动作之间的平滑过渡。 首先,当角色处于走状态时,人物的动画会呈现走的姿态和动作。在Blend Tree中,我们可以为走动画片段设置一个权重值,该权重值表示了走动画在融入动画过程中的比例。当走动画的权重值为1时,游戏会播放完整的走动画;当权重值小于1时,走动画会逐渐过渡至其他动画。 接下来,当角色需要跑时,Blend Tree会根据输入信号或者速度的变化来调整权重值。如果输入信号指示向前加速,那么走动画的权重值逐渐减小,而跑动画的权重值逐渐增大,从而平滑地将走动画过渡为跑动画。当权重值为1时,跑动画完全展示。 最后,当角色需要跳跃时,Blend Tree会再次调整权重值,从而实现从走或跑到跳的动画过渡。当跳跃动画的权重值逐渐增大,而走或跑动画的权重值逐渐减小时,角色会以平滑的方式从地面上升起,并播放相应的跳跃动画。 总的来说,Blend Tree通过在不同动画状态间进行权重调整和平滑过渡,使角色的走、跑、跳等动作看起来自然流畅。这种技术在游戏开发中被广泛应用,提升了角色动画的真实感和互动性。 ### 回答3: Blend Tree是一种在游戏开发中常用的技术,用于控制角色的移动动画,包括走、跑、跳等动作的平滑过渡和切换。Blend Tree使用一组连续的参数来控制不同动作之间的混合过程,使角色在不同的动作之间有流畅的过渡效果。 在Blend Tree中,走、跑、跳都可以被表示为不同的轴向,例如"Speed"和"Jump"。走和跑可以通过"Speed"轴向控制,当"Speed"为0时表示静止,当"Speed"逐渐增加时表示越来越快速地移动。而跳可以通过"Jump"轴向控制,当"Jump"为0时表示没有跳跃,当"Jump"逐渐增加时表示跳得越来越高。 在Blend Tree中,可以通过调整参数的值来控制角色的移动动作。例如,当用户按下慢跑按钮时,"Speed"参数可以慢慢地增加,角色的动画将从走的状态平滑过渡到跑的状态。当用户同时按下跳跃按钮时,"Jump"参数可以逐渐增加,角色的动画将从跑的状态平滑过渡到跳的状态。 通过Blend Tree,我们可以实现角色在不同动作之间的平滑过渡和切换。这样,角色的移动动画将更加流畅自然,使游戏体验更加逼真和可感知。Blende Tree的使用使得开发者能够更加方便地将不同的动作组合起来,为玩家提供更加多样化和灵活的操作方式。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值