Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Kleine Helferlein

Fadenkreuz auf gedachem Kreis

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.MitgliedThePuppetMaster 26.05.2011

Fadenkreuz_auf_Gedachtem_Kreis

Möchte man in einem Spiel um einen Spieler ein Fadenkreuz Setzen, welcher auf einem gedachten Kreis wandert, wärend man die Maus bewegt, hilft folgende Berechnung,um dies zu lösen.

Berechreibung im Quelltext

screenres 400, 300, 32

'Spielerparameter
Dim TPlayerPosX as UInteger = 200
Dim TPlayerPosY as UInteger = 150
Dim TCircleRadius as UInteger = 40

'Mausparameter
Dim TMouseR as Integer
Dim TMouseX as Integer
Dim TMouseY as Integer
Dim TMouseB as Integer

'zu berechnender Cursor auf dem Kreis
Dim TCursorX as Integer
Dim TCursorY as Integer
Dim TCursorL as Double

do until InKey() = Chr(27)                                          'Beim Drücken von "ESC" Schleife verlassen
    'Aktuelle Mouseposition abfragen
    TMouseR = GetMouse(TMouseX, TMouseY, , TMouseB)

    'Wenn Linke Maustate gedrückt, dann Spielerposition neu setzen
    If TMouseB = 1 then
        TPlayerPosX = TMouseX
        TPlayerPosY = TMouseY
    End If

    'Berechnung ausführen
    TCursorL = Sqr(Abs(TMouseX - TPlayerPosX) ^ 2 + Abs(TMouseY - TPlayerPosY) ^ 2)     'Weglänge zwischen Mausposition und Spielerposition
    If TCursorL > 0 Then  'SONDERFALL! Wenn die Weglänge 0 ist, dann benötigen wir keine Berechnung, da die Position identisch mit der Maus ist. und sich nciht berechnen lässt
        TCursorX = TPlayerPosX + (TMouseX - TPlayerPosX) * TCircleRadius / TCursorL         'Berechnugn für X
        TCursorY = TPlayerPosY + (TMouseY - TPlayerPosY) * TCircleRadius / TCursorL         'Berechnung für Y
    End If

    'Funktionsweise der Berechnung:
    '1. Wir berechnen die entfernen von zwischen Maus und dem Spieler.
    '   Dies machen wir mithilfe des Pythagoras-Satzes. a * a   +   b * b   = c * c  ->  Wurzel aus c * c  ->  Weglänge
    '2. Wir setzen die Länge zwischen Maus und Spieler in ein Prozentuales Verhältniss zu dem Gewünschten Radius
    '   Hierbei nutzen wir einen Simplen Prozentsatz.
    '   Wir kennen die Strecke von SpielerPosition X und der MausPosition X und ziehen beides voneinander ab um einen Abstand (Länge) zu erhalten. (TMouseX - TPlayerPosX)
    '   Angenommen wir haben SpielerX = 100 und MauseX = 60, dann wäre das ergebniss 40
    '   Wir möchten den Kreis im Radius von 30 um den Spieler Zeichnen
    '   Dazu Multiplizieren wir unser ergebniss mit dem gewünschten Radius 40 * 30
    '   und teilen dies anschliessend durch die Berechnete Länge des Abstandes zwischen Maus und Spielerposition
    '   damit erhalten wir die neue X Koordinate welche genau auf dem Kreis liegt.
    '   Anschliessend müssen wir zu diesem Ergebniss die Aktuelle Position des Spielers hinzu addieren.
    'Selbes auch mit Y machen

    'Zeichnen
    ScreenLock()                                                    'Flimmern verhindern
    CLS()                                                           'Bildshirm leeren
    Circle (TPlayerPosX, TPlayerPosY), 3, &HFF, , , , F             'Aktuelle Spielerposition Zeichnen (Gefüllter Kreis, ROT)
    Circle (TPlayerPosX, TPlayerPosY), TCircleRadius, &H00FF00      'Spielerradius (Kreis, GRÜN)
    Circle (TCursorX, TCursorY), 3, &HFFFFFF, , , , F               'Berechneter Cursorpunkt (Gefüllter Kreis, WEIS)
    Circle (TMouseX, TMouseY), 3, &HFFFF00, , , , F                 'Aktuelle Mausposition Zeichnen (Gefüllter Kreis, GELB)

    'Aktuelle Berechnungen anzeigen
    Locate 1, 1                                                     'Textposition zurücksetzen
    Print "Maus:  "; Str(TMouseX); " "; Str(TMouseY)                'Aktuelle Mauskoordinaten
    Print "Laenge:"; Str(TCursorL)                                  'Aktuelle Weglänge
    Print "Cursor:"; Str(TCursorX); " "; Str(TCursorY)              'Aktuelle Cursorberechnung
    ScreenUnLock()                                                  'Flimmern verhindern

    'kurz warten um CPU zu schonen
    sleep 1, 1                                                      '0,001 Sekunde Warten
loop


screen 0                                                            'Bildschirm wieder schliessen
end 0                                                               'Programm sauber beenden

MfG
TPM


Zusätzliche Informationen und Funktionen
  Bearbeiten Bearbeiten  

  Versionen Versionen