一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Android - Android下2d物理引擎Box2d用法簡(jiǎn)單實(shí)例

Android下2d物理引擎Box2d用法簡(jiǎn)單實(shí)例

2021-03-27 15:41鑒客 Android

這篇文章主要介紹了Android下2d物理引擎Box2d用法,實(shí)例分析了在Android平臺(tái)上使用Box2d的基本技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了Android下2d物理引擎Box2d用法。分享給大家供大家參考。具體如下:

程序運(yùn)行的時(shí)候需要加載Jbox2d的庫(kù),可到以下地址下載(使用的是不帶渲染部分的庫(kù)jbox2d-2.0.1-library-only.jar):

http://sourceforge.net/projects/jbox2d/

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package com.test;
import org.jbox2d.collision.AABB;
import org.jbox2d.collision.CircleDef;
import org.jbox2d.collision.PolygonDef;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.World;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class MyBox2d extends Activity {
 private final static int RATE = 10;//屏幕到現(xiàn)實(shí)世界的比例 10px:1m;
 private AABB worldAABB;
 //創(chuàng)建 一個(gè)管理碰撞的世界
 private World world;
 private float timeStep = 1/60;//模擬的的頻率
 private int iterations = 10;//迭代越大,模擬約精確,但性能越低
 private Body body,body2,body3;
 private MyView myView;
 private Handler mHandler;
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
    WindowManager.LayoutParams. FLAG_FULLSCREEN);
    worldAABB = new AABB();
     
    //上下界,以屏幕的左上方為 原點(diǎn),如果創(chuàng)建的剛體到達(dá)屏幕的邊緣的話,會(huì)停止模擬
    worldAABB.lowerBound.set(-100.0f,-100.0f);
    worldAABB.upperBound.set(100.0f, 100.0f);
    //注意這里使用的是現(xiàn)實(shí)世界的單位
    Vec2 gravity = new Vec2(0.0f,10.0f);
    boolean doSleep = true;
    world = new World(worldAABB, gravity, doSleep);//創(chuàng)建世界
    createBox(160, 470, 160, 10, true); 
    createBox1(160, 150, 160, 10, false);
    createCircle(160, 100, 10);
    createCircle1(150, 60, 10);
    timeStep = 1.0f/60.0f;
    iterations = 10;
    myView = new MyView(this);
    setContentView(myView);
    mHandler = new Handler();
    mHandler.post(update);
  }
  private Runnable update = new Runnable() {
    public void run() {
       world.step(timeStep, iterations);//開始模擬
       Vec2 position = body.getPosition();
       Vec2 position1 = body2.getPosition();
       Vec2 position2 = body3.getPosition();
       myView.x=position.x*RATE;
       myView.y=position.y*RATE;
       myView.x1=position1.x*RATE;
       myView.y1=position1.y*RATE;
       myView.x2=position2.x*RATE;
       myView.y2=position2.y*RATE;
        myView.update();
        mHandler.postDelayed(update, (long)timeStep*1000);
    }
  };
  public void createBox(float x,float y,float half_width,float half_height,boolean isStatic){
   PolygonDef shape = new PolygonDef();
   if(isStatic){shape.density = 0;}
   else{shape.density = 2.0f;}
   shape.friction = 0.8f;
   shape.restitution = 0.3f;
   shape.setAsBox(half_width/RATE, half_height/RATE);
   BodyDef bodyDef = new BodyDef();
   bodyDef.position.set(x/RATE, y/RATE);
   Body body1= world.createBody(bodyDef);
   body1.createShape(shape);
   body1.setMassFromShapes();
  }
  public void createCircle(float x,float y,float radius){
   CircleDef shape = new CircleDef();
   shape.density = 7;
   shape.friction = 0.2f;
   shape.radius = radius/RATE;
   BodyDef bodyDef = new BodyDef();
   bodyDef.position.set(x/RATE, y/RATE);
   body2 = world.createBody(bodyDef);
   body2.createShape(shape);
   body2.setMassFromShapes();
  }
  public void createCircle1(float x,float y,float radius){
   CircleDef shape = new CircleDef();
   shape.density = 7;
   shape.friction = 0.2f;
   shape.radius = radius/RATE;
   BodyDef bodyDef = new BodyDef();
   bodyDef.position.set(x/RATE, y/RATE);
   body3 = world.createBody(bodyDef);
   body3.createShape(shape);
   body3.setMassFromShapes();
  }
  public void createBox1(float x,float y,float half_width,float half_height,boolean isStatic){
   PolygonDef shape = new PolygonDef();
   if(isStatic){shape.density = 0;}
   else{shape.density = 2.0f;}
   shape.friction = 0.3f;
   shape.setAsBox(half_width/RATE, half_height/RATE);
   BodyDef bodyDef = new BodyDef();
   bodyDef.position.set(x/RATE, y/RATE);
   body= world.createBody(bodyDef);
   body.createShape(shape);
   body.setMassFromShapes();
  }
  class MyView extends View{
   Canvas canvas;
   public float x=160,y=150;
   public float x1=160,y1=100;
   public float x2=150,y2=60;
 public MyView(Context context) {
  super(context);
 }
 public void drawBox(float x,float y){
  Paint mPaint = new Paint();
  mPaint.setAntiAlias(true);
  mPaint.setColor(Color.RED);
  canvas.drawRect(x-160, y-10, x+160, y+10, mPaint);
 }
 public void drawGround(){
  Paint mPaint = new Paint();
  mPaint.setAntiAlias(true);
  mPaint.setColor(Color.BLUE);
  canvas.drawRect(0, 460, 320, 480, mPaint);
 }
 public void drawCircle(float x1,float y1){
  Paint mPaint = new Paint();
  mPaint.setAntiAlias(true);
  mPaint.setColor(Color.GREEN);
  canvas.drawCircle(x1, y1, 10, mPaint);
 }
 public void update(){
  postInvalidate();
 }
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  this.canvas = canvas;
  drawGround();
  drawBox(x, y);
  drawCircle(x1, y1);
  drawCircle(x2, y2);
 }
 }
}

希望本文所述對(duì)大家的Android程序設(shè)計(jì)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 我不卡影院手机在线观看 | 欧美午夜视频一区二区 | 成人男女网免费 | 和日本免费不卡在线v | 日本一区二区视频在线 | 狠狠干快播 | 欧洲一级| 国产精品日本一区二区不卡视频 | 国产精品videosse | avav男人天堂| 欧美1级| 大陆性出航 | 免费观看一级一片 | 草久久网| 亚洲欧美日韩在线观看看另类 | 大肚孕妇的高h辣文 | 亚洲午夜久久久久影院 | 日本人添下面的全过程 | 天海翼黄色三级 | 国产夜趣福利第一视频 | 日本黄a三级三级三级 | 粗了大了 整进去好爽视频 刺激一区仑乱 | 麻豆自拍 | 日本欧美不卡一区二区三区在线 | 日韩国产成人资源精品视频 | 手机看片福利 | 国产成人精品福利色多多 | 麻豆视频免费在线播放 | 俄罗斯激情性孕妇孕交大全 | 无码精品一区二区三区免费视频 | 亚洲成年人专区 | 500第一精品 | 免费国产一级观看完整版 | k逼| 99久久爱热6在线播放 | 四虎影视永久免费视频观看 | 色综合合久久天天综合绕视看 | 亚洲欧美另类在线观看 | 日韩一品在线播放视频一品免费 | 国产高清在线视频一区二区三区 | 美女的让男人桶爽网站 |