Jag håller på att göra ett plattformspel (typ supermario) för att värma upp så att säga. Mitt problem är följande: Det bästa är om du gör som du sa: att du skapar en spelareklass och sedan skapar klasser som ärver ifrån den första. Bas-klassen innehåller det mest grundläggande, det som alla olika sorters gubbar kommer att behöva. Nu är jag inte så haj exakt på SuperMario, men om det inte skiljer speciellt mycket så kan du också skapa en cPlayer klass som du initierar med lite olika parameterar. Då behöver du inte blanda in polymorfism om du inte vill. Hänger inte riktigt med på det där med interface o vb.net koden. Vad menar du med interface? Har alltid undrat det... Inte samma som gui hoppas jag. JohanL, om jag gör så som du beskrev blir det så mycket (som jag ser det) onödig kod. Största problemet skulle vara animationerna. Jag har bara läst en tutorial om DX DirectDraw och den handlade om hur man gör ett pong. Så allt jag gör har jag kommit på själv i princip. Det system för animationer jag har nu ser ut som så att jag skapar ett fält/array (?) Rectangle[n] med n antal rectanglar i som inne håller positionerna av varje bildruta. Vet inte om det är så man brukar göra eller om det finns något smidigare. Det blir väldigt svårt att bara ha en player klass då för det blir så mycket och rörigt. Jag skulle rekommendera att du tittar på de exempel som innehåller Meshes i SDK't, där kommer du få en bättre förståelse för hur animation kan genomföras med hjälp av så kallad Keyframe itnerpolation. Ojj, den här tråden var gammal nu... Skulle bara säga att jag löste problemet för ett bra tag sen nu med lite polymorphism, använde virtuella functioner och override. Funkar jätte bra! Om någon skulle ha samma problem så vet ni vad ni ska leta efter! Fast det är en onödig metod, JohanLs är egnetligen mycket vettigare. Helt riktigt är det väldigt onödigt att använda polymophism bara för det är en annan uppsättning animationer, krävs det inget ultrageni för att räkna ut. Som jag sa i _första_ posten är spelet mer avancerat än bara "mario och luigi"spelet innehåller inte ens dom :P, just nu utvecklar jag multiplayer, fungerar väldigt bra, har en basic deathmatch 'motor' :)class fråga i dxdw
Jag har 2 klasser: cMario och cLuigi. Dessa innehåller allting som har med som att göra såsom position animations arrayer o annat stuff. Sedan har jag en class där jag knyter samman alla andra classer, cGame. Vad jag vill kunna göra är att man ska kunna välja om man vill spela mario eller luigi innan spelet börjar. Nu till det riktiga problemet: Oberoende av om man väljer mario eller luigi vill jag bara behöva en uppsättning kod. Alltså jag vill INTE skapa 2 object, typ:
Mario = new cMario();
Luigi = new cLuigi();
För att sedan behöva skriva 2 st rader av allt.
Mario.Draw(surface);
Luigi.Draw(surface);
(I spelloopen)
Utan jag vill skapa ett object som har alla egenskaper och metoder som den gubbe som spelaren väljer. Alltså classen cPlayer ärver från cMario om spelaren väljer Mario och från cLuigi om spelaren väljer honom.
Vet inte riktigt om detta går eller inte, eller om det finns en anna likande lösning. Grejjen är den att spelet kommer vara mycket mer avancerat än vad jag har beskrivit men det har ingen betydelse för principen är den samma.
Fråga om ni inte förstår vad jag menar! :)
Tacksam för svar.Sv: class fråga i dxdw
En annan variant är att du använder interface.
När du sedan ska välja spelare så har du något i stil med (vb.net):
dim cPlayer as PlayerBaseClass
Select Case iPlayerType
Case iPlayerType_Mario
cPlayer = New PlayerMarioClass
Case iPlayerType_Luigi
cPlayer = New PlayerLuigiClass
End Select
Hänger du med?Sv: class fråga i dxdw
<code>
class cPlayer {
void InitializePlayer(string name) {
if(name=="Mario") {
// Ladda Marios animationer och specifika inställningar (hastighet kanske)
} else if (name == "Luigi") {
// Ladda Luigis animationer osv
}
// Och så initierar variabler som kanske är gemensamma...
}
}
</code>Sv: class fråga i dxdw
Rätta mig om jag har fel nu... Skulle din kod innebära att jag bara skulle behöva skriva en rad kod för allt i Spel klassen (cGame). T.ex när användaren trycker ner pilhöger behöver jag inte kolla om han valde luigi eller mario, utan det är bara o skriva:
<code>
cPlayer.XPosition += loopduration * speed;
</code>
Det är det jag vill uppnå!
Här kommer en liten kodbit som körs när pil höger trycks ner, som jag inte tycker är så bra. Hade vart bättre om det vore som ovan.
<code>
if(PlayingWith == enumPlayingWith.Mario)
{
Mario.XPosition += Convert.ToInt32( Mario.MoveSpeed * this.dLoopDuration );
}
else if(PlayingWith == enumPlayingWith.Luigi)
{
Luigi.XPosition += Convert.ToInt32( Luigi.MoveSpeed * this.dLoopDuration );
}
</code>
Det är just detta jag vill undvika. Kan du förklara lite mer vad din kod innebär.Sv: class fråga i dxdw
Sv: class fråga i dxdw
MvhSv: class fråga i dxdw
Sv: class fråga i dxdw
En ny klass är bara motiverad om den är fundamentalt skiljd från en annan klass; att den har andra metoder, har en annan funktion (syfte), etc.
I ditt fall hade det ju helt klart räckt att ladda in animationerna etc. dynamiskt. Hade inte krävt mer kod, och OODn hadevarit mer logisk.Sv: class fråga i dxdw
Grejjen är den att spelarna innehåller många olika funktioner pga dom kan göra olika saker, t.ex slide, wall-jump o lite annat som inte alla kan göra, jobbar på det just nu. Plus att alla fiender använder också spelar-basklassen, dock modifieras en del värden i fiende-subklassen, men fortfarande samma klass.
Så i mitt fall skulle jag nog inte klara mig så bra utan polymorphism.