| Autor |
Beitrag |
bockwurst
      
Beiträge: 191
win98 /XP
D1 D5 Prof DE2005PE
|
Verfasst: Mo 17.10.05 10:01
Ich versuche eine Art RisikoBrettspiel zu programmieren,
dazu habe ich einige Fragen.
Kann ich in einem großen Bitmapbild Regionen markieren, die wenn sie mit der Maus gedrückt werden ein Ereignis ausführen können.
Kann ich nur diese Region in der Farbe verändern?
Ich möchte eine eine Lnadkarte abscannen und dann mit der Maus auf einzelene Teile klicken. Ist dies zu möglich?
MFG
Andreas
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 17.10.05 10:23
Regionen Ala HTML Maps kannst du nicht definieren. Das musst du schon alles per Hand machen. Aber mit dem passenden Trick sollte das sehr einfach sein.
Mir würde da Spontan die Idee kommen, dass du dir noch eine temporäre Bitmap erstellst in der die einzelnen Regionen jeweils eine eigene Farbe haben. Und das als 256 Farben Bitmap, dann hast du die Möglichkeit 256 verschiedene Regionen zu definieren. Die müsste dann genau so groß sein wie das richtige Bild. Wenn jemand Klickt, dann prüfst du in der Regionenmap welche Farbe das Pixel hat und so kannst du genau abprüfen wo jemand hingeklickt hat. Dabei spielt es keine Rolle wie das Bild aussieht welches du dann darstellst. Das ist ja ein anderes.
Das Einfärben kannst du auch mit Hilfe dieser Map machen. Du weißt ja welche Region (Farbe) du einfärben möchtest und gehst mit Scanlines ein mal durch beiden Bilder durch (Pixel für Pixel) und jedes Pixel was zu deiner Region gehört (Regionmap) färbst du in der anderen Map ein. Das sollte recht schnell gehen. Und zur optischen Aufbesserung könntest du auch ein wenig Transparenz mit einbauen.
Wichtig ist, dass du beim Erstellen der Regionenmap äußerste Vorsicht walten lässt, da jede noch so kleine Farbänderung sich auf das Spiel auswirken wird.
Die ander Möglichkeit wäre, dass du deine Grenze mit Vektoren definierst und das dann abprüfst. Aber dabei dürfte der Aufwand ziemlich große sein.
PS: Wenn du lustig wärst, würdest du es auch so einbauen, dass die Leute ihre eigenen Maps einladen können und auf denen spielen könnten. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 17.10.05 14:48
Oder einfach in OnClick des Images:
Delphi-Quelltext 1: 2:
| if PtInRect(Mouse.CursorPos, Rect(1, 1, 10, 10)) then ShowMessage('Die Maus ist im oberen Eckbereich'); |
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 17.10.05 14:55
Hast du die Karte von Risiko schon mal gesehen? Das sind Landesgrenzen drauf abgebildet. Ich glaube nicht, dass du da simple Rechteckte ausreichen werden.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Mo 17.10.05 18:01
ich find die idee mit dem zweiten bitmap ziemlich gut aber würde es nicht genügen wenn man die koo vom onclick nimmt und dann die farbe bei diesem pixel überprüft? am besten wäre das wohl mit den rgb werten zu machen oder?
_________________ "Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Mo 17.10.05 19:00
Vermutlich nicht, da die Einfärbung der Karte ja geschieht um den Spielerländer anzuzeigen. Man käme also ohnehin nicht daran umher eine zweite Map für die Landesidentifikation zu halten. Lossey Lösung hört sich auch für mich spontan nach der besten an, zumal mit entsprechenden Graustufen eine leichte Implementation möglich ist und man mit dieser "Alpha-Map" auch nichtmal sehr groß landet. Ein alternatives Ansatz (wohl aber nicht zeitgemäß) wäre es nicht die Länder anklickbar zu machen, sondern in den Ländern "Anfasser" zu setzen auf die der Spieler klicken muss. Dies liesse sich dann definieren und leicht mit der Rechteck-Methode überprüfen. Leichter zu implementieren, jedoch auch nicht mehr ganz so hübsch anzusehen bzw. zu führen.
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
bockwurst 
      
Beiträge: 191
win98 /XP
D1 D5 Prof DE2005PE
|
Verfasst: Di 18.10.05 10:41
Vielen Dank für eure Vorschläge,
mit dem Farben abfragen, werde ich am Wochenende gleich mal ausprobieren.
Vielleicht gibt es aber noch eine Lösung.
Ich nehme ein gescanntes Bild und schneide jedes Land heraus. Nun habe viele Länder und
lege sie einfach über auf mein großes Bild, entweder als Bild oder sogar als Form (TForm) oder Sprite.
Nunn meine Frage, gibt es eine Möglichtkeit nicht nur "viereckige" Bilder zu "laden", sondern eine "frei Form" (ohne viel Aufwand!) ?
Eine ganz andere Möglichkeit wäre es, die Bipmap-Komponente neu abzuleiten und eine Möglichkeit einzubringen, einen geschlossenen Polynom/Vektorzug einzuzeichnen.
Ich habe mir mal die Mühe gemacht, eine Funktion zu schreiben die testet, ob ein Punkt in einem Polynom zug ist, oder nicht (aus dem Buch "Algorithmen in C++" von Robert Sedgewick)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78:
| TKoordinaten = Record x,y:real end;
Function CCW(p0,p1,p2: TKoordinaten):smallint; var dx1,dx2,dy1,dy2:real; begin dx1 := p1.x - p0.x; dy1 := p1.y - p0.y; dx2 := p2.x - p0.x; dy2 := p2.y - p0.y; if (p0.x=p1.x)and(p0.x=p2.x)then if p0.y>p1.y then begin result:=-1;exit;end else begin result:=1;exit;end; if (p0.y=p1.y)and(p0.y=p2.y)then if p0.x>p1.x then begin result:=-1;exit;end else begin result:=1;exit;end; if (dx1*dy2 > dy1*dx2) then begin result:= +1; exit; end; if (dx1*dy2 < dy1*dx2) then begin result:= -1; exit; end; if ((dx1*dx2 < 0) or (dy1*dy2 < 0)) then begin result:= -1; exit; end; if ((dx1*dx1+dy1*dy1) < (dx2*dx2+dy2*dy2)) then begin result:= +1; exit; end; result:= 0; end;
Function Ist_im_Feld(t:TKoordinaten; ZDaten:TIntegerListe):Boolean; type TLinie=Record p1,p2:TKoordinaten; end; TPointArray=record x,y:real; end;
function intersect(l1,l2:TLinie):smallint; begin if ((CCW(l1.p1, l1.p2, l2.p1) * CCW(l1.p1, l1.p2, l2.p2)) <=0) and ((CCW(l2.p1, l2.p2, l1.p1) * CCW(l2.p1, l2.p2, l1.p2)) <=0) then result:=1 else result:=0; end;
CONST ANZAHL=20; var P:array[0..ANZAHL]of TPointArray; lt,lp:TLinie; i,count,j,n:smallint; begin for i:=0 to ANZAHL do begin P[i].x:=9999; P[i].y:=9999 end; n:=0;
Repeat inc(n); P[n].x := ... P[n].y := .. until i>=ZDaten.count-3;
P[0]:=P[n]; lt.p1.x:= t.x; lt.p1.y:= t.y; lt.p2.x:= 35000; lt.p2.y:=t.y+1; count:=0; j:=0; i:=0;
while (i<=n-1) do begin lp.p1.x:=p[i].x; lp.p1.y:=p[i].y; lp.p2.x:=p[i+1].x; lp.p2.y:=p[i+1].y; if (intersect(lp,lt)=1) then inc(count); inc(i); end;
if count mod 2 =1 then result:=true else result:=false; end; |
Andreas
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Di 18.10.05 12:40
Ich habe mir schon mal ähnliche Gedanken (d.h. wie kann ich feststellen, ob ein unregelmäßig geformter Bereich angeklickt wird) gemacht. Meiner Meinung nach ist es am elegantesten - dafür aber erst mal arbeitsintensiv! -, die einzelnen Bereiche in Dreiecke zu unterteilen (ein Bereich ist dann quasi ein "array of dreieck") und zu prüfen, ob der Klick in einem der dem Gebiet zugehörigen Dreiecke stattgefunden hat. Damit kannst du auch konvexe Gebiete erstellen (denn ich bezweifle, dass deine Polygon-Routine damit umgehen kann!).
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 18.10.05 12:42
Also erst mal. Möglich ist alles. Na ja. Einigen wir uns auf fast alles. Es stellt nur immer die Frage ob es sinnvoll ist und ob die Nachteile nicht die wenigen wirklichen Vorteile nicht ausgleichen. Vor allem musst du bedenken. Um so komplexer du ein Problem lösen möchtest um so länger dauert die Entwicklung und um so anfälliger ist es gegenüber Problemen.
Transparente Bilder: Bilder sind IMMER Rechteckig. Du kannst aber bei einem TBitmap, nachdem du das geladen hast, die Eigenschaft Transparent und TransparentColor setzen. Damit werden einzelne Pixel ausgelassen.
Delphi-Quelltext 1: 2:
| bmp.TransparentColor := bmp.Canvas.Pixels[0, 0]; bmp.Transparent := True; |
Wenn du das dann zeichnest sollte es eigentlich transparent sein. (Eigentlich und sollte in einem Satz)
Allerdings wenn du jedes Land einzeln herrausschneidest hast du den Vorteil, dass du deine Bilder mit unnützen Datenaufblähst, das Zeichnen leicht bis erheblich ausbremst und du bei der Ländererkennung trotzdem keinen Schrift vorwärts gekommen bist. Kurz gesagt. Ich kann dir davon nur abraten.
Was du mit den Polygonen vor hast könnte auch gehen. Aber ich für meinen Teil halte es für unnötig kompliziert. Ist aber Geschmackssache.
[edit] Polygonprüfungsauswahlenroutine: Ich mag es gerne einfach. (Meistens) Schon mal überlegt das ganze mit einer Hardwarebeschleinigung zu machen? Also so etwas wie in OpenGL. Dann könntest du sehr einfach Polygone erstellen und die Tests sind auch schon eingebaut. Und zwar das Picking. Das geht auch nach sichtbarkeiten und solltest du mal auf die Idee kommen die Karte in 3D zu gestalten, dann würde das auch schon funktionieren, da das Picking 100% identisch ist. Aber nur so eine Idee.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Nils:D
      
Beiträge: 131
Debian, Win XP
Delphi 7 Arch.
|
Verfasst: Mo 24.10.05 10:55
Warum nimmst du nicht ein einfaches TImage.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.FormCreate(Sender: TObject); begin deinBild.Picture.LoadFromFile('welt.png'); end; |
Dann hast du erstmal eine einfache Welt. Hinzu solltest du ganz bescheiden evtl. mit Canvas die Landesgrenzen zeichnen und per
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var Form1: TForm1; CurPos: TPoint
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Cursor.Pos.X then ... if Cursor.Pos.Y then ... end; |
überprüfen wo du hinklickst. Außerdem musst du es ja nicht mit der einfachen Klick-Methode machen. Du kannst einfach Buttons nehmen, mit z.B. Madagaskar, ... .
Oder du lädst jeden Kontinent bzw. jedes Land einzelnd, das wäre eine andere Methode. Dann musst du dich ncoh entscheiden, ob die Grenzen schon in dem/den Bild/Bildern drinnen sind.
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Mo 24.10.05 13:43
ja nils so einfach ist das net weil nen kontinent meist net einfach nen rechteck ist... und dann kann man net einfach mit x und y überprüfen würd ich sagen...
und die kontinente einzeln laden bringt auch nix da die images auch rechtecke sind also wieder nix mit überprüfen...
wie stellst du dir das denn dann vor mit dem überprüfen? wie willst du mit deiner methode was bekommen was die form des kontinents hat und das überprüfen?
_________________ "Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
|
|
Nils:D
      
Beiträge: 131
Debian, Win XP
Delphi 7 Arch.
|
Verfasst: Mo 24.10.05 16:59
Amateur hat folgendes geschrieben: | ja nils so einfach ist das net weil nen kontinent meist net einfach nen rechteck ist... und dann kann man net einfach mit x und y überprüfen würd ich sagen...
und die kontinente einzeln laden bringt auch nix da die images auch rechtecke sind also wieder nix mit überprüfen...
wie stellst du dir das denn dann vor mit dem überprüfen? wie willst du mit deiner methode was bekommen was die form des kontinents hat und das überprüfen? |
Das , mit der Überprüfung war auch nur ein Beispiel  Es gibt mit sicherheit andere Methoden. Und jeder Programmierer weiß, dass es TransparentColor gibt.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mo 24.10.05 17:09
Ich kenn das Spiel nicht und weiß nicht wie fein die regionen sein sollen, möchte hier aber die Möglichkeit ins gespräch bringen die zweite Map zu verkleinern. Auch wenn die Map z.B. nur ein viertel der Größes der Spielgrafik ausmacht müsste das für die Regionen noch ausreichen, evtl. sogar noch weniger.
|
|
Nils:D
      
Beiträge: 131
Debian, Win XP
Delphi 7 Arch.
|
Verfasst: Mo 24.10.05 17:24
Tilman hat folgendes geschrieben: | | Ich kenn das Spiel nicht und weiß nicht wie fein die regionen sein sollen, möchte hier aber die Möglichkeit ins gespräch bringen die zweite Map zu verkleinern. Auch wenn die Map z.B. nur ein viertel der Größes der Spielgrafik ausmacht müsste das für die Regionen noch ausreichen, evtl. sogar noch weniger. |
Das bringt mich auf eine Idee: einfach einen Mapeditor schreiben und die Map laden, dann hat man alle Möglichkeiten und hat alles drinnen, was man braucht.
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Mo 24.10.05 18:14
@ nils ich weiss dass es transparentcolor gibt aber das hilft bei dem problem ja auch nicht da der click auf ne transparente fläche löst trotzdem das onclick aus also wie willste das machen mit der überprüfung. und um zu wissen wie fein die regionen sein sollen: lad dir ne weltkarte runter. fass kleine kontinente zu großen zusammen und mal es so ab dass man die kontinente noch erkennt.. net einfach nur vierecke dann weißte wie fein.
oder: www.rtv.de/neonpics/...siko2_screen2_gr.jpg
ist wohl aus nem risiko pc spiel aber so fein ungefähr....
_________________ "Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
|
|
Nils:D
      
Beiträge: 131
Debian, Win XP
Delphi 7 Arch.
|
Verfasst: Mo 24.10.05 18:30
Amateur hat folgendes geschrieben: | @ nils ich weiss dass es transparentcolor gibt aber das hilft bei dem problem ja auch nicht da der click auf ne transparente fläche löst trotzdem das onclick aus also wie willste das machen mit der überprüfung. und um zu wissen wie fein die regionen sein sollen: lad dir ne weltkarte runter. fass kleine kontinente zu großen zusammen und mal es so ab dass man die kontinente noch erkennt.. net einfach nur vierecke dann weißte wie fein.
oder: www.rtv.de/neonpics/...siko2_screen2_gr.jpg
ist wohl aus nem risiko pc spiel aber so fein ungefähr.... |
Dann nimmt mal halt ogl, dx oder delphix. Es gibt aber irgendeine Lösung. Außerdem habe ich auf Buttons hingewiesen, falls das vom Design her nicht reicht, wird das Spiel halt später upgedatet.
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Mo 24.10.05 18:35
der threadsteller wollte aber glaub ich kein dx oder so verwenden. hat jedenfalls nix davon geschrieben...
und buttons sind doch normalerweise auch rechteckig oder?
also ich find die lösung mit dem zweiten bitmap und den farben am besten... (siehe weiter oben)
_________________ "Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
|
|
Nils:D
      
Beiträge: 131
Debian, Win XP
Delphi 7 Arch.
|
Verfasst: Mo 24.10.05 18:43
Amateur hat folgendes geschrieben: | der threadsteller wollte aber glaub ich kein dx oder so verwenden. hat jedenfalls nix davon geschrieben...
und buttons sind doch normalerweise auch rechteckig oder?
also ich find die lösung mit dem zweiten bitmap und den farben am besten... (siehe weiter oben) |
Ich meinte mit Buttons, dass es ein Menü gibt in dem alle Buttons zur Auswahl der Länder ist. Eine ListBox wäre dafür aber besser geignet.
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Mo 24.10.05 18:49
hm ja ok das ginge tatsächlich aber bevor ich da die buttons schreibe würde ich eher überlegen wie ich das mit dem zweiten bitmap löse...
denn klick auf die map ist doch benutzer freundlicher als buttons...
ansonsten könnte man labels in den ländern mit den namen der länder benutzen und deren onclick nutzen. aber ob das so toll ist weiß ich net. kann man nur auf den namen klicken im land und nicht irgendwo auf das land.
naja wäre jedenfalls gut vom threadsteller mal zu hören ob und wie er das problem gelöst hat bevor wir hier noch weiter rumrätseln...
_________________ "Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
|
|
Nils:D
      
Beiträge: 131
Debian, Win XP
Delphi 7 Arch.
|
Verfasst: Di 25.10.05 09:33
Amateur hat folgendes geschrieben: | hm ja ok das ginge tatsächlich aber bevor ich da die buttons schreibe würde ich eher überlegen wie ich das mit dem zweiten bitmap löse...
denn klick auf die map ist doch benutzer freundlicher als buttons...
ansonsten könnte man labels in den ländern mit den namen der länder benutzen und deren onclick nutzen. aber ob das so toll ist weiß ich net. kann man nur auf den namen klicken im land und nicht irgendwo auf das land.
naja wäre jedenfalls gut vom threadsteller mal zu hören ob und wie er das problem gelöst hat bevor wir hier noch weiter rumrätseln... |
Auf jeden Fall sollte jedes Land beschriftet werden. Ich würde Buttons oder Beschriftungen zum AUswählen nur provisorisch machen.
|
|