Entwickler-Ecke
Multimedia / Grafik - zufallsmap mit array
olum99 - So 04.05.03 03:12
Titel: zufallsmap mit array
ich hab versucht ein programm zu basteln, mit dem man zufallsmaps für wasauchimmer erstellen kann. das meiste is aus den tuts hier :)
bislang kann es nur wasser (bild "0") und land(bild"1") machen.
irgendwas haut mit den arrays nicht hin, ich weiss nicht was.(in der button.click prozedur bei der for to do schleife gibts ne access violation)
ich hatte das array vorher auch schon auf integer und hatte mir so den strtoint kram gespart.
naja hier mal der code, vielleicht seht ihr ja schon auf anhieb was.
Quelltext
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: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DXDraws, StdCtrls, DXSprite, DXClass;
type zeile = array[1..104] of string[1]; spalte = array[1..4] of zeile;
type tfeld = class text: spalte; DXImageList1: TDXImageList; DXSpriteEngine1: TDXSpriteEngine; procedure gnatur; procedure gumwelt; procedure ggebaeude; procedure gstrasse; procedure speichern; procedure znatur; procedure zumwelt; procedure zgebaeude; procedure zstrasse; procedure zbeschr; procedure zkueste; procedure laden; end;
TForm1 = class(TForm) DXDraw1: TDXDraw; Button1: TButton; Button2: TButton; Button3: TButton; DXTimer1: TDXTimer; DXImageList1: TDXImageList; DXSpriteEngine1: TDXSpriteEngine; procedure DXTimer1Timer(Sender: TObject; LagCount: Integer); procedure Button1Click(Sender: TObject);
private
public
end; TAnimation = class(TImageSprite);
var feld: tfeld;
Form1: TForm1; feldn,x,y: integer; Animation: TAnimation;
implementation
{$R *.dfm}
procedure tfeld.gstrasse; begin text[4][feldn]:=inttostr(0); end;
procedure tfeld.ggebaeude; begin text[3][feldn]:=inttostr(0); end;
procedure tfeld.gumwelt; begin text[2][feldn]:=inttostr(0); end;
procedure tfeld.gnatur; var meer : integer ; begin randomize; meer:=random(10); if meer>=5 then text[1][feldn]:=inttostr(0); if meer<5 then text[1][feldn]:=inttostr(1); end;
procedure tfeld.zumwelt; begin end;
procedure tfeld.zgebaeude; begin end;
procedure tfeld.zstrasse; begin end;
procedure tfeld.zbeschr; begin end;
procedure tfeld.zkueste; begin end;
procedure tfeld.znatur; var bild: string; i,j: integer; begin feldn:=0; x:=0; y:=0; j:=0; for i:=1 to 104 do begin
feldn:=feldn+1; j:=j+1; if strtoint(text[1][feldn])=0 then bild:=inttostr(0); if strtoint(text[1][feldn])=1 then bild:=inttostr(1); Animation := TAnimation.Create(DXSpriteEngine1.Engine); Animation.Image := Form1.DXImageList1.Items.Find(bild); Animation.X := x; Animation.Y := y; Animation.Width := Animation.Image.Width; Animation.Height := Animation.Image.Height; Animation.AnimCount := 5; Animation.AnimLooped := True; Animation.AnimSpeed := 20/1000; Animation.AnimStart := 0;
x:=x+72; if j = 10 then begin x:=-36; y:=y+60; end; if j = 21 then begin x:=0; y:=y+60; j:=0; end; end; end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer); begin DXSpriteEngine1.Move(1); DXDraw1.Surface.Fill(0); DXSpriteEngine1.Draw; DXDraw1.Flip;
end;
procedure tfeld.speichern; begin end;
procedure tfeld.laden; begin end;
procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin x:=0; y:=0; feldn:=0; for i:=0 to 104 do begin feldn:=feldn+1; feld.gnatur; end; feld.znatur; end;
end. |
mimi - So 04.05.03 14:32
was genau funktniert denn nicht ?
achja:
DU solltes vleicht wenn du ein 2D Array benutzt es so machen(ist aber kein fehler)
test[0,3]... macht genau das selbe:)
olum99 - So 04.05.03 14:44
an der zeile hält er sich auf, immer mit ner access violation
Quelltext
1:
| text[1,feldn]:=inttostr(1); |
das ist das erste mal das er ins array schreiben soll, dh ich denke es wird garnicht richtig initialisiert.
ist statt dem array of string[1] eigentlich auch array of integer möglich?
mimi - So 04.05.03 15:30
ja:
Quelltext
1:
| Map = array[0..MapX,0..MapY] of Integer; |
olum99 - So 04.05.03 17:57
hmm ich hab deine tips eingebaut und noch ne menge rumgerödelt aber gehn will es noch immer nich.
ich hab jetzt das array mit namen map als type definiert:
Quelltext
1:
| type map = array[1..104,1..4] of Integer; |
und eine globale variable u vom typ map gemacht:
ich schreib was ins array indem ich einfach dem betroffenen feld einen wert zuweise
den hol ich mir später so wieder:
Quelltext
1:
| bild:=inttostr(u[feldn,1]); |
is das theoretisch richtig?
praktisch is da irgendwo n fehler drin
mimi - Mo 05.05.03 17:26
wozeichnes du das ?
und was für ein fehler ?
also das sollte eingetlich richtig sein :)
so änlich mache ich das auch immer, aber du hast die karte ja richtig groß gemacht, reichen nicht:
39,27 als größe ?
brauchst doch nur 39*16 und 27(ich nehme immer 23)*16 zu machen.....
ich denke deine Map ist zu groß sonst müsste der code funktionieren...
olum99 - Di 06.05.03 14:54
hmm was ich machen wollte war jedem feld eine nummer geben (1-104) und dann halt felder 1-4 (1 grungbeschaffenheut des feldes, 2 was drauf is, 3. gebäude etc) die integer werte als inhalt zugewiesen bekommen was sie halt für eigenschaften haben (1:mine, 2:holzfällerhütte etc).
gezeichnet wird es dann nach reihenfolge und nicht nach koordinaten.
meine aktuelle idee ist ein 3dimensionales array bei dem die ersten beiden werte die koordinaten geteilt durch breite bzw höhe sind (fortlaufende zahlen) und der dritte 1-4 die beschaffenheit des feldes beschreibt.
der vorteil wäre, dass man viel leichter auf die einzelnen felder zugreifen kann (zeichnen x*72,y*60, beschaffenheit=z; außerdem abfragen x div 72 y div 60 beschaffenheit:=z;)
aber im moment check ich grad noch den krams mit den arras nich ganz, meinste wirklich 104*4 werte sind schon zuviel??
hab mir ein paar testprogs gebastelt (bzw basteln lassen :D) und hab die grundlegenden probleme inzwischen gelöst.
nun muss ich mal rausfinden was mit 3dimensionalen arrays alles neu wird.
mimi - Di 06.05.03 15:32
also auf einen 3D array kannst du versichten(wenn ich dich richtig verstanden habe):
Quelltext
1: 2: 3: 4: 5: 6: 7:
| type TMap = record Tex,Typ:Integer; end;
var Map = Array[0..MapX, 0..MapY] of TMap; |
ich denke 104 ist viel zu groß:
1. Du musst scrollen
2. den Speicher musst du auch beachten....
und es gibt mit sichereit noch mehr gründe :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!