C# (+XNA) Classes samen laten werken

Pagina: 1
Acties:

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
[disclaimer modus] Waarschijnlijk zie ik iets stoms over het hoofd of heb ik gegoogled naar de verkeerde woorden [/disclaimer modus]

Ik ben nu een tijdje aan het spelen met XNA Gamestudio Express, icm Visual Studio C# Express.

Werkt allemaal lekker en ik heb al aardig wat driehoekjes getekend :)

Nu krijg ik een ontzettend lange Game1.cs (zeg maar de hoofdmodule van het programma) waar allemaal methods in staan zoals bijvoorbeeld "KeyboardInput()"

de zelf geschreven methode Keyboard Input leest of er een toets wordt ingedrukt en wordt elke keer van uit een andere methode (Game.Update()) gecalled.

Nu wil ik om alles netjes te ordenen de methode KeyboardInput() in het bestand Keyboard.cs zetten in het zelfde project. Alleen nu geeft Game.Update aan dat "KeyboardInput()" niet bestaat in de huidige context

Logisch!

Nu heb ik Keyboard.cs al dezelfde namespace gegeven als Game1.cs, ook heb ik al de volgende regel toegevoegd aan Keyboard.cs (het ": Micrososft.Xna.Framework.Game gedeelte")
C#:
1
2
3
4
5
6
7
namespace XNA_Tryout
{
    class Keyboard : Microsoft.Xna.Framework.Game
    {
      //code
    }
}


Is dat nodig? (het helpt iig niet)

Ook heb ik geprobeerd om in Game1.cs "using Keyboard" en "using Keyboard.cs" te zetten in de using statements maar dit helpt ook niet.

Het is vast iets heel stom kleins, maar hoe zorg ik er dus voor dat ik over meerdere bestanden kan werken met 1 class (of met samenwerkende classes)

Het klinkt eigenlijk redelijk elementair maar heb het niet kunnen vinden, ook niet in de C# video tutorials.

~ Mijn prog blog!


  • Niek.NET
  • Registratie: Oktober 2005
  • Laatst online: 01-12 17:20
Je class is private. Als je deze public maakt en de namespaces komen overeen met die in de Game1.cs kun je de KeyboardInput() aanroepen met 'Keyboard.KeyboardInput();'

Overigens denk ik niet dat het nodig is om je Keyboard te laten overerven van Microsoft.Xna.Framework.Game aangezien je 'hoofd' class al een game entiteit vertegenwoordigt.
Ik heb zo'n vermoeden dat je KeyboardInput() methode de keyboard state ophaalt van de Keyboard class ipv je 'hoofd' class.

edit:

Ik zie net in mijn eigen code dat je waarschijnlijk in Game1 class straks 2 definities hebt van de Keyboard class omdat deze ook in de Microsoft.Xna.Framework.Game voorkomt. Misschien is het een goed idee om een 'InputMonitor' class te maken :)
therat10430 schreef op zaterdag 05 mei 2007 @ 11:06:
Ook heb ik geprobeerd om in Game1.cs "using Keyboard" en "using Keyboard.cs" te zetten in de using statements maar dit helpt ook niet.
een using statement wordt gebruikt om een 'snelkoppeling' te maken naar een namespace, niet naar een class. In jouw geval dus niet nodig omdat je je Keyboard class al in dezelfde namespace hebt zitten als je Game1 class.

[ Voor 45% gewijzigd door Niek.NET op 05-05-2007 11:29 ]


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 20-11 21:40

Not Pingu

Dumbass ex machina

Niek.NET schreef op zaterdag 05 mei 2007 @ 11:21:
Je class is private. Als je deze public maakt en de namespaces komen overeen met die in de Game1.cs kun je de KeyboardInput() aanroepen met 'Keyboard.KeyboardInput();'
Dan moet je de method KeyboardInput() wel static maken, net als alle bijbehorende member variabelen.

Een beter idee is misschien een instance van je Keyboard class in Game1.cs te plaatsen.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Hardstikke bedankt het werkt nu, kleine aanvulling
In Game1.cs is ook deze code nog nodig
C#:
1
2
3
//InputClass.cs is mijn file voor keyboardinput
//deze code staat in Game1.cs
InputClass inputclass = new InputClass();


Nu kan ik vanuit Game1.cs zo verwijzen naar InputClass:
C#:
1
inputclass.ProcessKeyboard();


(Semi-)Publieke variabelen kan ook door in Inputclass te zetten:
C#:
1
public int mijnpubliekeint;


deze berijk je dan in Game1.cs dmv
C#:
1
inputclass.mijnpubliekeint = 8;


Hiermee kun je niet vanuit bijvoorbeeld Soundsystem.cs de variabele meteen benaderen, maar je kunt wel via Game1.cs deze weer heen en weer sturen.

Hardstikke bedankt, als iemand nog op of aanmerkingen of tips voor (echt) globale variabelen heeft (zover die in C#) bestaan hoor ik ze graag, ik heb hier btw even een heel uitgebreide post van gemaakt ter naslag omdat ik er zelf nogal lang mee aan het klooien ben geweest.

*Therat denkt nog even na, hmmm alleen lezen.. hmm dat zou redelijk threadsafe kunnen zijn hmm multi-monitor, multi-core engine hmmm -> eerst maar meer C# kennis verkrijgen }) *

[ Voor 94% gewijzigd door roy-t op 05-05-2007 18:30 ]

~ Mijn prog blog!