Die "QBasic-Times"



Ausgabe Nr.3 (2-2000)


 
Übersicht

DirectQB Teil 3 - Mouse und Sound
Erklärung wie man DirectQB benutzt.

BSAVE & BLOAD  Tuturial No.1
Tuturial für BSAVE und BLOAD von Jazzman

Wie mach' ich eine Librarie?
Erklärung für die Erstellung eigener Libraries

Neuvorstellung von XBall IV
QMystic stellt XBall IV vor
 


Herzlich willkommen in der dritten Ausgabe der QBasic-Times.
Dieses Mal, geht es um das einbinden der Mouse und Sound in DirectQB.
Des weiteren hat Jazzman den ersten Teil seines  sehr informativen BLOAD & BSAVE Tuturials geschrieben.
Und für alle, die gerne selbst eine Librarie in QBasic erstellen wollen , aber nicht wissen wie das geht,  gibt es Abhilfe. Und nebenbei stelle ich mein Spiel XBall IV vor.

Also, Hals- und Beinbruch!



 
 

DirectQB Teil 3  - Mouse und Sound
 

Also, wie versprochen, hier ist die Fortsetzung die DirectQB Tuturials.
Dieses Mal geht es um die wirklich wichtigen Dinge, die DirectQB zu bieten hat und die in einem gutem Spiel auf keinen Fall fehlen sollten. Es geht um Mouse und Sound.
Beginnen  wir einfach mit der Mouse.
Die Mouse wird automatisch beim Initialisieren von DirectQB  mit gestartet. Es gibt also keinen Befehl der die Mouse extra startet.
Aber es gibt eine Funktion die erkennt ob der Computer überhaupt eine Mouse besitzt. Es ist DQbMouseDetected. Wenn keine Mouse installiert ist liefert diese Funktion den Wert 0 zurück.
Um nun die Mouse sichtbar zu machen, gibt es den Befehl DQBMouseShow.
Der Mousezeiger erscheint nun und kann mit der mechanischen Mouse über den Bildschirm bewegt werden.
Aber der Mousezeiger alleine bringt es noch nicht, da ebenfalls dessen Position auf dem Bildschirm wichtig ist.
Mit den Funktionen DQBMouseX und DQBMouseY kann man nun diese Position bestimmen. Um die Mouse wieder zu verdecken gibt es diesen Befehl DQBMouseHide.
Wenn es notwendig ist, die Mouse auf eine Bestimmt Position zu setzten benutz man am besten den Befehl DQBSetMousePos X, Y
X und Y sind die jeweiligen X- und Y – Koordinaten.
Wenn man hingegen der Mouse den Bewegungsbereich einschränken will setzt man den Befehl DQBsetMouseRange X1, Y1, X2, Y2
X1 und Y1 sind die Koordinaten der linken oberen Ecke und X2 und Y2 sind die Koordinaten der rechten unteren Ecke.
Um alle Einstellungen rückgängig zu machen gibt es den Befehl DQBresetMouse

Hier ein Beispiel:

'$INCLUDE:'DIRECTQB.BI'

' DirectQB wird initialisiert mit einem ExtraLayer, ohne Sound und EMS
IF DQBinit(1, 0, 0) THEN DQBclose: PRINT DQBerror$: END

' Test ob Mouse da ist
IF NOT DQBmouseDetected THEN
    ' Mouse wurde nicht gefunden
    PRINT "Dieses Programm benötig eine Mouse!"
    DQBclose
    END
END IF

DQBinitVGA

' Setzt alle Werte zurück
DQBresetMouse

' Setzte neue Reichweite für Mouse
DQBsetMouseRange 6, 6, 314, 148

DO
    ' lösche Layer 1
    DQBclearLayer 1

    DQBbox 1, 5, 5, 315, 149, 32

    ' Einige Extra Informationen
    DQBprint 1, "Taste drücken zum Beenden ", 0, 170, 40

    ' Mouseinformationen
    Info$ = "Mouse ist bei " + str$(DQBmouseX) + "," + str$(DQBmouseY)
    Info$ = Info$ + " - Buttons: " + str$(DQBmouseLB) + " " +    str$(DQBmouseRB)

    DQBprint 1, Info$, 0, 180, 40

    ' Verdecke Mouse
    DQBmouseHide

    ' Kopiere Layer 1 auf den Bildschirm
    DQBcopyLayer 1, VIDEO

    ' Zeige Mousezeiger wieder
    DQBmouseShow

LOOP WHILE INKEY$ = ""

' Programm beenden
DQBclose
 

Da der Mousezeiger von DirectQB nicht besonders gut aus sieht hat man auch die Möglichkeit das Aussehen den Zeigers zu verändern. Mit dem im DirectQB mitgelieferten DQBTool kann man selbst Mousezeiger malen.
Und mit diesem kleinen Programm kann man diesen Mousezeiger in sein Spiel einfügen.

DIM SHARED cursor AS STRING * 64

OPEN "mouse.cur" FOR BINARY AS #1
IF LOF(1) <> 64 THEN CLOSE #1
GET #1, , cursor: CLOSE #1

DQBsetmouseshape 0, 0, cursor

DQBsetmouseshape ist der Befehl um den neuen Mousezeiger einzusetzen.

Kommen wir nun zum Sound.
DirectQB bietet eine nicht ganz zu verachtendes Soundlibrarie, es können bis zu 32 Sound parallel neben einander abgespielt werden. Die Soundsampels selber, können in den RAM geladen werden um sie aus diesem dann ab zuspielen. Ein Soundsample darf aber leider immer nur 64KB groß sein.
Um den RAM, beim Initialisieren der DQB Librarie, frei und zum Benutzen bereit zu machen, wird der zweite Wert bei DQBInit eingesetzt. Hier ein Beispiel:
Dummy& =  DQBInit (0, 4, 0)
In diesem Fall wurde von DirectQB kein Layer aber 4 * 64KB Soundablageplatz – so genannter Slot - bereit gestellt.
In diese Slots können nun Soundsample gespeichert werden.
Das erfolgt durch die Funktion:
DQBloadSound (Slot, SoundDatei)
Slot gibt die Nummer des Slots an in der das Sound gespeichert werden soll. Wenn wie im vorher gehenden Beispiel 4 Slots zur Verfügung gestellt wurden, kann die Slotnummer 1 bis 4 betragen.
SoundDatei ist der Name der WAV-Datei die geladen werden soll.
Da DQBloadsound eine Funktion ist, liefert sie natürlich einen Wert zurück..
Wenn der Wert 0 ist, dann ist alles in Ordnung  und die Wav-Datei konnte erfolgreich geladen werden
Wenn der Wert 1 ist, konnte die Wav.Datei nicht gefunden werden.
Ein Lesefehler wird mit dem Wert 2 gemeldet.
Wenn etwas mit der Datei selbst nicht in Ordnung ist wird der Wert 3 zurück geliefert.
Wert 4 gibt an das das Soundformat nicht unterstützt wird und der Wert 5 das die Datei größer ist als 64KB.
Wenn es die Slotnummer nicht gibt kommt der Wert 6.

Das wichtigste ist aber nun das Abspielen des Sound, welches mit dem Befehl DQBplaySound erfolgt.
Vorher muß aber erst der Soundblaster aktiviert werden.
Die Funktion DQBinstallSB ist dafür verantwortlich.
Für diese Information werden viele Informationen benötigt.

DQBinstallSB (Volumentabelle, Stimmen, Frequenz, BaseAddr, IRQ, DMA)

Volummentabelle  stellt man erstmal auf FALSE. Dazu kommen wir später noch.
Stimmen gibt an, wie viele Sounds nebeneinander abgespielt werden können.
Frequenz ist die Standardfrequenz.
BaseAddr gibt den Port des Soundblasters an. Nomalerweise ist das H220.
IRQ und DMA stellt man am besten auf AUTO, dann kann man nichts falsch machen.

Ein Beispiel:

IF DQBinstallSB(FALSE, 2, 22050, &H220, AUTO, AUTO) THEN
    ' FEHLER
    DQBclose
    END
END IF

In diesem Beispiel wurden 2 Stimmen aktiviert und der Soundblaster auf 22050 kHz eigestellt.
22050 kHz ist der höchste Wert mit der besten Klangqualität. Es geht natürlich auch 11025 kHz odedr 8000 kHz.
DQBinstallSB liefert einen wert der ungleich 0 ist wenn estwas nicht stimmt.

Um nun den Sound abzuspielen  benutzt man:
DQBplaysound Slot, Stimme, Frequenze, Wiederholung

Slot ist die Slotnummer, also welcher Sound abgespielt wird.
Stimme ist die Nummer der Stimme, also die Spur auf der der Sound abgespielt werden soll.
Frequenze ist die Frequenze mit der dieser Sound abgespielt werden soll.
Wenn man für Wiederholung 0 einsetzt wird der Sound nur einmal abgespielt.
Wenn man 1 angibt, wird der Sound immer wiederholt.
Stoppen kann man den Sound dann nur mit
DQBstopVoice Stimme
Wobei Stimme die Nummer der Spur ist welche gestoppt werden soll.
Um beim Beenden des Programms den Soundblaster wieder zu deaktivieren
Benutzt man einfach DQBremoveSB

Beispiel:

'$INCLUDE:'DIRECTQB.BI'

IF DQBinit(0, 1, 0) THEN DQBclose: PRINT DQBerror$: END

' Starte Soundblaster auf 220h als Base Adresse
' finde IRQ und DMA selbständig. 2 Stimmen werden initialisiert
' Die Samplingrate ist 22 kHz
IF DQBinstallSB(FALSE, 2, 22050, &H220, AUTO, AUTO) THEN
    ' Fehler
    DQBclose
    END
END IF

' Fragt den Benutzer nach der SoundDatei
INPUT "Welche WAV soll geladen werden: ", File$

' Lädt Sound in den Speicher
IF DQBloadSound(1, File$) THEN DQBclose: PRINT „Fehler beim laden: END

PRINT "Taste drücken zum beenden..."

' Spielt den Sound 1 mit 22kHz auf Spur 2 einmal
DQBplaySound 1, 2, 22050, 0

WHILE INKEY$ = "": WEND

DQBremoveSB

DQBclose
 
 

So, das was es für diese Ausgabe. In der nächsten geht es dann um Sprites.
 Soeren Dressler
 



 
 

BSAVE & BLOAD   <-- Tuturial No.1 -->
 

Geschrieben von Jazzman - Clocksoft
www.freenet.de/Clocksoft
Clocksoft@freenet.de
 

In diesem Tuturial möchte ich kurz geschreiben wie man mit BSAVE und BLOAD umgeht, da
es so viel darüber zu schreiben gibt, werden wohl noch ein paar Tuturials folgen.
Diese Tuturial ist in mehre Abschnitte aufgeteilt:

1.) Die Parameter von BSAVE & BLOAD
2.) Erklärung zu BSAVE & BLOAD
3.) Einen Text speichern und wieder laden
4.) Denn ganzen Bildschirm speichern und wieder laden
 

1.) Die Parameter von BLOAD & BSAVE

 BSAVE dateiname, offset, länge
 BLOAD dateiname (,offset)

 - dateiname Hier muß der Name anzugeben, wo die Daten gespeichert bzw. geladen werde
                sollen, es gelten Dosregeln für die Namensvergabe.
 - offset       Die Anzahl von Bytes von dem Speichersegment, von dem das speichern beginnen
                soll.
 - länge        Gibt die länge der Datei an, zwischen 0 und 65 353 Bytes.
 
 

2.) Erlärung zu BSAVE & BLOAD

Mit BSAVE werden die die Daten nicht einfach so gespeichert, sondern der Speicherbereich
wird gespeichert, alos 100% Computeroptimiert, es muß nichts umgewandelt werden, sondern
wird direkt zurück in den Speicher geschrieben, dadurch werden die gespeicherten Daten
wesentlich BSAVE und BLOAD haben dadurch, dass sie die Daten einfach wieder in den Speicher
geladen werden müssen den Vorteil, dass sie sehr schnell sind, das man damit Animationen
ermöglichen kann. Es wird nichts als Klartext gespeichert, so das niemand die Dateien
einfach lesen kann, kleine Verschlüsselung, aber ohne na ja.

3.) Einen Text speichern und wieder laden

Damit man Texte speichern kann, muß man nicht viel machen, den zu speichernden Text
speichert man erst mal als String in eine Variable, dessen Offset wird mit VARPTR bestimmt,
das Speichersegment der Variable wird mit VARSEG bestimmt, dass heißt es wird die genaue
Speicherstelle der Variable bestimmt, die BSAVE dan Speichert um sie beim laden einfach nur
wieder an die entsprechende zu laden. Hier ein erklärtes Beispiel:
 
 
Text$ = "Das ist ein Test" 'Hier ist unsere Variable
DEF SEG = VARSEG(Text$)  'Hier wird das Standartspeichersegment auf den 
'Anfang des Segmentes der Variable gesetzt, dies
'wird mit VARSEG automatisch gemacht.
BSAVE "TUT1.BSV", VARPTR(Text$), 48 'BSAVE speichert jetzt die Variable in die Datei
'TUT1.BSV, der Offset der Datei wird mit VARPTR
'ermittelt, die Länge der Datei wird auf 48 Bytes
'festgelegt, wenn die Variable zu groß ist stürzt
'QBasic ab, das macht sich bemerkbar wenn der
'anzuzeigende Text falsch ist, bei der nächsten
'Aktion wird QBasic die Fehlermeldung
'INCORRECT SPACE anzeigen und mutwillig beenden
Text$ = ""  'Löscht den Inhalt der Variable.
BLOAD "TUT1.BSV", VARPTR(Text$) 'Läd die Datei TUT1.BSV und speichert die Daten in
'der Variable Text$, dessen Speicheroffset mit
'VARPTR bestimmt wird.
DEF SEG 'Speichersegment wieder auf den Standart setzen
PRINT Text$ 'Zum Testen wird die Variable angezeigt

4.) Denn ganzen Bildschirm speichern und wieder laden

Dafür giebt es eine sehr einfache Methode
 
SCREEN 13 'Denn Bildschirm auf SCREEN 13 setzen, der hat die
'die Auflösung von 320 x 200 Pixeln in 256 Farben.
FOR x = 1 TO 320
  FOR y = 1 TO 200
   PSET (x, y), INT(RND * 15) 
  NEXT y 
 NEXT x 
'Hier wird auf den ganzen Bildschirm ein Zufalls-
'muster erzeugt.
DEF SEG = &HA000  'Hier wird das Speichersegment auf das des Bild-
'schirms gesetzt, der Hexwert ist mit A000 fest,
'dies ist der Anfang des Bildschirmsegments. 
BSAVE "TUT2.BSV", 0, 64000 'Hier wird der gesamte Bildschirm in der Datei
'TUT1.BSV gespeichert. Es wird der Anfang des Bild-
'schirmsegments und die folgenden 64000 Bytes
'gespeicher. Die 64000 Bytes ergeben sich aus
'Höhe x Breite der Auflösung, hier 
'320 x 200 = 64000, der Offset ist auf Null gesetzt,
'weil wir ja von anfang an anfangen, wird dieser
'geändert fehlt das entsprechende Stück am Anfang
'des Bildes
CLS  'Die Bildinformationen werden gelöscht
BLOAD "TUT2.BSV" 'Die ebend gespeicherten Informationen werden
'wieder geladen
DEF SEG 'Speichersegent wieder auf Standart zurücksetzten

Ich hoffe das euch diese Tuturial weitergeholfen hat, wenn ich noch Fragen oder Anregungen
habt schreibt mir, ich habe immer ein offenes Ohr für Fragen.

Jazzman / Clocksoft (f) 2000  Clocksoft@freenet.de
 
 



 

Wie macht man Librarie in QBasic?
 

Es kam immer wieder die Frage,  wie man eigentlich selbst eine Librarie erstellt.
Zuerst sollte ich vielleicht erklären, was überhaupt eine Librarie ist.
Die Librarie, abgekürzt LIB, ist eine Sammlung von Befehlen also SUBs und Funktionen die extern in QBasic benutzt werden können.

Um nun eine eigene Librarie zu erstellen, benötigt man die SUBs und Funktionen , die in der Librarie enthalten sein sollen.
Diese müssen sich in einer BAS Datei befinden, die kein Hauptprogramm besitzt sondern nur die SUBs und Funktionen und deren DECLARE Befehle.
Man klickt nun im Menü auf RUN und dann auf MAKE LIBRARY.
QBasic will nun wissen wie die Librarie heißen soll. Man gibt den Namen ein und klickt danach auf MAKE LIBRARY.
QBasic erstellt nun die gewünschte Librarie, die aber so noch nicht verwendbar ist, da QBasic nur mit QLB Dateien etwas anfangen kann.
Diese QLB Datei kann man mit dem Programm LINK.EXE erstellen, welche bei QBasic mit dabei ist.
Man gibt also als DOS-Befehl folgendes ein.

    LINK /QU MEINE.LIB, MEINE.QLB, NUL, QUICKQLB.LIB

MEINE.LIB ist die von QBasic erstellte LIB-Datei
MEINE.QLB ist die fertige Librarie.
QUICKQLB.LIB ist die Librarie die dein Compiler benötigt.
(BQLB45.LIB ist es bei QuickBasic4.5 und
QBXQLB.LIB bei PDS oder auch QBASIC7.1)

MEINE.QLB kann zwar nun von QBasic mit
    qb /l meine.qlb
gestartet werden, aber QBasic kennt die deklarierten  SUBs und Funktionen noch überhaupt nicht.
Für diesen Zweck benötigt QBasic eine BI Datei, in welcher der Inhalt des Hauptprogramms, also alle DECLARE Zeilen stehen.
Die BI Datei wird innerhalb des Programm, welches mit der Librarie arbeiten soll, mit
    ‘INCLUDE:‘MEINE.BI‘
eingesetzt.

Ich hoffe diese Erklärung war verständlich.
Also viel Spaß beim Progen!
Soeren Dressler
 



 

Neuvorstellung von XBall IV
 
 

Der vierte Teil der Breakoutvariante ist da.
Aber WAS IST BREAKOUT werden sich die meisten Fragen.
Ich werde jetzt hier nicht erklären, was Breakout ist. Aber  ich werde ein wenig über mein Spiel XBall plaudern.
XBall, ist wie schon gesagt, eine Breakoutvariante, bei der es darum geht, mit einem kleinen Ball die Steine aus dem Spielfeld zu schlagen. Als einzige Steuermöglichkeit hat der Spieler einen Schläger, auch Paddel genannt. Mit diesem Paddel hindert man den Ball auf dem Boden auf zuschlagen. Denn wenn das passiert, verliert man diesen Ball und sieht ihn nie wieder. Die Anzahl der Bälle ist begrenzt. Ich muß also nicht sagen, dass man möglichst sparsam mit den runden Kugeln umgehen sollte.
Ziel ist es nun, alle grünen Steine aus dem Spielfeld zu befördern. Dieses Ziel ist aber mit einigen Hindernissen ausgestattet. Je nach Level, liegen noch andere  Steine im Weg. Diese müssen selbstverständlich vorher abgeschossen werden. Aber genau diese Steine haben ihre Tücken. Es gibt Seine, aus denen seltsame Dinge heraus fallen. Wenn man diese Objekte auf fängt, lösen  sie eine Aktion aus. Das Symbol auf den Objekten zeigt vorher an, welche Eigenschaft diese oder jenes besitzt.
Es kann zum Beispiel einen neuen Ball herbei zaubern oder einen aus dem Archiv  verschwinden lassen. Einige bringen Punkte mit und wieder andere nehmen diese weg. Es gibt auch welche, die den Schläger vergrößern oder verkleinern können.
Wie gut man sich anstellt oder wie schlecht, zeigt die Highscore. XBall IV ist eine Freeware. Es kann auf http://qmystic.xxn.de oder auf http://basic.de.cx down geloadet werden. Im Paket enthalten, ist das Spiel, einige Levels und ein Editor, mit welchem man selbst Levels erstellen kann.
Wenn du ein Level selbst gemacht hast, schick es mir einfach unter soeren01@t-online.de
Ich stelle es dann mit auf die Seite.

Bei Fragen, Problemen oder Vorschlägen, schreibt mir unter  soeren01@t-online.de.
Viel Spaß!

Soeren Dressler


So, das war’s für diese Ausgabe. Ich hoffe das die QBasic-Times in Zukunft genauso gut ankommt wie bisher.
Also, wenn ihr etwas habt, was unbedingt mit in die nächste Ausgabe soll (Werbung für eure Seite oder Spiel oder Tool oder ein Tuturial  ...) , dann schick es mir einfach.

Bis zum nächsten Mal!

Soeren D.