benyamin_pc
Well-Known Member
سلام به اونایی که این بحث رو دنبال می کنن و می دنم خیلی هم کم هستند .
خوب توی این درس می خوام نحوه قرار دادن گرافیک روی اشیائی که توی قسمت قبل با استفاده از 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تا ارور میده

