Hold to jump higher function not properly working - game-development

I'm currently making a game and I made this simple script that checks when a player holds down the up arrow key so that the longer you hold the button, the further upwards you jump. It works fine and all, until you decide to jump again mid-air, then the gravity of the is_action_just_pressed is added into the player's total gravity which is kind of a problem.
I'm kind of new to GDScript and programming in general, so a little help would really be appreciated!
Here's my (bad) code:
var gravity : int = 1800
var vel : Vector2 = Vector2()
func _physics_process(delta):
vel.x = 0
vel = move_and_slide(vel, Vector2.UP)
vel.y += gravity * delta
if Input.is_action_just_pressed("jump") and is_on_floor():
vel.y -= jumpforce
gravity -= 500
if Input.is_action_just_released("jump"):
gravity += 500
There isn't anything in godot for checking if the player is holding down a button and I'm not sure what is wrong with my code, so I have no idea what is causing this issue or how to fix it.

There isn't anything in godot for checking if the player is holding down a button
Instead of using is_action_just_pressed and is_action_just_released which tell you if the action was pressed or released since the last frame, use is_action_pressed which tell you if the action is currently pressed.
It works fine and all, until you decide to jump again mid-air, then the gravity of the is_action_just_pressed is added into the player's total gravity which is kind of a problem.
The issue is that you are not keeping track if player jumped. For example:
if Input.is_action_just_pressed("jump") and is_on_floor():
jumped = true
vel.y -= jumpforce
gravity -= 500
if Input.is_action_just_released("jump") and jumped:
jumped = false
gravity += 500
With jumped declared at the top of the script, similar to gravity and vel.

Related

GODOT - How can I stop the player from hitting the default walls in GODOT and instead keep going

I am making a platformer game and I dont know how to make the player to dont collide with those default walls! Ive already setted the camera follow but now my player is getting stuck on those default walls!
Here´s the player movement code:
extends KinematicBody2D
const GRAVITY = 600
const WALK_SPEED = 200
const JUMP_FORCE = 350
var velocity = Vector2()
var screen_size
func _ready():
screen_size = get_viewport_rect().size
func _physics_process(delta):
velocity.y += delta * GRAVITY
if Input.is_action_pressed("ui_left"):
velocity.x = -WALK_SPEED
elif Input.is_action_pressed("ui_right"):
velocity.x = WALK_SPEED
else:
# velocity.x = 0
# smoothen the stop
velocity.x = lerp(velocity.x, 0, 0.1)
if Input.is_action_pressed("ui_up") and is_on_floor():
velocity.y = -JUMP_FORCE
velocity = move_and_slide(velocity, Vector2.UP)
# prevent player going out of screen
position.x = clamp(position.x, 0, screen_size.x)
position.y = clamp(position.y, 0, screen_size.y)
Please help!
The player just gets blocked as shown in the image!
Like I cant advance more from that position idk why. Sorry my english is bad.
Please help, thanks in advance!
My Player gets stuck when he reaches that blue line when the game is running. I just want to desactivate that. Do you know any way?
I think its because the player can only move to the size of the screen, because when I put the game in FullScreen, I can move much further.
Right there in the code is what you describe:
# prevent player going out of screen
position.x = clamp(position.x, 0, screen_size.x)
position.y = clamp(position.y, 0, screen_size.y)
If you don't want to limit the player to the screen, remove that code.
On a similar note, make sure you have a camera following the player. The simplest way to do it is to put a Camera2D as child of the player and set its current property to true.

Tile Collision In GML

I am making a game based on the game AZ on the website Y8, and I am having problems with tile collisions.
the player moves basically by giving it speed when up is pressed, then rotating left or right.
direction = image_angle;
if(keyForward)
{
speed = 2;
}
else speed = 0;
// rotate
if(keyRotateLeft)
{
image_angle = image_angle + 5;
}
if(keyRotateRight)
{
image_angle = image_angle - 5;
}
then I said when the player collides with the tile speed = 0. But the player gets stuck and can't move anymore. is there a better way to do this.
A simple approach would be as following:
Attempt to rotate
Check if you are now stuck in a wall
If you are, undo the rotation.
A more advanced approach would be to attempt pushing the player out of solids while rotating.
Alternatively, you may be able to get away with giving the player a circular mask and not rotating the actual mask (using a user-defined variable instead of image_angle).

Why are my bullets flying in weird directions?

I've been making a twin-stick shooter with GML for a while, and I've gotten to the point where I want the ship to shoot bullets. I wrote the code below, with the intention of making the fire fire at wherever the cursor is, but for some reason the bullets fire in strange directions. One time it will be shooting in the right direction, at other times it will be towards an angle, other times behind the ship. The only clue I have is that for some reason it's not genuinely random, it only seems to change whenever I move the cursor or the ship. Can someone please check my code?
image_angle = point_direction(x,y,mouse_x,mouse_y);
if (mouse_check_button(mb_left) && Reload < 0)
{
angle = point_direction(x,y,mouse_x,mouse_y);
Reload = 20;
with (instance_create_layer(x+cos(angle)*50, y+sin(angle)*50, "Bullets", Bullet))
{
angle = other.angle;
dx = cos(angle);
dy = sin(angle);
image_angle = angle;
}
}
else {Reload = clamp(Reload-1, -10, 20)}

THREEJS: Rotating the camera while lookingAt

I have a moving camera in camera container which flies arond the scene on giving paths like an airplane; so it can move to any position x,y,z positive and negative. The camera container is looking at his own future path using a spline curve.
Now I want to rotate the camera using the mouse direction but still keeping the general looking at position while moving forward with object. You could say, i want to turn my head on my body: while moving the body having the general looking at direction, i am turning my head around to lets say 220 degree up and down. So i can't look behind my body.
In my code the cameraContainer is responsible to move on a pline curve and to lookAt the moving direction. The camera is added as a child to the cameraContainer responsible for the rotation using the mouse.
What i don't get working properly is the rotation of the camera. I guess its a very common problem. Lets say the camera when moving only on x-axes moves not straight, it moves like a curve. Specially in different camera positions, the rotation seems very different. I was tryiing to use the cameraContainer to avoid this problem, but the problem seems nothing related to the world coordinates.
Here is what i have:
// camera is in a container
cameraContainer = new THREEJS.Object3D();
cameraContainer.add(camera);
camera.lookAt(0,0,1);
cameraContainer.lookAt(nextPositionOnSplineCurve);
// Here goes the rotation depending on mouse
// Vertical
var mouseVerti = 1; // 1 = top, -1 = bottom
if(window.App4D.mouse.y <= instance.domCenterPos.y) // mouse is bottom?
mouseVerti = -1;
// how far is the mouse away from center: 1 most, 0 near
var yMousePerc = Math.abs(Math.ceil((instance.domCenterPos.y - window.App4D.mouse.y) / (instance.domCenterPos.y - instance.domBoundingBox.bottom) * 100) / 100);
var yAngleDiffSide = (instance.config.scene.camera.maxAngle - instance.config.scene.camera.angle) / 2;
var yRotateRan = mouseVerti * yAngleDiffSide * yMousePerc * Math.PI / 180;
instance.camera.rotation.x += yRotateRan; // rotation x = vertical
// Horizontal
var mouseHori = 1; // 1 = top, -1 = bottom
if(window.App4D.mouse.x <= instance.domCenterPos.x) // mouse is left?
mouseHori = -1;
// how far is the mouse away from center: 1 most, 0 near
var xMousePerc = Math.abs(Math.ceil((instance.domCenterPos.x - window.App4D.mouse.x) / (instance.domCenterPos.x - instance.domBoundingBox.right) * 100) / 100);
var xAngleDiffSide = (instance.config.scene.camera.maxAngle - instance.config.scene.camera.angle) / 2;
var xRotateRan = mouseHori * xAngleDiffSide * xMousePerc * Math.PI / 180;
instance.camera.rotation.y += xRotateRan; // rotation y = horizontal
Would be really thankful if someone can give me a hint!
I got the answer after some more trial and error. The solution is to simply take the initial rotation of y in consideration.
When setting up the camera container and the real camera as child of the container, i had to point the camera to the frontface of the camera container object, in order to let the camera looking in the right direction. That lead to the initial rotation of 0, 3.14, 0 (x,y,z). The solution was to added 3.14 to the y rotation everytime i assigned (as mentioned by WestLangley) the mouse rotation.
cameraReal.lookAt(new THREE.Vector3(0,0,1));
cameraReal.rotation.y = xRotateRan + 3.14;

THREE.js rotating camera around an object using orbit path

I am struggling in solving this problem.
On my scene, I have a camera which looks at the center of mass of an object. I have a some buttons that enable to set camera position on particular view (front view, back view,...) along a invisible sphere that surroung the object (constant radius).
When I click on the button, i would like the camera to move from its start position to the end position along the sphere surface. When camera moves I would like it to keep fixing center of mass of the object.
Has anyone have a clue on how to achieve this?
Thanks for help!
If you are happy/prefer to use basic trigonometry then in your initialisation section you could do this:
var cameraAngle = 0;
var orbitRange = 100;
var orbitSpeed = 2 * Math.PI/180;
var desiredAngle = 90 * Math.PI/180;
...
camera.position.set(orbitRange,0,0);
camera.lookAt(myObject.position);
Then in your render/animate section you could do this:
if (cameraAngle == desiredAngle) { orbitSpeed = 0; }
else {
cameraAngle += orbitSpeed;
camera.position.x = Math.cos(cameraAngle) * orbitRange;
camera.position.y = Math.sin(cameraAngle) * orbitRange;
}
Of course, your buttons would modify what the desiredAngle was (0°, 90°, 180° or 270° presumably), you need to rotate around the correct plane (I am rotating around the XY plane above), and you can play with the orbitRange and orbitSpeed until you hare happy.
You can also modify orbitSpeed as it moves along the orbit path, speeding up and slowing down at various cameraAngles for a smoother ride. This process is called 'tweening' and you could search on 'tween' or 'tweening' if you want to know more. I think Three.js has tweening support but have never looked into it.
Oh, also remember to set your camera's far property to be greater than orbitRadius or you will only see the front half of your object and, depending on what it is, that might look weird.