probleme mit arrays - limit in bb? [gelöst]
Übersicht

![]() |
SereyanneBetreff: probleme mit arrays - limit in bb? [gelöst] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
mir ist ein merkwürdiger Fehler in meinem Spiel aufgefallen. Ich arbeite mit mehreren Arrays um die Karte zu erstellen. Code: [AUSKLAPPEN] Dim map (50,50) ;Karte definieren
Data 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000, 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,130,130,130,130,130,130,130,130,130,130,130,130,130,130 ;(usw) Dim huette (20,15) ;Haus definieren Dim ladenkarte (20,15) ;Laden definieren Dim zeltkarte (20,15) ;Zelt definieren Dim kirchenkarte (20,15) ;Kirche definieren Diese Methode ist für mich die leichteste, um ein Haus zu zeichnen, wenn es vom Spieler betreten wird. Es funktioniert auch alles einwandfrei. Naja fast alles - denn plötzlich stellte ich fest bei einem neuen Spielstart, dass die oberste Zeile der Hauptkarte (Dim map (50,50)) auf einmal nicht mehr angezeigt wird. Spiel neu gestartet ohne was am Code zu verändern, und alles war wieder okay. Jetzt hatte ich das Problem noch mal - dieses Mal fehlten die oberen 2 oder 3 Zeilen. Bei einem Neustart ist wieder alles wie es sein soll. Woran kann das liegen? Hat BB Probleme damit mehrere so große Arrays in einem Spiel zu verwalten? Ich weiß keine Lösung. Wie gesagt, das Problem tritt ja auch nicht immer auf... Hoffentlich weiß von euch jemand Rat! Vielen Dank im Voraus! |
||
- Zuletzt bearbeitet von Sereyanne am Mi, Apr 30, 2008 15:08, insgesamt 2-mal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Das ist, sorry wenn das böse klingt, die wohl mit abstand dümmste art sowas zu lösen. -> Robsite - BB Tutorials - RPG Tutorial
2. Blitz hat garkeine beschränkung. Solangs in den RAM passts gehts. Wenns nicht in den ram passen würde, käme ziemlich sicher ein MAV (Memory access violation) und nicht einfach nichts. Einfach nichts kommt nur wenn man nen Bug hat oder zb im 3D Modus ein Mesh mit mehr als 65335 Polygonen / Vertices füttert (missachtung der DX7 spezifikationen) Vielleicht läuft ja ein programm das einen einfluss drauf hat und dafür sorgt dass teile der map in die pagefile geschrieben werden statt im RAM gehalten wodurchs grosse verzögerungen geben würde. Firefox 2 zb gibt seinen speicher nicht frei bis man es beendet und neu startet. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich entschuldige mich für meine "dümmste art sowas zu lösen". Die Tuts hab ich durch - wo stand denn da so ein Problem drin?
Bin mal neugierig: Wie würdest du es denn lösen? Firefox benutze ich nicht. Wie gesagt, das Problem tritt nicht immer auf, von ca. 100 mal starten vllt nur ein mal... Danke schon mal für deine Antwort. edit: warum hört das rpg tut eigentlich bei teil6 auf, wo es doch bis 10 gehen sollte? |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Indem man Tilemap benutzt und die Maps einzeln handhabt.
Heisst jedes Mal wenn du die Tilemap wechselst (ins haus gehst, angenommen das aussen hört auf zu existieren) lädst du die entsprechenden Daten. Dein derzeitiger Aufbau scheint vorzusehen das du für alles neue Arrays machst, damit wirst du niemals mehr als ein kleines gebiet hinbekommen. Speziell weil du sicher über kurz oder lange auch sowas wie einen Editor schreiben willst. Schade das mapeditor.de.vu nicht mehr angeboten wird, der wär die optimale lösung gewesen. Du kannst, um das ganze zu beschleunigen, 2 Maps halten. Eine Indoor (wenn du in ein haus gehst zb) und eine Outdoor, damit du net alles neu laden musst wenn du das haus direkt wieder verlässt (-> eine art caching) Das wichtigste hier ist vermutlich dass du eine einigermassen effiziente Speicher- und Datennutzung erreichst, dass du zb die nicht genötigten Bilder alle wieder freigibst und solche Dinge. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
- Zuletzt bearbeitet von Dreamora am Mo, Apr 28, 2008 14:37, insgesamt einmal bearbeitet
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin nicht sicher ob ich dich verstanden hab. Mein derzeitiger Aufbau sieht so aus:
Code: [AUSKLAPPEN] Dim map (50,50) ;Karte definieren
Include "data/map.bb" Dim huette (20,15) ;Haus definieren Include "data/huette.bb" Dim ladenkarte (20,15) ;Laden definieren Include "data/ladenkarte.bb" Dim zeltkarte (20,15) ;Zelt definieren Include "data/zeltkarte.bb" Dim kirchenkarte (20,15) ;Kirche definieren Include "data/kirchenkarte.bb" Repeat SetBuffer BackBuffer() Cls For y = 0 To 49 For x = 0 To 49 DrawImage tileset,x*32-scrollx,y*32-scrolly,map(x,y) Next Next ;Spiel If KeyHit (OK) Then ; If px und py vor einer Tür Then BetretenHaus() (Pseudocode) Flip Forever End Function BetretenHaus() For y = 0 To 14 For x = 0 To 19 DrawImage tilehaus,x*32,y*32,huette(x,y) Next Next ;(ist natürlich nicht die ganze Funktion) end function Also im Hauptspiel wird die 50,50 Karte gemalt und wenn ein Haus betreten wird, dimensioniere ich jedes Mal eine neue Karte. Meintest du dass ich die Hauptkarte einfach bestehen lassen und jedesmal mit neuen Daten überschreiben soll? So etwa:? Code: [AUSKLAPPEN] Dim map (50,50) ;Karte definieren
If KeyHit (OK) Then ; If px und py vor einer Tür Then BetretenHaus() (Pseudocode) Function BetretenHaus() For y = 0 To 49 For x = 0 To 49 DrawImage tilehaus,x*32,y*32,map(x,y) Next Next und dann einfach die Data-Zeilen neu schreiben? (kann man das verstehen? klingt doof..) edit: also nicht jedesmal ein neues array erstellen, sondern das alte überschreiben? |
||
- Zuletzt bearbeitet von Sereyanne am Mo, Apr 28, 2008 12:37, insgesamt einmal bearbeitet
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kann dreamora nur recht geben.
und du solltest dich auf zwei bis drei Arrys hauptsächlich beschränken. 1. Arry in dem alle map tiles gespeichert werden dim tile_map( map_size_x , map_size_y, layer_anzahl ) "layer" kann man wie ebenen verstehen, um zb höhenunterschiede in 2D zu realisieren. Beispiel: Layer(ebene) 0 ist ein fluss Layer(ebene) 1 ist eine brücke die über den fluss gemalt wird 2. Arry in dem Objekte gespeichert werden, dinge die zb. immer über allen "map tiles gezeichnet werden sollen". In diesem Arry könnte man z.b item positionen speichern... oder NPC positionen .. etc dim Objekt_arry( map_size_x , map_size_y, layer_anzahl ) Beispiel: Schilder, bewegliche steine, Schatzkisten usw... eignen sich gut als inhalte für diesen arry evt. 3. Arry.. keine ahnung aber vielleicht möchtest du ja mal was spezielles haben. Beispiel: Es sollen Zufällig Irgenwo auf der map, tiles ohne weiteren sichtbaren grund blockieren, und das soll sich zur lauftzeit ganz dynamisch und schnell ändern können. Dim Besetzt_arry ( map_size_x , map_size_y, layer_anzahl ) Ich bin mir sicher, dass es bestimmt bessere Lösungswege gibt, aber ich denke für den anfang und die ersten tile geschichten passt das recht gut. Lasse mich aber auch gerne eines besseren belehren ![]() Achja die map wird dann im groben so Gezeichnet: (sidebar einklappen = keine Zeilenumbrüche) Code: [AUSKLAPPEN] for layer = 0 to layer_anzahl for x = 0 to map_size_x for y = 0 to map_size_y If tile_map(x,y,layer) >0 then dramimage tileset,x*32,y*32,tile_map(x,y,layer) If objekt_arry(x,y,layer) >0 then dramimage tileset,x*32,y*32,tile_map(x,y,layer) ;objekte werden immer über den map tiles gemalt next next next mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke euch beiden.
ist eine idee wert. aber den "bug" dass plötzlich die obere Zeile nicht mehr angezeigt wird, versteh ich trotzdem nicht. gut dann mach ich mich mal ans werk die dims zu ändern... |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da du uns ja erst nur die Dimensionierung zeigtest konnten wir auch keine vernünftige Antwort auf diesen Fehler finden ![]() Du redimensionierst ständig neu, sagst du. Bei Dim in der Schleife wird dass array immer neu definiert und unter ungünstigen Umständen könnte es theoretisch vorkommen das Teile der Daten überschrieben werden. Merke: Daten die in ihrer Größe unveränderlich sind nicht verändern. Du scheinst dim ![]() Praktisch gesehen ist Dein vorgehen - sorry für die offenen Worte - übelster Scrap. Du definierst für jedes Objekt im Spiel einen eigenen Datenbereich. Das bläht das Game total auf. Deine Gebäude scheinen alle gleichgroß, wie wäre es mit karte(50,50) und Innen(15,20)? Wenn ein Gebäude betreten wird wird nicht ein neues Dim (mit neuer Anzeigefunktion) benötigt, sondern einfach das universelle neu befüllt: Pseudo-Code: [AUSKLAPPEN] dim karte dim innen ... repeat if imbau= false drawkarte() else drawinnen() endif ; hier noch die tests welcher bau betreten wird und setzen der innenkarte darauf ;zb if keyhit(2) then ; restore kirche ; for x = 0 to 19 for y=0to14 read innen(x,y) next next ;endif until keyhit(1) function drawinnen() for x = 0 to 19 for y=0to14 drawtile blabla end function Selbst dieser Ansatz ist noch aufgeblasen. eigentlich reicht es nämlich vollkommen nur mit Karte(x,y) zu arbeiten. Die kann ja die maximal im Spiel mögliche Grösse haben und per Variablen in ihrer Ausdehnung beschränkt werden, so dass nur der benötigte Teil gezeichnet und ausgewertet wird. Die Gedanken die Du hier vor dem Schreiben in Überlegungen zum Aufbau investierts wirst Du später mehrfach zurückgezahlt bekommen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann hab ich Dreamora ja doch richtig verstanden.
Danke für deine ausführliche Erklärung, BladeRunner. Durch euch ist mir die Dim-Verwendung deutlicher geworden ![]() ![]() Immer wieder kompetente Hilfe hier im Forum! Danke! Edit: Jetzt hab ich doch noch ein Problem. Ich versteh ja was ihr meint. Aber ich möchte natürlich nicht dass jedes Gebäude gleich aussieht. Wo pack ich denn die Daten hin? Die Data 0,1,2,... Zeile? BB spuckt zwar keinen Fehler aus, aber wenn ich ein Gebäude betrete, hab ich einen ganz lustigen gewürfelten Bildschirm. Ich brauch ja für jedes Gebäude andere Data-Zeilen. Wohin damit? In die Funktion geht nicht. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
restore![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
jawoll. lang hats gedauert (hatte nicht viel zeit), jetzt hab ichs umgeschrieben. funktioniert einwandfrei.
danke nochmal! (jetzt weiß ich wozu restore gut ist ^^) |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group