موتورهای فیزیکی در فلش ۵
۹۵/۰۳/۱۱
موتورهای فیزیکی در فلش ۳
۹۵/۰۳/۱۱

موتورهای فیزیکی در فلش ۴

سلام به اونایی که این بحث رو دنبال می کنن و می دنم خیلی هم کم هستند .
خوب توی این درس می خوام نحوه قرار دادن گرافیک روی اشیائی که توی قسمت قبل با استفاده از debugDraw خود box2d رسم شدن رو توضیح بدم .
این درس مثل درس قبلی نیازی به توضیح نداره و فقط با کمی دقت به توضیحاتی که روی کدها نوشتم همه چیز قابل فهم می شه .
فقط قبل از خوندن کدها باید به ۲ تا نکته دقت کنید .
۱- باید قبل از شروع بع کد کردن اشیاء مورد نظرتون رو بسازید و بذارید توی کتابخانه فلش و از اونها برای کار با اکشن اسکریپت هم خروجی بگیرید .
۲- در جهان فیزیکی زمانی که از سمبل ها استفاده می کنید ابعاد کمی دچار تغییر می شوند فرض کنید در این جهان هر ۳۰ پیکسل برابر ۱ متر است بنابراین اگر شما شیئی به ابعاد ۳۰ * ۳۰ پیکسل دارید یعنی شیئی به ابعاد ۱ متر در ۱ متر دارید و این شیء خیلی از ابعاد stage شما فراتر است بنابراین باید محاسباتی را در مقداردهی های خود انجام دهید تا ابعاد درستی را بدتس آورید .

نکات رو که گفتم اینم از کد :
[PHP]

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

////////////////////////////////////////////////////////////////////
//۱ – world ساختن شیء
var m_world:b2World;
//
//۱-۱ – ساختن محدود کننده مختصات
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
//
//۱-۲ – مقدار دهی بردار گرانش
var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
//
//۱-۳ – مقدار دهی شی جهان
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);*/
//////////////////////////////////////////////////////////////////////
//۲ – ساختن متغیرهای  بدنه ها و اشکال
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);//تنظیم ابعاد ۴ ضلعی
boxDef.friction = 0.3;//تنظیم اصطکاک
boxDef.density = 0;//تنظیم چگالی
////////////////////////////////////////////////////////////////////
//خوب این کدها مربوط می شن به اضافه کردن سمبل به شی ء زمین
bodyDef.userData = new PhysGround();//با کتابخانه یه نگاهی بندازید
//مشخص کردن ابعاد زمین
//نکته : یادتون باشه زمانی که دارید از موتور فیزیک استفاده می کنید ابعاد با حالت عادی تفاوت دارن
//بنابراین وقتی یک شی ء توی فلش می کشید و اون رو می ذارید توی کتابخانه انتظار نداشته باشید
//دقیقا با همون ابعاد کتابخانه توی کار فیزیکی بتونید ازش استفاده کنید
// زمانی که شما از موتور فیزیکی باکس ۲ دی استفاده می کنید و دارید از سمبل استفاده می کنید
//هر ۳۰ پیکسل شما برابر با ۱ متر حاب می شه بنابراین در برخی از مثال ها اگر تقسیم بر ۳۰ یا
// ضربدر ۳۰ دیدید تعجب نکنید می خوان مقیاس رو تنظیم کنن
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;
// تعریف ۴ ضلعی ها
boxDef = new b2PolygonDef();
boxDef.SetAsBox(rX, rY);
boxDef.density = 1.0;
boxDef.friction = 0.5;
boxDef.restitution = 0.8;//تنظیم حالت ارتجاعی اشیاء
//////////////////////////////////////////////////////////////////////
//مثل قبل از این ۳ خط هم برای گرافیک دهی استفاده می شه
bodyDef.userData = new PhysBox();// به کتابخانه یه نگاهی بندازید
bodyDef.userData.width = rX * 2 * 30;
bodyDef.userData.height = rY * 2 * 30;
//////////////////////////////////////////////////////////////////////
body = m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
// در اینجا چون چگالی برابر ۱ است این دستور کاربرد دارد
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;
//////////////////////////////////////////////////////////////////////
//مثل قبل از این ۳ خط هم برای گرافیک دهی استفاده می شه
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);
}
///////////////////////////////////////////////////////////////
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@۲
//۳ – اضافه کردن ایونت برای حلقه بروز رسانی
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);
}
}
}
////////////////////////////////////////////////////////////////

[/PHP]

خوب کدها رو هم که گفتم اینم از لینک دانلود مثال : http://darajeh.net/amirUploads/helloWorld%20(graphic).zip

موفق باشید

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*ضروری