Mein SpaceInvaders project, Spieler interaktion macht probleme (UPDATE_3.1)



  • Es tut mir leid ich verstehe nicht genau was du meinst 😞 ich habe SetCursorPos nachgeschlagen , das erscheint mir ja ganz sinnvoll wenn ich den Spieler bewegen möchte aber wie finde ich überhaupt seine Position heraus? Nach weiterem suchen habe ich GetCursorPos gefunden aber ich kriege es nicht hin die funktion in meinen Code zu implementieren 😕



  • µBx schrieb:

    aber ich kriege es nicht hin die funktion in meinen Code zu implementieren 😕

    Das ist keine Aussage.Was genau kriegst du nicht hin?Zeig uns im Code wo du es nicht hinkriegst(aber bitte nur das Codestückchen und nich den ganzen Code des Spiels).



  • Ich verstehe http://msdn.microsoft.com/de-de/library/ms648390(en-us,VS.85).aspx und http://msdn.microsoft.com/de-de/library/ms648380(en-us,VS.85).aspx (unterer Teil, "Using the Keyboard to move the cursor" nicht richtig. Ich habe zwar versucht GetCursorPos aufzurufen aber er sagt mir "GetCursorPos im aktuellen Kontext nicht vorhanden"

    übrigens, soweit ich es verstanden habe hat die ganze sache was mit pointern zu tun ... darin liegt vermutlich mein defizit ich hab bisher kaum ahnung was pointer sind... kennt jmd von euch ein gutes tutorial dafür?



  • Zeig wie du sie aufrufst. 🙄



  • int pos;
    GetCursorPos(pos);
    

    👎

    ich weiss das der Rückgabewert int eigentlich falsch ist aber welche einheit kann man denn dafür verwenden ??? oO





  • µBx schrieb:

    Es tut mir leid ich verstehe nicht genau was du meinst 😞 ich habe SetCursorPos nachgeschlagen , das erscheint mir ja ganz sinnvoll wenn ich den Spieler bewegen möchte aber wie finde ich überhaupt seine Position heraus?

    Indem du die Positoin in eine bzw. zwei Varaiblen speicherst.

    µBx schrieb:

    Nach weiterem suchen habe ich GetCursorPos gefunden aber ich kriege es nicht hin die funktion in meinen Code zu implementieren 😕

    GetCursorPoshat mit C# erstmal nichts zu tun. WINAPI und :net sind zwei unterschiedlice Dinge.
    Die aktuelle Position, d.h. sollte eigentlich egal sein, oder wofür möchstest du sie verwenden?

    Die aktuelle Consolencursorpsoition erhält man über Console.CursorTop und Console.CursorLeft.

    Firefighter schrieb:

    http://www.cy2online.net/Snippet/CSharp/Miscellaneous/71/Get_Cursor_Position.html

    Beschäftige dich mal mit den Grundlagen richtig.

    Was soll der mit der Mausposition in einem Konsolsenfenster anfangen?



  • Hahah 😃 Da hab ich wohl doch zu viel Rum gedrunken 😃 Ja der Link war mist :p



  • ok, danke allerdings möchte ich ja nicht die koordinaten vom mouse cursor wissen sondern die vom text cursor ...

    ...

    Ich wollte gerade ausprobieren ob es nicht vllt doch den text cursor anzeigt und habe den code eingefügt allerdings kriege ich die fehlermeldung das "Cursor" im aktuellen Kontext nicht vorhanden ist und das der Typ oder Namespace "Point" nicht gefunden werden konnte.

    Das war der Code den ich ausprobiert habe (im sourcecode des spiels) :

    Point a = Cursor.Position;
                string x = a.X.ToString();
                string y = a.Y.ToString();
                Console.WriteLine(x);
    

    es kann auch sein das ich irgendwas übersehe da ich a) noch ein anfänger bin und b) totmüde

    ----------------------------------------

    EDIT: OK... als ich den post geschrieben hab kamen 2 andere hinzu^^ das erklärt die sache natürlich 🙂

    danke Rhombicosidodecahedron 🙂 der Befehl hat mir schonmal weitergeholfen 🙂



  • Hi leute, ich bin nun etwas weitergekommen stehe aber wieder vor einem Problem bei dem ich keine Lösung weiß. Ich schäme mich auch das ich den Code vom Snakeprojekt abgeguckt habe aber es hat quasi genau gepasst...

    Mein Problem ist das er zwar das Spielersymbol "#" angibt wenn ich auf die rechte Pfeiltaste drücke aber wie lösche ich das Symbol wie sorge ich dafür das bei 10 klicks auf die rechte Pfeiltaste "________#" ( = Leerzeichen, kann ich so aber nicht im Forum angeben) und nicht "##########" ausgegeben wird? Tut mir leid für die dämlichen Fragen aber ich bin wirklich ein blutiger Anfänger 😕

    Es muss bei einem klick auf die Linke Taste das letzte Symbol gelöscht werden, aber wie mache ich das genau ? denn das letzte Symbol ist ja kein String sondern "irgendein" text der in der Console steht, und wenn ich quasi den string "#" suche und herausfinde (auch weiss ich nicht genau wie das geht...) würde das Programm doch auch den String Player und seine Spuren finden oder?

    Sorry für all die Fragen, hab mir heute ein C# Buch bestellt (Der visual c# programmierer) morgen soll es ankommen, vllt nerve ich euch dann weniger mit Fragen

    EDIT: Ach verdammt, ich habe gerade gesehen das genau das die Frage beim Snake Projekt war, ich denke ich habe die idee dahinter verstanden aber nicht genau den Coder der dort geposted wurde 😕 ich bemühe mich nochmal seler vllt löse ich es ja doch. Immerhin hab ich jetzt nen ansatz^^

    EDIT2: Ok Problem gelöst... und jetzt habe ich auch die "oldLeft" und "oldTop" int im snakeprojekt code gefunden, als ich die nicht fand hatte es mich etwas verwirrt. Sorry für die Störung 😕

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    
    namespace Console_Invaders
    {
    
        class Program
        {
    
            public void credits()
            {
                Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
                Console.WriteLine("X                            X");
                Console.WriteLine("X This Game was coded by µBx X");
                Console.WriteLine("X                            X");
                Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
                Console.WriteLine("");
            }
    
            static void Main()
            {
                int ymax = Console.WindowHeight - 3;
                int xmax = Console.WindowWidth;
                Program p = new Program();
                p.credits();                                            
                Console.WriteLine("Bitte eine Taste drücken um das Spiel zu starten!");
                ConsoleKeyInfo KPs; // KP = KeyPressedstart
                KPs = Console.ReadKey(true);
                //Console.WriteLine(KP.Key);
                Console.Clear();
                Console.WriteLine("Das spiel beginnt !...");
                Thread.Sleep(500);
                Console.Clear();
                Console.SetWindowSize(80,50);
                Console.WriteLine("");
                Console.WriteLine("");
                Console.WriteLine("");
                Console.WriteLine("");
                String Player = "#";          
    
                int CPos;
                CPos = Console.CursorLeft;
                ConsoleKeyInfo KP;
                int CTOP = Console.CursorTop;
                do
                {
                    KP = Console.ReadKey(true);
    
                    switch (KP.Key)
                    {
                        case ConsoleKey.RightArrow:
                            if (CPos < 78)
                            {
                                ++CPos;                            
                            }
                            break;
    
                        case ConsoleKey.LeftArrow:
                            if (KP.Key == ConsoleKey.LeftArrow)
                            {
                                if (CPos > 1)
                                {
                                    --CPos;                                
                                }
                            }
                            break;
    
                    }
    
                    Console.SetCursorPosition(CPos, CTOP);
                    //Console.WriteLine(CPos);                            
                    Console.Write(Player); 
    
                } while (KP.Key != ConsoleKey.Escape);
    
            }
    
        }
    
    }
    


  • Also erst mal: mach dich doch nicht selber so fertig, 1. die besten sachen sind geklaut 2. ist doch nichts schlimmes hab da ja nich nur für eine person geholfen sondern für alle folgenden 😛
    zweitens: es gibt keine dämlichen fragen als anfänger nur dämliche antworten
    drittens: das forum ist doch für fragen da, du nervst doch dann nicht ^^
    viertens: seh grade du hast es ^^ aber vllt hilft dir ja trotzdem meins noch habs komplett überschrieben viel komfortabler 😛
    naja hier:

    class Program
      {
        //Top und Left sind die CursorPosition nur bisschen kürzer
        //damit kann die CursorPosition auch verändert werden
        static int Top
        {
          get { return Console.CursorTop; }
          set { Console.CursorTop = value; }
        }
    
        static int Left
        {
          get { return Console.CursorLeft; }
          set { Console.CursorLeft = value; }
        }
    
        static void Main()
        {
          Console.CursorVisible = false;//is ja hässlich wenn man den sieht ^^
          credits();
          Console.WriteLine("\r\nBitte eine Taste drücken um das Spiel zu starten!");
          Console.ReadKey();
          Console.Clear();
          Console.WriteLine("Das spiel beginnt !...");
          Thread.Sleep(500);
          Console.Clear();
          Console.SetWindowSize(80, 50);
          Console.WriteLine("\r\n\r\n\r\n");//\r\n = Escapesequenz für zeilenumbruch
          String Player = "#";
    
          Console.Write(" " + Player);//Player das erste mal schreiben
          Left--;//Springe wieder mit Cursor auf Playerstelle
    
          ConsoleKeyInfo Input;
          do
          {
            Input = Console.ReadKey(true);
            switch (Input.Key)
            {
              case ConsoleKey.RightArrow:
                if (Left < 78)
                {
                  Console.Write(" " + Player);//überschreibt alt und macht neu
                  Left--;//setzt wieder auf aktuell
                }
                break;
              case ConsoleKey.LeftArrow:
                if (Left > 2)// Hab den Wert erhöht damit es symetrisch ist :)
                {
                  Left--;//Setzt dahin wo player hinkommt
                  Console.Write(Player + " ");//macht neues zeichen und automatisch altes überschreiben
                  Left -= 2;//Setzt wieder dahin wo player ist
                }
                break;
            }
          } while (Input.Key != ConsoleKey.Escape);
        }
    
        static void credits()//static dadurch kannst dus direkt benutzen
        {
          Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
          Console.WriteLine("X                            X");
          Console.WriteLine("X This Game was coded by µBx X");
          Console.WriteLine("X                            X");
          Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
        }
      }
    


  • Vielen Dank das macht es wirklich VIEL übersichtlicher, ich hatte eigl vor es erstmal _irgendwie_ hinzubekommen und dann um eine nachbearbeitung hier im board zu bitten. Dann arbeite ich mal mit dem Code weiter 🙂



  • So , ist etwas her das ich mich damit beschäftigen konnte. Ich habe mich heute mal wieder dran gesetzt und sofort trat ein Problem auf! Wie mache ich die schuss-funktion ? Ich muss einen String in eine bestimmte Reihe posten können habe aber weder bei msdn noch in meinem Buch ("Der C# Programmierer") irgendwelche informationen dazu einen String in eine bestimmte Reihe zu schreiben! theoretisch benötige ich ja

    Console.Write("!")
    

    ("!" ist das geschoss) aber wo kann ich hier nun den paramter für die Reihe reinquetschen ? unter http://msdn.microsoft.com/de-de/library/system.console.write(VS.80).aspx konnte ich nichts passendes finden.

    Code ist unverändert von Sirajas verbessertem Code, nur das ich die schuss funktion auf die leertaste geschrieben habe also :

    case ConsoleKey.Spacebar:
    {
         Console.Write("!");    
    }
    break;
    

    ist ja klar das "!" das "#" ersetzt, deswegen muss ich es ja irgendwie hinkriegen es in eine andere Reihe zu schreiben
    -----
    mal wieder eine hochkomplexe frage^^



  • top++; .



  • ach verdammt, natürlich. Habs bei deiner version etwas übersehen^^ danke 🙂



  • und ich komme schon wieder nicht weiter 😞 .

    die notizen habe ich nur für mich im programm gemacht.

    Das problem ist das ich nach meiner Idee "Left mal leer" schreiben möchte und danach player ... ich habe es mit for, while und do-while schleifen probiert... keins hat hingehauen im code ist derzeit mein letzter while versuch...

    case ConsoleKey.Spacebar:
                        {
                            if (Left > 2)
                            {
    
                                Top = Top - 5;
                                Console.WriteLine("!");
                                Top = Top + 4;
    
                                string leer = " ";
                                int fuck = 1;
    
                                while (fuck != Left)
                                {
                                    Console.WriteLine(leer);
                                    fuck++;
                                }
    
                                /* Ich muss es hinkriegen, dass der Player nach dem schuss wieder an die Position zurück
                                 * kommt und nicht wieder an den anfang gesetzt oder ganz gelöscht wird...
                                 * ausserdem muss ich es schaffen den player immer auf einer Linie zu behalten, das ist
                                 * immer aktualisiertes Top (z.B. Top - 5) + 1 (in dem statischen Fall den ich zum test
                                 * habe wäre es Top + 4 */
    
                                /* IDEE: um den Player wieder an die Position zu setzen einfach Left mal leer schreiben
                                 * das problem ist das Left nur 1mal geschrieben wird oder es nur "nach unten" funktioniert */
    
                            }
    
                        }
                        break;
    


  • ehm ich versteh dein problem nich ganz ^^, der player sollte sich doch beim schuss garnet bewegen :-P?



  • mh probiers mal aus dann siehst du das der player nach dem schuss von vorne anfängt also player wird nach Left = 0 , gesetzt

    du darfst mir deine msn addy / icq nummer per mail oder privater nachricht schrieben 😛 wenn nicht is auch ok^^



  • hab ich net sry ^^ bin aber im forum immer wieder da 😉 ^^ hab mir überlegt am besten is noch ne methode

    static void Schreibe(int X,int Y, string Text)
    {
        int altX = Left;
        int altY = Top;
        Console.SetCursorPosition(X,Y);
        Console.Write(Text);
        Console.SetCursorPosition(altX,altY);
    }
    

    also damit kannst du ja dann immer i-wo was zeichnen und trotzdem an der alten position sein danach 😛



  • Hi, ich komme einfach nicht weiter... ich habe nicht mal einen Ansatz 😕 ich weiss nicht wie ich die schuss funktion "sinnvoll" programmieren soll ich hatte zwar nen ansatz bei dem er das geschoss immer 1 reihe pro 0.5 sek hoch gesetzt hat aber der code war schwachsinn (7-8 mal Setcursorposition, write,sleep) vorallem konnte man den Cursor nicht "richtig" bewegen als es ausgeführt wurde da die position ja immer mal wieder kurz woanders hingesetzt wurde. Kann mir jmd verraten wie ich die schuss funktion coden soll ? (siraja vielleicht ? :))

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    
    class Program
    {
        //Top und Left sind die CursorPosition nur bisschen kürzer 
        //damit kann die CursorPosition auch verändert werden 
        static int Top
        {
            get { return Console.CursorTop; }
            set { Console.CursorTop = value; }
        }
    
        static int Left
        {
            get { return Console.CursorLeft; }
            set { Console.CursorLeft = value; }
        }
    
        static void Main()
        {
            Console.CursorVisible = false;//is ja hässlich wenn man den sieht ^^ 
            credits();
            Console.WriteLine("\r\nBitte eine Taste drücken um das Spiel zu starten!");
            Console.ReadKey();
            Console.Clear();
            Console.WriteLine("Das spiel beginnt !...");
            Thread.Sleep(500);
            Console.Clear();
            Console.SetWindowSize(80, 50);
            Console.WriteLine("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n");//\r\n = Escapesequenz für zeilenumbruch 
            String Player = "#";
    
            Console.Write("                                      " + Player);//Player das erste mal schreiben 
            Left--;//Springe wieder mit Cursor auf Playerstelle 
    
            ConsoleKeyInfo Input;
            do
            {
                Input = Console.ReadKey(true);
                switch (Input.Key)
                {
                    case ConsoleKey.RightArrow:
                        if (Left < 78)
                        {
                            Console.Write(" " + Player);//überschreibt alt und macht neu 
                            Left--;//setzt wieder auf aktuell 
                        }
                        break;
                    case ConsoleKey.LeftArrow:
                        if (Left > 2)// Hab den Wert erhöht damit es symetrisch ist :) 
                        {
                            Left--;//Setzt dahin wo player hinkommt 
                            Console.Write(Player + " ");//macht neues zeichen und automatisch altes überschreiben 
                            Left -= 2;//Setzt wieder dahin wo player ist 
                        }
                        break;
                    case ConsoleKey.Spacebar:
                        {
                            int altX = Left;
                            int altY = Top;
    
                            Console.SetCursorPosition(altX, altY);
    Schuss(Left, Top - 5, altX, altY);
    
                        }
                        break;
    
                }
            } while (Input.Key != ConsoleKey.Escape);
        }
    
        static void credits()//static dadurch kannst dus direkt benutzen 
        {
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            Console.WriteLine("X                            X");
            Console.WriteLine("X This Game was coded by µBx X");
            Console.WriteLine("X                            X");
            Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
        }
    
        static void Schuss(int SchussPosLeft, int SchussPosTop, int altX_2, int altY_2)
        {
            Console.SetCursorPosition(SchussPosLeft, SchussPosTop);
            Console.Write("!");
            Console.SetCursorPosition(altX_2, altY_2);
    
        }
    }
    

Anmelden zum Antworten