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