Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Tutorial :: Pravljenje igara u Pascal-u... moze?

[es] :: Pascal / Delphi / Kylix :: Tutorial :: Pravljenje igara u Pascal-u... moze?
(TOP topic, by X Files)
Strane: 1 2 3

[ Pregleda: 5304 | Odgovora: 53 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1401
82.208.201.*

ICQ: 246436949


Profil

icon Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 20:10

Ovih dana imam dosta slobodnog vremena, a nadam se da ce tako i ostati pa bih mogao da napisem neki tutorial o pravljenju multiplatform igara u Pascal-u (Free Pascal Compiler + Lazarus). Poenta bi bila da napisem prvo tekst i potom postavim kod, ali nekompletan... cim ga neko zavrsi, postavim svoje resenje (mozda se na kraju ispostavi da je moje resenje pogresno ) i idemo dalje. Interesuje me samo da li ima ljudi koje bi to interesovalo da ne pisem bezveze?

Isli bi od pocetka (tekstualni prikaz i osnovni tipovi podataka) pa do OOP igara koje koriste razne API-je za kreiranje prozora, crtanje, pustanje zvuka, fiziku...


DirectX na srpskom | GLScene na srpskom

There are only 10 types of people in this world; those who understand binary and those who don't.
13.05.2007. u 20:10 

Nemanja_666
Nemanja Tatic
Gradiska

Član broj: 116292
Poruke: 120
217.23.204.*



Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 22:19
Bilo bi dobro da uradimo igru cisto u free pascal-u nekoristeci nikih biblioteka iz lazarus-a.
13.05.2007. u 22:19 

PeroGenijalac
Križevci, Hrvatska

Član broj: 136690
Poruke: 8
*.cmu.carnet.hr.

ICQ: 459843816


Profil

icon Re: Tutorial :: Pravljenje igara u Pascal-u... moze?13.05.2007. u 22:44
evo jedna igra koju je jedan moj prijatelj (drug kako god) napisao drugom prijatelju jer mu je to trebalo za školu, i sad je ovaj upao u živo blato, njemu profesor kaže da će ići na natjecanje, a nema zapravo pojma.... Inače u igri se radi o tome da treba u posudu hvatati slova koja padaju:

Code:


(*
========================
Napravio Matija *****
travanj 2007
========================
*)
PROGRAM Igra;                                                                  {Naslov Programa}
USES Crt,Dos,Graph;                                                            {Potrebno za neke funckcije kao KeyPressed,ReadKey,GotoXY...}
TYPE postavke=RECORD                                                           {Zapis,sadrži postavke slova}
posx,posy,slova : integer;                                                     {X,Y pozicija slova i sam broj koji preko chr naredbe pretvaramo u slovo}
END;                                                                           {Kraj zapisa}
slovo=ARRAY[1..40] OF postavke;                                                {Niz slova}
postavke2 = RECORD                                                             {Zapis,sadrži postavke za highscore}
ime :STRING;                                                                   {ime}
bodovi:integer;                                                                {bodovi}
END;                                                                           {kraj zapisa}
scores=ARRAY[1..40] of postavke2;                                              {niz zapisa imena i rezultata}
var KrajIgre,kraj,Pauza : boolean;                                             {Dali je igra gotova,kraj repeat petlje u Kraj_Igre procedure, i provjera pauze}
Key : LONGINT;                                                                 {Služi za provjeru koja je tipka pritisnuta}

(*varijable i,j služe za popunjavanje podataka kroz for petlju,padslova služi za spremanje koliko je slova palo zaredom,
maxslova koliko slova pada,TimeCount služi za određivanje brzine padanja umjesto Delay Funkcije,zivot služi za spremanje broja života,
bodovi za spremanje broja bodova,MaxRez-potreban broj bodova za novi "nivo",DelayTime zajedno sa TimeCount služi za ubrzavanje ili usporavnja slova
iako to nije prava vremenska funkcija već više ovisi o brzini procesora*)
i,j,padslova,maxslova,TimeCount,zivot,bodovi,MaxRez,DelayTime :integer;
kosaricax,kosaricay : byte;                                                    {GotoXY Traži Byte tip, iako radi i sa običnim integer tipom,sadrži x i y poziciju košarice}
s: slovo;                                                                      {Spremanje postavki slova}
sc :scores;                                                                    {Spremanje imena i bodova iz datoteke i u datoteku}
izbor: char;                                                                   {Spremanje Početnog Izbora}
data:text;                                                                     {Tex Tip}
ime: string;                                                                   {Ovdje Spremamo ime}
(*
==============================================================
Procedura koja resetira poziciju slova i samo slovo          |
==============================================================
*)
PROCEDURE gReset;                                                              {Naziv procedure}
BEGIN                                                                          {Početak procedure}
             s[i].slova:=65;                                                   {Po ASCII Kodu slovo A je na 65->trebamo obična slova}
             s[i].slova:=s[i].slova+random(25);                                {Do 90 su velika slova(65+25=90), dodajmo nasumičan broj da dobijemo nasumično slovo}
             s[i].posx:=random(75)+1;                                          {Sirina do 76(75+1) +1 zato da uvijek bude veće od 1}
             s[i].posy:=0;                                                     {Pozicija 0}
             s[i].posy:=s[i].posy-(5*i);                                       {Da slova ne bi bila u istom redu}
END;                                                                           {Kraj procedure}
(*
===============================================================
Procedura koja se poziva na kraju igre, sprema svaki          |
rezultat koji igrač napravi  u  datoteku i omogućuje          |
ponovno igranje ili izlaz iz igre        |                    |
===============================================================
*)
PROCEDURE Kraj_Igre;                                                           {Naziv procedure}
BEGIN                                                                          {Početak procedure}
    IF bodovi<0 THEN bodovi:=0;                                                {U slučaju da su nam bodovi ispod 0}
    assign(data,'Scores.txt');                                                 {Zadano ime datoteke}
    {$I- iskljuci I/O provjeru}
    append(data);                                                              {Dodaj rezultat na kraj}
    IF IOresult<>0 THEN rewrite(data);                                         {Ako datoteka ne postoji, napravi novu, IOresult vraća 0 ako je sve prošlo u redu}
    close(data);                                                               {Zatvori datoteku}
    {$I+ ukljuci I/O provjeru}
    append(data);                                                              {Dodavanje teksta na kraj datoteke}
    writeln(data,ime);                                                         {Piše ime u datoteku}
    writeln(data,bodovi);                                                      {Piše bodove u datoteku}
    close(data);                                                               {Zatvara datoteku}
    clrscr;                                                                    {Čisti ekran}
    kraj:=false;                                                               {Da nebi došlo do beskonačne petlje}
    REPEAT                                                                     {Repeat petlja}
         gotoxy(30,10);                                                        {Oko sredine ekrana}
         writeln('KRAJ IGRE');                                                 {Ispiši poruku}
         gotoxy(10,11);                                                        {Oko sredine}
         writeln('Pritisnite P ako zelite igrati ponovo ili Q za izlaz: ');    {Ispiši poruku}
         IF KeyPressed THEN                                                    {Ako je tipka pritisnuta, procesuiraj}
           BEGIN                                                               {Početak if naredbe}
             Key:=ORD(READKEY);
             IF Key=0 THEN Key:=ORD(READKEY) SHL 8;                            {Funkcijska tipka}
             CASE Key OF                                                       {Ako želimo igrati ponovo resetirajmo postavke}
                  ORD('p'): BEGIN
                            MaxRez:=500; bodovi:=0;
                            kosaricay:=23; kosaricax:=23;
                            zivot:=1;
                            maxslova:=1; DelayTime:=100;
                            greset; kraj:=true;
                            END;
                  ORD('q'): halt(1);                                           {Direktan izlaz iz programa}
             END;                                                              {End case}
            END;                                                               {end if}
     UNTIL kraj=true;                                                          {Sve dok kraj nije true}
END;                                                                           {Kraj procedure}

{Procedura za zamjenu brojeva}
PROCEDURE zamijeni(var x,y : integer);
var t:integer;
begin
t:=x;
x:=y;
y:=t;
end;
{Procedura za zamjenu stringova}
PROCEDURE zamijeni2(var x,y : string);
var t:string;
begin
 t:=x;
 x:=y;
 y:=t;
 end;
(*
========================================================================================================================
Procedura za ispis rezultata                                                                                           |
========================================================================================================================
*)
PROCEDURE HighScore;                                                           {Naziv procedure}
BEGIN                                                                          {Početak procedure}
assign(data,'Scores.txt');                                                     {Zadano ime datoteke}
{$I- iskljuci I/O provjeru}
reset(data);                                                                   {Pokušava otvoriti datoteku}
IF IOresult<>0 THEN                                                            {Ako nije uspjelo}
               BEGIN                                                           {Početak if naredbe}
                   rewrite(data);                                              {Napravi datoteku}
                   writeln('Rezultati 15 najboljih');                          {Ispiši poruku}
                   writeln;                                                    {Jedan prazan red}
                   FOR i:=1 TO 15 DO                                           {Popuni datoteku i ispiši na ekran}
                                 BEGIN                                         {Početak for naredbe}
                                      writeln(data,'Igrac',i);                 {Spremi ime igrača u datoteku}
                                      write('igrac',i);                        {Ispiši ime na ekran}
                                      writeln(data,' ',1000 div i);            {Spremi broj bodova u datoteku}
                                      writeln(' ',1000 div i);                 {Ispiši na ekran}
                                 END;                                          {Kraj for petlje}
               END                                                             {Kraj if naredbe}
ELSE                                                                           {Ako je uspjelo}
BEGIN                                                                          {Početak else naredbe}
         writeln('Rezultati 15 najboljih');                                     {Ispiši poruku}
         writeln;                                                              {Jedan prazan red}
         FOR i:=1 TO 40 DO                                                     {Za i=1 do 9 radi}
         BEGIN                                                                 {Početak for petlje}
              IF (IOresult=0)AND NOT eof(data) THEN                            {Ako nema greške i nije kraj datoteke}
              BEGIN                                                            {Početak if naredbe}
                   readln(data,sc[i].ime);                                     {Učitaj ime}
                   readln(data,sc[i].bodovi);                                  {Učitaj bodove}
              END;                                                             {Kraj if naredbe}
         END;                                                                  {Kraj for petlje}
(*
=====================
Sortiraj podatke    |
=====================
*)
    FOR i:=1 TO 39 DO                                                          {Za i=1 do 9 radi}
    FOR j:=i+1 TO 40 DO                                                        {Za j=i+1 do 10 radi}
                    IF sc[i].bodovi<sc[j].bodovi THEN                          {Ako su bodovi manji}
                    BEGIN                                                      {Početak if petlje}
                         zamijeni(sc[i].bodovi,sc[j].bodovi);                  {Zamijeni bodove}
                         zamijeni2(sc[i].ime,sc[j].ime);                       {Zamijeni imena}
                    END;                                                       {Kraj If naredbe}
    FOR i:=1 TO 15 DO                                                          {Od i=1 do 9 radi}
    BEGIN                                                                      {Početak for petlje}
        IF sc[i].ime<>'' THEN writeln(sc[i].ime,' ',sc[i].bodovi);             {Ako ime nije prazno ispiši ga i ispiši bodove}
    END;                                                                       {Kraj for petlje}
END;                                                                           {Kraj else}
close(data);                                                                   {Zatvori datoteku}
readln                                                                         {Čekaj pritisak tipke}
END;                                                                           {Kraj procedure}
(*
==============================================
Procedura koja se poziva na početku programa |
==============================================
*)
PROCEDURE Upute;
BEGIN
writeln('Za svako ulovljeno slovo igrac dobiva 25 bodova a za svako izgubljeno gubi');
writeln('30 bodova. Svakih 500 bodova dobiva 1 zivot, igra se ubrzava i pada jedno');
writeln('slovo vise. Kada izgubi sve bodove gubi 1 zivot. Ako nema zivota igra zavrsava ');
writeln('Ako padnu 3 slova zaredom takoder gubi zivot.');
TextColor(14);                                                                 {Boja teksta}
TextBackground(9);                                                             {Boja pozadine}
for i:=0 to 76 do                                                              {Za i=1 do 76 radi}
write('=');                                                                    {Nacrtaj marginu}
writeln;                                                                       {Jedan prazan red}
writeln('Unesite S za pocetak, Q za izlaz ili H za High Score :');             {Ispiši poruku}
readln (izbor);                                                                {Sprema izbor}
END;                                                                           {Kraj procedure}

(*
=====================================================================================================================
Glavna funckija
=====================================================================================================================
*)

BEGIN                                                                          (*Početak glavne funkcije*)
(*
====================
Početne definicije |
====================
*)
randomize;                                                                     {Nasumični brojevi}
TimeCount:=0;                                                                  {Brojač vremena}
MaxRez:=500;                                                                   {Svakih 500 bodova "novi nivo"}
padslova:=0;                                                                   {Spremamo koliko slova padne zaredom van košarice}
DelayTime:=100;                                                                {Vrijeme odgode kod padanja slova}
zivot:=1;                                                                      {Početni broj života}
bodovi:=0;                                                                     {Početni bodovi}
maxslova:=3;                                                                   {Koliko slova pada}
kosaricax:=25;                                                                 {X pozicija košarice}
kosaricay:=23;                                                                 {Y pozicija košarice}
kraj:=false;                                                                   {Kod procedure Kraj_Igre za Repeat petlju}
KrajIgre:=false;                                                               {U glavnoj funkciji repeat petlja}
Pauza:=false;                                                                  {Spremamo Status pauze}
(*
=============================
Popunjavanje postavki slova |
=============================
*)
FOR i:=1 TO maxslova DO
gReset;                                                                        {Resetirajmo poziciju svakog slova}
(*
=========================
Sama igra               =
=========================
*)
TextColor(15);                                                                 {Čista bijela boja}
Upute;                                                                         {Pozivanje procedure upute}
CASE izbor OF                                                                  {Ako u proceduri upute unesemo H pozovi HighScore Proceduru}
'H','h':
BEGIN
     clrscr;                                                                   {Očistimo ekran}
     HighScore;                                                                {Pozovimo proceduru HighScore}
END;                                                                           {Kraj case izbora of h}
'S','s' :                                                                      {Ako unesemo S pokreni igru}
BEGIN
      clrscr;                                                                  {Očistimo ekran}
      write('Unesite ime:');                                                   {Ispiši poruku}
      readln(ime);                                                             {spremi unos u varijablu ime}
      REPEAT                                                                   {Repeat petlja}
        GotoXY(1,1);                                                           {Lijevi gornji kut}
        writeln('Bodovi: ',bodovi,' Zivoti: ',zivot,'       Pritisnite P za Pauzu, Q za Izlaz');
        writeln('-------------------------------------------------------------------------------');
        IF KeyPressed THEN                                                      {Pritisak tipke}
           BEGIN
             Key:=ORD(READKEY);
             IF Key=0 THEN
                  Key:=ORD(READKEY) SHL 8;
             CASE Key OF
                  ORD('j'):IF pauza=false THEN kosaricax:=kosaricax-1;          {Ako nismo u pauzi pomakni kosaricu lijevo}
                  ORD('k'):IF pauza=false THEN kosaricax:=kosaricax+1;          {Ako nismo u pauzi pomakni kosaricu desno}
                  ORD('p'): BEGIN                                               {U slučaju tipke p}
                            IF pauza=false then                                 {Ako pauza nije uključena}
                            pauza:=true                                         {Uključi ju}
                            ELSE                                                {inače}
                            pauza:=false;                                       {isključi pauzu}
                            END;
                  ORD('q'): Kraj_Igre;                                          {Ako pritisnemo q pozovi proceduru za kraj igre}
             END;                                                               {End Case}
           END;                                                                 {End if}
  (*Za makivanje "dopplerovog" efekta kosarice maknuti komentare*)
(*GotoXY(1,23);
writeln('                                                                                  ');*)
     GotoXY(kosaricax,kosaricay);                                               {Postavi pokazivac na poziciju kosarice}
     writeln('\__/');                                                           {"Nacrtaj" kosaricu}
     (* Naš Brojač umjesto delay funkcije*)
      FOR i:=1 to maxslova DO                                                   {Procesuiraj svako slovo}
      BEGIN
      TimeCount:=TimeCount+1;                                                   {Povečaj brojač svaki krug}
           IF s[i].posy>2 THEN                                                  {Samo ako je y kordinata slova veća od 2-> da ne pišemo preko bodova}
           BEGIN
                GotoXY(s[i].posx,s[i].posy);                                    {postavi slovo i ispiši ga na ekran}
                writeln(chr(s[i].slova));
           END;                                                                 {End if}
      IF pauza=false THEN                                                       {Ako nije pauzirano}
      IF TimeCount>DelayTime THEN BEGIN                                         {Ako je prosao određen period vremena}
      TimeCount:=0;                                                             {Postavi brojač na 0}
      s[i].posy:=s[i].posy+1;                                                   {Simulacija padanja}
      clrscr;                                                                   {Očisti ekran}
      END;
      IF (s[i].posy=kosaricay) AND (s[i].posx<kosaricax) OR (s[i].posy=kosaricay) AND (s[i].posx>kosaricax+3) then {Ako slovo ne padne u košaricu gubimo bodove}
         BEGIN
              bodovi:=bodovi-30;                                                {Smanji bodove za 30}
              padslova:=padslova+1;                                             {Brojac koliko slova pada zaredom povećaj za 1}
              gReset;                                                           {Ponovno postavi slovo}
              IF bodovi<0 THEN zivot:=zivot-1;                                  {Ako su bodovi ispod 0 gubimo život}
              IF padslova>2 THEN                                                {Ako su pala 3 slova zaredom također gubimo život}
              BEGIN
              zivot:=zivot-1;
              padslova:=0;
              END;

         END;
      IF (kosaricay=s[i].posy) AND (s[i].posx>=kosaricax) AND (s[i].posx<=kosaricax+3)THEN {Ako su košarica u slovo na istoj poziciji, povećajmo bodove i ponovno postavimo slovo na random poziciju}
         BEGIN bodovi:=bodovi+25;                                              {Povečaj bodove}
         IF padslova>0 THEN padslova:=0;                                       {Resetiraj brojac koji broji koliko je slova palo zaredom}
         gReset;                                                               {Resetiraj poziciju slova}
         END;                                                                  {End if}
      END;                                                                     {End For}
      IF kosaricax<1 THEN kosaricax:=1;                                        {Da nebi mogli sa košaricom previše lijevo}
      IF kosaricax>76 THEN kosaricax:=76;                                      {Niti previše desno}
      IF bodovi>=MaxRez THEN                                                   {Ako imamo potreban broj bodova}
      BEGIN
           zivot:=zivot+1;                                                     {Dodaj novi život}
           DelayTime:=DelayTime-10;                                            {Ubrzaj padanje slova}
           maxslova:=maxslova+1;                                               {Dodaj slovo više}
           MaxRez:=MaxRez+500;                                                 {Povećaj potreban broj bodova}
      END;                                                                     {End if }
      IF pauza=true then                           &