1 decade ago by riceje7
I am attempting to use box2d to create a soft-body blob. I found this tutorial here that shows how to make one using the as3 version of box2d so I ported it to work with impact&
here is my blob entity:
and here is my main.js:
can anyone help me figure out what it is that i'm doing wrong? At first I thought I was getting a different error because i wasn't passing the right thing to the constructor for the b2.CircleShape(), but when I corrected that i get the error above. And now i'm stumped. any help would be greatly appreciated.
Another thing that i haven't been able to find any info on or anything is how to spawn box2d entities. i have been assuming that it is the same as normal but i could be wrong. can anyone confirm the correct way to spawn a box2d entity? Thanks everyone!
039;s box2d provided in the physics demo on the downloads page. however i am getting this error: #Uncaught TypeError: undefined is not a function
on this line of my code: var fixtureDef = new b2.FixtureDef();
here is my blob entity:
ig.module('game.entities.blob').requires('plugins.box2d.entity').defines(function () { EntityBlob = ig.Box2DEntity.extend({ blobMassParticles: 16, blobMassParticleDist: 50, blobs: [], worldScale: null, init: function (x, y, settings) { this.parent(x, y, settings); this.worldScale = settings.worldScale; this.blobs.push(this.blob(50, 50, 15)); for(var i = 0; i < this.blobMassParticles; i++){ var angle = (2*Math.PI)/this.blobMassParticles *i; var posX = this.pos.x+this.blobMassParticleDist+Math.cos(angle); var posY = this.pos.y+this.blobMassParticleDist+Math.sin(angle); this.blobs.push(this.blob(posX, posY, 2)); var dJoint = new b2.DistanceJointDef(); dJoint.bodyA = this.blobs[0]; dJoint.bodyB = this.blobs[this.blobs.length-1]; dJoint.localAnchorA = new b2.Vec2(0, 0); dJoint.localAnchorB = new b2.Vec2(0, 0); dJoint.length = this.blobMassParticleDist/wordlScale; dJoint.dampingRatio = .5; dJoint.frequencyHz = 5; var distanceJoint = ig.world.CreateJoint(dJoint); if(i > 0){ var distanceX = posX/this.worldScale-this.blobs[this.blobs.length-2].pos.x; var distanceY = posY/this.worldScale-this.blobs[this.blobs.length-2].pos.y; var distance = Math.sqrt(distance*distanceX+distanceY*distanceY); dJoint.bodyA = this.blobs[this.blobs.length-2]; dJoint.bodyB = this.blobs[this.blobs.length-1]; dJoint.localAnchorA = new b2.Vec2(0, 0); dJoint.localAnchorB = new b2.Vec2(0, 0); dJoint.length = distance; distanceJoint = ig.world.CreateJoint(dJoint); } if(i === blobMassParticles-1){ var distanceX = posX/this.worldScale-this.blobs[1].pos.x; var distanceY = posY/this.worldScale-this.blobs[1].pos.y; var distance = Math.sqrt(distance*distanceX+distanceY*distanceY); dJoint.bodyA = this.blobs[1]; dJoint.bodyB = this.blobs[this.blobs.length-1]; dJoint.localAnchorA = new b2.Vec2(0, 0); dJoint.localAnchorB = new b2.Vec2(0, 0); dJoint.length = distance; distanceJoint = ig.world.CreateJoint(dJoint); } } }, update: function () { this.parent(); }, draw: function () { this.parent(); }, blob: function(x, y, r){ var bodyDef = new b2.BodyDef(); bodyDef.position.Set(x/this.worldScale, y/this.worldScale); bodyDef.type = b2.Body.b2_dynamicBody; var circleDef = new b2.CircleDef(); circleDef.density = 1; circleDef.friction = .5; circleDef.restitution = .4; circleDef.radius = 10; circleDef.type = b2.Body.b2_dynamicBody; var circleShape = new b2.CircleShape(circleDef); var fixtureDef = new b2.FixtureDef(); //Thrown Here fixtureDef.shape = circleShape; fixtureDef.density = 1; fixtureDef.restitution = .4; fixtureDef.friction = .5; var blob = ig.world.CreateBody(bodyDef); blob.CreateFixture(fixtureDef); return blob; } }); });
and here is my main.js:
ig.module('game.main').requires('impact.game', 'impact.font', 'impact.image', 'plugins.box2d.game', 'game.entities.blob', 'plugins.Button', 'game.levels.splashscreen', 'plugins.impact-splash-loader').defines(function () { SplashScreen = ig.Box2DGame.extend({ titlefont: new ig.Font("media/titlefont.font.png"), buttons: [], buttonsData: { xlocs: [832, 960, 1792, 1920, 2752, 2880], w: 128, h: 85 }, boundingBox: null, gravity: new b2.Vec2(0, 30), worldScale: 30, player: null, init: function () { ig.game.loadLevel(LevelSplashscreen); ig.input.bind(ig.KEY.MOUSE1, 'click'); for (var i = 0; i < 6; i++) { var button = ig.game.spawnEntity(Button, this.buttonsData.xlocs[i], 64, { flip: i % 2 === 0 ? false : true, size: { x: this.buttonsData.w, y: this.buttonsData.h }, pressedUp: function () { console.log("nav button"); } }); this.buttons.push(button); } this.player = ig.game.spawnEntity("EntityBlob", 50, 50, { worldScale: this.worldScale }); }, update: function () { this.updateWorld(); this.parent(); }, draw: function () { this.parent(); }, updateWorld: function () { ig.world.Step(ig.system.tick, 5); ig.world.ClearForces(); } }); ig.main('#canvas', SplashScreen, 60, 960, 640, 1, ig.ImpactSplashLoader); });
can anyone help me figure out what it is that i'm doing wrong? At first I thought I was getting a different error because i wasn't passing the right thing to the constructor for the b2.CircleShape(), but when I corrected that i get the error above. And now i'm stumped. any help would be greatly appreciated.
Another thing that i haven't been able to find any info on or anything is how to spawn box2d entities. i have been assuming that it is the same as normal but i could be wrong. can anyone confirm the correct way to spawn a box2d entity? Thanks everyone!