Showing posts with label BananaMonkey. Show all posts
Showing posts with label BananaMonkey. Show all posts

Thursday, July 26, 2012

Adding sound to the Box2D world

This is a continuation from the prev post, and it gives the code flow for "Let there be sound".

Add audio tag to your html page,
.....
<body onLoad="init();">
      <canvas id="canvas" width="600" height="400" style="background-color:#333333;" ></canvas>
      <audio id="audio" src="media/misc003.mp3">
 </audio>
</body>
.....

Initializing the audio object in the js file
initWorld.js
    audio = document.getElementById("audio");

Event handling for the audio object can be added as follows
    audio.addEventListener("playing", start, false);
    audio.addEventListener("pause", stop, false);
    audio.addEventListener("ended", stop, false);
    function start() {
    }
    function stop() {
    }

playing sound in the Detect collision loop
....
if((body1.GetUserData().name == "Bat" && body2.GetUserData().name == "Ball") ||(body1.GetUserData().name == "Ball" && body2.GetUserData().name == "Bat")){
audio.play();
...
}
....

other methods that used for audio manipulation within js
Alternative, to play audio from JavaScript you can simply do this:
       var audio = new Audio("song.mp3");
       audio.play();
To pause
        audioElement.pause();
Volume Controller
        audioElement.volume=0
Play at exactly 20 seconds in the song
        audioElement.currentTime=35;
        audioElement.play();

Tad dam we are done, this plays the audio file everytime there is a collision between the bat and the ball. 

Reference
HTML5 Audio Tag
https://developer.mozilla.org/en/Using_audio_and_video_in_Firefox
http://www.webkit.org/blog/140/html5-media-support/
HTML5 Supported Audio Formats

Wednesday, July 25, 2012

BananaMonkey

Hi guys sharing the completed BananaMonkey mini project here.
p.s. Sorry about the indentation in the code, the editor screws it up :( 

index.html

<html>
   <head>
      <title>Box2dWeb</title>
   </head>
   <style type="text/css" media="screen">
    canvas, img { display:block; margin:1em auto; border:1px solid black; }
    canvas { background:url(image/BG2.jpg) }
  </style>

 <body onLoad="init();">
      <canvas id="canvas" width="600" height="400" style="background-color:#333333;" ></canvas>
   </body>
   <script type="text/javascript" src="libs/Box2dWeb-2.1.a.3.min.js"></script>
<script type="text/javascript" src="js/initWorld.js"></script>
<script type="text/javascript" src="js/baseclass.js"></script>
<script type="text/javascript" src="js/gameDemo.js"></script>
</html>

initWorld.js
- initializes the world
- handles events
- handles collision
- redraws world


var world;
var b2Vec2 = Box2D.Common.Math.b2Vec2
        ,      b2BodyDef = Box2D.Dynamics.b2BodyDef
        ,      b2Body = Box2D.Dynamics.b2Body
        ,      b2FixtureDef = Box2D.Dynamics.b2FixtureDef
        ,      b2World = Box2D.Dynamics.b2World
        ,      b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape
        ,      b2CircleShape = Box2D.Collision.Shapes.b2CircleShape
        ,      b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef
        ,      b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef
        ,      b2RopeJointDef = Box2D.Dynamics.Joints.b2RopeJointDef
        ,      b2MouseJointDef =  Box2D.Dynamics.Joints.b2MouseJointDef
        ,      b2DebugDraw = Box2D.Dynamics.b2DebugDraw
        ,      b2Fixture = Box2D.Dynamics.b2Fixture
        ,      b2AABB = Box2D.Collision.b2AABB
        ,      b2Color = Box2D.Common.b2Color;
var SCALE = 30;
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
function init() {
world = new b2World(new b2Vec2(0,10), true);
var debugDraw = new b2DebugDraw();
        debugDraw.SetSprite ( document.getElementById ("canvas").getContext ("2d"));
        debugDraw.SetDrawScale(SCALE);     //define scale
        debugDraw.SetFillAlpha(0.3);    //define transparency
        debugDraw.SetLineThickness(1.0);
        debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
        world.SetDebugDraw(debugDraw);
initGame();
window.setInterval(update,1000/60);
}
window.setInterval(removeObjScheduledForRemoval, 1000/90);
document.body.addEventListener("keydown", keyset, false);
var moveLeft, moveRight;
function keyset(evt){
//37: "left", 39: "right"
if(evt.keyCode == 37){
moveLeft = 1;
moveRight = 0;
}
if(evt.keyCode == 39){
moveLeft = 0;
moveRight = 1;
}  
}
var bricksScheduledForRemoval = Array();
var index = -1;
function removeObjScheduledForRemoval()
{
for(var i = 0; i <= index; i++){
world.DestroyBody(bricksScheduledForRemoval[i]);
bricksScheduledForRemoval[i] = null;
}
bricksScheduledForRemoval = Array();
index = -1;
}
function update() {
world.Step(1 / 60, 10, 10);
        world.ClearForces();
        context.clearRect(0, 0, canvas.width, canvas.height);
world.DrawDebugData(); // comment to disable debugdraw

//detect collision
for (var c = world.GetContactList() ; c ; c = c.GetNext()){
var body1 = c.GetFixtureA().GetBody();
      var body2 = c.GetFixtureB().GetBody();
if((body1.GetUserData().name == "Bat" && body2.GetUserData().name == "Ball") ||(body1.GetUserData().name == "Ball" && body2.GetUserData().name == "Bat")){
var ImpulseVec = new b2Vec2((Math.random() * 3), - (Math.random() * 5));
var point = new b2Vec2((body2.GetWorldCenter().x),(body2.GetWorldCenter().y));
body2.ApplyImpulse(ImpulseVec, point);
}
for (var i = 0; i < 3 ; i = i + 1)
{
  for(var j = 0; j <= 9 ; j = j + 1)
  {
  if(body1.GetUserData().name == ("Brick" + j + i) && body2.GetUserData().name == "Ball") {
bricksScheduledForRemoval[++index] = body1;
}else if(body1.GetUserData().name == "Ball" && body2.GetUserData().name == ("Brick" + j + i)){
bricksScheduledForRemoval[++index] = body2;
}
    }
}
}

// world redraw
for (b = world.GetBodyList() ; b; b = b.GetNext()) {
// draw the static world objects
if (b.GetType() == b2Body.b2_staticBody && b.GetUserData() != null){
updateSkin(b);
}
if (b.GetType() == b2Body.b2_dynamicBody && b.GetUserData() != null) {
if(b.GetUserData().name == "Bat"){
if(moveLeft){
moveLeft = 0;
var ImpulseVec = new b2Vec2(-30,0);
var point = new b2Vec2((b.GetWorldCenter().x ), (b.GetWorldCenter().y ));
b.ApplyImpulse(ImpulseVec, point);
}
if(moveRight){
moveLeft = 0;
var ImpulseVec = new b2Vec2(30,0);
var point = new b2Vec2((b.GetWorldCenter().x ), (b.GetWorldCenter().y ));
b.ApplyImpulse(ImpulseVec, point);
}
}
updateSkin(b);
}
}
}

baseclass.js
- Generic class for creation Box2D objects
- handles Box2D world to Canvas mapping


function createRigidBody(propList){
var fixDef = new b2FixtureDef;
        fixDef.density = propList.density;
        fixDef.friction = propList.friction;
        fixDef.restitution = propList.restitution;
        var bodyDef = new b2BodyDef;
if(propList.type == "StaticBody"){
    bodyDef.type = b2Body.b2_staticBody;
}
if(propList.type == "DynamicBody"){
bodyDef.type = b2Body.b2_dynamicBody;
}
if(propList.shape == "Box"){
fixDef.shape = new b2PolygonShape;
fixDef.shape.SetAsBox(propList.width, propList.height);
}
if(propList.shape == "Sphere"){
fixDef.shape = new b2CircleShape(propList.width)
}
bodyDef.position.x = propList.x;
bodyDef.position.y = propList.y;
rbData = new Object();
rbData.name = propList.name;
rbData.width = propList.width;
rbData.height = propList.height;
rbData.skin = propList.skin;
bodyDef.userData = rbData;
var rigidbody = world.CreateBody(bodyDef).CreateFixture(fixDef);
return rigidbody;
}

function updateSkin(b)
{
var pos = b.GetPosition();
context.save();
context.translate(b.GetWorldCenter().x * SCALE,b.GetWorldCenter().y * SCALE);
context.rotate(b.GetAngle());
width = b.GetUserData().width * SCALE;
height = b.GetUserData().height * SCALE;
context.drawImage(b.GetUserData().skin, -width, -height, (width)*2, (height)*2);


    context.restore();
}

gameDemo.js
- Creationg of the Game objects



function initGame(){
initBox();
initBat();
initBricks();
initBall();
}
function initGame2(){
initBox();
initPendullum();
initBasket();
}
function initBox(){
propertyList = new Object();
propertyList.density = 1.0;
propertyList.friction = 0.5;
propertyList.restitution = 0.1;
propertyList.x = 10;
propertyList.y = 14;
propertyList.width = 10;
propertyList.height = 1;
propertyList.type = "StaticBody";
propertyList.shape = "Box"
var image = new Image();
image.src = "image/border.png";
propertyList.skin = image;
propertyList.name = "Ground";
ground = createRigidBody(propertyList);
propertyList.x = 10;
propertyList.y = 0;
propertyList.width = 10;
propertyList.height = 0.3;
propertyList.name = "Roof";
roof = createRigidBody(propertyList);
propertyList.x = 0;
propertyList.y = 0;
propertyList.width = 0.4;
propertyList.height = 14;
propertyList.name = "rwall";
rwall = createRigidBody(propertyList);
propertyList.x = 20;
propertyList.y = 0;
propertyList.name = "lwall";
lwall = createRigidBody(propertyList);
}

function initBat(){
//create Basket
propertyList = new Object();
propertyList.density = 10.0;
propertyList.friction = 0.5;
propertyList.restitution = 0.2;
propertyList.x = 10;
propertyList.y = 13;
propertyList.width = 1.5;
propertyList.height = .8;
propertyList.type = "DynamicBody";
propertyList.shape = "Box"
var image = new Image();
image.src = "image/moneky.png";
propertyList.skin = image;
propertyList.name = "Bat";
bat = createRigidBody(propertyList);
}
function initBall(){
propertyList = new Object();
propertyList.density = 1.0;
propertyList.friction = 0.5;
propertyList.restitution = 0.1;
propertyList.x = 10.0;
propertyList.y = 5.0;
propertyList.width = 0.5;
propertyList.height = 0.5;
propertyList.type = "DynamicBody";
propertyList.shape = "Sphere"
var image = new Image();
image.src = "image/ball.png";
propertyList.skin = image;
propertyList.name = "Ball";
pendullumball = createRigidBody(propertyList);
}

function initBricks() {
propertyList = new Object();
propertyList.density = 10.0;
propertyList.friction = 0.5;
propertyList.restitution = 0.2;
propertyList.width = 0.7;
propertyList.height = 0.5;
propertyList.type = "StaticBody";
propertyList.shape = "Box"
var image = new Image();
image.src = "image/banana.png";
propertyList.skin = image;
var x = 1, y = 1;
for (var i = 0; i < 3 ; i = i + 1)
{
for(var j = 0; j <= 9 ; j = j + 1)
{
propertyList.x = x;
propertyList.y = y;
propertyList.name = "Brick" + j + i;
createRigidBody(propertyList);
x = x + 2;
}
y = y + 0.9;
x = 1;
}
}

Yaeeee my short term project is completed. Now on we march to bigger goals :D


The game doesn't end when the monkey drops the ball since i suck at playing it :)

Reference -
Removing bodies safely