Also, hier ist ein Schnipsel, das eine Methode zeigt, wie man einen Mausklick in unregelmässige Felder erkennen kann.
Es ist vermutlich nicht die beste und schon gar nicht die schnellste Variante, aber immerhin eine, die geht.
Das Prinzip ist, das die Fläche eine Randfarbe hat, und ein Klick in die Fläche mit einem FillArea-Befehl verbunden ist. Für jede Fläche ist ein Punkt gespeichert (Datasection), der sicher innerhalb der Fläche liegt. Nach dem Fill-en wird nur noch überprüft, ob der Punkt nun die Füllfarbe hat. Wenn Ja, wurde das entsprechende Feld geklickt.
Wenn jemand ne einfachere/schnellere Lösung weiss, wäre ich interessiert.
In dem Beispielbild (hier zu finden: http://www.vsurf.de/Dostej-KarteAnzeige.png ) sind es die Provinzen des mittelalterlichen Japans.
Code: Alles auswählen
; PureBasic Visual Designer v3.93 build 1480 (PB4Code)
UsePNGImageDecoder()
;{Konstanten und Variablen
Enumeration
#Sprite1
#File1
EndEnumeration
Enumeration
#Window
EndEnumeration
#MaxProvinz = 64
;EnableExplicit
Define mx.l, my.l
path.s = ""
Global Dim Mittelpunkte(64, 1)
Restore Mittel
For k=1 To #MaxProvinz
Read Mittelpunkte(k, 0)
Read Mittelpunkte(k, 1)
Next
;}
;{ Enviroment
If InitSprite()
Else
MessageRequester("Fehler", "Init nicht möglich")
End
EndIf
;}
;{Proceduren
Procedure DrawScreen()
DisplaySprite(#Sprite1, 0, 0)
;{ zum plazieren der Mittelpunkte
If StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
For x = 1 To #MaxProvinz
DrawText(Mittelpunkte(x, 0), Mittelpunkte(x, 1), Str(x), RGB(0,0,255))
Next
StopDrawing()
FlipBuffers()
EndIf
;}
EndProcedure
;}
;{ Fenster aufbauen
If OpenWindow(#Window, 0, 0, 1024, 748 , "Anzeiger", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
If Not OpenWindowedScreen(WindowID(#Window), 5, 5, 900, 451, 0, 0, 0)
MessageRequester("Fehler", "Screen nicht möglich")
End
EndIf
EndIf
;}
;{ Medien laden
If Not LoadSprite(#Sprite1, Path + "KarteAnzeige.png")
MessageRequester("Fehler", "Sprite konnte nicht geladen werden")
End
EndIf
;}
;{ Laufschleife
DrawScreen()
Repeat ; Start of the event loop
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadget() ; Is it a gadget event?
EventType = EventType() ; The event type
;{ Mausaktionen in Screen
mx = WindowMouseX(#Window)-5
my = WindowMouseY(#Window)-5
If mx > 0 And mx < 900
If my > 0 And my < 451
If Event = 514
; die Farbe unter dem Mauspunkt ermitteln
If StartDrawing(ScreenOutput())
color = Point(mx, my)
If color = RGB(192,192,192)
FillArea(mx, my, RGB(0,0,255), RGB(255,255,0))
; Durchsuche alle Mittelpunkte
For x = 1 To #MaxProvinz
; welcher davon ist nun gelb?
If Point(Mittelpunkte(x, 0), Mittelpunkte(x, 1)) = RGB(255,255,0)
Debug x ; Ergebnis anzeigen
Break
EndIf
Next
EndIf
StopDrawing()
; Ansicht neu aufbauen
FlipBuffers()
Delay(500)
DrawScreen()
EndIf
EndIf
EndIf
EndIf
;}
Until Event = #PB_Event_CloseWindow ; End of the event loop
;}
End
DataSection
Mittel:
Data.l 795
Data.l 157
Data.l 763
Data.l 125
Data.l 663
Data.l 199
Data.l 695
Data.l 253
Data.l 701
Data.l 281
Data.l 666
Data.l 326
Data.l 660
Data.l 358
Data.l 640
Data.l 374
Data.l 638
Data.l 238
Data.l 626
Data.l 303
Data.l 604
Data.l 338
Data.l 581
Data.l 365
Data.l 589
Data.l 314
Data.l 564
Data.l 271
Data.l 559
Data.l 337
Data.l 548
Data.l 220
Data.l 555
Data.l 177
Data.l 510
Data.l 226
Data.l 522
Data.l 242
Data.l 507
Data.l 272
Data.l 526
Data.l 338
Data.l 495
Data.l 329
Data.l 495
Data.l 308
Data.l 481
Data.l 240
Data.l 460
Data.l 272
Data.l 460
Data.l 316
Data.l 438
Data.l 249
Data.l 429
Data.l 290
Data.l 447
Data.l 308
Data.l 452
Data.l 339
Data.l 416
Data.l 262
Data.l 396
Data.l 279
Data.l 423
Data.l 319
Data.l 410
Data.l 303
Data.l 391
Data.l 317
Data.l 386
Data.l 353
Data.l 425
Data.l 229
Data.l 383
Data.l 226
Data.l 378
Data.l 256
Data.l 356
Data.l 207
Data.l 350
Data.l 221
Data.l 344
Data.l 248
Data.l 315
Data.l 194
Data.l 328
Data.l 253
Data.l 287
Data.l 191
Data.l 308
Data.l 234
Data.l 239
Data.l 200
Data.l 266
Data.l 228
Data.l 186
Data.l 206
Data.l 214
Data.l 225
Data.l 365
Data.l 301
Data.l 314
Data.l 282
Data.l 308
Data.l 311
Data.l 239
Data.l 282
Data.l 245
Data.l 306
Data.l 152
Data.l 225
Data.l 163
Data.l 276
Data.l 126
Data.l 317
Data.l 122
Data.l 220
Data.l 118
Data.l 238
Data.l 122
Data.l 262
Data.l 88
Data.l 240
Data.l 67
Data.l 330
Data.l 83
Data.l 355
EndDataSection
edited bobobo