Make gehört zur Standard djgpp Distribution, und befindet sich in der
Datei v2gnu/mak*b.zip (was auch immer gerade die aktuelle Version ist).
Sie ist hier erhältlich: http://www.delorie.com/djgpp/.
Sind Sie sicher, dass djgpp richtig installiert ist? Lesen Sie
die Anweisungen in der djgpp readme.1st Datei, und stellen
Sie insbesonere sicher dass die DJGPP Umgebungsvariable gesetzt ist und
sich das djgpp\bin Verzeichnis im Datei-Pfad befindet.
Sind Sie sicher, dass Sie das GNU make Programm verwendn, und nicht
eine andere Version, z.B. die von Borland? Falls Zweifel bestehen,
führen Sie "make -v" aus und überprüfen ob eine GNU Copyright Meldung
erscheint.
Führe make nicht im Windows Explorer aus! Öffne eine DOS Box,
ändere das Allegro Verzeichnis, und gib "make" in der
Kommandozeile ein.
Es kann sein dass die Systemzeit abweicht oder falsch eingestellt ist.
Außerdem besteht die Möglichkeit, dass Sie eine neue Datei installiert
haben, die von jemandem in einer östlicheren Zeitzone erstellt wurde.
In diesem Fall kann man entweder ein paar Stunden warten (oder die Uhr
kurzfristig vorstellen), oder ein Utility wie "touch" verwenden um
das Datum der Dateien zu verändern.
Wie die Fehlermeldung andeutet, benötigt der Compiler mehr Speicher.
Das go32-v2 Programm teilt einem mit wie viel Speicher zur Zeit verfügbar
ist. Unter DOS kann es helfen die Swap-Datei zu
vergrößern. Unter win95, erhöhe den DPMI Speicher auf 65536 (muss
manuell eingegeben werden, weil die Liste sonst mit 16384 aufhört).
Wie die Fehlermeldung andeutet, gibt es einen Konflikt zwischen gcc
und einer älteren Version von libc. Eine Lösung ist am Ende der Datei
readme.DJGPP enthalten, die man im DJGPP Archiv gcc*b.zip findet.
Fehlermeldung, wie:
C:\TEMP\ccdaaaaa(.text+0x9):x.c: undefined reference to `allegro_init'
C:\TEMP\ccdaaaaa(.text+0xe):x.c: undefined reference to `install_keyboard'
Man sollte immer die Dokumentation lesen :-) Programme müssen immer mit
der Bibliothek, liballeg.a, gelinkt werden. Stellen Sie zuerst sicher, dass alles
korrekt installiert wurde (make sollte das automatisch machen). Danach,
falls Sie von der Kommandozeile oder mit einem makefile kompilieren,
fügen Sie -lalleg an das Ende des gcc Kommandos, oder falls Sie Rhide
benützten, öffnen Sie das Options/Libaries Menu, schreiben 'alleg' in
das erste freie Feld, und achten darauf dass das Kontroll-Kästchen
aktiviert ist.
Nein, leider nicht. Für Anfänger, liballeg.a ist ca. 1MB, aber man
benötigt meist auch noch andere Programme, wie den Grabber, Sound Setup,
etc. Nicht zu vergessen all die Beispielprogramme. Wären kompilierte
Versionen aller Programme enthalten, käme eine Binärversion auf mehrere
MB: viel zu groß! Ernsthaft, es gibt keinen Grund, Allegro nicht selbst
zu kompilieren. Ein Compiler ist ein deterministischer Ablauf: Aus der
selben Eingabe, und mit den gleichen Optionen, erhält man immer das selbe
Ergebnis. Falls es nicht funktioniert, sind entweder die Eingabe-Dateien
falsch (d.h. es stimmt etwas nicht mit der Allegro-Installation), oder
es wird eine falsche Kommandozeile verwendet (sollte nicht vorkommen,
da alles was man tun muss ist "make" einzugeben...) oder mit dem Compiler
ist etwas nicht in Ordnung, d.h. er ist nicht richtig installiert. Finden
und beheben das Problem, anstatt es unter den Teppich zu kehren indem Sie
jemand anderen dazu bringen für Sie zu kompilieren...
GNU Programme schreiben ihre Fehlermeldungen in den Error-Stream, stderr.
Leider kann command.com diesen nicht umleiten. Aber glücklicherweise
hatte DJ den schlauen Einfall das zu umgehen, und man kann sein redir
Programm verwenden um die Ausgabemeldungen in eine Datei zu leiten, z.B.
"redir -eo make > logfile.txt".
Hier gibt es unterschiedliche Erfahrungen. Einige Leute haben von
Problemen berichtet, während andere sagen es funktioniert. Ich selbst
habe keinen Zugang zu NT, also kann ich keine Seite bestätigen, und
ehrlich gesagt, interessiert es mich auch nicht sonderlich. Wenn Sie
Windows-Programme wollen, benutzen Sie die Windows-Version. Wenn Sie
DOS-Programme ausführen willst, benutzen Sie DOS!
Ja, aber mit Einschränkungen. Wenn Sie die OpenDOS Version von EMM386
benützten, müssen Sie deren DPMI Implementierung ausschalten
(DPMI=OFF in der EMM386.EXE Zeile in der config.sys). Gehen Sie außerdem
sicher, dass die PIC=OFF Option gesetzt ist, aber das ist die
Default-Einstellung, es sollte also kein Problem darstellen).
Es geht nicht. Dieses Limit kommt von der VGA Hardware, nicht von Allegro.
Um auf mehr Speicher zuzugreifen, muss man einen SVGA Modus benutzen,
d.h. entweder eine höhere Auflösung verwenden, oder den SciTech Display
Doctor, der mehrere SVGA Modi mit niedriger Auflösung unterstützt.
Es funktioniert bei einigen, bei anderen nicht. Das Problem ist dass sich
Creative Labs weigert, technische Details zu veröffentlichen, was zur
Folge hat, dass wir nicht wissen, wie wir Treiber für sie schreiben
sollen. Beschwer dich bei ihnen, oder kaufe eine andere Karte von einem
vernünftigeren Hersteller.
Der Grund kann sein, dass die Lautstärke sehr leise gestellt ist:
Versuche sie im Setup-Programm einzustellen. Außerdem mixt Allegro
mehrere Sounds in einen einzigen Ausgabe-Buffer, während der Windows
Sound-Player immer nur ein Sample gleichzeitig abspielt. Das hat zur
Folge, dass jeder Sound nur einen kleineren Prozentsatz des
Gesamtvolumens erhält. Das ist ganz einfach der Preis den man für
mehrere Ausgabekanäle zahlen muss. Wer das nicht will, kann (im
Setup-Programm) die Anzahl der Sound-Kanäle ändern: Es kann eine
beliebige Potenz von zwei sein, kleiner oder gleich 64. Je kleiner,
desto lauter ist der Sound. Eine Alternative ist die
set_volume_per_voice() - Funktion, die in der Dokumentation beschrieben
wird. Sie ermöglicht es, das Gesamt-Volumen von Allegros digitaler
Soundausgabe anzupassen.
Probier' den FreeBE/AF Treiber (http://www.talula.demon.co.uk/freebe/),
oder den kommerziellen SciTech Display Doctor (http://www.scitechsoft.com).
Sollte es immer noch nicht funktionieren, sende eine Beschreibung des
Problems an die Allegro Mailing-Liste, zusammen mit einer Kopie der
Ausgabe der afinfo und vesainfo Programme.
Das VBE/AF Interface tut das sogar, für die Video-Treiber: siehe das
FreeBE/AF Projekt auf http://www.talula.demon.co.uk/freebe/.
Für mehr generelle Dinge wie Sound, VESA, und mode-X Routinen, wäre es
aber sehr kompliziert das umzusetzen, weil die Treiber von einer Reihe
von Helfer-Funktionen in der Haupt-Bibliothek abhängen. Das DJGPP
DXE-Format ist bei weitem nicht flexibel genug um das zu unterstützen,
und ich will Allegro nicht von anderen dynamischen Link Paketen abhängig
machen.
Tja, wie es aussieht, müssen Sie die Größe des Umgebungsspeichers erhöhen :-)
Am einfachsten geht das in den DOS-Box Einstellungen (Klicken Sie auf das
Systemmenu und wählen "Eigenschaften"), oder in der config.sys Datei
(z.B. "shell=c:\command.com /e:8192").
Sie müssen Ihrem Compiler sagen wie er die DirectX Include und Bibliothek
Dateien finden kann: nehmen Sie die DirectX SDK /include und /lib Verzeichnisse
in den Compiler/Linker Pfad auf. Alternativ, falls die Konfiguration
nicht veränderr werden soll, kann man auch die Dateien aus den DirectX SDK
/include und /lib Verzeichnissen in die entsprechenden Verzeichnisse des
Compilers kopieren.
Eine neuere Version des DirectX SDK wird benötigt, mindestens Version 5.
Sie ist auf der Microsoft Entwickler Seite erhältlich.
Setze END_OF_MAIN() an das Ende deiner main() Funktion. Allegro benutzt
dieses Makro, um die normale main() Funktion mit etwas Präprozessor-Magie
in eine WinMain() Funktion im Window-Stil umzuwandeln.
Versichern Sie sich, dass sie eine Windows GUI Applikation erstellen,
und nicht eine Konsole Applikation. Es gibt eine entsprechende
Einstellung in MSVC oder dem Borland C++ Builder. Beim Borland C++
Kommandozeilencompiler ist es das '-tW' Flag. Eine andere Möglichkeit
besteht darin, das Präprozessorsymbol ALLEGRO_USE_CONSOLE vor den
Allegro Includes zu definieren, falls wirklich eine Konsole für das
Programm benötigt wird.
Tja, wie es aussieht, müssen Sie die Größe des Umgebungsspeichers erhöhen :-)
Am einfachsten geht das in den DOS-Box Einstellungen (Klicken Sie auf das
Systemmenu und wählen "Eigenschaften"), oder in der config.sys Datei
(z.B. "shell=c:\command.com /e:8192").
Versichern Sie sich, dass sie kein Semikolon an Ihre MSVCDIR Variable
angrhängt haben, falls Sie MSVC verwenden, oder an Ihre MINGDIR
Variable, falls Sie Mingw32 verwenden, oder an Ihre BCC32DIR Variable,
falls Sie BCC verwenden.
Schalten Sie bitte "direct updating" für den DirectX Fenster-Treiber
aus, indem sie die entsprechende Konfigurationsvariable verwenden.
Die Sektion "Konfigurationsroutinen" in der Dokumentation enthält
Informationen über das Format, sowie die allegro.cfg Template-Datei.
Schalten Sie bitte "direct updating" für den DirectX Fenster-Treiber
aus, indem sie die entsprechende Konfigurationsvariable verwenden.
Die Sektion "Konfigurationsroutinen" in der Dokumentation enthält
Informationen über das Format, sowie die allegro.cfg Template-Datei.
Der Grabber muss mit dem Code in datedit.c gelinkt werden. Aber es sollte
gar nicht notwendig sein, sich darüber Gedanken zu machen: "make" sollte
das alles automatisch erstellen.
Eine neuere Version der GNU Binutils wird benötigt. Lesen Sie readme.txt
um herauszufinden, was die mindestens benötigte Version ist.
Nicht solange <x-beliebig> nicht in readme.txt als eine der
unterstützten Plattformen erwähnt wird. Sie können versuchen, Allegro zu
portieren, aber das ist meinst ziemlich viel Arbeit. Sollte
<x-beliebig> ein 16-Bit Compiler wie der alte Borland C sein, vergessen
Sie die Idee ganz einfach :-)
WIP steht für "work in progress" (in Arbeit), und bezieht sich auf
Veränderungen gegenüber der letzten offiziellen Version. WIP Versionen
der Bibliothek können von der Allegro Homepage bezogen werden
(http://alleg.sourceforge.net/), und sind für
gewöhnlich sehr stabil, aber nicht so lange getestet wie End-Versionen.
Um einen Patch anzuwenden, wird das patch Programm benötigt. Für DJGPP
sollte es vom selben Ort als die anderen Pakete erhältlich sein - es ist
ein Standard GNU-Tool. Falls das Programm nicht funktioniert, überprüfen Sie,
ob Sie den Patch über eine unmodifizierte Allegro-Kopie (mit der Version
von der der Patch upgraden soll) installieren.
Diese Datei ist für die WIP Versionen separat erhältlich. Sie ist hier:
http://alleg.sourceforge.net/wip.html. (alldata.zip)
Das ist ganz einfach die Weise in der die Video-Hardware funktioniert:
Es kann zu einem Zeitpunkt immer nur eine Palette aktiv sein. Entweder
wandle alle Bilder um, so dass sie die selbe Palette verwenden, oder
benutze einen Truecolor Graphikmodus.
Auf der Allegro.cc Homepage (http://www.allegro.cc/) sollten
entsprechende Tools zu finden sein, z.B. Fixpal oder Smacker.
Die VGA-Hardware benutzt nur 6 Bits pro Farb-Komponente, was bedeutet das
die Rot-, Grün- und Blauanteile in der Palette-Struktur nur Werte zwischen
0 und 63, und nicht zwischen 0 und 255 annehmen können. Das bedeutet das
2^18 = 262144 verschiedene Farben möglich sind, bzw. 64 Graustufen. Mit
der VESA-Funktion 0x40F8 ist es zwar möglich einen 8 Bit breiten DAC
einzustellen, aber Allegro unterstützt das nicht direkt, und ich bin mir
nicht sicher wie kompatibel das auf verschiedener Hardware laufen würde.
Im 256 Farben Modus benutzt die VGA-Hardware Index #0 für den Rand.
(In Truocolor-Modi schwarz). Der bunte Rand kann vermieden werden indem
man in der Palette Index #0 auf schwarz setzt.
Nur schwer :-) Es gibt keinen so einfachen Trick wie einfach die Palette
ändern, deshalb muss das Bild wiederholt neu gezeichnet werden. (heller
oder dunkler) Man könnte auch wiederholt halb transparente Rechtecke
über den Bildschirm zeichnen, oder draw_lit_sprite() verwenden, aber
eine Warnung: Diese Operationen sind sehr CPU intensiv und benötigen
einen schnellen PC.
fade_in() und fade_out() funktionieren nur in 8-Bit Palette Modi. Eine
Möglichkeit ein Bitmap einzublenden ist jeden einzelnen Bildpunkt in
einem Loop zu ändern. Eine alternative ist es transparente Rechtecke
über den Bildschirm zu zeichnen. Diese Methoden können aber ziemlich
langsam sein. Das Beispiel exxfade.c demonstriert wie man zwischen zwei
Bitmaps umblenden kann. Man kann es leicht modifizieren sodass es von/zu
einem schwarzen Bildschirm umblendet. Siehe auch die vorherige Frage.
Schau auf die Allegro-Homepage
(http://alleg.sourceforge.net/), dort sollten einige
Utilities zu finden sein, z.B. DTA und Smacker.
Starte dein Zeichenprogramm, und stelle in der RGB Farbauswahl Rot und
Blau auf das Maximum (normalerweise 255, aber das hängt von den
verwendeten Einheiten ab), und Grün auf das Minimum. Das Ergebnis sollte
ein spezieller Farbton "Magic Pink" sein, oder wie es manche nennen,
Magenta.
Denken Sie daran, dass die Vertex Positionen (in der Fixed Point Version) im
Fixed Point Format angegeben werden. Man kann sie mit dem itofix()
Makro konvertieren, oder die Koordinaten um 16 Bit nach links shiften.
Denke daran dass der Rotationswinkel im Fixed-Point-Format angegeben
wird, und man deshalb das itofix() Makro verwenden muss oder die
Koordinaten 16 Bits nach links shiften. z.B.
rotate_sprite(bmp, spr, x, y, itofix(32)) rotiert den Sprite um 45 Grad.
Sie versuchen vermutlich, die Dialog-Struktur mit einem Pointer auf ein
Bitmap zu initialisieren, richtig? Das geht nicht, weil der Dialog zur
Übersetzungszeit des Compilers erzeugt wird, das Bitmap aber erst zur
Laufzeit geladen wird und der Compiler deshalb noch nicht weiß, wo es sein
wird. Fügen Sie einen Null-Pointer in die Dialog-Struktur ein, und kopiere den
wirklichen Bitmap-Pointer als Teil des Programminitialisierungscodes in
das dp-Feld, nachdem das Bitmap in den Speicher geladen wurde.
Das hänge davon ab, was genau Sie tun wollen. Wenn die Bilder komplett
gefüllt sind, gibt es keinen Vorteil für RLE-Sprites, und es ist
wahrscheinlich schneller, ein reguläres Bitmap mit der blit()-Funktion
zu verwenden. Falls die Grafik viele transparente Bereiche enthält, ist
ein RLE-Sprite fast immer kleiner und schneller als draw_sprite().
Kompilierte Sprites sind normalerweise um einiges schneller als beide
anderen Methoden für maskierte Sprites, und geringfügig schneller für
deckende Graphiken, aber das ist sehr unterschiedlich. Sie sind am
nützlichsten für kleine Sprites, auf alten Maschinen, und im Mode-X.
Für SVGA-Modes auf einem Pentium kann es leicht sein, dass blit()
schneller ist (die Größe der kompilierten Sprites ist sehr schlecht
für die Cache-Performance).
Sie müssen sicherstellen, dass die Update-Rate der Game-Logik konstant ist.
Screen-Refreshes müssen dazu auf zu langsamen Computern übersprungen
werden, damit sie nicht zurückfallen. Das kann mit Hilfe eines Timers
implementiert werden, der eine globale Variable gemäß der Logik-Rate
erhöht. z.B.
volatile int speed_counter = 0;
void increment_speed_counter()
{
speed_counter++;
}
END_OF_FUNCTION(increment_speed_counter);
void play_the_game()
{
LOCK_VARIABLE(speed_counter);
LOCK_FUNCTION(increment_speed_counter);
install_int_ex(increment_speed_counter, BPS_TO_TIMER(60));
while (!game_over) {
while (speed_counter > 0) {
update_game_logic();
speed_counter--;
}
update_display();
}
}
Mit save_bitmap(). Lies die save_bitmap() Dokumentation, sie beschreibt
einen oft gemachten Fehler, und hat auch Beispielcode.
Rufe srand(time(NULL)) am Programmstart auf, und benutze dann
rand()%limit um eine Pseudo-Zufallszahl zwischen 0 und limit-1 zu
erhalten.
Das ist nicht notwendig. Der Linker sollte nur die benötigten Teile
der Bibliothek einbeziehen, wenn also z.B. keine, sagen wir,
Texture-Mapping oder FLIC Funktionen aufgerufen werden, werden sie auch
nicht in die ausführbare Datei aufgenommen. Das funktioniert nicht
perfekt, weil ein großer Teil von Allegro mit Listen von Funktionszeigern
arbeitet, wodurch ein Großteil der Grafik-Funktionen in die ausführbare
Datei mitaufgenommen wird - aber ich dabei versucht, das auf ein Minimum
zu begrenzen. Siehe allegro.txt für genauere Informationen wie man Teile
der Graphik- und Soundtreiber entfernen kann.
Nein. Diese Art von Hardware-Unterstützung wäre nützlich als Teil eines
3D-API, was Allegro nicht ist, und nie sein wird. Falls Sie sich in dieser
Richtung betätigen wollen, wäre meiner Meinung nach die MESA Bibliothek
(eine OpenGL-Implementation) ein guter Ausgangspunkt.
Es gibt bereits sehr gute Tools dafür, z.B. das JGMOD Paket. Siehe die
Links auf der Allegro Webseite
(http://alleg.sourceforge.net/).
Es ist untersagt vorzuschlagen eine dieser Bibliotheken in Allegro zu
integrieren, denn dieses Thema wurde bereits auf der Allegro
Mailing-Liste zu Tode diskutiert - und ich bin es leid.
Das wäre sehr viel Arbeit, und ich habe nicht die Zeit es selber zu
machen. Es gibt bereits einige Netzwerk-Pakete, die sich in Entwicklung
befinden oder im Internet erhältlich sind, und meiner Meinung nach ist
diese Art Code ohnehin besser als Addon Bibliothek geeignet.
Unisys hat ein Patent auf den LZW Kompressions-Algorithmus, der im GIF
Format verwendet wird. Ich möchte, dass alles in Allegro frei benutzbar
bleibt, ohne irgendwelche Einschränkungen, und das bedeutet dass kein
Code integriert werden kann der einer Lizenz oder Gebühren unterliegt.
Es ist nicht auszuschließen. Versuchen Sie, das kleinste Codefragment zu
isolieren, mit dem das Problem reproduziert werden kann, und ich werde es
mir anschauen. Wenn Sie mir ein 10 Zeilen Programm senden, repariere ich
es. 100 Zeilen, und ich kann es vielleicht. 1000 Zeilen, und ich habe
keine Chance :-)
Sicher. Lesen Sie die Giftware Lizenz in readme.txt. Mir ist es egal, was
Sie damit machen, und es gibt keine Probleme mit einem kommerziellen
Einsatz.
Wann immer es fertig ist! Eine kleine Ermunterung ist immer willkommen,
aber ich habe keine fixen Termine, und ich werde keine für dich machen :-)
Sobald es fertig ist, wird es herauskommen.
Der Grabber kann direkt aus GRX oder Bios .fnt-Dateien importieren, oder
man man kann sie mit einem beliebigen Zeichenprogramm in ein .pcx Bild
zeichnen. Auf http://www.talula.demon.co.uk/ttf2pcx/ gibt es ein
Utility, das Windows TrueType-Fonts in dieses .pcx Format konvertiert.
Auf die Allegro Homepage
(http://alleg.sourceforge.net/) sind einige Links. Man
kann Gravis Patches (.pat Format) benutzen, oder SoundFont 2.0 (.sf2)
Dateien, aber letztere müssen erst mit dem pat2dat Utility in eine
patches.dat Datei konvertiert werden.
Sie benötigen das makertf Utility
(ftp://ftp.coast.net/Coast/win3/winhelp/mkrtf104.zip),
und den Windows Help Compiler
(ftp://ftp.microsoft.com/Softlib/MSLFILES/HC505.EXE).
Erstellen Sie eine temporäres Verzeichnis, kopiere die allegro.txi Datei aus dem
allegro/docs Verzeichnis, und führe die folgenden Kommandos aus:
"makertf --no-warn allegro.txi -o allegro.rtf -J allegro.hpj" gefolgt von
"hcp allegro.hpj". Letzteres wird einige Fehlenmeldungen ausgeben, aber
sie können ganz einfach ignoriert werden.
Die allegro.rtf Datei kann von Microsoft Word gelesen und von dort
gedruckt werden, aber man sollte zuvor die Index-Felder mit einem
Rechts-Klick aktualisieren. Man kann auch ein TeX Paket installieren
und mit den tex und dvi Programmen allegro.txi in das Postscript Format
umwandeln.
Schauen Sie auf der Allegro-Homepage nach:
http://alleg.sourceforge.net/.
Wenn Sie noch irgendetwas wissen, was man hinzufügen könnte, senden Sie mir
bitte die URL!
Es vereinfacht die Wartung des Programms (Falls der Wert von PI je
geändert werden müsste). Es macht das Programm u.U. auch portierbarer.
Eine Reihe von Graphikkarten haben fehlerhafte oder unvollständige VESA
Implementierungen, und oft ist die vsync() Funktion nicht implementiert.
Für Beispiele wie man flimmerfreie Animationen darstellt lohnt sich ein
Blick auf das Demo-Spiel, das verschiedene Methoden verwendet.
Wenn der Code ohne Optimierunge läuft, dann könnte es ein Compiler-Fehler
sein. Sie könnten versuchen den Compiler zum Nachgeben zu zwingen, z.B:
while (!key[KEY_ENTER])
yield_timeslice();
In diesem speziellen Fall wäre as aber ohnehin besser readkey() zu
verwenden.
Überlege auch, deinen Compiler up- oder downzugraden.
Hier: http://alleg.sourceforge.net/maillist.html.