2D Editor Frage!
Übersicht

RoggiBetreff: 2D Editor Frage! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen,
Ich habe ein neues Projekt im Auge. Nämlich ein mini Sim city Klon. Und zwar dachte ich mir mache ich erstmal einen Leveleditor wo ich Wiese,Berge und Straßen setzten kann. Nun wollt ich ausprobieren, wie das ist wenn eine Nachfrage besteht das sich ein Objekt verändert. Ich wollte es so lösen! Es ist eine Probevariante wo man auf a drückt um die nachfrage zu steigern aber das haut net hin: Code: [AUSKLAPPEN] Nachfrage = 0 If keyhit (30) Nachfrage =Nachfrage +1 Endif If Nachfrage =10 then Und hier weiss ich net weiter. Er soll bei den bisher errichteten Sachen etwas neues malen. Einfach eine rotes Viereck. Um es zu probieren. Hier noch der restliche Code. Ist aus einem Tutorial das ich verändert habe! Code: [AUSKLAPPEN] Graphics 800,600,16,1
SetBuffer BackBuffer() Global ende;solange ende=0 ist, läuft das Programm Global mx,my;Position der Maus. So müssen wir im Programm nur einmal den Befehl MouseX(),MouseY() benutzen und können dasn mx,my benutzen Global c=2;c gibt an, welche Geländeart gerade gewählt ist(1=Wasser,2=Wiese,3=Feuer,4=Sand) Global datei;Benötigt man beim Speichern. ERklährt sich weiter unten von selbst(Wissen wie man Speichert vorausgesetzt) Dim grafik(4);Hier werden die Grafiken für Wasser,Wiese,Feuer,Sand gespeichert. Der RPG TutorialSChöpfer macht das anders, aber das ist fast genauso, nur das er alle Grafiken in einem BMP anstatt in 4 speichert. ;laden der Grafiken For x=1 To 4 grafik(x)=LoadImage("tile"+Str$(x)+".bmp") Next Dim map(20,20);die map ist ja bekanntlich nur eine Art Schachbrett(10*10 Felder groß) For y=0 To 19 For x=0 To 19 map(x,y)=1;Jedes Feld wird auf 1 gesetzt, damit am Anfang jedes Feld Wasser ist(1 steht für Wasser) Next Next While ende=0;solange ende=0 ist läuft das Programm Cls;bilschirm wird gelöscht If KeyHit(1)Then;wenn ESC gedrückt wird ;speichern der Map ;hier benötigt man das Wissen, wie man etwas Speichert. datei=WriteFile("map.dat");Pfad For y=0 To 19 For x=0 To 19 WriteLine datei,map(x,y);Für jedes Feld der Map wird die Zahl gespeichert, die wir dem Feld mit dem Editor übergeben haben. Wenn man die Karte dann laden möchte, muss man für jedes Feld eines Arreys diese Zahl laden(seht ihr in dem anderen Programm) Next Next CloseFile datei ; ende=1;Ende ist gleich 1. Dadurch wird das Programm beendet. End If ;mit den Tasten 1-4 wählt man eine Geländeart(Wasser,Wiese,...) If KeyHit(2)Then c=1 If KeyHit(3)Then c=2 If KeyHit(4)Then c=3 If KeyHit(5)Then c=4 If MouseHit(2)Then;Wenn rechte Maustaste gedrückt wird, soll durchgescrollt werden c=c+1;c wird um eins erhöht. Bewirkt das Durchschalten mit der Rechten Maustaste durch die Geländearten(wahlweise anstatt der Tasten 1-4) If c=5 Then c=1;Wenn c=5 ist, muss es wider 1 sein, weil wir keine Geländeart 5 haben End If ;zeigerkoordinaten If MouseX()<10*60Then mx=MouseX()/30;Solange sich die maus in unserem 10*10 großen Feld befindet, ist mx,my=die Mausposition If MouseY()<10*60 Then my=MouseY()/30;es muss durch 30 dividiert werden, weil jedes unserer Felder nicht 1 sondern 30 Pixel groß ist. ; If MouseDown(1) Then;wenn linke Maustaste gedrückt wird map(mx,my)=c;Das Feld der map, an der sich die Maus befindet, wird auf die Zahl unserer ausgewählten Geländeart gesetzt. Auf der Stelle der Map befindet sich dann die Geländeart. End If For y=0 To 19 For x=0 To 19 DrawBlock grafik(map(x,y)),x*30,y*30;Die Karte wird gemalt. Und zwar die Grafik für die Nummer, die in dem Feld gespeichert ist(1 für Wasser,...). *30, weil die einzelnen Kacheln(Grafiken für die Geländeart) ja im Abstand von 30 Pixeln gemalt werdne sollen Next Next ; ;Eine Art Cursor wird gemalt. Der sieht aus, wie die ausgewählte Geländeart DrawBlock grafik(c),mx*30,my*30 Color 255,0,0 Rect mx*30,my*30,30,30,0;Ein Rotes, lehres Rechteck wird um den Corsor gemalt ; ;Anweisungen während des Editors Text 400,50,"Rechte Maustaste/Tasten 1-4 zum wechseln" Text 400,100,"Linke Maustaste zu editieren" Text 400,150,"1:Wasser" Text 400,200,"2:Wiese" Text 400,250,"3:Straße" Text 400,300,"4:Berge" Flip Wend End Das oben ist nur eine Idee. Wenn jemand weiss wie ichs besser lösen kann! Bitteschön! Danke Schon im Vorraus MfG Tom |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nachfrage von was? Wenn Population besteht, benötigt diese einen 'Grundbedarf' an Straßen, Wohnhäusern etc. Wenn also deine Map in einem Dim-Feld gespeichert wird, kannst du zu der 2-dimensionalen Karte noch eine dritte Dimension einsetzen die speichert welche Beschädigung ein Straßentile bereits hat. Bei jedem Durchfahren eines Autos wird die Variable des Tiles um eins erhöht, bei 1000 Wird das Tile durch eine kaputtere ersetzt, wobei gleichzeitig die Person die durch kapute Straßen fahren muß deren Motivation singt. Das ganze geht natürlich auch bei anderen Objekten mit dieser Variable, beispielsweise Bücherrei, wenn es zu wenige davon gibt wird diese überfüllt bzw. mit Leerstandänden die Motivation der Personen senken. Dann hat eine Bücherei halt 1000 Bücher deren Zahl gesenkt wird wenn ein Buch ausgeliehen, bzw. die Zahl hebt wenn die Bücherei ausgebaut wird oder eine Person wieder ein Buch zurück bringt... Das programmieren eines Sim City Klons ist, denke ich mal, nicht grad eine der einfachsten Tätigkeiten die man proggen kann. Da hier ein äusserst gut geplantes Gleichgewicht der KI, Benutzung von Einrichtungen, Motivation etc. erstellt werden muß. Es darf nicht vorkommen, das eine Kleinigkeit die gesammte Gesellschaft in die Ruinen bringt, anders auch nicht zu der Wohlhabensten Gesellschaft überhaupt. Gleichzeitig möchte aber der Spieler Veränderungen möglichst bald merken...
Da es unterschiedliche Straßenarten (Asphalt, Schotter, Autobahn, Landstraße, Fußwege) gibt, muß beachtet werden, daß der Computer wissen muß wenn ein Tile 'verbraucht' ist, ob es durch ein anderes ersetzen kann. Dies könnte man eventuell mit einer vierten Dimension des Dim-Feldes erstellen, die angibt welches das nächste Tile nach dem Verbrauch ist. Beispiel (on the fly): dim karte%(99,99,1,1) ... for x=0 to 99 for y=0 to 99 ;Auto fährt über Tile karte(x,y,1,0)=karte(x,y,1,0)+1 if karte(x,y,1,0)>1000 then karte(x,y,0,0)=karte(x,y,0,1) ;Karte zeichnen drawimage bild,x*32,y*32,karte(x,y,0,0) next next |
||
Roggi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn ich ein Haus erstelle und dann auf a drücke steigt die Nahcfrage nach einen größeren Haus. wenn die Nachfrage bei 10 ist wird dieses durch ein größeres ersetzt | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das Beispiel habe ich dir schon in meinem vorherigem Beitrag beschrieben. Nur ist es dort als Beispiel einer Straße. Du hast ja bereits ein Dim-Feld für dein Terrain die du als Tiles auf dem Bildschirm bringst. Also: Dim map(x,y) In diesem Koordinatensystem wird die 2D-Map gespeichert (1=Wasser, 2=...). Wenn jetzt beispielsweise 4=Haus ist dann kannst du 5=großes Haus, 6=Villa, 7=Palast... machen. Um die Nachfrage für jedes Haus zu speichern, eignet sich eine weitere Dimension in deinem Dim-Feld. Also: Dim map(x,y,anchfrage). Abspeichern und auslesen deren machst du dann so:
map(x,y,0)=Tile ; (1=Wasser, 4=Haus...) map(x,y,1)=Nachfrage ; (0=nicht besetzt, 10=überbefüllt/überfordert) Damit der Rechner aber 'weiß' ob ein Objekt überhaupt vergrößert werden kann, brauchst du eine weitere Variable die angibt welches Tile als nächstes kommt. Dies kannst du mit einer weiteren Variable machen. Also: map(x,y,art). (Oder mit einer weiteren Dimension map(x,y,0,1), beschreibe ich aber nicht weiter da die Variablenvergabe ich für einfacher halte). Abspeichern und auslesen deren machst du dann so: map(x,y,0)=Tile ; (1=Wasser, 4=Haus...) map(x,y,1)=Nachfrage ; (0=nicht besetzt, 10=überbefüllt/überfordert) map(x,y,2)=nächstes Tile ; (Zahl=Tilenummer) Wenn ein Tile (Objekt) nicht weiter ausgebaut werden kann, dann 'verlinkt' die Nummer auf die eigene Tilenummer. Also wenn folgende Ausgangssituation: x=5 y=3 map(x,y,0)=6 ; 6 bedeutet Villa map(x,y,1)=10 ; 10 bedeutet Nachfrage übersteigt Kapazität map(x,y,2)=7 ; 7 ist die nächste Tilenummer (vorher festgelegt!!!) Per If-Anweisung wird nach map(x,y,1) überprüft ob die Zahl >=10 ist, wenn ja wird der Wert von map(x,y,2) nach map(x,y,0) kopiert. Also map(x,y,0)=map(x,y,2) und ganz wichtig!!! map(x,y,1)=0. Wenn aber bereits der nächst Schritt fort gegangen ist. Tile ist schon ein Palast (Kann also nicht mehr ausgebaut werden). Dann passiert folgendes: x=5 y=3 map(x,y,0)=7 ; 7 bedeutet Palast map(x,y,1)=10 ; 10 bedeutet Nachfrage übersteigt Kapazität map(x,y,2)=7 ; ist die nächste Tilenummer auf sich selbst bezogen. Per If-Anweisung muß überprüft werden, ob map(x,y,0) und map(x,y,2) die gleichen Werte haben, wenn ja kann nicht mehr ausgebaut werden und somit die Nachfrage nicht mehr durch einen weiteren Ausbau verringert werden! Je größer die Nachfrage also map(x,y,1)=14 als Beispiel, wird die Motivation der darin lebenden Menschen vermindert. ---- --- -- - - - - - Du hast also für jedes Feld im 2D-System eine Tilenummer für die Darstellung des Bildes welches per LoadAnimImage geladen wurde, einen Nachfragewert für alles was anfällt wie Straßenbenutzung und Hausbenutzung, und einen Ausbauwertlink zur nächsten Tilenummer. Deine Abfrage muß also (auf das von mir benannte Beispiel bezogen) wie folgt lauten: If map(x,y,1)>=10 Then If map(x,y,0)<>map(x,y,2) Then map(x,y,0)=map(x,y,2) map(x,y,1)=0 End If End If Du hast ja die Möglichkeit in einem Dim-Feld während der Laufzeit Werte auszulesen aber auch zu beschreiben. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group