Descrizione dell'ambiente:
- Sto implementando un motore moderno (hobbista) per (un vecchio) videogioco per PlayStation 1
- I dati grafici sono rappresentati come pacchetti dove possono rappresentare un poligono o uno sprite,
(e vengono trasformati in modo diverso per finire come pixel sullo schermo) - Tutti i tipi di pacchetti di questo tipo (18 in totale) possono essere ridotti a 2 o 3 tipi al massimo (cosa ho fatto per ridurre la superficie del codice), con alcuni flag che indicano ciò che è presente in essi
A scopo informativo,
Questo formato è più o meno una variante del formato HMD di Sony, un efficiente formato di basso livello che viene consumato direttamente dalla GPU della PlayStation 1, a scapito dell'essere ostile da leggere / parse, ecc ... (in realtà sulla vera PlayStation 1, si potrebbero emettere poche chiamate alla libreria di sistema per caricarlo e basta)
Descrizione del problema:
- Ho bisogno di trovare un modo (semplice ma efficace) per realizzare i loro contenuti
- contabilità che possono essere poligoni o sprite
Per farla breve,
I seguenti frammenti di codice riportati di seguito probabilmente spiegano meglio qual è il contenuto e l'approccio preliminare,
Interfacce contro cui lavoreremo:
/// <summary>
/// a graphics primitive.
/// </summary>
public interface IPrimitive
{
bool IsPolygon { get; }
bool IsSprite { get; }
}
/// <summary>
/// a polygon, i.e. triangle, quad.
/// </summary>
public interface IPolygon : IPrimitive
{
void GetMesh();
}
/// <summary>
/// a sprite, (internal representation has different meaning than a polygon).
/// </summary>
public interface ISprite : IPrimitive
{
void GetMesh();
}
Digita presente nei dati di gioco:
/// <summary>
/// a packet representing graphical data : a polygon or a sprite.
/// </summary>
public class GraphicsPacket : IPolygon, ISprite
{
public GraphicsPacket(Stream stream)
{
// read packet ...
// there will be a flag indicating if it's a sprite
// and therefore should be treated differently
}
public bool IsSprite { get; }
public bool IsPolygon => !IsSprite;
void IPolygon.GetMesh()
{
if (IsSprite)
throw new InvalidOperationException("Instance is not a polygon");
}
void ISprite.GetMesh()
{
if (IsPolygon)
throw new InvalidOperationException("Instance is not a sprite");
}
}
Test dell'intera logica:
public class Test
{
public void BuildPrimitive([NotNull] IPrimitive primitive)
{
if (primitive == null)
throw new ArgumentNullException(nameof(primitive));
// obviously here, 'as' cast would always be true for all cases
var polygon = primitive.IsPolygon;
if (polygon)
{
// do something with it
((IPolygon)polygon).GetMesh();
return;
}
var sprite = primitive.IsSprite;
if (sprite)
{
// do something with it
((ISprite)sprite).GetMesh();
return;
}
throw new NotSupportedException(nameof(primitive));
}
}
Domanda:
Il mio approccio per il trattamento di un pacchetto grafico dipende dal suo contenuto?
cioè.
- implementazione dell'interfaccia esplicita
- naive
bool
controlla e attiva lo stato non valido
Argomenti forti su come prendere in considerazione di suddividere i dubbi in questo caso,
- i dati di gioco sono proprio così, perché cambiare la logica?
- (mio) approccio moderno, orientato agli oggetti, sintetizza questo come pochi tipi (cioè concetto ASCIUTO) Il problema
- non scomparirà davvero, poiché quei pacchetti grafici saranno sempre un poligono o uno sprite (ad esempio perché combattere contro quella logica dopo tutto?)
Spero che abbia senso per te, altrimenti fammi sapere come posso migliorare la domanda.