تاپیک موتور فیزیکی دیگه ادامه نمیده؟

benyamin_pc

Well-Known Member
سلام به اونایی که این بحث رو دنبال می کنن و می دنم خیلی هم کم هستند . :rose:
خوب توی این درس می خوام نحوه قرار دادن گرافیک روی اشیائی که توی قسمت قبل با استفاده از debugDraw خود box2d رسم شدن رو توضیح بدم .
این درس مثل درس قبلی نیازی به توضیح نداره و فقط با کمی دقت به توضیحاتی که روی کدها نوشتم همه چیز قابل فهم می شه .
فقط قبل از خوندن کدها باید به 2 تا نکته دقت کنید .
1- باید قبل از شروع بع کد کردن اشیاء مورد نظرتون رو بسازید و بذارید توی کتابخانه فلش و از اونها برای کار با اکشن اسکریپت هم خروجی بگیرید .
2- در جهان فیزیکی زمانی که از سمبل ها استفاده می کنید ابعاد کمی دچار تغییر می شوند فرض کنید در این جهان هر 30 پیکسل برابر 1 متر است بنابراین اگر شما شیئی به ابعاد 30 * 30 پیکسل دارید یعنی شیئی به ابعاد 1 متر در 1 متر دارید و این شیء خیلی از ابعاد stage شما فراتر است بنابراین باید محاسباتی را در مقداردهی های خود انجام دهید تا ابعاد درستی را بدتس آورید .

نکات رو که گفتم اینم از کد :
PHP:
import flash.display.Sprite;
import flash.events.Event;
// اضاف کردن کلاس های فیزیک
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;

////////////////////////////////////////////////////////////////////
//1 - world ساختن شیء 
var m_world:b2World;
//
//1-1 - ساختن محدود کننده مختصات
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
//
//1-2 - مقدار دهی بردار گرانش
var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
//
//1-3 - مقدار دهی شی جهان
m_world = new b2World(worldAABB, gravity, false);
/////////////////////////////////////////////////////////////////////
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/////////////////////////////////////////////////////////////////////
//از این متغیرها برای ترسیم اشیاء در حالت تست استفاده می شود
//توی این قسمت چون می خوایم از گرافیک ها استفاده کنیم پس دیگه نیازی به این ها نداریم
/*var dbgDraw:b2DebugDraw = new b2DebugDraw();
var dbgSprite:Sprite = new Sprite();
addChild(dbgSprite);
dbgDraw.m_sprite = dbgSprite;
dbgDraw.m_drawScale = 30.0;
dbgDraw.m_fillAlpha = 0.0;
dbgDraw.m_lineThickness = 0.0;
dbgDraw.m_drawFlags = 0xFFFFFFFF;
m_world.SetDebugDraw(dbgDraw);*/
//////////////////////////////////////////////////////////////////////        
//2 - ساختن متغیرهای  بدنه ها و اشکال
var body:b2Body;
var bodyDef:b2BodyDef;
var boxDef:b2PolygonDef;
var circleDef:b2CircleDef;
// ساختن بدنه زمین
bodyDef = new b2BodyDef();
//ساختن شکل زمین
bodyDef.position.Set(10, 12);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(30, 3);//تنظیم ابعاد 4 ضلعی
boxDef.friction = 0.3;//تنظیم اصطکاک
boxDef.density = 0;//تنظیم چگالی
////////////////////////////////////////////////////////////////////
//خوب این کدها مربوط می شن به اضافه کردن سمبل به شی ء زمین 
bodyDef.userData = new PhysGround();//با کتابخانه یه نگاهی بندازید
//مشخص کردن ابعاد زمین
//نکته : یادتون باشه زمانی که دارید از موتور فیزیک استفاده می کنید ابعاد با حالت عادی تفاوت دارن
//بنابراین وقتی یک شی ء توی فلش می کشید و اون رو می ذارید توی کتابخانه انتظار نداشته باشید 
//دقیقا با همون ابعاد کتابخانه توی کار فیزیکی بتونید ازش استفاده کنید
// زمانی که شما از موتور فیزیکی باکس 2 دی استفاده می کنید و دارید از سمبل استفاده می کنید
//هر 30 پیکسل شما برابر با 1 متر حاب می شه بنابراین در برخی از مثال ها اگر تقسیم بر 30 یا
// ضربدر 30 دیدید تعجب نکنید می خوان مقیاس رو تنظیم کنن
bodyDef.userData.width = 30 * 2 * 30;
bodyDef.userData.height = 30 * 2 * 3;
//خوب اینم که دیگه معلومه شیئی که بالا اونو مقدار دهی کردید رو می ذاره توی استیج
addChild(bodyDef.userData);
//اضافه کردن اشکال به بدنه
body = m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//اگر چگالی عددی بیش از صفر باشد این دستورباعث معلق شدن شیء بدنه خود می شود
body.SetMassFromShapes();
//بنابراین در اینجا چون چگالی صفر است این دستور کاری انجام نمی دهد
//////////////////////////////////////////////////////////////////////
// اضافه کردن چند شی دیگر
for (var i:int = 1; i < 4; i++) 
{
    bodyDef = new b2BodyDef();
    bodyDef.position.x = Math.random() * 15 + 5;
    bodyDef.position.y = Math.random() * 5;
    var rX:Number = Math.random() + 0.5;
    var rY:Number = Math.random() + 0.5;
    // تعریف 4 ضلعی ها
    boxDef = new b2PolygonDef();
    boxDef.SetAsBox(rX, rY);
    boxDef.density = 1.0;
    boxDef.friction = 0.5;
    boxDef.restitution = 0.8;//تنظیم حالت ارتجاعی اشیاء
//////////////////////////////////////////////////////////////////////
//مثل قبل از این 3 خط هم برای گرافیک دهی استفاده می شه 
    bodyDef.userData = new PhysBox();// به کتابخانه یه نگاهی بندازید
    bodyDef.userData.width = rX * 2 * 30;
    bodyDef.userData.height = rY * 2 * 30;
//////////////////////////////////////////////////////////////////////
    body = m_world.CreateBody(bodyDef);
    body.CreateShape(boxDef);
    // در اینجا چون چگالی برابر 1 است این دستور کاربرد دارد
    body.SetMassFromShapes();
//مثل بالا از این خط کد هم برای اضافه کردن شی ء ساخته شده به استیج استفاده می شه
addChild(bodyDef.userData);
}

for (var j:int = 1; j < 4; j++) 
{
    bodyDef = new b2BodyDef();
    bodyDef.position.x = Math.random() * 15 + 5;
    bodyDef.position.y = Math.random() * 5;
    // تعریف دایره ها
    circleDef = new b2CircleDef();
    circleDef.radius = rX;
    circleDef.density = 1.0;
    circleDef.friction = 0.5;
    circleDef.restitution = 0.5;
//////////////////////////////////////////////////////////////////////
//مثل قبل از این 3 خط هم برای گرافیک دهی استفاده می شه 
    bodyDef.userData = new PhysCircle();
    bodyDef.userData.width = rX * 2 * 30;
    bodyDef.userData.height = rX * 2 * 30;
//////////////////////////////////////////////////////////////////////
    body = m_world.CreateBody(bodyDef);
    body.CreateShape(circleDef);
    body.SetMassFromShapes();
//مثل بالا از این خط کد هم برای اضافه کردن شی ء ساخته شده به استیج استفاده می شه
addChild(bodyDef.userData);
}
///////////////////////////////////////////////////////////////
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2
//3 - اضافه کردن ایونت برای حلقه بروز رسانی
this.addEventListener(Event.ENTER_FRAME, Update);

function Update(evt:Event) {
    //بروز رسانی جهان
    m_world.Step(1/30, 10);

    // بروز رسانی موقععیت و زاویه چرخش اسپریت ها
    for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
        if (bb.m_userData is Sprite) {
            bb.m_userData.x = bb.GetPosition().x * 30;
            bb.m_userData.y = bb.GetPosition().y * 30;
            bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
        }
    }
}
////////////////////////////////////////////////////////////////
خوب کدها رو هم که گفتم اینم از لینک دانلود مثال :
http://www.amirdarajeh.com/amirUploads/helloWorld (graphic).zip

موفق باشید

این کدو که کپی می کنمو کنارشم box2d 2.1 می ذارم 20تا ارور میده :-? کسی آموزش منسجمی از box 2d نداره؟ :sad:
 

armanbm

کاربر VIP
پ اول باید کتابخانه ها رو به برنامه معرفی کنی. که آموزشش همونجا اومده.
 

جدیدترین ارسال ها

بالا