My Three.js / Physijs rafting game benefited from a step back yesterday. The code and the concepts are substantially simpler at this point. I am unsure if this is simple enough yet for anything less than an advanced chapter in Gaming JavaScript, but at least it is worth including at this point.
I will worry about further simplification another day. Tonight, I need to finish the game. This means that I need to add some obstacles that prevent the raft from reaching the end of its river.
After last night, I can group my river segment objects (water, river banks, joints between segments) in an invisible Physijs object—I use a Plane Mesh to ensure that it does not interact with my raft or any other game elements. To this river segment, I add a single (for now) obstacle:
function riverSegment(rotatiaon, offset) { // ... var length = 1500 , half = length / 2; var segment = new Physijs.PlaneMesh( new THREE.PlaneGeometry(10, 10), new THREE.Material() ); segment.rotation.y = rotation; // ... var water = new Physijs.PlaneMesh( new THREE.PlaneGeometry(length, 500), new THREE.MeshBasicMaterial({color: 0x483D8B}) ); water.position.x = half; segment.add(water); addObstacle(water); scene.add(segment); // ... }The
addObstacle()
function randomly places a box along the river segment:function addObstacle(water) { var width = 250 , length = 1500 , position = Math.random() * length; var obstacle = new Physijs.BoxMesh( new THREE.CubeGeometry( 25, 25, 25 ), Physijs.createMaterial( new THREE.MeshNormalMaterial() ) ); obstacle.position.y = 13; obstacle.position.x = position; water.add(obstacle); }This seems to work well enough as the raft is able to collide with the obstacles and can even come to rest on them:
Upon further reflection, that does not seem quite right. I gave no mass to the obstacles so the raft, continuously pushed by the river current, should be able to push the obstacles. I will worry about that another day.
For now, I would simply like to end the game once the raft collides with an obstacle. I start by adding a tracer bullet where the
gameOver()
function call will eventually go:function addObstacle(water) { // ... obstacle.addEventListener("collision", function(object) { console.log("Game over dude!") }); water.add(obstacle); }Only this does not work. I was sure that I had the callback syntax right. What could I be missing?
Eventually, I try adding the obstacle directly to the scene instead of to the river segment group:
function addObstacle(water) { // ... obstacle.addEventListener("collision", function(object) { console.log("Game over dude!") }); scene.add(obstacle); }This works… unfortunately. In fact, not only do I see the collision event, but I also notice that the raft is now able to push the obstacles along, sometimes into each other:
Although it works to add the obstacle to the scene, this is not a workable solution for my game. I need to add the obstacles to individual segments of the river—not attempt to calculate the world location of river segments so that I can try to place obstacles in the scene.
I try digging through the Physijs source some, but this seems to be related to ammo.js interactions. Such investigation is going to require more than a night's worth of work. Bummer.
Day #492
No comments:
Post a Comment