Welche ist die beste Variante?

  • Hi,

    ich bin gerade dabei das Spiel "Risiko" zu programmieren. Das Spielfeld ist eine Weltkarte; auf alle Länder muss der Spieler später anklicken können. Die Farbe des angeklickten Landes muss sich verändern können.

    Variante:
    1- Die einzelnen Länder mit GDI zeichen und den Inhalt anschließend füllen.

    2- Die Länder werden vorher als png gespeichert und in ein GUI gezeichnet. Für die verschiedenen Farben der Spieler, könnte man ein halbtransparentes Layer auf das Land zeichen.

    Spoiler anzeigen

    Welche Variante ist die bessere? oder gibt es noch eine Andere?

  • Also eine andere Variante kenne ich nicht, welche du nimmst musst du eig. selber wissen.

    Wenn du es mit GDI-Plus machst ist es ganz bestimmt eine Ganze mäge mehr aufwand aber die Dateien bleiben klein, wenn du alles mit Bildern machst (du hast gesagt mit png, das geht aber auch nur mit GDI+ GuiCtrlCreatePic kann kein PNG anzeigen, woweit sich da bei den Betaversionen nichts geändert hat) werden es viele dateien und auch mehr MB. Dann ist es aber auch zimlich schwer die länder aneinanderzu setzen, weil es sind ja keine 4-Ecke sondern halb wie ein Land aussieht und dann daruf eine action zu legen ist sehr schwer, also das man wirklich nicht nur in der Mitte das Land anklicken kann sondern auch an den Rändern. Aber wenn du einen Weg findest Poste ihn :thumbup:

    mfg. Jam00

  • Ich habe beide Varianten schon ausprobiert. Ich finde es leichert einfach alles per GDI+ zu zeichen. Allerdings kann man komischerweise nicht abfragen ob auf eine gezeichnete Fläche geklickt hat:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aPoints[8][2]

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("GDI+", 400, 300)
    $hWnd = WinGetHandle("GDI+")
    GUISetState()
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $aPoints[0][0] = 7
    $aPoints[1][0] = 50
    $aPoints[1][1] = 50
    $aPoints[2][0] = 100
    $aPoints[2][1] = 25
    $aPoints[3][0] = 200
    $aPoints[3][1] = 5
    $aPoints[4][0] = 250
    $aPoints[4][1] = 50
    $aPoints[5][0] = 300
    $aPoints[5][1] = 100
    $aPoints[6][0] = 350
    $aPoints[6][1] = 200
    $aPoints[7][0] = 250
    $aPoints[7][1] = 250
    _GDIPlus_GraphicsFillClosedCurve($hGraphic, $aPoints)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hGraphic
    MsgBox(32, "Info", "Grafik geklickt!")
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

    [/autoit]
  • Ja das liegt daran das man mit GDI+ nur die Hintergrundfarbe der Gui verändert (soweit ich weiß) und man ein Control erstellt. Müssteste wolh irgendwie mit PixelAbfrage machen, ich guck mal ob ich was hinbekomme, ist eig ganz leicht, solange es einfarbig ist, nur schwer wird wenn ein feld unterschiedliche farben hat

    EDIT:
    Habs Fertig:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aPoints[8][2]

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("GDI+", 400, 300)
    $hWnd = WinGetHandle("GDI+")
    GUISetState()
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $aPoints[0][0] = 7
    $aPoints[1][0] = 50
    $aPoints[1][1] = 50
    $aPoints[2][0] = 100
    $aPoints[2][1] = 25
    $aPoints[3][0] = 200
    $aPoints[3][1] = 5
    $aPoints[4][0] = 250
    $aPoints[4][1] = 50
    $aPoints[5][0] = 300
    $aPoints[5][1] = 100
    $aPoints[6][0] = 350
    $aPoints[6][1] = 200
    $aPoints[7][0] = 250
    $aPoints[7][1] = 250
    _GDIPlus_GraphicsFillClosedCurve($hGraphic, $aPoints)
    GUIRegisterMsg (0x0201,"_Erkennung")
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd
    Func _Erkennung()
    $Info = MouseGetPos()
    $Color = PixelGetColor ($Info[0],$Info[1])
    If $Color = 0x000000 Then
    MsgBox(32, "Info", "Grafik geklickt!")
    EndIf
    EndFunc
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

    [/autoit]

    mfg. Jam00

    Einmal editiert, zuletzt von Jam00 (28. November 2009 um 12:05)