Skip to content

Commit

Permalink
mecanicas de personaje funcionando
Browse files Browse the repository at this point in the history
  • Loading branch information
kone9 committed Apr 26, 2020
1 parent 43e89ef commit 94b3700
Show file tree
Hide file tree
Showing 39 changed files with 2,160 additions and 82 deletions.
2 changes: 1 addition & 1 deletion .mono/metadata/scripts_metadata.editor
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"res://codigos/BoardManager.cs":{"modified_time":"1587380554","class":{"namespace":"","class_name":"BoardManager","nested":false}},"res://codigos/Escena_Principal.cs":{"modified_time":"1587392515","class":{"namespace":"","class_name":"Escena_Principal","nested":false}},"res://codigos/GameManager.cs":{"modified_time":"1587385613","class":{"namespace":"","class_name":"GameManager","nested":false}},"res://codigos/MovingObject.cs":{"modified_time":"1587654867","class":{"namespace":"","class_name":"MovingObject","nested":false}}}
{"res://codigos/BoardManager.cs":{"modified_time":"1587848329","class":{"namespace":"","class_name":"BoardManager","nested":false}},"res://codigos/Escena_Principal.cs":{"modified_time":"1587745563","class":{"namespace":"","class_name":"Escena_Principal","nested":false}},"res://codigos/GameManager.cs":{"modified_time":"1587745519","class":{"namespace":"","class_name":"GameManager","nested":false}},"res://codigos/MovingObject.cs":{"modified_time":"1587905680","class":{"namespace":"","class_name":"MovingObject","nested":false}},"res://codigos/Player.cs":{"modified_time":"1587905772","class":{"namespace":"","class_name":"Player","nested":false}},"res://codigos/SuelosScript/Suelo1.cs":{"modified_time":"1587836811","class":{"namespace":"","class_name":"Suelo1","nested":false}},"res://codigos/Wall.cs":{"modified_time":"1587905397","class":{"namespace":"","class_name":"Wall","nested":false}}}
2 changes: 1 addition & 1 deletion .mono/metadata/scripts_metadata.editor_player
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"res://codigos/BoardManager.cs":{"modified_time":"1587380554","class":{"namespace":"","class_name":"BoardManager","nested":false}},"res://codigos/Escena_Principal.cs":{"modified_time":"1587392515","class":{"namespace":"","class_name":"Escena_Principal","nested":false}},"res://codigos/GameManager.cs":{"modified_time":"1587385613","class":{"namespace":"","class_name":"GameManager","nested":false}},"res://codigos/MovingObject.cs":{"modified_time":"1587654867","class":{"namespace":"","class_name":"MovingObject","nested":false}}}
{"res://codigos/BoardManager.cs":{"modified_time":"1587848329","class":{"namespace":"","class_name":"BoardManager","nested":false}},"res://codigos/Escena_Principal.cs":{"modified_time":"1587745563","class":{"namespace":"","class_name":"Escena_Principal","nested":false}},"res://codigos/GameManager.cs":{"modified_time":"1587745519","class":{"namespace":"","class_name":"GameManager","nested":false}},"res://codigos/MovingObject.cs":{"modified_time":"1587905680","class":{"namespace":"","class_name":"MovingObject","nested":false}},"res://codigos/Player.cs":{"modified_time":"1587905772","class":{"namespace":"","class_name":"Player","nested":false}},"res://codigos/SuelosScript/Suelo1.cs":{"modified_time":"1587836811","class":{"namespace":"","class_name":"Suelo1","nested":false}},"res://codigos/Wall.cs":{"modified_time":"1587905397","class":{"namespace":"","class_name":"Wall","nested":false}}}
Binary file modified .mono/temp/bin/Debug/Rogue en Godot.dll
Binary file not shown.
Binary file modified .mono/temp/bin/Debug/Rogue en Godot.pdb
Binary file not shown.
Binary file not shown.
Binary file modified .mono/temp/obj/Debug/Rogue en Godot.dll
Binary file not shown.
Binary file modified .mono/temp/obj/Debug/Rogue en Godot.pdb
Binary file not shown.
3 changes: 3 additions & 0 deletions Rogue en Godot.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@
<Compile Include="codigos\Escena_Principal.cs" />
<Compile Include="codigos\GameManager.cs" />
<Compile Include="codigos\MovingObject.cs" />
<Compile Include="codigos\Player.cs" />
<Compile Include="codigos\SuelosScript\Suelo1.cs" />
<Compile Include="codigos\Wall.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Expand Down
6 changes: 4 additions & 2 deletions codigos/BoardManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,20 +96,22 @@ public void SetupScene(int level)//esto crea los muros del borde y el suelo..Tom
}


private void BoardSetup() //metodo para crear el escenario inciial
private async void BoardSetup() //metodo para crear el escenario inciial
{

//recorremos la X
for(int x = -1; x < columns + 1; x++ )//si el area es 8x8 quiero tambien incluir en ese area el borde,entonces si la x primera es el cero en -1 iria el muro
{
//recorremos la y
await ToSignal(GetTree().CreateTimer(0.01f),"timeout");
for(int y = -1; y < rows + 1; y++ )//lo mismo pasa en el eje y..Por eso empieza en -1
{

await ToSignal(GetTree().CreateTimer(0.01f),"timeout");
toInstantiate = GetRandomInArray(floorTiles);//devuelve un objeto instanciado de tipo sprite toma como parametro un array de packetscene

if(x == -1 || y ==-1 || x == columns || y == rows )//si la posicion pertenece al borde
{
//await ToSignal(GetTree().CreateTimer(1.0f),"timeout");
//referencio a un elemento aleatorio del borde
toInstantiate = GetRandomInArray(outerWallTiles);//devuelve un objeto isntanciado de tipo sprite toma como parametro un array de packetscene
}
Expand Down
4 changes: 2 additions & 2 deletions codigos/Escena_Principal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ private void TestGameManager() //esto es para verificar si existe en el nodo un
if(i.IsInsideTree())//si esta en la escena
{
existeGameManager = true;//existe un game Manager
GD.Print("ya existe un gameManger");
//GD.Print("ya existe un gameManger");
}
}
if(existeGameManager == false)//sino existe un game manager
{
GD.Print("No existe un GameManger creo uno nuevo");
//GD.Print("No existe un GameManger creo uno nuevo");
instanciarGameManager();//instancio el gameManager
}
}
Expand Down
10 changes: 7 additions & 3 deletions codigos/GameManager.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using Godot;
using System;

public class GameManager : Node
public class GameManager : Node2D
{
//voy a hacer que este GameManager sea un singleton y que nunca se destruya
public BoardManager boardScript;//creo una referencia al board manager

public int playerFoodPoint = 100;//puntos iniciales de comida del jugador
public bool playersTurn = true;//si es el turno del jugador
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
Expand All @@ -18,7 +19,10 @@ private void InitGame()//inicializa el juego
boardScript.SetupScene(16);//llamo a la función que esta en board manager para crear la escena toma como parametro el nivel actual que es la cantidad de enemigos
}


public void GameOver()
{
Visible = false;//desactivo el nodo que contiene este script,esto tendria que desactivar el Game manager para saber que es Game over puede que lo haga de otra manera
}
// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
Expand Down
54 changes: 32 additions & 22 deletions codigos/MovingObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,34 @@ public abstract class MovingObject : KinematicBody2D//esta es una clase global q
{

public float moveTime = 0.1f;//tiempo en moverse de una casilla a otra
private float movementSpeed;//velocidad a la que se devera mover un objeto de una casilla a otra para que tarde 0.1
public float movementSpeed;//velocidad a la que se devera mover un objeto de una casilla a otra para que tarde 0.1
private int blokingLayer;//referencia a la capa activa se representa por el Z-index
public CollisionShape2D BoxCollider;
public RayCast2D rayo;
public RigidBody2D rb2D;

public GameManager _GameManager;
public bool enable;//para saber si el objeto puede estar enable y moverse
public Tween moverConTween;
public int dimensionSprite = 32;

// Called when the node enters the scene tree for the first time.
public override void _Ready()
/*public override void _Ready()//no puedo implementar override desde player o enemigo por eso muevo todas estas variables del ready a cada script independiente
{
movementSpeed = 1f / moveTime;//velocidad a la que se movera
BoxCollider = GetNode<CollisionShape2D>("CollisionShape2D");
rayo = GetNode<RayCast2D>("RayCast2D");
moverConTween = GetNode<Tween>("Tween");
//rb2D = thi;por ahora voy a evitarla
}
}*/

protected void SmoothMovementWithTween(Vector2 end)//Esta función va a procesar el movimiento en unity se usa una corrutina,pero en godot puede hacerce lo mismo con un nodo tween
{
moverConTween.InterpolateProperty(
this,//que objeto quiero crear la interpolación osea este mismo
"Position",//que propiedad quiero interpolar,osea la posición
this.Position,//posición inicial
end,//posicion final
0.5f,//tiempo para ir de una posición a otra
end,//posicion final y multiplico por el tamaño del sprite,para esto tengo que hacer pruebas,pero creo que asi tendria que funcionar
0.3f,//tiempo para ir de una posición a otra
Tween.TransitionType.Linear,//tipo de interpolación es Tween.TRANS_LINEAR
Tween.EaseType.InOut//como termina la transición Tween.EASE_IN_OUT
);
Expand All @@ -46,7 +48,7 @@ protected bool Move(int xDir, int Ydir,RayCast2D hitRaycast)//es privada para cu
bool colisiono;//para saber cuando el raycast colisiona
Vector2 start = Position;//posicion inicial
Vector2 end = start + new Vector2(xDir,Ydir);//la posición de adonde queremos movernos suma de vectores (0,0) + (1,0) = (1,0)
hitRaycast.CastTo = new Vector2(xDir,Ydir);//esto determina para adonde va apuntar el raycast,por ahora es para prueba ya que supuestamente recibo por parametro donde tendría que apuntar
hitRaycast.CastTo = new Vector2(-Ydir,xDir);//esto determina para adonde va apuntar el raycast

//hacemos una raycast entre el punto inicial y final
//si hay un collider por donde pasa esa linea abremos encontrado ese objeto
Expand All @@ -56,33 +58,41 @@ protected bool Move(int xDir, int Ydir,RayCast2D hitRaycast)//es privada para cu
if(colisiono == false)//sino esta colisionando
{
//hacemos el movimiento
//GD.Print("tendria que moverse");
//GD.Print("cantidad que mueve en X: ",xDir);
//GD.Print("cantidad que mueve en Y: ",Ydir);
//GD.Print("la posicion en final X: ",end.x);
//GD.Print("laposicion en final Y: ",end.y);

SmoothMovementWithTween(end);//movemos con interpolación lineal recibe por parametro la ultima posición
return true;
}
else//si en la mascara 2 hay 1 personaje o un obstaculo
{
GD.Print("No podemos movernos");
return false;//no hemos podido movernos
}
}


protected abstract void OnCantMove(KinematicBody2D go); //aqui viene el comportamiento luego de no poder moverse,es un meotdoABstracto ya que se va a comportar de diferente manera según sea el personaje o elenemigo

//Esto es relacionado al movimiento y al tipo de obstaculo
protected abstract void OnCantMoveStaticBody2D(StaticBody2D go); //aqui viene el comportamiento luego de no poder moverse,es un meotdoABstracto ya que se va a comportar de diferente manera según sea el personaje o elenemigo
protected abstract void OnCantMoveRigidBody2D(KinematicBody2D go);
protected virtual void AttempMove(int xDir,int yDir)//metodo para internar moverse esto recive por arametro cuanto en x y cuanto en y lo marcamos como abstracto ya que cada esto lo haremos en cada personaje
{
RayCast2D hit = rayo;//tomo la referencia del nodo que esta en la función ready
bool canMove = Move(xDir,yDir,hit);//
if(canMove) return;//si se movio termino esta función
var col = hit.IsColliding();//nose si funcione luego lo voy a probar con el personaje
//sino notificamos que nos hemos encontrado cno cierto objeto que nos bloquea el paso,sin embargo el jugador y el enemigo tienen diferente comportamiento
OnCantMove((KinematicBody2D)hit.GetCollider());//aqui tengo que pasarle el kinematicBody que estamos colisionando
}
// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
//
// }




Node col = (Node)hit.GetCollider();//usando la colisicioń del raycast busco el nodo
if(col.IsInGroup("Wall"))//si el nodo colisionado esta en el grupo wall
{
//GD.Print("estoy conlisionado con un muro");
OnCantMoveStaticBody2D((StaticBody2D)hit.GetCollider());//aqui tengo que pasarle el staticbody que estamos colisionando
}
if(col.IsInGroup("characters"))//si el nodo colisionado esta enel grupo character
{
//GD.Print("estoy conlisionado con un personaje");
OnCantMoveRigidBody2D((KinematicBody2D)hit.GetCollider());//aqui tengo que pasarle el kinematicBody que estamos colisionando)
}
}
}
140 changes: 140 additions & 0 deletions codigos/Player.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
using Godot;
using System;

public class Player : MovingObject
{
public int wallDamage = 1;//daño
public int pointPerFood = 10;//puntos por comida
public int pointPerSOda = 20;//puntos por soda
public float restardLevelDelay = 1f;//segundos antes de reiniciar o pasar al siguente nivel

private AnimationTree animator;//referencia al nodo animationthree
private int food;//para llevar la cuenta de cuanta comida tiene
private AnimationNodeStateMachinePlayback playback;//referencia al nodo animation tree con el parametro para acceder a los stados

//private bool seMovio = false;

Wall hitWall;//referencia a la pared que esta chocando

// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
movementSpeed = 1f / moveTime;//velocidad a la que se movera
BoxCollider = GetNode<CollisionShape2D>("CollisionShape2D");
rayo = GetNode<RayCast2D>("RayCast2D");
moverConTween = GetNode<Tween>("Tween");
//rb2D = thi;por ahora voy a evitarla
animator = GetNode<AnimationTree>("AnimationTree");//referencia al animation three
_GameManager = (GameManager)GetTree().GetNodesInGroup("GameManager")[0];
food = _GameManager.playerFoodPoint;//la comida inicial del jugador busco desde el game manager

playback = (AnimationNodeStateMachinePlayback)GetNode<AnimationTree>("AnimationTree").Get("parameters/playback");//accedo al nodo animation three y a la propiedad de las maquinas de estado
playback.Start("PlayerIdle");//animación inicial player estatico osea igle

}


private void CheckIfGameOver()//verifica que si es GameOver
{
if(food <= 0)//sino tenemos comida
{
_GameManager.GameOver();//llamo a la función Game Over,ojo esta función tiene que terminar el juego
}
}

protected override void AttempMove(int xDir, int yDir)
{
food --;//en cada paso dismunuje la comida
base.AttempMove(xDir,yDir);//ejecuto esta acción
CheckIfGameOver();//siempre que se decrementa la comida verificamos si es game over
_GameManager.playersTurn = false;//luego terminamos el turno del jugador
}

public override void _PhysicsProcess(float delta)
{
if(!_GameManager.playersTurn)//si no es el turno del jugador
{
return;//dejamos de ejecutar
}

int horizontal = Convert.ToInt16((Input.GetActionStrength("d") - Input.GetActionStrength("a")) * dimensionSprite);//mover izquierda derecha
int vertical = Convert.ToInt16((Input.GetActionStrength("s") - Input.GetActionStrength("w")) * dimensionSprite );//mover arriba abajo
if(horizontal != 0)//esto es para que NO se mueva en diagonal
{
vertical = 0;//esto es para que NO se mueva en diagonal
}
if(horizontal != 0 || vertical != 0 )///nos estamos moviendo
{
AttempMove(horizontal,vertical);//movemos el personaje
//if(!seMovio)//esto es para prueba
//{
//seMovio = true;
//
//}
//GD.Print(rayo.IsColliding());//esto es para prueba compruebo si el rayo colisiona
// await ToSignal(GetTree().CreateTimer(0.1f),"timeout");//esto es para prueba
//seMovio = false;//esto es para prueba
}

}





protected override void OnCantMoveStaticBody2D(StaticBody2D pared)//si "NO" podemos movernos recibe el cuerpo estatico y es un una pared.Este es un metodo que se sobreescribe
{
if(pared.IsInGroup("Wall"))
{
hitWall = (Wall)pared.GetParent();//con esto tendria que poder acceder al script que maneja ese piso para cambiar la figura al ser golpeado
}
if(hitWall != null)//si el personaje esta chocando con un muro
{
hitWall.DamageWall(wallDamage);//descuento el hp al suelo,se me esta complicando entender el concepto de unity y pasarlo a godot
//activo animación romper bloque
playback.Travel("PlayerChop");//activo animación romper pared
}
}
protected override void OnCantMoveRigidBody2D(KinematicBody2D pared)//si "NO" podemos movernos recibe el cuerpo rigido y es un character.Este es un metodo que se sobreescribe
{
playback.Travel("PlayerChop");//activo animación romper pared
}





private void Restart()
{
GetTree().ReloadCurrentScene();//reinicia la scena esto puede cambiar
}

public void LoseFood(int loss)
{
food -= loss;//cantidad de comida que pierdo
playback.Travel("PlayerHit");//activo animación daño
CheckIfGameOver();//verifico sino todavia tengo comida osea sino es game over
}

public async void _on_Area2D_area_entered(Area _area)//esta funcion tiene una corrutina para detener el flujo por un tiempo
{
if(_area.IsInGroup("Exit"))//si entramos al aerea de exit
{
enable = false;//el jugador no se puede mover
//aqui tendria que venir una transcición al cambiar de pantalla
await ToSignal(GetTree().CreateTimer(1.0f),"timeout");//detengo por 1 segundo
Restart();//reinicio el nivel,voy a tener que utilizar un singleton para guardar puntajes
}
if(_area.IsInGroup("Food"))
{
food += pointPerFood;//sumo el puntaje de la comida
(_area.GetParent() as Sprite).Visible = false;//hago invisible el nodo padre que contiene el sprite por lo tanto todos los hijos tendrian que ser inviisble
}
if(_area.IsInGroup("Soda"))
{
food += pointPerSOda;//sumo el puntaje de la soda
(_area.GetParent() as Sprite).Visible = false;//hago invisible el nodo padre que contiene el sprite por lo tanto todos los hijos tendrian que ser inviisble
}
}

}
21 changes: 21 additions & 0 deletions codigos/SuelosScript/Suelo1.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using Godot;
using System;

public class Suelo1 : Wall
{
// Declare member variables here. Examples:
// private int a = 2;
// private string b = "text";

// Called when the node enters the scene tree for the first time.
public override void _Ready()
{

}

// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
//
// }
}
Loading

0 comments on commit 94b3700

Please sign in to comment.