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

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Sereyanne

Betreff: probleme mit arrays - limit in bb? [gelöst]

BeitragMo, Apr 28, 2008 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 28, 2008 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 28, 2008 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 28, 2008 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 28, 2008 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 28, 2008 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Surprised

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

BeitragMo, Apr 28, 2008 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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...

BladeRunner

Moderator

BeitragMo, Apr 28, 2008 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Da du uns ja erst nur die Dimensionierung zeigtest konnten wir auch keine vernünftige Antwort auf diesen Fehler finden Wink
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 nicht verstanden zu haben. Einmal zu Beginn des Programmes in der passenden Grösse angelegt steht es Dir für den Rest des Ablaufes zur verfügen. Ein reDim ist nur interessant und sinnig wenn sich die Grösse des betreffenden Feldes mal ändert. (Wenn das passiert sollte man sich allerdings auch gedanken darüber machen ob es nicht effizientere Datenstrukturen zur Speicherung gibt. zB. eine Bank.)
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

BeitragDi, Apr 29, 2008 7:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy . Ich habs gestern doch nicht mehr geschafft, das umzuschreiben. Aber keine Sorge, ich werde eure Ratschläge beherzigen Cool

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.

BladeRunner

Moderator

BeitragDi, Apr 29, 2008 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 30, 2008 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
jawoll. lang hats gedauert (hatte nicht viel zeit), jetzt hab ichs umgeschrieben. funktioniert einwandfrei.

danke nochmal! (jetzt weiß ich wozu restore gut ist ^^)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group