Som sagt i:
http://www.udvikleren.dk/DotNet/Thread.aspx/13/28250/ ville jeg komme tilbage, og spørge noget mere om hvordan det er smart at strukturer sit program i c#(i virkeligheden nok .NET generalt)
Nu er jeg her så, og denne gang er jeg stødt ind i et enligt problem. Som sagt i den første tråd, har jeg tænkt mig at lave en 2D level editor (link til, og beskrivelse af, en i den originale tråd).
Så vis man skal holde det helt simpelt skal man bruge:
-Et område der kan vise de tiles man har lagt ud, og kan lægge nye, ved at trykke der hvor man vil have lagt en. (kalder den "Editoren" fremover)
-En måde, at bestemme hvilken tile, der skal ligges i Editoren.(kalder den "TileVælgeren" fremover)
-En muglighed for at gemme hvilke tiles, og hvordan de er lagt, til en tekst fil, der kan læses af spillet.
Her er hvad jeg har tænkt indtil vidre:
De første to punkter, Editoren og TileVælgeren, skal vises grafisk på skærmen, så derfor vil jeg lave en user control til hver. Da jeg har læst om MVC, og det ser ud som om det er den måde der oftest bliver anvendt, vil jeg også lave en model klasse til hver control. (jeg kan ikke se hvad jeg skal bruge en control klasse til, men vis den er svaret på alle mine problemer, så bare sig hvordan jeg skal bruge den

)
Editor modellen skal så have disse værdier (og funktioner):
int[,] map //til at holde hvilken værdi der skal puttes, hvor i det grid som Editoren består af
int currentTile //til at afgøre hvilken tile der skal placeres, når jeg trykker et sted i Editoren
//noget event noget til at underrette viewet når modellen bliver opdateret
saveToTxt() // er ikke sikker på om den skal være her.
setTile(int x, int y)
{
xPos = x/tileWidth //tileWidth er bredden på et felt i "tabellen"
yPos = y/tileHeight //du kan nok gætte hvad tileHeight er

map[xPos,yPos] = currentTile;
}
EditorViewet(selve controllen) skal se ud således:
EditorModel model = new EditorModel();
enlig skal det bare være et panel der fylder hele controllen. når man trykker et sted, skal den kalde model.setTile(int x, int y) med musse positionen som argument. i paint metoden, skal den med et loop i et loop iterere gennem model.map, og tegne hver tile i det tal som loopet er nået til*tileWidth eller tileHeight. Bliver nok nødt til at skrive selve koden(er lidt svært at forklare), men jeg ved ikke lige hvordan man tegner et billede til skærmen, så jeg antager bare at funktion drawPicture(x, y) tegner et billede til skærmen i koordinaterne x,y.
for(int i = 0; i < y; i++)
{
for(int j = 0; j < x; j++)
{
if(model[x,y] = 0)
{
drawPicture(i*tileHeight,j*tileWidth, "picture0.png");
}
//en masse else if her, til forskellige værdier. Skal selfølgelig finde på noget mere elegant, men ligenu prøver jeg at holde det simpelt.
}
}
Jeg har ikke tænkt så meget i tileVælgeren endnu, men her er det helt basic:
Model:
int currentTile //hvilken tile der er valgt
string(eller en form for billede) tileSheet //enten selve billedet der skal bruges som tile sheet, eller path'en til det
view:
Skal kunne vælge hvilken til der skal være currentTile.
Så er det på plads. MVC arkitekturen ser god ud når viewet kun skal være view for mig, men hvad når viewet også skal kunne bruges af andre objekter? eksempelvis skal editoren kunne trække currentTile ud af TileVælgeren(eller vælgeren skal kunne give editoren dens currentTile værdi), og for at kunne gøre det bliver det nødt til at have en referance til TileVælgeren.
Det er her jeg er gået lidt i stå. Jeg kan ikke rigtig finde ud af hvordan man kæder flere MVC dele sammen i et program.
Skal jeg lave noget om i det jeg har tænkt indtil vidre?
Skal jeg droppe MVC?
Har jeg misforstået MVC?
Er der noget andet?