package com.nono.demo.box2d;
import org.jbox2d.collision.AABB;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.World;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* 游戏视图
* @author Nono
*
*/
public class MainGameView extends SurfaceView implements SurfaceHolder.Callback, Runnable{
private Context mContext;
private SurfaceHolder holder;
private Paint paint;
private Canvas canvas;
private World world;
private Bitmap bitmapBg;
private Bitmap bmpStone;
private Thread thread;
private boolean flag = false;
public MainGameView(Context context) {
super(context);
mContext = context;
this.setKeepScreenOn(true);//保持屏幕常亮
holder = this.getHolder();//获取控制器
holder.addCallback(this);//添加监听
paint = new Paint();//实例化画笔
paint.setStyle(Style.FILL_AND_STROKE);
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
this.setFocusable(true);
this.setFocusableInTouchMode(true);
//创建一个物理世界
AABB aabb = new AABB();
aabb.lowerBound = new Vec2(-100, -100);
aabb.upperBound = new Vec2(100, 100);
Vec2 gravity = new Vec2(0, 10);
world = new World(aabb, gravity, true);
}
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
bitmapBg = BitmapFactory.decodeResource(getResources(), R.drawable.background);
bmpStone = BitmapFactory.decodeResource(getResources(), R.drawable.tile1);
WorldBodyFactory.createStone(world, getWidth()/2, getHeight()/2,
bmpStone.getWidth(), bmpStone.getHeight(),
0, 1.0f,
bmpStone);//创建一个小石头
WorldBodyFactory.createPolygon(world, 0, getHeight()-5,getWidth() , 30, 0, 0);
thread = new Thread(this);//地面
flag = true;
thread.start();
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder arg0) {
flag = false;
}
/**
* 绘图
*/
private void draw() {
try{
canvas = holder.lockCanvas();
canvas.drawColor(Color.BLACK);//清屏
//绘制背景
canvas.drawBitmap(bitmapBg, 0, 0, paint);
//遍历绘制Body
Body body = world.getBodyList();
for(int i = 1; i < world.getBodyCount(); i++){
if ((body.m_userData) instanceof MyRect) {
MyRect rect = (MyRect) (body.m_userData);
rect.drawRect(canvas, paint);
}if ((body.m_userData) instanceof MyStone) {
MyStone title = (MyStone) (body.m_userData);
title.drawStone(canvas, paint);
}
body = body.m_next;
}
}catch(Exception e){
}finally{
try {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
} catch (Exception e2) {
}
}
}
/**
* 逻辑
*/
private void logic() {
world.step(Constant.stepTime, Constant.iteraTions);
///遍历Body,进行Body与图形之间的传递数据
Body body = world.getBodyList();
for (int i = 1; i < world.getBodyCount(); i++) {
//判定m_userData中的数据是否为MyRect实例
if ((body.m_userData) instanceof MyRect) {
MyRect rect = (MyRect) (body.m_userData);
rect.setX(body.getPosition().x * Constant.RATE - rect.getW() / 2);
rect.setY(body.getPosition().y *Constant.RATE - rect.getH() / 2);
rect.setAngle((float) (body.getAngle() * 180 / Math.PI));
} else if ((body.m_userData) instanceof MyStone) {
//判定m_userData中的数据是否为MyTile实例
MyStone tile = (MyStone) (body.m_userData);
tile.setX(body.getPosition().x * Constant.RATE - tile.getW() / 2);
tile.setY(body.getPosition().y * Constant.RATE- tile.getH() / 2);
tile.setAngle((float) (body.getAngle() * 180 / Math.PI));
}
body = body.m_next;
}
conut++;
}
public void run() {
while (flag) {
logic();
draw();
try {
Thread.sleep((long)Constant.stepTime * 1000);
} catch (Exception ex) {
}
}
}
private int conut = 0;
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN
&&conut > 100){
WorldBodyFactory.createStone(world, getWidth()/2, bmpStone.getHeight(), bmpStone.getWidth(), bmpStone.getHeight(),
0f, 0.5f, bmpStone);
conut = 0;
}
return super.onTouchEvent(event);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Box2DFirst.rar (36个子文件)
Box2DFirst
bin
classes.dex 176KB
Box2DFirst.apk 1.32MB
com
nono
demo
box2d
MainGameView.class 5KB
WorldBodyFactory.class 2KB
MainActivity.class 1KB
MyRect.class 2KB
R$layout.class 397B
R$drawable.class 466B
R$attr.class 343B
MyStone.class 2KB
R.class 495B
Constant.class 407B
Ibody.class 185B
R$string.class 430B
resources.ap_ 1.24MB
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
tile1.png 2KB
background.png 1.81MB
icon.png 4KB
values
strings.xml 179B
drawable-mdpi
icon.png 3KB
layout
main.xml 382B
assets
default.properties 362B
gen
com
nono
demo
box2d
R.java 748B
proguard.cfg 1KB
src
com
nono
demo
box2d
MyStone.java 1KB
MainGameView.java 5KB
Ibody.java 216B
MainActivity.java 901B
MyRect.java 1009B
Constant.java 346B
WorldBodyFactory.java 2KB
.project 846B
.classpath 353B
AndroidManifest.xml 685B
libs
jbox2d-2.0.1-library-only.jar 155KB
共 36 条
- 1
我不是至尊宝
- 粉丝: 645
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页