Borland C++ Kurven zeichnen



  • Canvas->Pen->Size

    Ich kenne das Spiel leider nicht.
    Ich gehe davon aus, du hast ein Hintergrundbild und zeichnest mit der Mouse Linien auf dieses Bild.

    Im MouseMove Event bekommst du x und y Koordinaten mitgeliefert. Anhand derer kannst du Entscheidungen für deine Spiellogik treffen. ( z.B. Darf ich hier überhaupt zeichnen? )

    Evtl. brauchst du auch noch das MouseDown Event für die Nutzung von Mousetasten.

    Darkman89 schrieb:

    und bei bitmap wäre es dann doch genauso, wenn ich da eine dicke linie zeichnen würde, dann macht erkennt das programm ja nicht nur diese dicke linie sondern das ganze bild oder nicht?

    Naja was heißt "erkennen"... ?

    Die gezeichneten Linien sind auch einfach nur Pixel im Bild, genau wie die Pixel deines Hintergrundbildes. Evtl. solltest du dir die Regionen, die du z.B. nicht bemalen darfst, irgendwo anders noch speichern, oder du speicherst dir die Pixel, die zu deinen gezeichneten Linien gehören, oder du zeichnest die Linien mit einer Farbe, die im restlichen Hintergrundbild nicht vorkommt.



  • also zum spiel:

    http://www.tks-clan.eu/hd.jpg
    so sieht das aus. Die Funktion -> Man geht mit dem Zeiger über den Start und dann anschließend durch Besuche der Panelns bis zum Ziel. Berührt man das Bild (die Karte im Hintergrund) ist das Spiel vorbei. Dies mach ich dann einfach über MouseMoveEvent von Hintergrundbild. Ich setze ein boolwert, wenn mousemove auf pnlStart ist. Sobald ich ersten Panel mit dem zeiger berühre, starte ich den timer für die zeit. der timer stoppt dann entweder bei berührung auf bild (verloren) oder bei berührung auf pnlZiel (spiel gewonnen)

    so, das nun zum spiel. Jetzt war meine idee mithilfe von canvas (an dieser stelle bedanke ich mich für Canvas->Pen->Size) die linien zu zeichnen und dann letzendlich mousmove event nur für die linie abzufragen...wenn ich hierbei aber die pixel nehmen würde, dann ist das doch richtig viel oder nicht? da muss ich ja dann die pixel der kompletten linie "messen" und dementsprechend abfragen...ich hab sowas nie gemacht...ist das wirklich komplex oder kommt mir das nur so vor?



  • Hallo,

    du kannst es an der Farbe der Linie festmachen 🙂 Sobald die Untergrundfarbe des Cursors (Pixels[x][y]) nicht mehr der Farbe der Linie entspricht, ist das Spiel verloren 🙂

    VlG



  • hallo,

    ok, das hört sich schon etwas leicht an...
    wie frage ich dies aber ab?
    also nehmen wir mal an die farbe ist schwarz, dann frag ich ja ab:
    if(Color!=clBlack)
    ShowMessage("verloren");

    aber wie sieht das konkreter aus bzw wo frag ich das dann immer ab...
    lg

    Darkman89



  • if ( Canvas->Pixels[x][y] == clBlack )
    {
        ...
    }
    


  • Darkman89 schrieb:

    aber wie sieht das konkreter aus bzw wo frag ich das dann immer ab...

    Im OnMouseMove Ereignis



  • hey leute,
    hab das grad mal ausprobiert:

    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
      if(Canvas->Pixels[X][Y]==clBlack){
        ShowMessage("schwarz");
      }
    }
    

    es klappt nicht. hab ein bild mit schwarzem fleck und weißem hintergrund genommen...der hat das schwarze nicht erkannt...ist da was falsch?

    EDIT:
    ok hab den fehler gefunden:
    [cpp]
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
    int X, int Y)
    {
    if(**Image1->**Canvas->Pixels[X][Y]==clBlack){
    ShowMessage("schwarz");
    }
    //Image1->Canvas->
    }
    [/cpp]

    achja, der hat gemeckert, dass man nur bmp benutzen darf, das hattet ihr aber ja schon erwähnte! DANKE SCHÖNNNNNNNNNN!!!



  • Hallo,

    habe noch ein kleines Problem. Nachdem man mit dem Mauszeiger auf clBlue kommt, öffnet sich eine ShowMessage (Später soll hier ein video geöffnet werden) nachdem klick auf ok-buttons des Showmessage soll der mauszeiger ja wieder zurück im blauen Punkt gelangen, weil das spiel gar nicht beendet ist. ich hab da eine funktion gefunden:

    SetCursorPos(x,y);
    

    die x und y werte speicher ich einfach vor ShowMessage ab:

    if(imgKarte->Canvas->Pixels[X][Y]==clBlue)
                if(start){
                  x=X;
                  y=Y;
                  ShowMessage("Warschau");
                  SetCursorPos(x,y);
                }
    

    so nach dem klicken auf dem ok von showmessage, gelangt der mauszeiger nicht auf der gewünschten position...mir ist dann aufgefallen, dass diese SetCursortPos sich auf das ganze Bildschirm bezieht. Meine X und Y Werte dagegen sind ja dann nur vom Formular...habe aber dann mein Formular ganz oben links gerichtet und paar pixels hinzugefügt (wegen der Leiste oben):

    SetCursorPos(x,y+27);
    

    die werte sind einigermaßen ok, aber nicht hervorragend...meine fragen, gibt es eine SetCursorPos Funktion explizit für Formular? sodass es egal ist, wo sich das Formular sich grad befindet und die x und y werte sich auf formular beziehen?

    lg
    Darkman89



  • Hallo,

    Du kannst ja die Koordinaten mit ClientToScreen konvertieren.



  • ehmm kannst du das bitte mal etwas konkreter erläutern?
    ich kriege fehlermeldung:

    x=ClientToScreen(X);
    [C++ Error] uHD.cpp(144): E2064 Cannot initialize 'const TPoint &' with 'int'
    


  • 1. ClientToScreen ist eine Memberfunktion von TForm
    2. Sie erwartet als Parameter ein TPoint
    3. Sie liefert ein TPoint zurück
    das steht aber alles in der Hilfe
    also

    TPoint screenPos = form1->ClientToScreen(TPoint(X,Y));
    x = screenPos.x;
    

Anmelden zum Antworten