As some of you in the forums already know, I’m creating an FPS game and first I’m making the prototype. The last step to finish it is to shoot bullets out of a gun but I couldn’t make it work so I’m asking here for help.
I think most users want to see a nice shooting effect. I’m personally thinking about an example using raycast, but I’m not sure about this effect yet. The problem is that you get the result of a raycast instantly, while the moving projectile is not arrived yet. So using a moving projectile as bullet is not really an option in combination with a raycast. At least not for a simple example.
Well I did use it, but then I got rid of it with the new raycast because it went through walls. I could theoretically add it back in and just resize it to match the distance to the hit point but considering some objects like grenades cast 360 rays that would be a calculation nightmare. Oh and I just realized that all those calculations happen in the same frame so it would just uselessly move the box around until it gets rendered at its final rotation.
Can you please give me code that I can use by forking my project please? It would be really helpful as when I fix mistakes, other mistakes are occuring.
var FirstPersonMovement = pc.createScript('firstPersonMovement');
FirstPersonMovement.attributes.add('camera', {
type: 'entity',
description: 'Optional, assign a camera entity, otherwise one is created'
});
FirstPersonMovement.attributes.add('power', {
type: 'number',
default: 2500,
description: 'Adjusts the speed of player movement'
});
FirstPersonMovement.attributes.add('jumpImpulse', {
type: 'number',
default: 3,
description: 'Adjusts the impulse of player Jump'
});
FirstPersonMovement.attributes.add('gravity', {
type: 'number',
default: 90,
description: 'Adjusts the gravity'
});
FirstPersonMovement.attributes.add('lookSpeed', {
type: 'number',
default: 0.25,
description: 'Adjusts the sensitivity of looking'
});
FirstPersonMovement.prototype.initialize = function () {
this.force = new pc.Vec3();
this.eulers = new pc.Vec3();
this.canJump = 1; // Use this or I suggest this.canJump = true;
var app = this.app;
// Listen for mouse move events
app.mouse.on("mousemove", this._onMouseMove, this);
// when the mouse is clicked hide the cursor
app.mouse.on("mousedown", function () {
app.mouse.enablePointerLock();
console.log("Mouse Clicked");
}, this);
// Check for required components
if (!this.entity.collision) {
console.error("First Person Movement script needs to have a 'collision' component");
}
if (!this.entity.rigidbody || this.entity.rigidbody.type !== pc.BODYTYPE_DYNAMIC) {
console.error("First Person Movement script needs to have a DYNAMIC 'rigidbody' component");
}
};
//update code called every frame
FirstPersonMovement.prototype.update = function (dt) {
if (!this.camera) {
this._createCamera();
}
var force = this.force;
var app = this.app;
var forward = this.camera.forward;
var right = this.camera.right;
let power = this.power;
// movement
var x = 0;
var z = 0;
// Use W-A-S-D keys to move player
// Check for key presses
if (app.keyboard.isPressed(pc.KEY_A) || app.keyboard.isPressed(pc.KEY_Q)) {
x -= right.x;
z -= right.z;
}
if (app.keyboard.isPressed(pc.KEY_D)) {
x += right.x;
z += right.z;
}
if (app.keyboard.isPressed(pc.KEY_W)) {
x += forward.x;
z += forward.z;
power = this.power * (app.keyboard.isPressed(pc.KEY_SHIFT) ? 3 : 1);
console.log('power: ', power);
}
if (app.keyboard.isPressed(pc.KEY_S)) {
x -= forward.x;
z -= forward.z;
}
if (app.keyboard.isPressed(pc.KEY_SPACE) && this.canJump == 1) {
this.entity.rigidbody.applyImpulse(0, this.jumpImpulse, 0)
}
if (x !== 0 || z !== 0) {
force.set(x, 0, z).normalize().scale(power);
this.entity.rigidbody.applyForce(force);
}
if (this.entity.getPosition().y > 3) {
this.canJump = 0
}
if (this.entity.getPosition().y <= 3) {
this.canJump = 1
}
if (this.canJump == 0) {
this.entity.rigidbody.applyForce(new pc.Vec3(0, -this.gravity, 0));
}
this.camera.setLocalEulerAngles(this.eulers.y, this.eulers.x, 0);
};
FirstPersonMovement.prototype._onMouseMove = function (e) {
if (pc.Mouse.isPointerLocked() || e.buttons[0]) {
this.eulers.x -= this.lookSpeed * e.dx;
this.eulers.y -= this.lookSpeed * e.dy;
}
};
FirstPersonMovement.prototype._createCamera = function () {
this.camera = new pc.Entity();
this.camera.setName("First Person Camera");
this.camera.addComponent("camera");
this.entity.addChild(this.camera);
this.camera.translateLocal(0, 0.5, 0);
};