Free Pascal "fallabda" játék programozás?
Az a házim, hogy csináljak egy ilyen játékot. Jobb oldalon egy kis vonal, amit betűkkel irányítok fel-le és jön egy kis kör vissza kell ütni, az visszapattan megint elütni stb. Nem tudom mennyire érthető, olyasmi mint a Breakout nevű játék.
Ezt úgy kell megcsinálni, hogy a körnek (labdának) én adjam meg a kezdő koordinátáit, és a labda mindig más szögben pattanjon.
Addig megvan, hogy bekéretem a labda kezdő pozícióját, majd mikor elindul a grafikus üzemmód már kirajzolja a kört és a vonalat, de a kör nem mozog, a vonalat pedig nem tudom irányítani.
Abban kéne segítség, hogy a visszaütős részt hogy oldjam meg, a vonal irányítását, és hogy a labda mozogjon.
A vonal irányítást így próbáltam (a vonal a függőleges tengelyen (y) mozog;
repeat
case billentyu of
#102: y:=y+1;(az f betű ascii kódja, lenyomására felfelé menjen a vonal)
#108: y:=y-1; (az l betű ascii kódja, lenyomására lefelé menjen a vonal)
until #118; (v betű ascii kódja, kilépés)
A repeat ciklus nem tudom szükséges e, csak azért tettem oda ,mert így gondolatban addig csinálja míg a v-t megnyomom.
A vonal megjelenik, de az irányítás nem megy.
A kör mozgatására ötletem sincs. Annyit tudok hogy az x és y értékét kell növelni/csökkenteni eggyel amíg el nem éri a képernyő egy pontját, majd ha elérte akkor megint növelni/csökkenteni hogy az ellenkező irányba menjen stb amíg vége nincs a programnak. repeat ciklus kell, és 4 if utasítás, az biztos, de az értéknövelés/csökkenést nem tudom hogy kellene.
Bocsi a hosszú kérdésért, remélem érthető :D
Minden tanácsot örömmel fogadok :)
Egy karakteres felületre írt példa: [link]
Nem tökéletes, de az elvet láthatod, hogy merre indulj el.
Ahhoz, hogy valami mozogjon, mozgási vektorral kell rendelkeznie. Ha ez nincs, vagy a mozgási vektor X és Y koordinátája 0, akkor a labdád nem fog semerre sem menni.
Én így csinálnám:
(Megjegyzés: az ütőt jobb oldalra tettem, és a képernyő bal felső sarka a (0,0) pont)
LabdaX, LabdaY, LabdaSugár: integer
VektorX, VektorY: integer
ÜtőX, ÜtőTetejeY, ÜtőMéret: integer
főprogram:
.. grafika inicializálása
.. labda középpontjának bekérése
.. VektorX és VektorY értékének véletlenszerű meghatározása (-3 és +3 intervallum közt)
.. ÜtőX legyen a képernyő szélessége - 10 pixel
.. amíg a labda a képernyőn van:
.. .. ütő elmozdítása
.. .. labda elmozdítása
.. .. labda mozgási vektorának frissítése
.. .. labda és ütő kirajzolása
.. eredmény értesítése
.. kilépés
ütő elmozdítása:
.. ha a fel nyíl van nyomva, és az ÜtőTetejeY > 0:
.. .. ÜtőTetejeY csökkentése 1-gyel
.. különben ha a le nyíl van nyomva és az ÜtőTetejeY + ÜtőMéret < Képernyő magassága:
.. .. ÜtőTetejeY növelése 1-gyel
labda elmozdítása:
.. LabdaX növelése VektorX-szel
.. LabdaY növelése VektorY-nal
labda mozgási vektorának frissítése:
.. ha a LabdaY - LabdaSugár <= 0 vagy LabdaY + LabdaSugár >= Képernyő magassága:
.. .. VektorY felszorzása -1-gyel
.. ha a LabdaX - LabdaSugár <= 0 vagy (LabdaX + LabdaSugár >= ÜtőX és LabdaY >= ÜtőTetejeY és LabdaY <= ÜtőTetejeY + ÜtőMéret):
.. .. VektorX felszorzása -1-gyel
a labda a képernyőn van-e:
.. Akkor igaz, ha a LabdaX + LabdaSugár <= Képernyő szélessége
a labda és az ütő kirajzolása:
.. ez már a te dolgod
Lehet, hogy nem hibátlan, most fejből raktam össze.
„x és y értékét kell növelni/csökkenteni eggyel”
Legyen két változó, amelyiket mindig hozzáadsz a labda x és y értékeihez haladáskor. Amikor a labda falat ér, a megfelelő irányú növelőt fordítsd negatívba, valahogy így:
x:=x+xnövelő; y:=y+ynövelő;
if (x < xminimum) or ütő then xnövelő := -xnövelő;
if (yx < yminimum) or (y > ymaximum) then ynövelő := -ynövelő;
...tehát mondjuk a növelő érték mindkét koordinátánál 1 (jobbra fel), amíg nekimegy a felső falnak, onnantól minden lépésben x+1, y+(-1) lesz (jobbra le), ha ütőt ér, akkor x+(-1), y+(-1), tehát balra lefelé megy, stb. Így egy rutin intézheti a mozgatást, irányonként különbözők helyett.
Átírtam SimkoL programját Lazarusba, ha nincs Delphid:
(@SimkoL: Hm, közben látom ám, hogy ugyanazt az irányváltást használtad, amit némi spéttel én is ajánlgattam. Bocsesz.)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!