Wie erstelle ich Instanzen verschiedener Objekte, die die gleichen Parameter annehmen?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Wie erstelle ich Instanzen verschiedener Objekte, die die gleichen Parameter annehmen?

Post by Guest »

Ich versuche, ein Spiel im Touhou-Stil zu machen, in dem jedes Sprite, der Kugeln schießen kann, jede Art von Kugel schießen kann, die es gegeben wird, wobei die Schussabklingzeit aus der Kugel kommt. Aber ich kann nicht herausfinden, wie. Eine hartcodierte Kugel folgt der Position und Richtung der Zeichen, mit denen sie ausgesetzt sind. Beim Versuch, die Dynamik zu erstellen, habe ich versucht, der Zeichen eine Liste von Bullet -Typen hinzuzufügen, aber das konnte nur Instanzen von Bullets enthalten. Nicht der Klassentyp. und geben Sie immer noch alle für den Bau benötigten Parameter weiter. Was ich möchte, ist eine Funktion, die den Namen einer Unterklasse einer Kugel und die Parameter für diese Kugel nimmt. Wie gut entkoppelt ist, wie in den einzelnen Zeichen nichts über die Kugel außer dem Namen aufgerufen wird, erhält aber dennoch die Abklingzeitlänge der spezifischen Kugel.
i Wisse, dass dies irgendwie eine Fabrik verwendet, entweder die Werksmethode oder eine abstrakte Fabrik, aber ich kann meinen Kopf wirklich nicht umwickeln. Tut mir leid, wenn dies eine Wiederholung ist. < /p>
Hier ist mein Code: < /p>
GameEngine: < /p>

Code: Select all

var player = playerFactory.CreateEntity(playertexture, new Vector2(Globals.WindowSize.X/2,
Globals.WindowSize.Y / 2), 0,200f) as Player;
player.SpriteEvent += PlayerEventHandler;
private void PlayerEventHandler(object sender, SpriteEventArgs args)
{
//This is where the things like bullets and any
//other sprite events are currently set to go to.
//We can subscribe different types of sprites to different event
//handlers, this was just
//to test if my sprite event was working.
//Right now, it's only subscribed to the player
//and reacts when the F key is pressed.
var player = sender as Player;
var characterArgs = args as CharacterEventArgs;
BulletManager.AddByType("A");

}
< /code>
Player: < /p>
//on keypress, check if cooldown has ended, and if it has, shoot.
if(kstate.IsKeyDown(Keys.F))
{
shotCoolDown -= (float)gameTime.ElapsedGameTime.TotalSeconds;

if (shotCoolDown < 0)
{
this.Shoot(bulletTypes[0]);
}
}

public override void Shoot(Attack bullet)
{
//Call Shoot event, send to PlayerEventHandler, And set shotCooldown
//based on bullet created
this.OnSpriteEvent(new CharacterEventArgs(){ Bullet = bullet});
shotCoolDown = BulletA.GetCoolDown;
}
< /code>
Bullet: < /p>
public class BulletA(Texture2D texture, Vector2 position, float rotation, float speed) : Attack(texture, position, rotation, speed)
{
protected const float Cooldown = 500f;

public static float GetCoolDown => Cooldown;
public override void Update(GameTime gameTime)
{
// moving logic after its created
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post