Avatar billede simon.ulsnes Nybegynder
04. august 2002 - 01:02 Der 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... :-)
Avatar billede jakobandersen Nybegynder
04. august 2002 - 01:09 #1
Jeg kom lige i tanke om denne artikel, det kan være du kan finde lidt hjælp her:

http://www.c-sharpcorner.com/Graphics/SpaceInvadersMG.asp
Avatar billede nico26 Nybegynder
04. august 2002 - 01:16 #2
jeg tror problemet ligger i at hvis du skyder kaldes UpdateCanvas() rekursivt, og derved bliver mousemove events ikke håndteret - måske.
Avatar billede simon.ulsnes Nybegynder
04. august 2002 - 02:25 #3
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...
Avatar billede nico26 Nybegynder
04. august 2002 - 02:38 #4
Kan du ikke droppe mousemove eventet, og så bare aflæse musens koordinater i hver iteration i dit gameloop?
Avatar billede simon.ulsnes Nybegynder
04. august 2002 - 12:01 #5
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.

// Simon
Avatar billede simon.ulsnes Nybegynder
04. august 2002 - 12:58 #6
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.

// Simon
Avatar billede odegaard Nybegynder
04. august 2002 - 13:42 #7
Kan du ikke lave en stak som indeholder alle dine skud?
Avatar billede simon.ulsnes Nybegynder
04. august 2002 - 13:48 #8
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...

// Simon
Avatar billede odegaard Nybegynder
04. august 2002 - 14:06 #9
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ø :-)
Avatar billede simon.ulsnes Nybegynder
04. august 2002 - 14:40 #10
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.

// Simon
Avatar billede simon.ulsnes Nybegynder
04. august 2002 - 14:52 #11
Nu har jeg også fået det til at virke med fjenderne... og man får endda point for at skyde dem...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester