1. 程式人生 > >從零開始box2d(2) 物體的運動

從零開始box2d(2) 物體的運動

一步步來 從簡單到困難 就像王健林說的 先定一個小目標 一步步來 哈哈.

上一篇說了世界的建立 下面 模擬物體的運動

首先需要介紹新的東西

上一片介紹了AABB 包圍盒 Vec2 二維向量 和world 世界.

在物理世界裡面 還需要有物體 那麼就是 Body .
body (剛體 )建立的時候不能通過直接從構造器建立,必須通過World類物件的.createBody(BodyDef bd) 方法建立. 然後呼叫其createShape(ShapeDef sd)方法建立剛體的 幾何圖形

BodyDef , 其物件用於儲存剛體的一些描述資訊,主要是在建立剛體的時候呼叫的.
例如: public boolean isSleeping 表示剛體當前是否處於休眠

ShapeDef (形狀描述) , 其物件主要用來儲存形狀的描述資訊 該類有兩個子類
CircleDef,(圓形描述) ,PolygonDef(多邊形描述) . 形狀引數有 密度,摩擦係數,彈性係數.

**

下面例項 效果

這裡寫圖片描述

下面是程式碼

package com.cp;

import org.jbox2d.collision.AABB;
import org.jbox2d.collision.PolygonDef;
import org.jbox2d.collision.ShapeDef;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import
org.jbox2d.dynamics.BodyDef; import org.jbox2d.dynamics.World; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import
android.view.SurfaceHolder.Callback; public class MySurfaceView extends SurfaceView implements Callback, Runnable { private Thread th; private SurfaceHolder sfh; private Canvas canvas; private Paint paint; private boolean flag; // ---新增物理世界----->> final float RATE = 30; World world; AABB aabb; Vec2 gravity; float timeStep = 1f / 60f; final int iterations = 10; // ----在物理世界中新增一個多邊形--->> Body body;// 宣告物體物件 float polygonX = 40;// 宣告矩形X座標 float polygonY = 10;// 宣告矩形Y座標 float polygonWidth = 50;// 宣告矩形寬度 float polygonHeight = 50;// 宣告矩形高度 // ----在物理世界中新增一個多邊形--->> Body body2;// 宣告物體物件 float polygonX2 = 5;// 宣告矩形X座標 float polygonY2 = 400;// 宣告矩形Y座標 float polygonWidth2 = 50;// 宣告矩形寬度 float polygonHeight2 = 50;// 宣告矩形高度 // ----在物理世界中新增一個多邊形--->> Body body3;// 宣告物體物件 float polygonX3 = 5;// 宣告矩形X座標 float polygonY3 = 700;// 宣告矩形Y座標 float polygonWidth3 = 800;// 宣告矩形寬度 float polygonHeight3 = 2;// 宣告矩形高度 public MySurfaceView(Context context) { super(context); this.setKeepScreenOn(true); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Style.STROKE); setFocusable(true); // ---新增物理世界-->> aabb = new AABB(); gravity = new Vec2(0f, 10f); aabb.lowerBound.set(-100f, -100f);// 世界左上角 aabb.upperBound.set(400f, 400f);// 世界右下角 world = new World(aabb, gravity, true); // ----在物理世界中新增一個多邊形--->> 動態的 body = createPolygon(polygonX, polygonY, polygonWidth, polygonHeight, false);// 建立一個多邊形 // ----在物理世界中新增一個多邊形--->> 靜態的 body2 = createPolygon(polygonX2, polygonY2, polygonWidth2, polygonHeight2, true);// 建立一個多邊形 // ----在物理世界中新增一個多邊形--->> 這個是地平線 body3 = createPolygon(polygonX3, polygonY3, polygonWidth3, polygonHeight3, true);// 建立一個多邊形 } public void surfaceCreated(SurfaceHolder holder) { flag = true; th = new Thread(this); th.start(); } public Body createPolygon(float x, float y, float width, float height, boolean isStatic) { // ---建立多邊形面板 多邊形描述 PolygonDef pd = new PolygonDef(); // 例項一個多邊形的面板 if (isStatic) { pd.density = 0; // 設定多邊形為靜態 } else { pd.density = 1; // 設定多邊形的質量 } pd.friction = 0.8f; // 設定多邊形的摩擦力 pd.restitution = 0.3f; // 設定多邊形的恢復力 // 設定多邊形快捷成盒子(矩形) // 兩個引數為多邊形寬高的一半 pd.setAsBox(width / 2 / RATE, height / 2 / RATE); // ---建立剛體 BodyDef bd = new BodyDef(); // 例項一個剛體物件 bd.position.set((x + width / 2) / RATE, (y + height / 2) / RATE);// 設定剛體的座標 // ---建立Body(物體) Body body = world.createBody(bd); // 物理世界建立物體 body.createShape(pd); // 為Body新增面板 body.setMassFromShapes(); // 將整個物體計算打包 return body; } public void myDraw() { try { canvas = sfh.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.WHITE); canvas.drawRect(polygonX, polygonY, polygonX + polygonWidth, polygonY + polygonHeight, paint);// 繪畫矩形 canvas.drawRect(polygonX2, polygonY2, polygonX2 + polygonWidth2, polygonY2 + polygonHeight2, paint);// 繪畫矩形 canvas.drawRect(polygonX3, polygonY3, polygonX3 + polygonWidth3, polygonY3 + polygonHeight3, paint);// 繪畫矩形 } } catch (Exception e) { Log.e("tag", "myDraw is Error!"); } finally { if (canvas != null) sfh.unlockCanvasAndPost(canvas); } } public void Logic() { // ----物理世界進行模擬 world.step(timeStep, iterations); Vec2 position = body.getPosition(); polygonX = position.x * RATE - polygonWidth / 2; polygonY = position.y * RATE - polygonHeight / 2; Vec2 position2 = body2.getPosition(); polygonX2 = position2.x * RATE - polygonWidth2 / 2; polygonY2 = position2.y * RATE - polygonHeight2 / 2; Vec2 position3 = body3.getPosition(); polygonX3 = position3.x * RATE - polygonWidth3 / 2; polygonY3 = position3.y * RATE - polygonHeight3 / 2; } public void run() { while (flag) { myDraw(); Logic(); try { Thread.sleep((long) timeStep * 1000); } catch (Exception ex) { Log.e("tag", "Thread is Error!"); } } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { flag = false; } }

相關推薦

開始box2d(2) 物體運動

一步步來 從簡單到困難 就像王健林說的 先定一個小目標 一步步來 哈哈. 上一篇說了世界的建立 下面 模擬物體的運動 首先需要介紹新的東西 上一片介紹了AABB 包圍盒 Vec2 二維向量 和world 世界. 在物理世界裡面 還需要有物體 那麼就

IC卡解密開始2 版本更新! 解密工具PN532-mfoc-mfcuk-GUI V2.1 By:lookyour

由於 文件夾 7月 thread 2種 金融 系統 dos 同時 程序更新 更新內容最下面2017/5/3 V2.1======================================最簡要介紹下M1卡數據結構目前能看到的有2種M1卡,分別為S50 S70,其實就是

Centos Docker 開始2)之 mssql 的資料庫檔案儲存在主機

Docker mmsql新建資料庫如果能夠把資料庫檔案儲存在主機上就好了,centos好像可以掛載的 docker 的 run 命令: -v ~/nginx/www:/www :將主機中專案的目錄www掛載到容器的/www 準備命令一下: docker run -e

《電子設計開始(第2版)》pdf電子書附網盤連結+讀書方法論總結

有效率的讀書方法論 如果我們不是遣詞造句,不是需要對作者的語句一句句斟酌,也不是需要體會優美的語言的話,那麼快速看完一本書並能夠了解書的重要內容,讓書中的內容能夠幫助自己無疑是我們的最終目的。 1.確定讀書的目的,特別是“商務類”書籍。你為什麼會買它?你想從它這裡得到什

PHPUnit開始2):編寫 PHPUnit 測試

計劃永遠趕不上變化,本計劃本月完成所有PHPUnit的部落格內容。今天一看日曆發現都TMD的二月底了,而我才寫了一篇而已。情何以堪…… 今天寫第二篇,詳細說一說如何寫出一個測試用例。 這裡會涉及到一些什麼自動載入之類的,我就不再這裡補充了,大家可以查閱相關P

開始的全棧工程師——js篇2.18(js的運動

一、元素的 client offset scroll 三個系列 clientWidth / clientHeight / clientTop / clientLeftoffsetWidth / offsetHeight / offsetLeft / offsetTop / offsetParentscrol

IC卡解密開始學1 (也許會有2) 解密工具V2 V3大放送 By:lookyour

中國 tac ... 需要 編輯框 回復 mile gui for 前段時間發了一個破解的PN532工具,詳見 ===========================IC卡解密工具 PN532工具XP 爆破版http://www.52pojie.cn/thread-5978

開始理解JAVA事件處理機制(2

extend nds 接下來 htm ref param 簡單 tostring ansi 第一節中的示例過於簡單《從零開始理解JAVA事件處理機制(1)》,簡單到讓大家覺得這樣的代碼簡直毫無用處。但是沒辦法,我們要繼續寫這毫無用處的代碼,然後引出下一階段真正有益的代碼。

開始的網站架設生活[2]

int family oss 例如 web -c end 構造 logs 從零開始的網站架設[2] 哇,今天就從一個模板開始說起吧。上次腦抽下了一個模板,模板大概可以總結成幾個部分: (模板在這裏:需要學習的可以下載哦~下載後24小時刪除哦~) https://github

開始學習算法之歸並排序[1](2.2歸並排序)

並排 步驟 blog ++ 序列 else [1] 操作 歸並排序 歸並排序思想為將序列每相鄰兩個數字進行歸並操作(merge),形成floor(n/2)個序列,排序後每個序列包含兩個元素將上述序列再次歸並,形成floor(n/4)個序列,每個序列包含四個元素重復步驟2,直

開始搭建系統2.7——Quartz安裝及配置

get AR blank 安裝 pos html uart body cnblogs 從零開始搭建系統2.7——Quartz安裝及配置從零開始搭建系統2.7——Quartz安裝及配置

開始搭建系統1.2——Nginx安裝及配置

clas target nginx 1.2 targe nginx安裝 ref href 從零開始 從零開始搭建系統1.2——Nginx安裝及配置從零開始搭建系統1.2——Nginx安裝及配置

開始搭建系統2.3——Cat安裝及配置

AR lan tar gpo 從零開始 系統 .com .html log 從零開始搭建系統2.3——Cat安裝及配置從零開始搭建系統2.3——Cat安裝及配置

開始搭建系統2.5——Apollo安裝及配置

logs OS get html .cn apol blog class AR 從零開始搭建系統2.5——Apollo安裝及配置從零開始搭建系統2.5——Apollo安裝及配置

開始搭建系統3.2——微服務註冊中心開發及部署

註冊 cnblogs 開始 htm www post 服務註冊 logs get 從零開始搭建系統3.2——微服務註冊中心開發及部署從零開始搭建系統3.2——微服務註冊中心開發及部署

開始搭建系統2.4——Jenkins安裝及配置

AR gpo blank .cn 安裝 jenkin cnblogs 搭建 pro 從零開始搭建系統2.4——Jenkins安裝及配置從零開始搭建系統2.4——Jenkins安裝及配置

開始搭建系統2.1——Nexus安裝及配置

安裝 nexus pos HR class .html ref 系統 href 從零開始搭建系統2.1——Nexus安裝及配置從零開始搭建系統2.1——Nexus安裝及配置

開始搭建系統4.2——概要設計

ref pos com htm target pro .com .html blank 從零開始搭建系統4.2——概要設計從零開始搭建系統4.2——概要設計

【Linux】【Services】【PaaS】開始的Devops生活(2. kubernetes)

ces 自帶 .html 新版本 demon 最新版本 環境 html ice 1. 簡介 1.1. kubernetes,基礎架構和概念請參考https://www.cnblogs.com/demonzk/p/8301087.html 1.2. 如果想把kubernete

開始的全棧工程師——html篇1.2

段落 屬性 無限 port 簽名 分享圖片 就是 html 表示 起名方式與CSS 一.起名方式(起名方式也叫選擇器) 起名的目的是為了給標簽添加屬性 常見的3種選擇器有 標簽選擇器 id選擇器(使用的時候加#) class選擇器(使用的時候加.) 樣式的要求是