本文地址: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是物理世界构成了,挺强大的,学的不深;
Ⅱ)工作比较忙,都没时间学习,其实自己也懒;
Ⅲ)不要让任何事情成为你不学习的理由(引);
Ⅳ)学习吧!这篇文章分享给大家,技术含量不好,大家互相学习,学习!