04. august 2002 - 01:02Der er
10 kommentarer og 1 løsning
Space Invaders
Hej eksperter, Som et eksempel på System.Drawing namespacet, er jeg i gang med et lille projekt, nemlig en .NET klon af det ældgamle Space Invaders. Mit problem er, at mit rumskib ikke kan flytte sig mens det skyder.
Selve spillet er i en Control. En OnMouseMove event sørger for hele tiden at få fat i musens placering, og gemme X værdien i pPos. En OnMouseDown event sætter min variabel bool Shooting til true.
En funktion, void UpdateCanvas(), udfører hele svineriet. Den ser nogenlunde sådan ud: private void UpdateCanvas() { ClearCanvas(); DrawPlayer(); // Denne funktion tegner rumskibet ved positionen i pPos if (Shooting) { if (sPos > 0) { canvas.FillRectangle(Brushes.White, sPosX, // Rumskibets placering da det skød sPos, // Der hvor skuddet er nået til 2, 2); sPos--; // Da skuddet skal komme nedefra, flyttes det opad ved at trække fra sPos } else { Shooting = false; } Thread.Sleep(1); // Vent 1 millisekund før næste rutine udføres if (Shooting) UpdateCanvas(); // Hvis vi stadig skyder, skyd videre... }
Det var mit bedste bud, håber der er nogen der har et bedre... :-)
nico22 >> Du har fuldstændig ret, men er der ikke nogen der har et forslag til hvordan jeg så kan gøre det?
moonduck >> Tak for linket, men det er desværre alt alt for avanceret, og ser ud til at være struktureret på en helt anden måde end mit program, hvilket jeg ikke er erfaren nok endnu til at gøre noget ved. Jeg har dog downloadet det hvis jeg skulle få brug for det...
Jo, men så er problemet at koordinaterne i MousePosition er i forhold til hele skærmen, hvor MouseEventArgs.X er i forhold til min Control. Jeg kunne selvfølgelig godt trække viduets størrelse, position osv. fra, men jeg ved ikke hvordan jeg gør det bedst, for det er jo forskelligt hvor bred ens titellinje er.
Jeg fik endelig løst problemet! Jeg brugte en Timer control fra System.Windows.Forms med et interval på 1 millisekund som kalder UpdateCanvas() på hver Tick. Nu mangler jeg bare at man kan have flere skub i luften på én gang.
Det jeg arbejder på nu er en klasse (Shot) som repræsenterer ét skud. Den laver jeg så et array af som konstant gennemgås af et foreach loop. Jeg ved ikke om det er den smarteste metode, men sådan prøver jeg at gøre...
Problemet med et array er vel at den første plads i arrayet skal fjernes først. Dvs. du må flytte pladserne rundt hele tiden. Det var derfor at jeg foreslåede en stak. Problemet var bare at jeg mente en kø :-)
Hvordan konstruerer man sådan en? Jeg har fået det til at virke med skuddene, men ikke med aliens'ne (som indtil videre repræsenteres af røde pletter). Skuddene har en variabel bool Fired. Hvis denne værdi er false, bliver objektet sat til null, og pladsen bliver ledig.
Nu har jeg også fået det til at virke med fjenderne... og man får endda point for at skyde dem...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.