Question by
Konomira · Oct 16, 2015 at 09:05 PM ·
c#2djumpplatformerground detection
Checking if the player jumps while not grounded
In my 2D platformer, I have integrated a system where the player can jump up to 3 times, but only if there is a floor above them. When they jump for the second time, I want a LineRenderer to draw a line to a spot on the floor above them, giving the effect of them attaching a rope. My problem is that the rope appears on their first jump as well as the second and third. Here is the code that controls the rope:
Vector2 ropePosition = transform.FindChild("rope").GetComponent<Transform>().position;
ropePosition.x = GetComponent<Transform>().position.x + GetComponent<Rigidbody2D>().velocity.x;
ropePosition.y = GetComponent<Transform>().position.y + (height * 3);
if (Physics2D.Raycast(GetComponent<Transform>().position, ropePosition - new Vector2(GetComponent<Transform>().position.x, GetComponent<Transform>().position.y), Vector2.Distance(GetComponent<Transform>().position, ropePosition)))
{
if (!grounded && Input.GetKey(KeyCode.W) && ropesLeft > 0)
{
RaycastHit2D[] ropeHit;
ropeHit = Physics2D.RaycastAll(GetComponent<Transform>().position, ropePosition - new Vector2(GetComponent<Transform>().position.x, GetComponent<Transform>().position.y), Vector2.Distance(GetComponent<Transform>().position, ropePosition));
ropeLine.SetPosition(0, GetComponent<Transform>().position);
ropeLine.enabled = true;
if (ropeHit[0])
{
if (ropeHit[0].collider.tag == "floor" && Input.GetKeyDown(KeyCode.W) && !grounded)
{
ropeLine.SetPosition(1, ropeHit[0].point);
GetComponent<Rigidbody2D>().velocity = Vector2.zero;
GetComponent<Rigidbody2D>().AddForce((ropePosition - new Vector2(GetComponent<Transform>().position.x, GetComponent<Transform>().position.y)) * 75);
ropesLeft--;
}
}
}
else
{
ropeLine.enabled = false;
}
}
transform.FindChild("rope").GetComponent<Transform>().position = ropePosition;
The boolean grounded
is set to true in an OnCollisionStay2D
and is set to false in an OnCollisionExit2D
function. It seems that I can't check if the player presses "W" while not grounded because jumping sets grounded to false. Any idea how I'd fix this?
Comment