166 lines
4.5 KiB
C#
166 lines
4.5 KiB
C#
|
using Godot;
|
||
|
using System;
|
||
|
|
||
|
public partial class Chloek : StaticBody2D
|
||
|
{
|
||
|
private Area2D probe; // probe to find the tile in the in the direction of the player's movement
|
||
|
private AnimatedSprite2D sprite; // animated sprite of player
|
||
|
public Vector2 spriteMovement; // 2d vector dictating sprite's independant movement
|
||
|
private AudioStreamPlayer Interact;
|
||
|
private AudioStreamPlayer Reset;
|
||
|
private AudioStreamPlayer Snore;
|
||
|
private bool canMove = true; // if the player can move
|
||
|
private bool blocked; // if the player shouldn't move
|
||
|
private int pause; //timer for when processing needs to occur
|
||
|
private int idle; // timer for idling based actions (animations mostly)
|
||
|
private int snoreTimer; //timer for snoring
|
||
|
private Vector2 movement; //last movement direction
|
||
|
|
||
|
private void _on_probe_body_entered(Node2D body) //a bit slow to respond, but it does it's job most of the time
|
||
|
{
|
||
|
if (body.IsInGroup("Wall")) // if probe detects walls
|
||
|
{
|
||
|
blocked = true; // stops from moving
|
||
|
}
|
||
|
if (body.IsInGroup("Obsticals") && !body.IsInGroup("Lazer")) // if probe detects an obstical that isnt a lazer
|
||
|
{
|
||
|
blocked = true; //stops from moving;
|
||
|
}
|
||
|
// previous two can probably be lumped into one if statement
|
||
|
}
|
||
|
|
||
|
private void _on_probe_body_exited(Node2D body)
|
||
|
{
|
||
|
if (body.IsInGroup("Wall")) //if probe detects walls
|
||
|
{
|
||
|
blocked = false; // allow moving
|
||
|
}
|
||
|
if (body.IsInGroup("Obsticals") && !body.IsInGroup("Lazer")) //if probe detects an obstical that isnt a lazer
|
||
|
{
|
||
|
blocked = false; // allow moving
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void _on_chloek_area_body_entered(Node2D body)
|
||
|
{
|
||
|
//this "bounces" the player back if they enter a lazer
|
||
|
//I only need this becuase Lazers break normal collision checks
|
||
|
if (body.IsInGroup("Lazer"))
|
||
|
{
|
||
|
pause = 0;
|
||
|
canMove = true;
|
||
|
probe.Position = movement * -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void _Ready() // on startup
|
||
|
{
|
||
|
// setting starting coditions for variables
|
||
|
probe = GetNode<Area2D>("Probe");
|
||
|
sprite = GetNode<AnimatedSprite2D>("ChloekSprite");
|
||
|
Interact = GetNode<AudioStreamPlayer>("Interact");
|
||
|
Reset = GetNode<AudioStreamPlayer>("Reset");
|
||
|
Snore = GetNode<AudioStreamPlayer>("Snore");
|
||
|
spriteMovement = Position;
|
||
|
}
|
||
|
|
||
|
public override void _PhysicsProcess(double delta) // can update multipul times a frame so movment happens propperly
|
||
|
{
|
||
|
//finished tasks become functions
|
||
|
if (pause == 0)
|
||
|
{
|
||
|
move();
|
||
|
animations();
|
||
|
}
|
||
|
else {pause--;}
|
||
|
}
|
||
|
|
||
|
public void animations()
|
||
|
{
|
||
|
idle++;
|
||
|
if (sprite.GlobalPosition != Position) //if intending to move
|
||
|
{
|
||
|
if (idle > 0)
|
||
|
{
|
||
|
idle = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch (idle) //switch case for all time based animations
|
||
|
{
|
||
|
case 0: sprite.Play("Walk"); break;
|
||
|
case 1: sprite.Play("Idle"); sprite.Stop(); break;
|
||
|
case 1200: sprite.Play("Idle"); break;
|
||
|
case 1900: sprite.Play("Eepy"); break;
|
||
|
}
|
||
|
if(idle >= 1900)
|
||
|
{
|
||
|
if(snoreTimer > 400)
|
||
|
{
|
||
|
Snore.Play();
|
||
|
snoreTimer = 0;
|
||
|
}
|
||
|
else {snoreTimer++;}
|
||
|
}
|
||
|
else {snoreTimer = 0;}
|
||
|
|
||
|
spriteMovement = spriteMovement.MoveToward(Position, 1f); // sprite lags behind player position slightly
|
||
|
sprite.GlobalPosition = spriteMovement; //seems redundant but is nessesary
|
||
|
}
|
||
|
|
||
|
public void move()
|
||
|
{
|
||
|
if (canMove == true && blocked == false) //if player can move and isnt walking into something
|
||
|
{
|
||
|
spriteMovement = Position; //sprite snaps to previous position
|
||
|
Position = probe.GlobalPosition; //player position changes to probe's position
|
||
|
canMove = false; //prevents the player from moving every chance they get
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
canMove = false; //prevents the player from walking as soon as they aren't blocked
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void _Input(InputEvent @event)
|
||
|
{
|
||
|
if (@event.IsActionPressed("Reset"))
|
||
|
{
|
||
|
Reset.Play();
|
||
|
}
|
||
|
if(pause == 0) //pauses delay movement enough so that you can't walk into walls
|
||
|
{
|
||
|
if (@event.IsActionPressed("Up"))
|
||
|
{
|
||
|
movement = new Vector2(0,-20);
|
||
|
canMove = true;
|
||
|
pause = 3;
|
||
|
}
|
||
|
|
||
|
else if (@event.IsActionPressed("Down"))
|
||
|
{
|
||
|
movement = new Vector2(0,20);
|
||
|
canMove = true;
|
||
|
pause = 3;
|
||
|
}
|
||
|
|
||
|
else if (@event.IsActionPressed("Left"))
|
||
|
{
|
||
|
movement = new Vector2(-20,0);
|
||
|
sprite.FlipH = true; //sprite flips to face left
|
||
|
canMove = true;
|
||
|
pause = 3;
|
||
|
}
|
||
|
|
||
|
else if (@event.IsActionPressed("Right"))
|
||
|
{
|
||
|
movement = new Vector2(20,0);
|
||
|
sprite.FlipH = false; //sprite flips to face right
|
||
|
canMove = true;
|
||
|
pause = 3;
|
||
|
}
|
||
|
probe.Position = movement; //i could do this without movement, but i need it so that other sections can use it.
|
||
|
}
|
||
|
}
|
||
|
}
|