Bank-Funktionen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Rocys

Betreff: Bank-Funktionen

BeitragFr, Jan 23, 2009 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine kleine Funktionssammlung zum Thema Banks.
Zuerst sind die "add"-Befehle, die einen Wert an eine Bank anhaengen und, falls diese nicht existiert, eine erstellen. Rueckgabewert ist die Adresse der Bank
Folgender Code
Code:

meine_bank=BANK_add_byte(meine_bank,15)

wuerde also schauen, ob die Bank "meine_bank" existiert. Wenn nicht wuerde sie erstellt werden. In jedem Fall wird ans Ende der Bank der Wert 15 angehaengt.
Dann gibt es noch BANK_new_read und BANK_next_data:
Nehmen wir mal an, man speichert in einer Bank Gegnerdaten. Diese Daten bestehen aus
1 Byte fuer die Gegnerart
1 Int fuer die HPs
1 Short fuer die Munition
Dann wuerde man folgende Schleife machen, um alle Gegner durchzugehen:
Code:

BANK_new_read(7)
repeat
    BANK_next_data(gegner_bank)
   gegner_art=peekbyte(gegner_bank,BANK_readpos)
    gegner_hp=peekint(gegner_bank,BANK_readpos+1)
    gegner_ammo=peekshort(gegner_bank,BANK_readpos+5)
until BANK_end=1

Bank_new_read startet also die Durchsuchung einer Bank. Der Parameter gibt an, wie gross der Datensatz ist.
BANK_next_data setzt den Zeiger um die groesse eines Datensatzes weiter.
Also koennen wir alle Datensaetze in der Bank durchgehen.
BANK_readpos ist die Adresse des jeweiligen Datensatzes. Wenn schliesslich alle Datensaetze durchgegangen sind, wird die Variable BANK_end auf 1 gesetzt. Wir wissen, es gibt nichts mehr auszulesen.

Code:

Function BANK_add_byte(lcl_bank%,lcl_data%)
   ;diese Funtion haengt an eine Bank ein byte an
   ;wenn es die bank nicht gibt, wird sie erstellt
   ;die Adresse der Bank wird zurueckgegeben
   If lcl_bank%=0 Then
      lcl_bank=CreateBank(1)   ;Wenn es die Bank nicht gibt, wird sie mit der Groesse 1 erstellt
   Else
      ResizeBank(lcl_bank,BankSize(lcl_bank)+1)   ;Wenn es sie gibt, wird ihre Groesse um 1 erhoeht
   End If
   PokeByte(lcl_bank,BankSize(lcl_bank)-1,lcl_data)   ;das Byte wird angehaengt
   Return lcl_bank      ;die Adresse der Bank wird zurueckgegeben
End Function

Function BANK_add_short(lcl_bank%,lcl_data%)
   ;diese Funtion haengt an eine Bank einen Short-Wert an
   ;wenn es die bank nicht gibt, wird sie erstellt
   ;die Adresse der Bank wird zurueckgegeben
   If lcl_bank%=0 Then
      lcl_bank=CreateBank(2)   ;Wenn es die Bank nicht gibt, wird sie mit der Groesse 2 erstellt
   Else
      ResizeBank(lcl_bank,BankSize(lcl_bank)+2)   ;Wenn es sie gibt, wird ihre Groesse um 2 erhoeht
   End If
   PokeShort(lcl_bank,BankSize(lcl_bank)-2,lcl_data)   ;der Short-Wert wird angehaengt
   Return lcl_bank      ;die Adresse der Bank wird zurueckgegeben
End Function

Function BANK_add_int(lcl_bank%,lcl_data%)
   ;diese Funtion haengt an eine Bank einen Int-Wert an
   ;wenn es die bank nicht gibt, wird sie erstellt
   ;die Adresse der Bank wird zurueckgegeben
   If lcl_bank%=0 Then
      lcl_bank=CreateBank(4)   ;Wenn es die Bank nicht gibt, wird sie mit der Groesse 4 erstellt
   Else
      ResizeBank(lcl_bank,BankSize(lcl_bank)+4)   ;Wenn es sie gibt, wird ihre Groesse um 4 erhoeht
   End If
   PokeInt(lcl_bank,BankSize(lcl_bank)-4,lcl_data)   ;der INT-Wert wird angehaengt
   Return lcl_bank      ;die Adresse der Bank wird zurueckgegeben
End Function

Function BANK_add_float(lcl_bank%,lcl_data#)
   ;diese Funtion haengt an eine Bank einen Float-Wert an
   ;wenn es die bank nicht gibt, wird sie erstellt
   ;die Adresse der Bank wird zurueckgegeben
   If lcl_bank%=0 Then
      lcl_bank=CreateBank(4)   ;Wenn es die Bank nicht gibt, wird sie mit der Groesse 4 erstellt
   Else
      ResizeBank(lcl_bank,BankSize(lcl_bank)+4)   ;Wenn es sie gibt, wird ihre Groesse um 4 erhoeht
   End If
   PokeFloat(lcl_bank,BankSize(lcl_bank)-4,lcl_data#)   ;der Float-Wert wird angehaengt
   Return lcl_bank      ;die Adresse der Bank wird zurueckgegeben
End Function

Global BANK_readpos      ;Wo lesen wir in Banks
Global BANK_data_size   ;Wie viele Byte ist ein Datensatz lang
Global BANK_end=0      ;sind wir schon am Ende der Bank angelangt

Function BANK_new_read(lcl_data_size%)
   ;startet einen neuen Lese-Vorgang aus einer Bank
   BANK_readpos=-lcl_data_size      ;setze die Leseposition der Bank auf 0
   BANK_data_size=lcl_data_size   ;die Groesse der Datensaetze wird festgelegt
   BANK_end=0            ;Wir sind noch nicht am Ende der Bank
End Function


Function BANK_next_data(lcl_bank%)
   ;setzt die Readpos auf den naechsten Dateneintrag in der Bank
   BANK_readpos=BANK_readpos+BANK_data_size   ;Erhoehe den Bank_read_pos
   If BANK_readpos>=(BankSize(lcl_bank)-BANK_data_size) Then BANK_end=1   ;Wenn die Bank zuende ist, wird BANK_end=1
End Function

aMul

Sieger des Minimalist Compo 01/13

BeitragFr, Jan 23, 2009 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will nichts sagen, aber eigentlich benutzen die meisten Leute für das was du da beschreibst Types.
Es mag sein, dass Banks minimal schneller sind, obwohl ich mir da auch nicht mehr so sicher bin, wenn man wie du den Umweg über mehrere Funktionen macht um Werte auszulesen.

Ob die Qualität oder Originalität für das Codearchiv ausreichend ist soll ein Moderator beurteilen, aber ich empfinde den Code als wenig zu gebrauchen.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Goodjee

BeitragFr, Jan 23, 2009 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
nunja, das ist ja im prinzip ne liste, und somit kann es keine types ersetze, weil bb nur eine liste hat, so kann man mehrere machen

man könnte sich natürlich auch selber ne liste basteln mit types, indem man einen type knoten erstellt, der einen inhalt und einen vorgänger und nachfolger hat, aber so gehts ja auch Wink
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

Rocys

BeitragFr, Jan 23, 2009 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich benutze es, bei 'Traders' für folgendes.
ich habe ein Array PLANET_Ground_job_applications(max_planet,max_ground,max_worker). alle max_ sind variablen. Wenn jetzt eine Person sich auf den Job bewirbt, wird ihre ID in die Bank geschrieben, die ich in dem Array speichere.
Ich wüsste jetzt nicht, wie man das mit Types lösen könnte.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group