Enterprise Forever

:HUN => Programozás => Topic started by: minmax on 2016.April.15. 23:59:22

Title: Flappy Bird
Post by: minmax on 2016.April.15. 23:59:22
Szóval, van ez a Flappy Bird játék (FLAPPYB.BAS basic programcsokorból), Endi és Szipucsu munkája. Először is, köszönet érte, szerintem nagyon jól sikerült, mostanában eléggé rákattantam, rengeteget játszottam vele. Kicsit át is írogattam, mert szerettem volna egy "maratoni" verziót, ami ráadásul kicsit határozottabban is nehezedik. Úgyhogy átírtam a 6 életre vonatkozó sort:
  610   IF FAIL=6 THEN
erre:
  610   IF FAIL>SUCC THEN
Így annyi próbálkozásunk van, amennyi pályát már sikeresen teljesítettünk. Így azért tovább lehet jutni, mint 6 élettel, de mégis van tétje a dolognak, szóval mérsékeltebb cheat. Főleg, hogy nehezítettem is a pályákon, a nyílások egyre szűkebbek lesznek, nem állandóak.

És itt jön a probléma, hogy valamiért lefagy a játék a 42. próbálkozás környékén, tehát néhány példával:

sikeres + sikertelen = összes próbálkozás
29+13=42
27+15=42
29+12=41
26+16=42
22+20=42
24+19=43
25+17=39
27+15=42
24+19=43

Általában mielőtt elkezdené kirajzolni az új pályát, tehát fekete képernyőnél (alul az eredményjelzővel), de néha játék közben is. Nézegettem, de nem tudtam rájönni, hogy miért lehet ez. Kipróbáltam azt is, hogy nem 0+0-ról kezdek, hanem 30+30-ról, és akkor is lefagyott kb. ugyanennyi játék után, szóval valami memória-gondra tippelek. Amúgy a poke-ok mit csinálnak a programban? Ha valaki tud megoldást, kérem ossza meg velem. :)

Ide csatolom a fájlt basicban meg txt-ben, hogy ne kelljen esetleg keresgélni:

[attachmini=1]
[attachmini=2]
Title: Re: Flappy Bird
Post by: szipucsu on 2016.April.16. 00:16:42
Nem néztem még bele, de ez akkor szokott lenni, ha GOTO-val kiugrunk valami FOR vagy egyéb ciklusból a cikluson kívülre. Lehet, hogy a hibát még én csempésztem bele a játékba, amikor módosítgattam, mert régebben nem foglalkoztam ezzel, amíg itt a többiek fel nem hívták rá a figyelmem. A Dot Collector Turbo Editionban is lett volna egy ilyen hiba, sok játék után az is lefagyott volna, ha nem mondják a fórumtársak, hogy az úgy nem jó.
Title: Re: Flappy Bird
Post by: szipucsu on 2016.April.16. 00:21:20
Na, belenéztem. Szerintem az 550-es sorban az a GOTO 200 okozza a hibát. Nem FOR ciklus, de a HANDLER közepéből teljesen máshova ugrik.
A POKE-ok gyorsítás miatt vannak. A pálya kirajzolása előtt kikapcsolja a megszakításokra várakozást, így gyorsabban kirajzolja. Ilyenkor hiába nyomkodjuk a billentyűzetet, nem csinál semmit, és a hangok sem szólnak. A kirajzolás végén visszakapcsolja, hogy tudjunk játszani.
Title: Re: Flappy Bird
Post by: minmax on 2016.April.16. 00:36:22
Aha, és a GOTO-k azért kellenek, mert HANDLER-ből nem lehet függvényt hívni CALL-al? Mondjuk azt sem igazán értem, hogy miért van hibakezelővel megoldva, miért nem sima DEF HIBA és CALL HIBA?
Title: Re: Flappy Bird
Post by: minmax on 2016.April.16. 00:40:32
Amúgy ez a POKE-os megszakításkikapcsolás minden programnál más? Egy másik programban gondolom nem feltétlenül ugyanoda az 56-ra kell írni a 201-et meg 245-öt. Vagy még a beírt érték sem ugyanaz?
Title: Re: Flappy Bird
Post by: szipucsu on 2016.April.16. 00:44:14
Nem tudom, handlerből lehet-e függvényt hívni, de tényleg nagyon ronda és felesleges az a handler. Valószínű, nagyon megörültem, hogy milyen frappánsan meg lehet oldani az *** Invalid beam position kiküszöbölését. Az egész játék alatt figyelnie kéne, hogy mikor ér bal oldalon a pálya végére, és ez lassítaná, talán ezért találtam ki a handlerezést.

Szerintem minden programban az 56-ra kell írni az értékeket a POKE-kal. Legalábbis én már sok programnál így csináltam.
Title: Re: Flappy Bird
Post by: szipucsu on 2016.April.16. 00:46:26
Nem lehetne a Flappy bird előzményeit innen kezdődően (https://enterpriseforever.com/jatekok/szenzacios-bejelentes/msg39102/#msg39102) áthelyezni ennek a topiknak az elejére?
Title: Re: Flappy Bird
Post by: Povi on 2016.April.29. 19:44:28
Amúgy ez a POKE-os megszakításkikapcsolás minden programnál más? Egy másik programban gondolom nem feltétlenül ugyanoda az 56-ra kell írni a 201-et meg 245-öt. Vagy még a beírt érték sem ugyanaz?
De, mindenhol használható, ugyanazt kell irni mindig.

A POKE 56, 201 az a 0x38 cimre (ide ugrik a vezérlés minden megszakitáskor, vagyis másodpercenként 50-szer) ir egy RET utasitást (a 201, vagy szebben: 0xc9 a RET gépi kódja), azaz rögtön vissza is térünk a megszakitási rutinból. Ezért lesz gyorsabb a program, mert nem fut le a megszakitási rutin (ezért nincs pl. bill. olvasás, mert azt is az csinálná).

A POKE 56, 245-tel pedig visszaállitjuk a megszakitási rutin elején lévő utasitást az eredetire (egy PUSH AF van ott eredetileg, annak kódja a 245 (vagy 0xf5).