Skip to content

Commit

Permalink
enemigo y jugadot funcionando con pequeño detalle
Browse files Browse the repository at this point in the history
  • Loading branch information
kone9 committed Apr 27, 2020
1 parent 94b3700 commit ca294d9
Show file tree
Hide file tree
Showing 15 changed files with 842 additions and 69 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":"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}}}
{"res://codigos/BoardManager.cs":{"modified_time":"1587848329","class":{"namespace":"","class_name":"BoardManager","nested":false}},"res://codigos/Enemy.cs":{"modified_time":"1588009964","class":{"namespace":"","class_name":"Enemy","nested":false}},"res://codigos/Escena_Principal.cs":{"modified_time":"1587745563","class":{"namespace":"","class_name":"Escena_Principal","nested":false}},"res://codigos/GameManager.cs":{"modified_time":"1588009112","class":{"namespace":"","class_name":"GameManager","nested":false}},"res://codigos/MovingObject.cs":{"modified_time":"1588009857","class":{"namespace":"","class_name":"MovingObject","nested":false}},"res://codigos/Player.cs":{"modified_time":"1588010090","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":"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}}}
{"res://codigos/BoardManager.cs":{"modified_time":"1587848329","class":{"namespace":"","class_name":"BoardManager","nested":false}},"res://codigos/Enemy.cs":{"modified_time":"1588009964","class":{"namespace":"","class_name":"Enemy","nested":false}},"res://codigos/Escena_Principal.cs":{"modified_time":"1587745563","class":{"namespace":"","class_name":"Escena_Principal","nested":false}},"res://codigos/GameManager.cs":{"modified_time":"1588009112","class":{"namespace":"","class_name":"GameManager","nested":false}},"res://codigos/MovingObject.cs":{"modified_time":"1588009857","class":{"namespace":"","class_name":"MovingObject","nested":false}},"res://codigos/Player.cs":{"modified_time":"1588010090","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.
1 change: 1 addition & 0 deletions Rogue en Godot.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="codigos\BoardManager.cs" />
<Compile Include="codigos\Enemy.cs" />
<Compile Include="codigos\Escena_Principal.cs" />
<Compile Include="codigos\GameManager.cs" />
<Compile Include="codigos\MovingObject.cs" />
Expand Down
92 changes: 92 additions & 0 deletions codigos/Enemy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using Godot;
using System;

public class Enemy : MovingObject
{

[Export]
public int playerDamage = 10;//el daño que le hace el enemigo al jugador al golpearlo
private KinematicBody2D targetCharacter;
private Vector2 targetPosition;//referencia a la posición donde estara el jugador
private bool skinMove;//como es por turnos esta variable es para saber cuando puede moverse
private AnimationNodeStateMachinePlayback playback;//referencia al animator

// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
_GameManager = (GameManager)GetTree().GetNodesInGroup("GameManager")[0];//para poder acceder al GameManager
_GameManager.AddEnemyToList(this);//tendria que agregarse este mismo objeto kinematico2D

movementSpeed = 1f / moveTime;//velocidad a la que se movera
rayo = GetNode<RayCast2D>("RayCast2D");//referencia al raycast
moverConTween = GetNode<Tween>("Tween");//referencia al nodo tween
targetCharacter = (KinematicBody2D)GetTree().GetNodesInGroup("Player")[0];//referencia al nodo del personaje
playback = (AnimationNodeStateMachinePlayback)GetNode<AnimationTree>("AnimationTree").Get("parameters/playback");//accedo al nodo animation three y a la propiedad de las maquinas de estado
playback.Start("EnemyIdle");//como inicia la animación del personaje
}

public override void _Process(float delta)
{
targetPosition = targetCharacter.Position;//guardo la posición del personaje en targetPosition
}

protected override void AttempMove(int xDir, int yDir)
{

if(skinMove)//si se movio
{
skinMove = false;//desactivo el movimiento
return;//salgo de esta función
}
base.AttempMove(xDir,yDir);//la segunda ves sera falso y se ejecutara el movimiento
skinMove = true;//una ves hecho el movimiento otra ves sera verdadero
}

public void MoveEnemy()//metodo que se encarga de mover al personaje,esto es publico y lo hara el GameManager en una lista de enemigos
{
int xDir = 0;//posición donde nos vamos a mover
int yDir = 0;//posición donde nos vamos a mover
//si el jugador esta alineado verticalmente con el enemigo
//el enemigo se mueve de arriba abajo "Vertical"
//sino estan alineados el enemigo se mueve izquierda derecha "Horizontal"
if(Math.Abs(targetPosition.x - Position.x) < float.Epsilon)//si el jugador esta en la misma posición en X que el enemigo usa float epsilon para determinar un valor muy pequeño y el valor absoluto es para que siempre sea positivo o eso creo
{
//si la posición en y del target el mayor a la posición en y de enemigo
//el enemigo se mueve hacia arriba,sino se mueve hacia abajo
yDir = targetPosition.y > Position.y ? 1 * dimensionSprite : -1 * dimensionSprite;//siempre multiplico por el tamaño de sprite
}
else //sino el jugador no esta en la mismo posición en Y que el enemigo entonces el enemigo se mueve en el eje X
{
//si la posición en x del target el mayor a la posición en x de enemigo
//el enemigo se mueve hacia izquierdo,sino se mueve hacia derecha//Esto puede ser al reves
xDir = targetPosition.x > Position.x ? 1 * dimensionSprite : -1 * dimensionSprite;
}
AttempMove(xDir,yDir);

}

protected override void OnCantMoveStaticBody2D(StaticBody2D go)//sino puede moverse por un cuerpo statico osea esto seria los obstaculos que estan en medio del escenario
{

}

protected override Vector2 RaycastDirection(int xDir, int Ydir)//cuando el raycast es del enemigo
{
return new Vector2(xDir,Ydir);//devuelvo la posición normal y con esto funciona bien hacia adonde apunta el raycast
}

protected override void OnCantMoveRigidBody2D(KinematicBody2D go)//sino puede moverse por un kinematicbody como un personaje
{
Player hitPlayer = (Player)go;//de esta forma tendria que acceder al script que tiene el personaje
if(hitPlayer != null)//si estoy en la casilla player
{
hitPlayer.LoseFood(playerDamage);//descuento comida del personaje
playback.Travel("EnemyAttack");//el enemigo ataca cuando le quitamos puntos al jugador
}
}
// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
//
// }
}
45 changes: 40 additions & 5 deletions codigos/GameManager.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
using Godot;
using System;
using System.Collections.Generic;

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
public float turnDelay = 0.1f;//tiempo que va a tardar cada turno
private List<KinematicBody2D> enemies = new List<KinematicBody2D>();//aqui voy a guardar los enemigos
private bool enemiesMoving;//si el enemigo se esta moviendo o no

// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
Expand All @@ -16,16 +21,46 @@ public override void _Ready()

private void InitGame()//inicializa el juego
{
enemies.Clear();//antes de iniciar el nivel vaciamos la lista
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()
public void GameOver()//posiblemente esto despues voy a tener que correguirlo
{
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
}

private async void MoveEnemies()//esta función sera como una corrutina la utilizare para mover a los personajes cada cierto tiempo
{
enemiesMoving = true;//el enemigo se puede mover
await ToSignal(GetTree().CreateTimer(turnDelay),"timeout");//creo un timer que espera el tiempo que tenemos en la variable turnDelay...Esto puede cambiar
if(enemies.Count == 0)//sino hay enemigos
{
await ToSignal(GetTree().CreateTimer(turnDelay),"timeout");//esperara este tiempo antes que pueda volver a moverse
}
for(int i=0 ; i<enemies.Count; i++)//obtengo cada enemigo
{
(enemies[i] as Enemy).MoveEnemy();//busco la función que ejecuta el moviento del enemigo
await ToSignal(GetTree().CreateTimer((enemies[i] as Enemy).moveTime),"timeout");//espera hasta que termina de moverse,esto podria hacerse de otra forma pero por ahora lo hago igual que el tutorial
}
playersTurn = true;//cuando termino de mover todos los enemigos es el turno del jugador esto lo puedo verificar en el player en el bucle principal
enemiesMoving = false;//el enemigo ya no puede moverse
}


// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
//
// }
public override void _PhysicsProcess(float delta)
{
if(playersTurn || enemiesMoving)//si es el turno de jugador o los enemigos estan moviendose
{
return;//salimos de la función y no hacemos nada
}
MoveEnemies();//caso contrario iniciamos el movimiento de los enemigos nose si funcione el delay

}

public void AddEnemyToList(KinematicBody2D enemy)//los enemigos se agregan cuanso se crean
{
enemies.Add(enemy);//agrega el enemigo a la lista
}
}
8 changes: 5 additions & 3 deletions codigos/MovingObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ protected void SmoothMovementWithTween(Vector2 end)//Esta función va a procesar
"Position",//que propiedad quiero interpolar,osea la posición
this.Position,//posición inicial
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
0.1f,//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 @@ -48,8 +48,9 @@ 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(-Ydir,xDir);//esto determina para adonde va apuntar el raycast

//hitRaycast.CastTo = new Vector2(-Ydir,xDir);//esto determina para adonde va apuntar el raycast
hitRaycast.CastTo = RaycastDirection(xDir,Ydir);//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
//BoxCollider.Visible = false; //desactivamos el boxcollider para que no choque con nosotros mismos en el resultado
Expand Down Expand Up @@ -77,6 +78,7 @@ protected bool Move(int xDir, int Ydir,RayCast2D hitRaycast)//es privada para cu
//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 abstract Vector2 RaycastDirection(int xDir, int Ydir);//como el personaje y el enemigo tienen algunas diferencias tengo que procesar la direccioń del raycast en cada uno por separado
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
Expand Down
9 changes: 7 additions & 2 deletions codigos/Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ 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");
rayo = GetNode<RayCast2D>("RayCast2D");//referencia al raycast
moverConTween = GetNode<Tween>("Tween");//referencia al nodo tween
//rb2D = thi;por ahora voy a evitarla
animator = GetNode<AnimationTree>("AnimationTree");//referencia al animation three
_GameManager = (GameManager)GetTree().GetNodesInGroup("GameManager")[0];
Expand All @@ -42,6 +42,11 @@ private void CheckIfGameOver()//verifica que si es GameOver
}
}

protected override Vector2 RaycastDirection(int xDir, int Ydir)//cuando el raycast es del player
{
return new Vector2(-Ydir,xDir);//invierto la posición y con esto funciona bien hacia adonde apunta el raycast
}

protected override void AttempMove(int xDir, int yDir)
{
food --;//en cada paso dismunuje la comida
Expand Down
73 changes: 41 additions & 32 deletions escenas/characters/Enemy1.tscn
Original file line number Diff line number Diff line change
@@ -1,67 +1,72 @@
[gd_scene load_steps=9 format=2]
[gd_scene load_steps=12 format=2]

[ext_resource path="res://sprite/Scavengers_SpriteSheet.png" type="Texture" id=1]
[ext_resource path="res://codigos/Enemy.cs" type="Script" id=2]

[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 12.8874, 13.6713 )

[sub_resource type="Animation" id=2]
resource_name = "Enemy1Idle"
loop = true
[sub_resource type="Animation" id=4]
resource_name = "EnemyAttack"
length = 0.3
tracks/0/type = "value"
tracks/0/path = NodePath("SpritePlayer:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.2, 0.4, 0.6, 0.8, 1 ),
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ),
"times": PoolRealArray( 0, 0.1 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 1,
"values": [ 6, 7, 8, 9, 10, 11 ]
"values": [ 42, 43 ]
}

[sub_resource type="Animation" id=3]
resource_name = "Enemy1attack"
length = 0.3
[sub_resource type="Animation" id=5]
resource_name = "EnemyIdle"
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath("SpritePlayer:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.1 ),
"transitions": PoolRealArray( 1, 1 ),
"times": PoolRealArray( 0, 0.2, 0.4, 0.6, 0.8, 1 ),
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ),
"update": 1,
"values": [ 42, 43 ]
"values": [ 6, 7, 8, 9, 10, 11 ]
}

[sub_resource type="AnimationNodeAnimation" id=4]
animation = "Enemy1attack"
[sub_resource type="AnimationNodeAnimation" id=8]
animation = "EnemyAttack"

[sub_resource type="AnimationNodeAnimation" id=9]
animation = "EnemyIdle"

[sub_resource type="AnimationNodeAnimation" id=5]
animation = "Enemy1Idle"
[sub_resource type="AnimationNodeStateMachineTransition" id=10]

[sub_resource type="AnimationNodeOneShot" id=6]
[sub_resource type="AnimationNodeStateMachineTransition" id=11]
switch_mode = 2
auto_advance = true

[sub_resource type="AnimationNodeBlendTree" id=7]
graph_offset = Vector2( -116, 117.5 )
nodes/Animation/node = SubResource( 5 )
nodes/Animation/position = Vector2( 80, 160 )
"nodes/Animation 2/node" = SubResource( 4 )
"nodes/Animation 2/position" = Vector2( 80, 300 )
nodes/OneShot/node = SubResource( 6 )
nodes/OneShot/position = Vector2( 380, 180 )
nodes/output/position = Vector2( 640, 180 )
node_connections = [ "output", 0, "OneShot", "OneShot", 0, "Animation", "OneShot", 1, "Animation 2" ]
[sub_resource type="AnimationNodeStateMachine" id=6]
states/EnemyAttack/node = SubResource( 8 )
states/EnemyAttack/position = Vector2( 407, 198 )
states/EnemyIdle/node = SubResource( 9 )
states/EnemyIdle/position = Vector2( 407, 80 )
transitions = [ "EnemyIdle", "EnemyAttack", SubResource( 10 ), "EnemyAttack", "EnemyIdle", SubResource( 11 ) ]
graph_offset = Vector2( -9, 18.2934 )

[sub_resource type="AnimationNodeStateMachinePlayback" id=7]

[node name="Enemy1" type="KinematicBody2D" groups=[
"Enemy",
"characters",
]]
z_index = 2
collision_mask = 2
script = ExtResource( 2 )

[node name="CollisionShape2D" type="CollisionShape2D" parent="." groups=[
"CollisionShape2D",
Expand All @@ -75,14 +80,18 @@ hframes = 8
frame = 9

[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
anims/Enemy1Idle = SubResource( 2 )
anims/Enemy1attack = SubResource( 3 )
anims/EnemyAttack = SubResource( 4 )
anims/EnemyIdle = SubResource( 5 )

[node name="AnimationTree" type="AnimationTree" parent="."]
tree_root = SubResource( 7 )
tree_root = SubResource( 6 )
anim_player = NodePath("../AnimationPlayer")
active = true
parameters/OneShot/active = false
parameters/playback = SubResource( 7 )

[node name="RayCast2D" type="RayCast2D" parent="."]
enabled = true
cast_to = Vector2( -32, 0 )
collision_mask = 2

[node name="Tween" type="Tween" parent="."]
Loading

0 comments on commit ca294d9

Please sign in to comment.