Autor |
Beitrag |
Beutel
      
Beiträge: 89
WIN XP
|
Verfasst: Di 12.06.07 15:19
Hallo Liebe Gemeinde!
Ich brächte mal einen kleinen denk Anstoß und zwar habe ich eine art "Map" also ein Formular wo ich ein männel(Image) per Timer über denn Bild schirm läufen lasse. Sieht auch relativ knuffig aus aber jetzt fehlr mir irgend wie die Sache mit dem Gelände! Ich will das er sich Nahrung sucht. Habe ein paar Sträucher auf der Map verteilt, aber denke irgend wie das es uneffizent ist jedes mal abzufragen ob er nun auf so einen Strauch steht oder nicht? Wie machen das Erfahrene Leute das?
LG Beutel Moderiert von Gausi: Topic aus Freeware Projekte verschoben am Di 12.06.2007 um 15:30
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 12.06.07 16:12
Was ist an
Delphi-Quelltext 1:
| If Map[Man.X, Man.Y] = Busch Then |
denn ineffizient?
_________________ Na denn, dann. Bis dann, denn.
|
|
Beutel 
      
Beiträge: 89
WIN XP
|
Verfasst: Di 12.06.07 16:21
meinste ein 2 dimensionales Array machen und dann jedes einzelne Pixel drin abspeichern und in dem Array denn Zustand des Boden rein schrieben?
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Di 12.06.07 16:26
Zweidimensionales Array machen ist schon ganz vernünftig, aber für jeden Pixel ist es doch übertrieben, such dir eine Größe für ein Planquadrat deines Feldes und richte danach die Dimensionen deines Arrays
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 12.06.07 16:28
Deine Sträucher sind nur ein Pixel groß?
Du kannst auch eine Liste von Gegenständen mit ihren Positionen pflegen und dann immer abfragen, ob die Person da drauf steht. Das ist dann natürlich ineffizient, aber bei ein paar hundert Gegenständen eigentlich nicht so schlimm.
Wenn es dagegen mehrere tausend Gegenstände sind, die ständig zu prüfen sind, dann kann man das indizieren. Wie das genau geht, weiss ich aber nicht. Es ist, wie erwähnt, bei ein paar Sträuchern aber auch nicht nötig.
Daneben gibt es natürlich nach die 'Collision Detection'
_________________ Na denn, dann. Bis dann, denn.
|
|
Beutel 
      
Beiträge: 89
WIN XP
|
Verfasst: Di 12.06.07 16:59
gehen wir davon aus da sich ein Feld haben von 1000*1000 Pixeln und per random dann die Sträucher drauf platziere sagen wir die sind 25*25 muss ich denn anhalten wen der an einem Strauch steht. Wie mache ich das wenn ich mehrere attribute in das array aufnehmen will zum Beispiel "fog of war" wie sage ich das. Array[24,34] ist ein Strauch und dunkel(weiler noch nicht endeckt worden ist)
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Di 12.06.07 17:08
Hi, warum nicht so? Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| cFieldSize = 25;
TFielTypes = (ftBush, ftField, ftBla); TField = Record Revealed : Boolean; Kind : TFieldTypes; end; TMap = Array [0..1000 div cFieldSize - 1] of Array [0..1000 div cFieldSize - 1] of TField; TPlayer = Record Name : String; Position : TPoint; end;
Function PlayerOnBush(const APlayer : TPlayer; const AMap : TMap) : Boolean; begin Result := Map[APlayer.Position.X div cFieldSize, APlayer.Position.Y div cFieldSize].Kind = ftBush; end; | Das sollte ans Anstoss genügen ;) gruss, rob
_________________ erare humanum est
|
|
Beutel 
      
Beiträge: 89
WIN XP
|
Verfasst: Di 12.06.07 17:11
Danke werde mich mal dran setzen und wenn was ordentliches bei rauskommt mal hier reinstellen! vieleicht wird ja was ordentliches drauß
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Di 12.06.07 17:13
Beutel hat folgendes geschrieben: | Danke werde mich mal dran setzen und wenn was ordentliches bei rauskommt mal hier reinstellen! vieleicht wird ja was ordentliches drauß |
Na dann viel Spass und auf ein gutes gelingen!
gruss
_________________ erare humanum est
|
|
Beutel 
      
Beiträge: 89
WIN XP
|
Verfasst: Do 14.06.07 11:21
so ich habe es schon relativ weit gebracht! aber hab jetzt ein Problem ich habe das schiff mit auf der Karte und will die Figure gleich neben dem Schiff platzieren (auf den Sand). Das heißt ich müsste rings herum um das Schiff abfragen was Sand ist so das wären (3,6),(4,5),(3,7),(5,  so wie kann ich jetzt mit random abfragen welches er auswählen soll!
Also das schiff hat 8 Felder um sich herum.
ich will die Figur auf eines der Felder setzen.
Aber ich will das mit Random machen das es jedesmal wo andrs steht und es muss ein Sandfeld sein wo er drauf stehen soll.
also müsste ich die Position speichern um das schiff herum und mit random dann eins davon auswählen oder???
Einloggen, um Attachments anzusehen!
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Do 14.06.07 14:10
also bei meinem Wator Programm, hab ich das so gemacht, dass ich ein array of boolean erzeugt habe, bei dir hätte es acht Einträge. Dann gehst du alle Acht Felder durch (du musst dir eine Reihenfolge festlegen welches der Felder Nr. 1,2,3 usw. ist) und guckst ob es ein sandfeld ist, wenn ja setzt du die entsprechende variable im array auf true andernfalls false. Bist du alle acht felder durchgegangen, rufst du einfach solange random(  auf bis die entsprechende Arrayvariable true ist.
Machst du es so, brauchst du allerdings noch eine Variable die anzeigt ob überhaupt ein Sandfeld unter den Acht vorhanden ist.
Es gäbe noch die Möglichkeit, das mit dynamischen Arrays zu machen d.h. wenn du gerade ein sandfeld überprüfst erhöhst du die Länge des arrays um eins und speicherst die Nummer des Feldes, am ende könnte man dann mit random(high(array)) einfach ein Sandfeld auswählen. Ich hab das auchmal so bei meinem Wator Programm gemacht, dass war aber langsamer als die zuvor gepostete Lösung.
Hoffe das war jetzt einigermaßen verständlich ausgedrückt.
MfG
Basti
€: Mir ist noch eine Möglichkeit eingefallen, die die schnellste von allen sein könnte: Du musst ja sowieso alle Acht Felder überprüfen, also kannst du einfach die Figur auf das erste Sandfeld setzen. Die "zufäligkeit" der Auswahl liegt dann darin, dass du zufällig auswählst welches Feld du zuerst überprüfst und dich dann der Reihe nach durcharbeitest.
|
|
Beutel 
      
Beiträge: 89
WIN XP
|
Verfasst: Fr 15.06.07 14:23
Danke schön für die Antwort klappt auch so wie du es beschrieben hast habe variante eins genommen!
Aber mal was ganz dummes! ich will ein kleines test skript schrieben und das Array in einer TXT speichern! so aber wenn ich mache
Delphi-Quelltext 1:
| Memo1.Lines.Add(Karte[i_lauf,j_lauf].Kind) |
bekomme ich einen fehler das die typen inkompatible sind! war mir logisch aber wie kann ich das ding denn in Text speichern lassen!
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Fr 15.06.07 14:41
was ist den kind für ne variable? integer? dann hilft inttostr weiter.
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Sa 16.06.07 09:04
öhhmmm... ist das richtig, dass das Programm nichts macht?
|
|
Beutel 
      
Beiträge: 89
WIN XP
|
Verfasst: So 17.06.07 20:40
Delphi-Quelltext 1: 2: 3: 4:
| TFielTypes = (ftBush, ftField, ftBla); TField = Record Revealed : Boolean; Kind : TFieldTypes; |
nee eine selbst geschriebene! darum weiß ihc auch nicht wie ich es anwenden kann.
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Mo 18.06.07 16:10
aber es ist doch immerhin schonmal eine Ordinale Variable...
dann geht das doch einfach mit
Delphi-Quelltext 1: 2:
| int := Ord(Kind); str := IntToStr(int); |
Nach dem Prinzip sollte es funktionieren...
|
|