![]() | biblioteka do programowania gier | Języki: English español Deutsch français 한국어 (Hangul) Italiano |
|
Allegro FAQ Jeżeli nie ma tu odpowiedzi, zapytaj a zostanie dodana...
Zawartość
Trywialne problemy
Zobacz readme.txt.
Z dowolnego mirrora SimTel, w katalogu gnu/djgpp/v2tk/, lub z Allegro homepage, http://www.talula.demon.co.uk/allegro/.
Zobacz allegro.txt.
Problemy z DJGPP
Make jest częścią standardowej dystrybucji djgpp, w pliku v2gnu/mak*b.zip (zależy jaka wersja). Można to ściągnąć z http://www.delorie.com/djgpp/.
Czy jesteś pewien, że zainstalowałeś djgpp poprawnie? Sprawdź instrukcje w pliku readme.1st, a w szczególności czy ustawiłeś zmienną środowiskową DJGPP i dodałeś djgpp\bin do zmiennej path.
Czy jesteś pewien, że używasz programu make GNU, a nie jakiejś innej wersji jak to z Borlanda? Jeżeli masz wątpliwości uruchom "make -v" i sprawdź czy są wyświetlane prawa autorskie GNU.
Nie powinieneś uruchamiać make z eksploratora Win95! Otwórz okienko DOS'a, wejdź do katalogu Allegro i wpisz "make" w wierszu poleceń.
Sprawdź czy data i czas są ustawione poprawnie.
Jak sugeruje komunikat, musisz zapewnić więcej pamięci dla kompilatora. Program go32-v2 powie ile jest aktualnie dostępne. Jeżeli pracujesz pod DOS'em spróbuj zwolnić trochę dysku na plik wymiany. Pod Win95 zwiększ limit sesji DPMI we właściwościach sesji DOS do 65535 (Trzeba wpisać ręcznie bo na liście jest tylko do 16384).
Zdaje się że to problem z zastępczym linkerem z pakietu RSXNTDJ. Albo wróć do standardowego linkera z djgpp, albo usuń parametr "-s" z makefile'a Allegro. Jeżeli ktoś wie czemu to nie działa i jak to naprawić niech da znać!
C:\TEMP\ccdaaaaa(.text+0x9):x.c: undefined reference to `allegro_init' C:\TEMP\ccdaaaaa(.text+0xe):x.c: undefined reference to `install_keyboard' Nie czytałeś dokumentacji, prawda? :-) Musisz zlinkować program z plikiem biblioteki liballeg.a. Po pierwsze, sprawdź czy wszystko jest dobrze zainstalowane (wystarczy uruchomić make). Po drugie, jeżeli kompilujesz z wiersza poleceń lub przez makefile'a dodaj parametr "-lalleg" na koniec wiersza z komendą gcc. Jeżeli używasz Rhide'a wejdź do menu Options/Libraries wpisz 'alleg' w pierwsze wolne pole i zaznacz pole wyboru obok.
Niestety nie. Po pierwsze liballeg.a to około 450k, a pewnie chcesz jeszcze narzędzia jak grabber, sound setup, itp. A programy przykładowe? Jeżeli zamieszczę skompilowane wersje wszystkiego dystrybucja zajmie 7 mega: za duża, aby była praktyczna! Ponadto nie ma przyczyny, przez którą nie mógłbyś skompilować tego samemu. Kompilacja to proces deterministyczny, zawsze generuje ten sam rezultat. Jeżeli to nie działa, to albo masz złe pliki wejściowe (np. twoja kopia Allegro jest uszkodzona), albo wiersz poleceń jest zły (sprawdzenie co jest nie tak nie jest trudne, trzeba tylko napisać "make"...) lub kompilator jest uszkodzony, np. nie zainstalowałeś poprawnie djgpp. Musisz znaleźć i rozwiązać problem, a nie zamieść po dywan przez zmuszenie kogoś do skompilowania Allegro dla ciebie...
Narzędzia GNU wyświetlają komunikaty zbyt szybko do strumienia stderr. Niestety command.com jest zbyt głupi, aby to przekierować, ale na szczęście DJ był na tyle mądry, aby to obejść, wystarczy użyć programu redir np. "redir -eo make > logfile.txt".
Problemy DOS'owe
Rezultaty mogą być różne. Niektórzy mieli problemy podczas, gdy u innych działa świetnie. Nie mam dostępu do NT, więc sam nic nie mogę zrobić i tak naprawdę nie przejmuje się tym. Używaj wersji Allegro dla Windows jeżeli chcesz robić programy dla Windows. Jeżeli chcesz uruchamiać DOS'owe programy używaj DOS'a!
Tak, ale ze sprzeciwami. Jeżeli używasz wersji EMM386 z OpenDOS, musisz wyłączyć implementacje DPMI (DPMI=OFF w linii EMM386.EXE w config.sys). Powinieneś również ustawić flagę PIC=OFF, ale tak jest domyślnie więc nie powinno być z tym problemy, chyba że to włączyłeś.
Mam 2 megabajty na karcie. Nie możesz. Limit jest wymuszony przez VGA, a nie przez Allegro. Aby mieć dostęp powyżej 256k pamięci video użyj trybu SVGA co oznacza, albo wyższe rozdzielczości, albo uzyskanie kopii SciTech Display Doctor, który zapewnia wiele niskich rozdzielczości w trybach SVGA.
U niektórych działa, a u innych nie. Problem w tym, że Creative Labs odmawia opublikowania specyfikacji więc nie wiemy jak napisać sterownik. Narzekaj do nich, albo kup kartę od jakiegoś rozsądnego producenta.
Może dlatego, że ustawiłeś głośność na bardzo niską: spróbuj zmienić ją w programie setup. Ponadto Allegro miksuje wiele dźwięków do jednego bufora wyjściowego, w przeciwieństwie do odtwarzacza dźwięków Windows, który odtwarza jedną próbkę na raz, więc indywidualny dźwięk może uzyskać tylko mały procent głośności całego wyjścia. Jest to cena za wiele kanałów wyjściowych. Jeśli ci to nie odpowiada użyj programu setup, aby zmniejszyć liczbę kanałów: to może być dowolna potęga 2 mniejsza, lub równa 64. Im mniej ustawisz, tym będzie głośniej.
match any known 386 instruction'. Musisz uaktualnić binutils. W czasie pisania tego tekstu ostatnią wersją jest 2.10, można ją ściągnąć z: ftp://ftp.demon.co.uk/pub/mirrors/simtelnet/gnu/djgpp/v2gnu/ . Poszukaj najnowszej wersji bnu*b.zip (bnu210b.zip, w czasie pisania).
Spróbuj użyć sterownika FreeBE/AF (http://www.talula.demon.co.uk/freebe/), albo komercyjnego SciTech Display Doctor (http://www.scitechsoft.com). Jeżeli wciąż nie będzie działać, wyślij opis problemu na listę dyskusyjną mailingt, z kopią wyjścia z programów afinfo i vesainfo.
Interfejs VBE/AF już wspiera to dla sterowników graficznych: Zobacz projekt FreeBE/AF http://www.talula.demon.co.uk/freebe/. Dla bardziej generalnych rzeczy jak dźwięk, VESA, tryby X byłoby to bardzo trudne do zrobienia ponieważ sterowniki zależą w dużej mierze od funkcji pomocniczych rdzenia biblioteki. Format djgpp DXE nie jest wystarczająco elastyczny, aby to wspierać, a ja nie chcę uczynić Allegro od jakiś innych pakietów do linkowania.
Problemy Windows'owe
Musisz powiedzieć kompilatorowi gdzie szukać plików nagłówkowych i bibliotek DirectX: umieść katalogi DirectX SDK /include i /lib w ścieżkach kompilatora/linkera. Alternatywnie, jeżeli nie chcesz modyfikować konfiguracji, po prostu skopiuj pliki z katalogów DirectX SDK /include i /lib do odpowiadających im w kompilatorze.
Musisz umieścić END_OF_MAIN() zaraz za funkcją main(). Allegro używa tego, aby preprocesor przekształcił normalną funkcję main() w Windows'ową WinMain().
Trzeba zwiększyć rozmiar środowiska :-) Można tego dokonać zmieniając ustawienia okienka DOS (kliknij menu system i wybierz "właściwości"), lub twój config.sys (np. "shell=c:\command.com /e:8192").
Problemy z Unix'owe
Musisz umieścić END_OF_MAIN() zaraz za funkcją main(). Allegro używa tego, aby preprocesor wypełnił parametry argv[] (potrzebne do paru wewnętrznych rzeczy).
Musisz przekierować strumień stderr do pliku i obejrzeć go później. Metoda zależy od powłoki: Jeżeli używasz Bourne-podobnego shell'a jak bash, spróbuj "make 2> logfile.txt".
Ogólne problemy
Grabber musi być połączony z kom z dataedit.c. Nie musisz się tym martwić: napisz "make" i wszystko zostanie zrobione za ciebie.
Nie jeżeli twój kompilator nie jest wspomniany w readme.txt. Możesz przenieść Allegro na niego, ale to zazwyczaj dużo pracy. Jeżeli kompilator jest 16 bitowym kompilatorem pracującym w DOS'ie jak Borland C możesz śmiało zapomnieć o tym pomyśle :-)
WIP oznacza "work in progress" i odnosi się do zmian, które są nowsze, niż ostatnia oficjalna wersja. Wersja WIP biblioteki może by uzyskana jako patch ze strony Allegro (http://www.talula.demon.co.uk/allegro/) i jest na ogół całkiem stabilna, ale oczywiście nie tak dobrze przetestowana, jak finalna wersja.
Masz patch.exe? Jeżeli nie to ściągnij go z tego samego miejsca, z którego ściągnąłeś resztę djgpp: to narzędzie to część standardowej dystrybucji kompilatora. Jeżeli masz patch.exe, ale nie działa poprawnie upewnij się, że instalujesz patch na nie zmodyfikowanej wersji Allegro, która masz uaktualnić (najczęściej to znaczy najnowszej oficjalnej, od której WIP był zrobiony. Sprawdź plik tekstowy z WIP, aby być pewnym).
Kiedy wyświetlam drugi paleta pierwszego się miesza. W ten właśnie sposób działa karta graficzna: można ustawić tylko jedną paletę w danej chwili. Albo skonwertuj twoje obrazki do jednej palety, albo użyj trybu truecolor.
Zobacz Allegro homepage (http://www.talula.demon.co.uk/allegro/) po narzędzia, jak FixPal i Smacker.
szarości? Karta VGA używa tylko 6 bitów na każdą składową koloru, to znaczy czerwonego, zielonego i niebieskiego, w palecie od 0 do 63, a nie do 255. To daje ci potencjalnie 2^18 - 252144 różnych kolorów, lub 64 odcienie szarego. Jeżeli potrzebujesz więcej użyj funkcji VESA 0x4F08, aby wybrać 8 bitową szerokość DAC. Allegro nie wspiera tego bezpośrednio i nie wiem jak będzie się to zachowywać na różnym sprzęcie.
Kiedy jesteś w trybie 256 kolorowym, karta VGA wyświetla kolor #0 wokół obszaru wyświetlania (w trybach truecolor wyświetla czarny). Twój śmieszny kolor można usunąć przez ustawienie koloru #0 na czarny.
Z dużą trudnością :-) To nie jest tak łatwa sztuczka, jak ze zmianą palety, więc musisz ciągle przerysowywać obrazek w jaśniejszej, lub ciemniejszej formie. Możesz narysować czarne, przezroczyste prostokąty na ekranie i sciemnić je uzywając draw_lit_sprite() aby ściemnić to na ekranie. Ostrzegam, że te operacje wymagają szybkiego PC!
się nie dzieje. Co robię źle? fade_in() i fade_out() pracuję tylko w trybie z 8-bitową paleta. Jedną z metod jest ściemnianie bitmap w pętli po wszystkich pikselach. Alternatywą jest rysowanie przezroczystych czarnych prostokątów na ekranie. Chociaż, te metody mogą być wolne. Przykład exxfade.c demonstruje jak ściemnić dwie bitmapy. Możesz to zmodyfikować aby wygasić/rozjaśnić ekran. Przeczytaj też poprzednie pytanie.
Zobacz na Allegro homepage (http://www.talula.demon.co.uk/allegro/) po narzędzia, jak DTA i Smacker.
Co dokumentacja uważa za "jaskrawy różowy"... W swoim ulubionym programie graficznym, ustaw suwaki od czerwonego i niebieskiego koloru jak tylko się da najdalej (zwykle na 255, ale to zależy od jednostek jakie stosuje program), a zielony na zero. Rezultatem jest specjalny odcień magicznego różowego, lub jak niektórzy wolą, magnety.
Pamiętaj że pozycje wierzchołków są zapisywane w formacie fixed, więc musisz użyć makra itofix() lub użyć przesunięcia bitowego na swoich współrzędnych.
Pamiętaj że kąt obrotu jest przechowywany w formacie fixed, więc musisz użyć makra itofix() lub użyć przesunięcia bitowego w lewo na współrzędnych. Np., rotate_sprite(bmp, spr, x, y, itofix(32)) obróci obrazek o 45 stopni.
Zapewne próbujesz zainicjować strukturę dialog ze wskaźnika do bitmapy, prawda? To nie zadziała, ponieważ dialog jest tworzony w momencie kompilowania, a bitmapa jest ładowana tylko podczas uruchamiania, więc kompilator nie wie jeszcze gdzie będzie ulokowana. Musisz wypełnić strukturę dialog wskaźnikiem NULL, wtedy skopiować prawdziwy wskaźnik do pola dp jako część kodu inicjującego twojego programu, po załadowaniu bitmapy do pamięci.
Zależy co chcesz zrobić. Jeżeli obrazki są całkowicie wypełnione, nie ma sensu używać spritów RLE, bo nie będzie to szybsze niż zwykły blit(). Jeżeli grafika zawiera obszary przezroczyste spite RLE prawie zawsze będzie mniejszy i szybszy niż funkcja draw_sprite(). Skompilowane sprity są generalnie szybsze niż inne typy dla przezroczystych obrazków, i odrobinę szybsze dla całkowicie wypełnionych grafik, ale to może być zmienne. Najlepsze są z małymi obrazkami na starszych maszynach i w trybach X, a mogą być wolniejsze od blit() w trybach SVGA na pentium (duży rozmiar skompilowanego sprita jest zły dla wydajności cache).
Musisz być pewien, że logika gry jest aktualizowana ze stałą częstotliwością, a odświeżanie ekranu pomijane gdy komputer jest zbyt wolny na to. Można to zrobić przez zainstalowanie przerwania zegarowego, które będzie inkrementować zmienną globalną z szybkością logiki gry, np: 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(); } }
Dodaj funkcję save_bitmap() gdzieś w programie. Zobacz dokumentacje do save_bitmap(), aby zobaczyć jakie kryją się tam pułapki oraz przykładowe źródła.
Wywołaj srand(time(NULL)) na początku programu, następnie użyj rand()%limit aby otrzymać liczbę pseudolosową z zakresu 0..limit-1.
Nie potrzebuję żadnych funkcji dźwiękowych, matematycznych, GUI... Nie ma takiej potrzeby. Linker dodaje tylko te części biblioteki, które są aktualnie używane, jeżeli nie używasz, powiedzmy, teksturowania i obsługi FLIC'ów, zostaną usunięte z pliku wykonywalnego. Nie działa to doskonale ponieważ większość kodu Allegro używa tablic ze wskaźnikami do funkcji, co powoduje włączenie niepotrzebnych rzeczy, więc większość funkcji graficznych będzie w twoim programie, ale próbował to ograniczyć do minimum. Zajrzyj do allegro.txt, po więcej informacji na temat usuwania sterowników grafiki i dźwięku.
Nie. Uważam, że ten rodzaj wspomagania sprzętowego będzie bardziej użyteczny jako część właściwego API 3D, którym Allegro nie jest i nigdy nie będzie. Jeżeli chcesz nad tym pracować to biblioteka MESA (bezpłatna implementacja OpenGL) jest IMHO dobrym początkiem.
Wiele dobrych już istnieje, np. pakiet JGMOD. Zobacz linki Allegro (http://www.talula.demon.co.uk/allegro/). Nie sugeruj, aby włączyć to do Allegro, bo ten temat był powtarzany na liście dyskusyjnej do znudzenia i jestem już nim zmęczony.
To byłoby dużo pracy, a ja nie mam czasu. Jest wiele pakietów w sieci, więc według mnie taki kod będzie bardziej użyteczny jako osobna biblioteka, niż jako część Allegro.
Unisys ma patent na algorytm LZW, który jest używany do kompresji formatu GIF. Chciałem, aby Allegro mogło być używane w pełni nieodpłatnie, bez żadnych restrykcji więc nie mogę dołączyć kodu będącego obiektem licencjonowania lub opłat.
Być może. Spróbuj wyizolować najmniejszy fragment kodu, który może odtworzyć problem, a ja go obejrzę. Jeżeli wyślesz mi 10 linii, naprawie to. 100 linii, prawdopodobnie naprawię to. 1000 linii, nie ma szans :-)
Pewnie. Zobacz warunki giftware w readme.txt. Nie obchodzi mnie co z tym zrobisz, nie ma problemów z komercyjnym użyciem.
Jak zostanie zrobione! Drobna zachęta jest zawsze mile widziana, ale nie obowiązuje mnie żadne terminy i nie zamierzam ich ustalać specjalnie dla ciebie :-) Jak zostanie ukończone, będzie opublikowane.
Grabber potrafi importować bezpośrednio z plików w formacie GRX, BIOS'owym .fnt, lub możesz narysować je w pliku .pcx. Zobacz http://www.talula.demon.co.uk/ttf2pcx/ aby uzyskać narzędzie do konwertowania fontów TrueType do plików .pcx.
Zobacz Allegro homepage (http://www.talula.demon.co.uk/allegro/), są tam linki. Możesz użyć patchy Gravis (format .pat), lub plików SoundFont 2.0 (.sf2), ale później trzeba skonwertować do patches.dat narzędziem pat2dat.
Musisz ściągnąć narzędzie makertf (ftp://ftp.coast.net/Coast/win3/winhelp/mkrtf104.zip), i Windows Help compiler (ftp://ftp.microsoft.com/Softlib/MSLFILES/HC505.EXE). Utwórz katalog tymczasowy, skopiuj allegro.txi z allegro/docs, i uruchom komende "makertf --no-warn allegro.txi -o allegro.rtf -J allegro.hpj", a następnie "hcp allegro.hpj". Druga komenda daje mnóstwo ostrzeżeń, które spokojnie można zignorować.
Plik allegro.rtf może być czytany bezpośrednio w Microsoft Word i drukowany stamtąd, ale powinieneś kliknąć prawym klawiszem i uaktualnić tabele zawartości i pola indeksowe, aby wypełnić je poprawnymi danymi. Alternatywą jest zainstalowanie pakietu TeX i użycie tex'a i dvips'a do skonwertowania allegro.txi do formatu Postscript.
Sprawdź Allegro homepage, http://www.talula.demon.co.uk/allegro/. Jeżeli mam coś co można dodać, wyślij mi adres!
niż używanie wartości 3.141592 w moim kodzie? To ułatwia utrzymanie programu, gdyby wartość PI trzeba było zmienić. To ułatwi również przenoszenie programu na innych kompilatory, które używają różnych wartości PI.
Wiele kart graficznych ma błędną lub niepełną implementacje VESA. Często funkcja vsync() w ogóle nie jest zaimplementowana. Np. w rysowaniu bez mrugania, popatrz na źródła gry demo, która używa różnych metod rysowania.
|