mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-01 11:15:33 +00:00
102 lines
No EOL
4.5 KiB
C#
102 lines
No EOL
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Cirno.Scripts.Resources;
|
|
using Godot;
|
|
using Godot.Collections;
|
|
|
|
namespace Cirno.Scripts.Components;
|
|
|
|
public partial class BulletSpawner : Node2D
|
|
{
|
|
[Export] public PackedScene BulletScene;
|
|
private GameManager _gameManager;
|
|
|
|
public override void _Ready()
|
|
{
|
|
_gameManager = GetNode<GameManager>("/root/GameScene");
|
|
}
|
|
|
|
public void SpawnBullet(BulletInfo bulletInfo)
|
|
{
|
|
for (int i = 0; i < bulletInfo.BulletCount; i++)
|
|
{
|
|
var bullet = this.CreateChildOf<Bullet>(_gameManager.BulletsContainer, bulletInfo.BulletScene ?? BulletScene, bulletInfo.Position);
|
|
|
|
bullet.Initialize(bulletInfo);
|
|
|
|
//var bullet = BulletScene.Instantiate<Bullet>();
|
|
//bullet.Position = bulletInfo.Position;
|
|
//bullet.Owner = bulletInfo.Owner;
|
|
//bullet.Speed = speed;
|
|
|
|
float modifiedSpeed = bulletInfo.Modifier?.ModifySpeed(bulletInfo.Speed, i, bulletInfo.BulletCount) ?? bulletInfo.Speed;
|
|
bullet.Speed = modifiedSpeed;
|
|
|
|
Vector2 baseDirection = bulletInfo.Direction == Vector2.Zero ? Vector2.Right : bulletInfo.Direction.Normalized();
|
|
float baseAngle = Mathf.Atan2(baseDirection.Y, baseDirection.X);
|
|
//float angle = angleOffset + (360 / count) * i;
|
|
float angle = baseAngle + Mathf.DegToRad(bulletInfo.RotationOffset + (bulletInfo.Spread / bulletInfo.BulletCount) * i);
|
|
Vector2 bulletDirection = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
|
|
//Vector2 bulletDirection = new Vector2(Mathf.Cos(Mathf.DegToRad(angle)), Mathf.Sin(Mathf.DegToRad(angle)));
|
|
|
|
bullet.SetDirection(bulletDirection);
|
|
//GetParent().AddChild(bullet);
|
|
}
|
|
}
|
|
|
|
public void SpawnBullet(Vector2 position, Vector2 direction, float speed, BulletOwner owner, int count = 1, float angleOffset = 0, float spread = 0, PackedScene bulletScene = null, IBulletModifier modifier = null)
|
|
{
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
var bullet = this.CreateChildOf<Bullet>(_gameManager.BulletsContainer, bulletScene ?? BulletScene, position);
|
|
|
|
//var bullet = BulletScene.Instantiate<Bullet>();
|
|
bullet.Position = position;
|
|
bullet.Owner = owner;
|
|
//bullet.Speed = speed;
|
|
|
|
float modifiedSpeed = modifier?.ModifySpeed(speed, i, count) ?? speed;
|
|
bullet.Speed = modifiedSpeed;
|
|
|
|
Vector2 baseDirection = direction == Vector2.Zero ? Vector2.Right : direction.Normalized();
|
|
float baseAngle = Mathf.Atan2(baseDirection.Y, baseDirection.X);
|
|
//float angle = angleOffset + (360 / count) * i;
|
|
float angle = baseAngle + Mathf.DegToRad(angleOffset + (spread / count) * i);
|
|
Vector2 bulletDirection = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
|
|
//Vector2 bulletDirection = new Vector2(Mathf.Cos(Mathf.DegToRad(angle)), Mathf.Sin(Mathf.DegToRad(angle)));
|
|
|
|
bullet.SetDirection(bulletDirection);
|
|
//GetParent().AddChild(bullet);
|
|
}
|
|
}
|
|
|
|
public void SpawnTargetedBullet(Vector2 position, Vector2 target, float speed, BulletOwner owner, PackedScene bulletScene = null, int burstCount = 1, float spread = 0, IBulletModifier modifier = null)
|
|
{
|
|
Vector2 direction = (target - position).Normalized();
|
|
SpawnBullet(position, direction, speed, owner, burstCount, spread: spread, bulletScene: bulletScene, modifier: modifier);
|
|
}
|
|
|
|
[Obsolete]
|
|
public void SpawnSpiralPattern(Vector2 position, float speed, BulletOwner owner, int bulletCount, float rotationSpeed, double time, float spread, PackedScene bulletScene = null)
|
|
{
|
|
float angleOffset = (float)(rotationSpeed * time);
|
|
SpawnBullet(position, Vector2.Right, speed, owner, bulletCount, angleOffset, spread, bulletScene: bulletScene);
|
|
}
|
|
}
|
|
|
|
public class BulletInfo
|
|
{
|
|
public Vector2 Position { get; set; }
|
|
public Vector2 Direction { get; set; }
|
|
public float Speed { get; set; }
|
|
public float LifeTime { get; set; }
|
|
public BulletOwner Owner { get; set; }
|
|
public int BulletCount { get; set; }
|
|
public float RotationSpeed { get; set; }
|
|
public float RotationOffset { get; set; }
|
|
//public double Time { get; set; }
|
|
public float Spread { get; set; }
|
|
public PackedScene BulletScene { get; set; }
|
|
public IBulletModifier Modifier { get; set; }
|
|
public List<TimeModifier> TimeModifiers { get; set; } = new List<TimeModifier>();
|
|
} |