Site Logo


#TouhouDanmakufu[Single]
#ScriptVersion[3] //Esto es necesario para los scrips de ph3
#Title["SampleA01"]
#Text["SampleA01:Shooting Bullets Straight Down"] 

//Load the default shotsheet
#include "script/default_system/Default_ShotConst.txt"
//----------------------------------------------------
//Declarando las variables globales
//Las variables declaradas aquí pueden ser usadas durante todo el script
//Sin embargo, las varialbes declaradas aquí sin estáticas
//(Se pueden modificar, pero no por su cuenta, ya que no están en el loop principal)
//(Ya que el orden de ejecución no se puede garantizar, no se pueden utilizar números aleatorios (?))
//----------------------------------------------------
let objEnemy; //Enemy object
let frame = 0; //Contador para sincronizar los ataques del enemigo (irá incrementando de a uno en @MainLoop)

//----------------------------------------------------
//Movimiento del enemigo
//----------------------------------------------------
@Event
{
	alternative(GetEventType())
	case(EV_REQUEST_LIFE)
	{
		//El script pide la vida del enemigo
		SetScriptResult(500); //Configurando la vida del enemigo en 500
	}
}

@Initialize
{
	//Creando y registrando los enemy objects
	objEnemy = ObjEnemy_Create(OBJ_ENEMY_BOSS);
	ObjEnemy_Regist(objEnemy);

	//Configurando la imagen del enemigo
	let imgExRumia = GetCurrentScriptDirectory() ~ "ExRumia.png"; //Ruta al archivo de imagen del enemigo
	ObjPrim_SetTexture(objEnemy, imgExRumia); 
        //Configurando la imagen de arriba como textura para el enemy object (objEnemy)
	ObjSprite2D_SetSourceRect(objEnemy, 64, 1, 127, 64); 
        //Confugurando las coordenadas del rectángulo a usar en la imagen del enemigo (izquierda, arriba, derecha, abajo)
	ObjSprite2D_SetDestCenter(objEnemy); 
        //Posicionando el centro del rectangulo en el (0,0) de la pantalla (arriba a la izquierda)

	//Moviéndolo a las coordenadas (cx, 60) en 60 frames
	let cx = GetStgFrameWidth() / 2;
        //Definimos la variable "cx" como el centro horizontal de la pantalla (ancho de la pantalla / 2)

	ObjMove_SetDestAtFrame(objEnemy, cx, 60, 60);
}

@MainLoop
{
	//Obteniendo las corrdenadas del enemigo
	let ex = ObjMove_GetX(objEnemy);
	let ey = ObjMove_GetY(objEnemy);

	if(frame == 60)
	{
                //executed when frame is equal to 60
                //Se ejecuta cuando "frame" es igual a 60
                //・Dispara una bala derecho hacia abajo desde la posición del enemigo
                //・Velocidad: 3 píxeles por frame
                //・Ángulo: 90 (hacia abajo)    (0 = a la derecha, 180 = izquierda, 270 = arriba)
                //・Delay: 30 frames (retraso, demora)
		CreateShotA1(ex, ey, 3, 90, DS_BALL_S_RED, 30);

		frame = 0;
        	//Una vez que la bala es disparada, "frame" vuelve a 0 para que vuelva a contar a 60 y pueda disparar una bala otra vez

	}

	//Configurando el hitbox del enemigo (área en la que las balas le pegan)
	ObjEnemy_SetIntersectionCircleToShot(objEnemy, ex, ey, 32); //hitbox donde las balas le pegan. 32 es el radio.
	ObjEnemy_SetIntersectionCircleToPlayer(objEnemy, ex, ey, 24); //hitbox donde el player muere al hacer contacto. 24 es el radio.

	//Agregándole +1 a "frame". "frame++" equivale a "frame = frame +1;" o "frame += 1;"
	frame++;

	//Si la vida del enemigo llega a 0
	if(ObjEnemy_GetInfo(objEnemy, INFO_LIFE) <= 0)
	{
                //el enemigo muere inmediatamente cuando la vida llega a 0
                //Ya que este es un script para principiantes,
                //el script termina inmediatamente sin esperar por un efecto de explosión
		Obj_Delete(objEnemy);
		CloseScript(GetOwnScriptID());
		return;
	}
}