Autor Wątek: Scieżke uruchomionego programu  (Przeczytany 7484 razy)

Offline Kajtek

  • Użytkownik
    • Mimikra.pl - Najlepsza Agencja Interaktywna

# Wrzesień 04, 2007, 22:34:45
Kuba®'79™: Ale u mnie jest tak. Że kiedy pliki są w jednym katalogu z binarką on i tak szuka ich w /home/kajtek.
Program jest w /home/kajtek/projects/new/SDL/
W kodzie jest:
IMG_Load("button.png");
A on wypisuje:
Nie ma takiego plikuL /home/kajtek/button.png

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 04, 2007, 23:01:45
Właśnie dlatego mówię: spróbuj nie odpalać binarki bezpośrednio, ale przez skrypt, w Twoim wypadku wygladałby tak:
#!/bin/sh
cd /home/kajtek/projects/new/SDL
/home/kajtek/projects/new/SDL/program-binarka

Wydaje mi się, że jakkolwiek odpalisz taki skrypt (czy z terminala czy „przez kliknięcie”) powinno być ok (ale spróbuj).

Offline Kajtek

  • Użytkownik
    • Mimikra.pl - Najlepsza Agencja Interaktywna

# Wrzesień 04, 2007, 23:10:11
Dzięki wam wszystkim. Popróbuję tego wszystkiego. Ten skrypt też mi bardzo odpowiada. Zobaczę co mi bardziej będzie odpowiadać. Przy okazji przekonałeś mnie do przyjrzenia się dogłębnie bashowi.
Jeszcze raz wszystkim wielkie dzięki.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Wrzesień 05, 2007, 12:22:00
Dodam tylko, że pamiętanie danych w katalogach innych niż katalog EXE-ka ma oprócz formalnej poprawności także inne zalety, na przykład:

- Jeśli używamy katalogu domowego użytkownika, to każdy użytkownik w systemie będzie miał własne prywatne ustawienia i Save'y.

- Jeśli używamy katalogu bieżącego, to ktoś będzie mógł odpalić nasz program z katalogiem bieżącym innym niż ten w którym leży EXE i w ten sposób korzystać w programie z innego zestawu plików, np. robiąc jakiegoś moda :)

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 05, 2007, 13:00:00
- Jeśli używamy katalogu domowego użytkownika, to każdy użytkownik w systemie będzie miał własne prywatne ustawienia i Save'y.

Mówimy o takich „sztywnych” danych programu, jak na przykład obrazki..
A jeśli pojawi się konieczność zachowywania ustawień, skorzystamy ze zmiennej środowiska HOME, żeby mieć pełną ścieżkę z katalogiem domowym..

- Jeśli używamy katalogu bieżącego, to ktoś będzie mógł odpalić nasz program z katalogiem bieżącym innym niż ten w którym leży EXE i w ten sposób korzystać w programie z innego zestawu plików, np. robiąc jakiegoś moda :)
Jop, to jest problem...
Ale użycie katalogu /usr/local/share/program wpisanego (albo zupełnie łopatologicznie „na sztywno” albo sprytnym makefilem) w treść programu nas nie uratuje przed tym, że użytkownik sobie podmieni cała treść tego katalogu.. (Choć musi mieć wtedy prawa do tego konkretnego katalogu, a zmienić katalog bieżący na jakiś założony przez niego może zawsze..)

Offline Xion

  • Redaktor
    • xion.log

# Wrzesień 05, 2007, 14:57:40
Cytuj
Mówimy o takich „sztywnych” danych programu, jak na przykład obrazki..
W Windows można to rozwiązać przez mechanizm zasobów wkompilowywanych bezpośrednio do EXEka. Nie wiem czy w Linuxie jest coś podobnego, ale jako nowoczesny system operacyjny powinien chyba obsługiwać coś takiego ;P

Offline voytech

  • Użytkownik

# Wrzesień 05, 2007, 21:54:21
Właśnie dlatego mówię: spróbuj nie odpalać binarki bezpośrednio, ale przez skrypt, w Twoim wypadku wygladałby tak:
#!/bin/sh
cd /home/kajtek/projects/new/SDL
/home/kajtek/projects/new/SDL/program-binarka

Wydaje mi się, że jakkolwiek odpalisz taki skrypt (czy z terminala czy „przez kliknięcie”) powinno być ok (ale spróbuj).

Ja bym jeszcze dodał w skrypcie na początku pushd a na końcu popd:
#!/bin/sh
pushd .
cd /home/kajtek/projects/new/SDL
/home/kajtek/projects/new/SDL/program-binarka
popd

przed wejściem do katalogu z programem odkładamy na stosie bierzący katalog, przechodzimy do katalogu z programem, uruchamiamy go, a po wyjściu z programu wracamy do katalogu, w którym bylismy kiedy uruchamialiśmy nasz skrypt.

Można też zdefiniować jakąś zmienną systemową MOJ_PROGRAM_DATADIR w .bash_profile albo .bashrc (nie pamiętam gdzie dokładnie), która będzie przechowywała katalog z danymi programu. Wiele programów tak robi. Funkcja main ma trzeci parametr który jest wskaźnikiem chyba do tablicy napisów ze zmiennymi systemowymi.

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 05, 2007, 22:12:53
Ja bym jeszcze dodał w skrypcie na początku pushd a na końcu popd:
Też o tym pomyslałem, ale przetestowałem u siebie i skrypt nie zmieniał katalogu bieżacego w którym była powłoka (był pewnie wykonywany przez kopię powłoki). Choć pewnie jest to cecha bardzo osobnicza i u kogoś innego te dwie linijki będą bardzo pożądane...

Funkcja main ma trzeci parametr który jest wskaźnikiem chyba do tablicy napisów ze zmiennymi systemowymi.
Mieliśmy z założenia nie korzystać z parametrów main.. ;)
Ale na szczęście jest getenv.. :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Wrzesień 05, 2007, 22:50:22
Cytuj
- Jeśli używamy katalogu bieżącego, to ktoś będzie mógł odpalić nasz program z katalogiem bieżącym innym niż ten w którym leży EXE i w ten sposób korzystać w programie z innego zestawu plików, np. robiąc jakiegoś moda :)
Powiem szczerze, że to byłby bardzo dziwny sposób na robienie modów. Zazwyczaj załatwia się to przez command line, albo launcher przygotowany przez twórców gry albo samo community. :)

Cytuj
W Windows można to rozwiązać przez mechanizm zasobów wkompilowywanych bezpośrednio do EXEka.
File Oblivion.exe, size 4.7GB - nie wiem, czy to by przeszło, zwłaszcza że ładowanie zasobów jest nieco dziwne i w zasadzie nie wiadomo jak to jest właściwie realizowane, więc z wydajnością mogło by być ciężko. :)


Skoro już poruszyłem temat dużych gier, pytanie do znawców linuksowych - jak załatwilibyście ładowanie danych w locie z CD/DVD pod Linuksem. Nie muszę dodawać, że odpalenie gry powinno sprowadzić się do włożenia płyty jednego kliknięcia i w żadnym wypadku nie może to wymagać praw admina. :)

Cytuj
Nie wiem czy w Linuxie jest coś podobnego, ale jako nowoczesny system operacyjny powinien chyba obsługiwać coś takiego ;P
Tak samo jak rejestr i schowek systemowy (np. kopiujesz tekst w vim'ie, a wklejasz go w Emacsie, Anjucie, Eclipsie, czy NetBeansie). ;)

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 06, 2007, 09:32:07
Skoro już poruszyłem temat dużych gier, pytanie do znawców linuksowych - jak załatwilibyście ładowanie danych w locie z CD/DVD pod Linuksem. Nie muszę dodawać, że odpalenie gry powinno sprowadzić się do włożenia płyty jednego kliknięcia i w żadnym wypadku nie może to wymagać praw admina. :)

Wcale bym tego nie załatwił.... ;)

Zachowanie systemu wobec włożonej płytki jest dość osobnicze. U mnie np. samo nie dzieje się nic, muszę płytkę sam zamountować (“mount /mnt/cdrom”, ale nie muszę być do tego rootem). Ponadto nie mam żadnego graficznego menedżera plików, który pozwalałby „odpalić przez kliknięcie”, więc raczej wpisałbym całe “mount /mnt/cdrom ; cd /mnt/cdrom ; ./odpal-grę”.

Byłbym bardzo niezadowolony, gdyby gra oczekiwała ode mnie rycia w moim systemie i zmiany przyzwyczajeń...


Niektórzy są tak skonfigurowani, że gdy się wkłada płytke, mountuje się ona automatycznie i otwiera się okienko jakiegoś menedżera plików na katalogu głównym płytki. Jeżeli tam jest choćby link do odpalacza gry, a menadżer jest dostatecznie sprytny, to wystarczy dwukrotnie kliknąc na ten link..

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Wrzesień 06, 2007, 13:20:12
Niektórzy są tak skonfigurowani, że gdy się wkłada płytke, mountuje się ona automatycznie i otwiera się okienko jakiegoś menedżera plików na katalogu głównym płytki. Jeżeli tam jest choćby link do odpalacza gry, a menadżer jest dostatecznie sprytny, to wystarczy dwukrotnie kliknąc na ten link..
Chodzi mi o sytuację, w której główna część gry znajduje się na dysku, a reszta jest na DVD.

Z perspektywy zwykłego użytkownika powinno wyglądać to tak:
- wkłada płytkę i ewentualnie przechodzi do katalogu CD w managerze,
- klika "install", wyskakuje mu ładny instalator z minimum opcji do klikania (idealnie: tylko przyciski Install i Exit),
- po zakończeniu instalacji ma na pulpicie i/lub w menu gier link uruchamiający grę,
- po kliknięciu tego linka gra sprawdza, czy jest jej płyta w napędzie - jeżeli jest to się uruchamia, a jeżeli nie, to wyświetla ładne okienko "Włóż płytę z grą",

Jak pisałem wcześniej, część danych gry jest kopiowana na dysk w momencie instalacji (exeki, tekstury, modele, dźwięki), a część pozostaje na płytce (podkłady muzyczne, megatekstury, itp).

No i pytanie jest, jak coś takiego osiągnąć? Oczywiście mogą być z tym trudności, ale nie sądzę, żeby Linuks był tak dennie zaprojektowany, żeby się nie dało. :)

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 07, 2007, 12:31:47
Chodzi mi o sytuację, w której główna część gry znajduje się na dysku, a reszta jest na DVD.

Hmmm... Ja bym to robił tak:
  • Odpalony z płytki instalator (skrypt) sprawdza, jaką sam ma ścieżkę, „odejmuje” od tego znaną sobie swoją ścieżkę na płytce i ma ścieżkę do katalogu, w którym mountowana jest płytka (zwykle pewnie “/mnt/cdrom” albo “/media/cdrom” albo “/mnt/dvd” albo..., ale tą metodą można odkryć też bardziej egzotyczne konfiguracje; ten katalog zapisuje gdzieś razem z plikami instalowanymi; binarka gry też tam jest kopiowana, tworzony jest podobny do opisanych wyżej skrypt ją odpalający, który zapewnia jej właściwy katalog bieżący.
  • Sama binarka najpierw sprawdza, czy w katalogu bieżącym ma to, co potrzebuje. Jeśli nie, to wypluwa komunikat: „Sorry, ale nie odpalę się ręcznie, ale tylko utworzonym przez instalator skryptem.” i się poddaje. Po drugie sprawdza, czy w zapamiętanym katalogu mountowania płytki jest to, czego potrzebuje – jeżeli nie, może próbować wykonać np polecenie “/bin/mount TEN_KATALOG”, ewentualnie przeszukać /proc/mounts i /etc/fstab na obecność systemu plików płytki (iso) i próbować w tych katalogach, jeżeli się nie da, to wypluć komunikat: „Włóż i zamountuj płytkę (albo ostatecznie choć tylko włóż, sama spróbuję zamountować), albo podaj mi katalog, w której jest zamountowana.” (Niestety, ten komunikat łamie moją zasadę, że programowi nie wolno używać trybu rozkazującego w odniesieniu do ludzi ;), ale nie mam czasu go przeredagowywać) i powtarza opercję do skutku lub poddanie się Użytkownika (jeśli katalog jest inny, to warto go zapamiętać i próbowac potem od niego).
(Trzeba przyznać, że jest to dość upierdliwe, a pewnie gdyby starać się to zaimplementować, to upierdliwość wzrośnie kilkakrotnie, no ale tak to już jest z programami, które usiłują myśleć za Użytkownika...

Najprostrza metoda: binarka gry zawsze bierze dwa parametry: jeden to katalog z plikami zainstalowanymi na dysku, drugi to katalog z plikami na płytce (tak między Bogiem a prawdą wcale nie muszą fizycznie na płytce być, ktoś może cenić sobie szybkość (?) a nie cenić miejsca na dysku i całość sobie gdzieś skopiować). Użytkownik sam dba, żeby odpalać grę z prawidłowymi parametrami. Jeżeli się w nich kopnie, gra wypluwa błąd i tyle.)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Wrzesień 07, 2007, 17:25:47
Cytuj
(tak między Bogiem a prawdą wcale nie muszą fizycznie na płytce być, ktoś może cenić sobie szybkość (?) a nie cenić miejsca na dysku i całość sobie gdzieś skopiować)
Wydawca może wymagać, żeby gra sprawdzała, czy płyta jest faktycznie w napędzie - takie minimalne zabezpieczenie przed piractwem.

Cytuj
Użytkownik sam dba, żeby odpalać grę z prawidłowymi parametrami. Jeżeli się w nich kopnie, gra wypluwa błąd i tyle.)
Tylko że na początku mówiliśmy, że gra ma być przystosowana do "debilnych" użytkowników, a oni mają prawo nie wiedzieć w ogóle, co to konsola i command line, a tym bardziej uruchomić program z jakimikolwiek parametrami (załóżmy, że naszą grę piszemy w ramach akcji "Linuks w każdym domu"). :)

Offline ajuc

  • Użytkownik
    • strona domowa

# Grudzień 02, 2007, 22:27:47
Kiedyś zastanawiałem się nad innym rozwiązaniem - zamiast bawić się w pisanie instalatorów itp itd i dopasowywanie do każdej konfiguracji, zrobić liveCD (np na podstawie Slaxa). I będzie jak na konsolach - użytkownik wyłącza kompa, wkłada płytkę, włącza kompa - gierka chodzi :)

Ewentualne problemy - konfiguracj sieci, kiedy nie śmiga po dhcp. Ludzie pod windowsem zwykle mają zainstalowaną neostradę przez dziecko sąsiadów, jak gierka poprosi o wpisanie loginu i hasła, niektórzy użytkownicy mogą odpaść. Za to nie śmiecimy na dysku, jak coś się walnie użytkownik najwyżej traci save'y na dysku.

Offline wanderer

  • Użytkownik

# Grudzień 03, 2007, 10:58:32
Co do tytułowego wątku to w swoim projekcie mam aplikacje uruchamianą skryptem :

...
cd `dirname $0`
./gra.bin
...

Rozwiązuje to problem z podawaniem bezwzględnej ścieżki z konsoli.