You can improve the accuracy by using "b2GetBodyLinearVelocityFromWorldPointX/Y" on each body with the position of one of the contact points ("b2GetContactManifoldWorldPointX/Y"). You can then subtract these velocities to see the "force" of the collision. You could also multiply the velocities by the masses of the bodies to see if that produces better results. I'll see if I can write some example code to make it easier.
edit:
b2FindWorldContacts world
while b2GetContact()
if b2GetContactIsTouching()
bodyA = b2GetFixtureBody(b2GetContactFixtureA())
bodyB = b2GetFixtureBody(b2GetContactFixtureB())
x# = b2GetContactManifoldWorldPointX(0)
y# = b2GetContactManifoldWorldPointY(0)
velxA# = b2GetBodyLinearVelocityFromWorldPointX(bodyA, x#, y#)
velyA# = b2GetBodyLinearVelocityFromWorldPointY(bodyA, x#, y#)
velxB# = b2GetBodyLinearVelocityFromWorldPointX(bodyB, x#, y#)
velyB# = b2GetBodyLinearVelocityFromWorldPointY(bodyB, x#, y#)
velx# = (velxA# - velxB#)*b2GetContactManifoldWorldNormalX()
vely# = (velyA# - velyB#)*b2GetContactManifoldWorldNormalY()
if velx#*velx#+vely#*vely# > 10000.0
a2FillCircle x#, y#, 5.0, 0xFFFF0000
endif
endif
endwhile
As for breaking through a wall: you could store the balls velocity somewhere (in an array, or you could use a DBPro vector2 and store the ID of the vector with the body using b2SetObjectUserData). Then when you detect one of these collision where something breaks using the method above. You restore the old velocity to the body which didn't break, possibly slowing it down a bit based on how difficult the first body was to break.
[b]
