Digging into Box2D destructible terrain final version. Test it and enjoy.

There’s no wonder my most popular posts in these weeks are Box2d destructible terrain demo using only geometry and Where’s my water Flash + Box2D demo. A lot of people want to create new games with Box2D physics and destructible terrain, and I receive a lot of emails and Facebook messages asking me if I am going to release the code.

Unfortunately, the code wasn’t ready when I wanted to release it, for a known bug I called “the infamous square cave”, here it is:

Anyway, I think I finally fixed it, but there may be other issues to fix… so here is the final version of the engine, with a new game design idea and some output texts to help me in the debug.

This is the result:

You can dig into the terrain by clicking and dragging with the mouse, should you encounter the infamous square cave bug, please select all the content of the rightmost text area, copy it and paste it as a comment, so I can work on it. Otherwise, if you don’t find any issue, please comment it’s ok.

If everything goes well, next week will be dedicated to the full tutorial and suggestions to optimize it. I want to see new games!!

  • edopenroz

    Looks awesome!! No square cave bug appears!

  • adrian

    no square bug found… but I did get this error in the debug window (sometimes not always):

    Error: 1 A problem has occurred. Use the Validate() method to see where the problem is.53,420
    at _-9G::b2Separator/_-FF()
    at _-9G::b2Separator/_-62()
    at _-9G::b2Separator/_-8H()
    at _-Bu/_-Z()
    at _-Bu/_-Bg()
    at _-Bu/_-3k()

    the code:
    561,181;561,181;561,181;551,197;507,222;464,235;427,246;393,267;359,279;316,287;212,321;181,343;173,368;178,379;406,406;415,408;449,414;450,414;517,430;547,422;549,392;549,362;549,358;549,358;547,358;530,358;480,367;445,390;423,415;420,421;418,423;411,424;410,423;434,405;491,370;522,345;522,345;495,356;435,394;415,413;429,415;465,411;517,385;521,378;481,376;395,397;320,428;321,439;368,443;443,419;457,397;420,384;339,397;314,420;333,423;381,395;399,333;364,299;277,310;233,388;317,441;441,447;497,393;434,309;316,292;254,338;285,376;362,401;421,383;419,356;311,354;183,412;174,429;219,435;304,409;349,370;334,368;270,380;230,398;269,398;350,368;388,349;351,360;232,407;212,417;272,416;379,390;448,375;420,381;270,413;179,428;166,430;190,419;173,310;173,310;165,310;105,339;104,351;104,361;107,397;111,407;121,423;124,436;125,437;137,415;160,335;159,247;146,214;140,221;100,302;84,366;100,384;107,385;123,329;122,260;109,254;75,276;65,334;137,367;221,350;304,280;306,247;249,241;130,277;118,319;193,346;307,328;345,283;323,234;234,211;167,237;181,271;262,284;395,228;406,183;352,162;267,208;246,272;330,319;401,287;410,239;371,199;311,205;286,235;296,251;320,244;342,203;331,176;294,176;235,213;224,244;260,261;344,244;370,206;333,184;244,187;188,217;196,249;255,276;328,274;368,243;356,203;299,178;193,185;138,231;152,276;232,325;318,335;372,315;374,286;309,258;248,263;206,294;217,318;253,332;324,329;377,298;380,270;340,245;251,248;185,272;162,293;198,307;286,297;381,246;399,219;395,208;381,212;370,241;380,271;417,277;454,247;461,194;442,176;393,181;368,213;373,239;416,249;446,235;464,194;453,170;440,168;425,186;421,218;440,241;466,238;473,219;464,197;433,190;401,208;403,222;436,236;457,233;460,230;458,230;443,270;439,298;444,313;445,313;446,310;448,309;448,321;448,344;448,350;449,350;454,328;460,301;460,298;460,304;460,322;460,344;512,260;512,260;512,260;526,283;526,285;525,303;521,318;521,318;478,290;478,290;478,290;482,300;483,315;485,323;491,341;491,341;491,341;491,341;470,361;439,380;409,401;376,425;367,432;342,436;310,436;237,408;232,406;232,406;141,412;131,418;102,427;102,427;123,446;178,451;215,452;257,455;302,456;337,458;371,460;408,462;448,463;485,463;510,462;529,460;539,458;549,455;554,455;554,454;554,454;546,454;501,455;423,455;336,455;269,453;223,453;200,453;173,453;144,454;128,454;121,454;115,454;111,454;110,454;110,454;110,454;116,454;188,454;287,454;372,454;429,454;474,454;505,454;528,456;532,456;523,453;455,448;301,445;175,441;111,430;103,428;103,428;103,428;109,406;124,369;139,334;153,289;158,256;160,233;161,221;161,207;161,196;158,189;157,183;156,174;154,167;154,164;154,164;154,164;149,179;133,213;115,248;99,269;81,291;64,315;46,341;33,360;29,371;28,377;28,377;30,377;41,350;59,311;75,284;87,270;106,253;123,242;132,237;136,233;138,230;138,230;138,230;137,230;110,240;75,260;56,281;47,302;44,327;39,345;38,363;38,380;44,400;53,420;61,437;61,437;61,437;61,437;61,437;61,437;61,437;61,437;61,437;61,437;395,26;384,61;373,81;373,81;373,81;373,81;373,81;373,81;373,81;373,81;373,81;418,74;420,73;413,84;395,115;360,170;327,233;307,279;293,308;282,334;271,355;249,364;214,364;138,340;54,294;56,290;71,261;91,231;126,209;173,191;187,189;187,189;180,193;137,207;120,217;118,221;119,230;120,247;122,272;133,305;141,322;157,341;180,347;220,348;385,10;385,10;385,10;396,10;434,10;480,9;514,9;540,10;551,10;554,10;554,10;554,10;554,10;

  • 299,215;299,215;299,206;306,196;324,184;334,179;337,177;337,177;337,177;341,177;353,184;360,193;366,205;367,207;367,209;368,212;369,220;369,226;369,229;368,233;362,236;346,237;334,237;319,237;309,235;305,235;300,237;296,244;293,256;289,270;287,275;272,284;261,287;251,289;246,293;236,301;224,308;210,313;198,315;188,317;184,319;182,326;173,366;181,378;218,387;268,402;321,405;375,403;437,382;463,365;463,347;463,331;463,316;463,316;463,320;460,341;454,353;442,366;414,390;402,401;384,414;363,425;189,398;189,398;196,399;204,400;208,401;212,403;217,405;221,406;224,407;230,408;237,409;243,410;249,411;256,414;263,417;268,418;276,418;281,418;297,418;314,421;333,423;549,176;549,176;542,190;529,211;510,247;481,298;452,322;497,265;208,178;208,178;206,187;202,196;202,205;206,215;209,220;210,224;213,236;215,248;219,267;343,294;343,294;343,294;390,282;227,295;243,371;495,10;495,10;495,10;495,10;495,10;495,10;495,10;495,10;495,10;479,10;442,11;442,11;528,14;

  • iagows

    I changed the tab, changed back some minutes later and started “raining” a thousand balls (scrolling down hiding the game works too). Then they all went of the stage and everything went back to normal again. [sorry for the english]
    just in case:
    395,20;395,20;395,20;327,28;327,28;327,28;327,28;323,290;323,290;323,290;323,220;323,220;323,220;262,215;262,215;262,215;286,215;286,215;286,215;293,225;293,225;293,225;307,237;307,237;307,237;307,237;264,196;264,196;264,196;264,196;358,305;358,305;358,305;358,305;385,324;385,324;385,324;410,341;410,341;410,341;410,341;388,371;388,371;388,371;357,387;357,387;357,387;318,400;318,400;318,400;284,412;284,412;234,420;234,420;234,420;234,420;208,450;208,450;195,472;195,472;195,472;195,472;326,262;326,262;258,414;258,414;258,414;411,363;411,363;333,305;351,321;351,321;351,321;351,321;368,325;368,325;368,327;370,327;343,236;343,236;343,236;343,236;353,264;353,264;353,264;514,216;514,216;514,216;553,235;553,235;553,235;553,235;587,242;587,242;587,242;587,242;607,245;607,245;607,245;604,292;604,292;604,292;604,292;600,316;600,316;600,316;600,316;565,335;565,335;565,335;565,335;532,341;532,341;532,341;532,341;504,356;504,356;504,356;471,376;469,376;469,376;468,376;435,386;435,386;435,386;391,394;391,394;391,394;391,394;391,394;354,410;354,410;325,424;325,424;319,425;283,434;282,434;282,434;282,434;250,442;250,442;250,442;250,442;229,452;229,452;229,452;409,388;409,388;409,388;370,407;369,407;494,193;494,193;494,193;476,175;476,175;612,263;612,263;612,263;575,258;235,181;235,181;250,195;250,195;250,195;246,195;246,195;246,195;253,199;253,199;253,199;253,199;275,220;275,220;275,220;275,220;277,220;287,226;287,226;287,226;287,226;287,227;295,236;295,236;295,236;283,231;284,231;287,232;290,235;290,235;290,238;292,239;298,245;301,250;301,250;301,250;302,250;304,251;305,251;308,251;308,253;311,253;314,256;314,257;314,257;314,257;314,257;314,257;313,257;309,256;306,253;303,253;298,252;297,250;292,246;289,243;288,240;285,235;283,234;282,232;280,228;279,226;276,225;274,222;271,219;268,217;265,216;262,213;261,211;259,210;256,208;255,207;253,202;250,199;249,198;247,195;244,192;241,189;240,186;238,183;237,180;235,178;234,175;231,172;231,172;228,169;223,165;220,163;216,160;211,156;208,154;207,153;205,153;205,153;209,153;215,155;220,157;226,160;232,169;236,175;239,181;244,185;247,190;251,196;256,200;259,205;263,211;268,217;272,223;278,232;283,236;286,241;287,244;290,247;293,251;296,254;301,262;305,266;308,272;313,277;316,280;320,286;323,290;329,295;334,298;338,301;341,304;343,307;346,310;349,314;353,320;356,323;359,326;361,328;364,334;368,338;374,344;376,346;377,347;379,347;445,358;433,349;424,342;418,334;412,331;408,327;402,319;394,310;388,306;382,301;378,298;375,294;370,289;367,285;363,279;357,270;352,265;346,256;342,250;337,243;333,238;330,234;325,228;321,223;316,216;310,205;306,201;301,195;297,189;294,186;289,180;285,175;282,172;277,171;276,169;274,168;452,150;457,152;464,160;469,166;470,169;470,169;473,173;476,178;482,182;484,185;487,187;488,190;491,191;493,193;496,194;500,199;506,203;511,206;511,206;512,208;515,209;520,215;524,221;524,223;526,223;527,226;530,230;533,233;535,236;536,236;536,238;539,241;542,247;547,251;548,253;550,254;554,257;559,259;562,263;565,265;566,266;571,268;574,271;577,274;578,275;580,275;583,277;587,280;590,281;592,283;593,283;593,283;593,283;593,283;593,283;593,283;595,277;596,271;596,265;596,264;596,261;594,255;589,250;586,244;585,241;580,238;576,237;573,234;570,231;567,229;564,228;562,226;561,225;558,222;553,220;549,216;546,213;540,210;535,205;531,202;526,199;522,196;519,193;511,190;507,187;505,187;504,187;504,187;592,305;592,305;592,305;589,307;585,310;580,314;577,316;573,320;571,320;565,323;558,326;550,329;544,329;541,331;537,331;531,332;523,335;517,338;514,340;511,341;510,341;505,344;501,346;499,347;495,349;490,352;486,353;481,355;477,356;472,359;466,361;463,364;462,364;462,364;462,364;462,364;463,364;464,365;466,365;467,367;472,368;475,370;478,371;482,371;490,371;497,369;503,366;505,364;508,361;514,358;518,357;521,355;526,352;532,348;536,345;539,343;542,340;547,339;553,336;559,333;566,328;571,327;572,325;574,324;575,324;577,324;577,324;581,321;586,319;589,318;590,318;590,318;592,318;592,318;592,318;592,318;592,318;591,318;589,318;585,320;577,325;570,328;562,331;561,332;556,335;549,340;543,343;535,347;531,349;525,352;519,353;511,358;507,359;502,361;498,364;493,365;487,367;480,371;474,374;469,379;465,382;463,382;460,385;454,388;450,389;447,391;444,392;441,394;436,395;430,397;424,400;421,401;418,403;414,404;406,407;402,409;399,409;393,412;385,412;378,412;373,412;367,413;363,415;360,415;357,416;354,416;351,419;343,421;340,424;337,424;333,425;327,428;319,428;312,431;306,434;300,436;295,439;291,439;286,440;282,442;279,443;277,445;273,445;271,446;271,446;268,448;261,451;255,454;250,455;247,457;243,460;241,460;237,461;232,463;231,464;226,466;223,467;220,469;219,469;217,470;216,470;213,470;155,317;155,317;155,317;455,16;458,16;460,16;461,16;464,15;466,15;466,15;467,15;469,15;470,15;470,15;470,15;470,15;470,15;470,15;472,15;472,15;473,9;473,9;473,9;475,9;479,9;482,9;485,9;485,9;485,9;485,9;485,9;485,9;221,136;221,136;221,136;148,283;148,283;148,283;148,283;135,313;135,314;135,314;135,314;135,314;244,229;244,229;244,229;469,407;469,407;469,407;469,407;469,407;470,407;473,412;478,415;479,415;485,419;494,427;502,433;509,439;515,443;521,448;529,454;532,455;539,461;545,466;554,473;562,478;575,485;586,491;598,499;607,506;617,514;619,517;619,517;619,517;447,407;447,407;447,409;447,409;447,409;445,410;444,410;441,410;441,410;441,410;441,410;438,410;436,409;433,408;432,408;427,408;426,408;423,408;417,408;411,408;406,408;405,406;403,406;399,406;394,405;387,405;384,405;381,405;376,405;369,405;367,405;367,405;461,418;461,418;461,418;461,418;461,418;461,418;461,417;461,415;461,412;461,412;461,412;461,411;461,411;460,409;459,408;457,408;457,408;456,408;453,408;451,408;445,408;444,408;444,409;444,409;444,409;446,412;449,413;451,413;451,413;455,415;458,416;461,416;464,418;466,418;467,419;469,419;470,421;472,421;473,421;475,421;475,422;476,422;476,422;476,422;479,424;481,424;482,425;484,425;485,425;487,427;488,427;491,427;493,428;494,428;496,428;497,430;500,430;502,431;503,433;512,436;515,436;515,436;515,436;515,436;515,436;510,435;504,432;501,429;496,426;492,423;483,420;478,418;472,415;465,412;457,409;450,406;444,405;441,403;439,403;436,403;433,403;429,402;424,402;421,402;417,402;411,402;409,402;406,402;403,402;396,402;394,402;394,402;393,402;391,402;388,402;387,402;385,403;384,403;379,404;372,404;363,404;360,404;358,404;358,406;354,406;542,181;542,181;542,181;542,181;381,10;382,10;388,11;397,11;415,11;436,11;454,11;484,11;505,13;532,13;562,13;572,13;572,13;572,13;572,13;580,13;602,16;610,16;610,16;610,16;611,16;617,16;619,16;619,16;622,16;623,16;623,16;625,16;625,16;625,16;625,16;625,16;625,16;625,16;625,16;625,16;625,16;625,16;625,16;625,16;626,16;626,16;626,16;628,16;628,15;629,15;631,15;631,15;631,15;631,15;631,15;631,15;155,139;155,139;155,139;155,139;155,139;155,139;151,164;151,164;151,164;151,164;151,164;177,173;196,173;211,173;221,173;226,173;229,173;232,173;238,173;244,176;245,176;245,176;245,176;438,13;438,13;438,13;

  • Awesome and very helpful!

    Good work!

  • Great, man! Really!

  • Emanuele Feronato

    thank you all for the feedback, time to investigate and eradicate the remaining issues…

  • MC

    it works ok here!

    flash player 11.8
    firefox beta 23.0

  • Nice stuff! Can’t wait to play with the source :)!
    Does this work on dynamic bodies as well?

  • Cool stuff performance needs looked at though, drops from 30fps to 10fps when I am dragging the cave. Seems to be stuff in the enterframe event and garbage collection causing it (looked at it with scout).

    Running this on a macbook pro
    2.4 GHz, Intel Core 2 Duo
    Chrome version 28.0.1500.95
    Flash Version 11.8.800.97

  • Jeferson

    274,297;274,297;274,297;510,9;507,9;501,9;490,9;481,8;468,8;457,8;451,8;445,8;441,8;436,8;431,8;427,7;423,7;419,7;417,7;417,7;417,7;417,7;477,18;477,18;477,18;382,6;382,6;384,6;398,7;412,8;420,8;428,8;437,7;445,5;456,5;469,3;478,1;485,0;495,-1;505,-2;514,-4;520,-5;526,-6;533,-7;541,-7;547,-7;554,-7;562,-7;569,-7;579,-7;591,-5;601,-4;609,-3;615,-3;621,-2;626,-2;630,-1;632,-1;633,-1;633,-1;635,0;639,1;639,1;644,2;647,3;649,3;651,3;651,3;651,3;651,3;651,3;654,3;654,3;654,3;658,3;664,2;670,2;675,1;681,1;686,1;692,1;697,1;701,1;703,1;706,1;707,1;711,0;712,0;712,0;715,0;715,0;

    “715,0;” is repeating “forever” after this.

  • Hi! where is the “full tutorial” U promised!!!! I wait for it almost a month!!!

    • Emanuele Feronato

      coming next week, I had to fix a couple of nasty bugs

  • toddy

    look forward

  • Christian S.

    Awesome, destructible terrain Examples are really hard to find, Chipmunk is offering an Autogeometry Feature in the Pro Version.
    I’am really excited how you did that with Box2d.
    Thank you, nice work!!

  • Hey, looks awesome!

    When will you release source code?

  • That’s really cool, nice work!

  • Lorenzo

    Still waiting for a tutorial! ;-)

  • Alex

    Still waiting for the full tutorial, coming next week :)

  • Miko?aj

    I’ve just figured it out.
    The area is divided between 78 squares (or rectangles), which are set in 6 rows and 13 columns.
    The one rectangle is smaller than clipping area, so box2d wouldn’t crash.

    If you click (or drag) mouse, it works this way:
    1. check which squares (or rectangles) are with contact with clipping area,
    2. start clipper function with squares from point 1, and clipping area,
    3. destroy squares from point 1, and replace them by polygons which were created in point 2. If they are concave you use b2Separator.

    This hipothesis explain bugs with infamous squared caves which were observed in earliest version.

    I hope everybody understand my explanation:)

  • Pingback: Motions-Media JavaScript: Destructable Terrain in JavaScript mit Cangaja (Box2D, poly2tri, Clipper) | Motions-Media()

  • Matthimus

    Have you posted the source anywhere as of yet?