2D Game Update
- Keshav Batra
- Jan 21, 2022
- 2 min read
I finally got something worth showing to everybody. I basically used the animations that were given to me using pixel adventure. This include attacks, jumping, and movement. I even added a camera movement for it to follow the player whenever it moves. Below is some footage of the gameplay and some of the code used to make this all happen.
Camera Movement
private void Update()
{
//room camera
//transform.position = Vector3.SmoothDamp(transform.position, new Vector3(currentPosX, transform.position.y, transform.position.z), ref velocity, speed);
//Follow Player
transform.position = new Vector3(player.position.x + lookAhead, transform.position.y, transform.position.z);
lookAhead = Mathf.Lerp(lookAhead, (aheadDistance * player.localScale.x), Time.deltaTime * cameraSpeed);
}
public void MoveToNewRoom(Transform _NewRoom)
{
currentPosX = _NewRoom.position.x;
}
}
Attack
private void Awake()
{
anim = GetComponent<Animator>();
playerMovement = GetComponent<PlayerMovement>();
}
private void Update()
{
if (Input.GetMouseButton(0) && cooldownTimer > attackCoolDown && playerMovement.canAttack())
Attack();
cooldownTimer += Time.deltaTime;
}
private void Attack()
{
anim.SetTrigger("attack");
cooldownTimer = 0;
fireballs[FindFireball()].transform.position = firePoint.position;
fireballs[FindFireball()].GetComponent<Projectile>().SetDirection(Mathf.Sign(transform.localScale.x));
//pool fireballs
}
private int FindFireball()
{
for(int i =0; i<fireballs.Length; i++)
{
if (!fireballs[i].activeInHierarchy)
return i;
}
return 0;
}
Fireball Animation
private void Awake()
{
anim = GetComponent<Animator>();
boxcollider = GetComponent<BoxCollider2D>();
}
private void Update()
{
if (hit) return;
float movementSpeed = speed * Time.deltaTime*direction;
transform.Translate(movementSpeed, 0, 0);
lifetime += Time.deltaTime;
if (lifetime > 5) gameObject.SetActive(false);
}
private void OnTriggerEnter2D(Collider2D collision)
{
hit = true;
boxcollider.enabled = false;
anim.SetTrigger("Explode");
}
public void SetDirection(float _direction)
{
lifetime = 0;
direction = _direction;
gameObject.SetActive(true);
hit = false;
boxcollider.enabled = true;
float localeScaleX = transform.localScale.x;
if (Mathf.Sign(localeScaleX) != _direction)
localeScaleX = -localeScaleX;
transform.localScale = new Vector3(localeScaleX, transform.localScale.y, transform.localScale.z);
}
private void Deactivate()
{
gameObject.SetActive(false);
}
}
Player Movement
private void Awake()
{
body = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
boxCollider = GetComponent<BoxCollider2D>();
}
private void Update()
{
horizontalInput = Input.GetAxis("Horizontal");
//Flips the player when moving right and left
if (horizontalInput > 0.01f)
transform.localScale = Vector3.one;
else if (horizontalInput < -0.01f)
transform.localScale = new Vector3(-1,1,1);
//Set animator parameters
anim.SetBool("Run", horizontalInput != 0);
anim.SetBool("Grounded", isGrounded());
//Wall jump logic
if (wallJumpCooldown > 0.2f)
{
if (Input.GetKey(KeyCode.Space))
Jump();
body.velocity = new Vector2(horizontalInput * speed, body.velocity.y);
if (OnWall() && !isGrounded())
{
body.gravityScale = 0;
body.velocity = Vector2.zero;
}
else
body.gravityScale = 3;
if (Input.GetKey(KeyCode.Space))
Jump();
}
else
wallJumpCooldown += Time.deltaTime;
print(OnWall());
}
private void Jump()
{
if (isGrounded())
{
body.velocity = new Vector2(body.velocity.x, jumpPower);
anim.SetTrigger("Jump");
grounded = false;
}
else if(OnWall() && !isGrounded())
{
if (horizontalInput == 0)
{
body.velocity = new Vector2(-Mathf.Sign(transform.localScale.x) * 10, 0);
transform.localScale = new Vector3(-Mathf.Sign(transform.localScale.x), transform.localScale.y, transform.localScale.z);
}
else
body.velocity = new Vector2(-Mathf.Sign(transform.localScale.x) * 3, 6);
wallJumpCooldown = 0;
}
}
private bool isGrounded()
{
RaycastHit2D raycastHit = Physics2D.BoxCast(boxCollider.bounds.center, boxCollider.bounds.size, 0, Vector2.down, 0.1f, groundLayer);
return raycastHit.collider != null;
}
private bool OnWall()
{
RaycastHit2D raycastHit = Physics2D.BoxCast(boxCollider.bounds.center, boxCollider.bounds.size, 0, new Vector2(transform.localScale.x, 0), 0.1f, WallLayer);
return raycastHit.collider != null;
}
public bool canAttack()
{
return horizontalInput == 0 && isGrounded() && !OnWall();
}
Comments