Autor Beitrag
Beutel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

WIN XP

BeitragVerfasst: 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 user profile iconGausi: Topic aus Freeware Projekte verschoben am Di 12.06.2007 um 15:30
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 12.06.07 16:12 
Was ist an
ausblenden Delphi-Quelltext
1:
If Map[Man.X, Man.Y] = Busch Then					

denn ineffizient?

_________________
Na denn, dann. Bis dann, denn.
Beutel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

WIN XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

WIN XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Di 12.06.07 17:08 
Hi,

warum nicht so?

ausblenden 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 - 1of Array [0..1000 div cFieldSize - 1of 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

WIN XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Di 12.06.07 17:13 
user profile iconBeutel 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

WIN XP

BeitragVerfasst: 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,8) 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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(8) 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

WIN XP

BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Fr 15.06.07 14:41 
was ist den kind für ne variable? integer? dann hilft inttostr weiter.
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Sa 16.06.07 09:04 
öhhmmm... ist das richtig, dass das Programm nichts macht?
Beutel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89

WIN XP

BeitragVerfasst: So 17.06.07 20:40 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Mo 18.06.07 16:10 
aber es ist doch immerhin schonmal eine Ordinale Variable...
dann geht das doch einfach mit
ausblenden Delphi-Quelltext
1:
2:
int := Ord(Kind);
str := IntToStr(int);

Nach dem Prinzip sollte es funktionieren...