dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Kustība Delfos
Goto page Previous  1, 2, 3, 4, 5  Next
 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
Kristians



Joined: 06 Apr 2005
Posts: 99
Location: Ventspils

PostPosted: Wed Apr 20, 2005 12:35 am    Post subject:

Pilnīgi visu saprotu tas iepriekšējais bija domāts tā ja nesaprot to ko es tur pirmīt uzrakstīju tad lai viņi izmanto to dxtimeri Evil or Very Mad
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Apr 20, 2005 12:43 am    Post subject:

Ak tā :) Es domāju tu to man biji teicis, to pēdējo postu.
Back to top
View user's profile Send e-mail
kaszu



Joined: 28 Dec 2004
Posts: 103
Location: Iceberg, Northpole

PostPosted: Wed Apr 20, 2005 9:39 am    Post subject:

Te off topic saak veidoties.
Timer priekss game loop var izmantot speelees, kuraas loti biezza kardu paarziimeessana nav svariiga, tacu ja vajag performance, tad taimeris priekss main loop nekur neder, jo vinnss norij datora resursus.
Iisi sakot priekriitu bubu:
Quote:
Ar taimeri veidots spēles main loop nav labs.
Back to top
View user's profile Send e-mail Visit poster's website
s1
Guest





PostPosted: Wed Apr 20, 2005 3:18 pm    Post subject:

Quote:
Timer priekss game loop var izmantot speelees, kuraas loti biezza kardu paarziimeessana nav svariiga, tacu ja vajag performance, tad taimeris priekss main loop nekur neder, jo vinnss norij datora resursus.
Iisi sakot priekriitu bubu:


Vai kāds var ko konkrētāk paskaidrot? Man tas ir ļoti aktuāli.
Back to top
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Apr 20, 2005 4:27 pm    Post subject:

Spēles, kurā pārsvarā notiek animācija (FPS/RTS/u.t.t), main loop veido apmēram šādu (ir vairācijas ar multithreadingu):
Code:
while (playing) {
  check_keys();
  move_objects();
  repaint();
}
Redzms, ka main loops izpildās nepārtraukti, tāpēc vajadzība pēc taimer atkrīt, jo jebkurā cikla iterācijā tu vari noteikt tekošo un iepriekšējo iterācijas izpildīšanās laiku un noteikt starpību starp tiem.

Funkciju nozīmes:
check_keys() - pārbauda nospiestos taustiņus, pamaina objektu koordinātes.
move_objects() - pārvieto spēles objektus (tipa inerce,utt), AI darības, kolīziju detektēšana.
repaint() - pasaka OS, ka vajag pārzīmē ekrānu, t.b. pati pārzīmēšana nenotiek šajā procedūrā, bet atsevišķā onPaint funkcijā.

Protams ir variācijas - piemēram ja tu izmanto tīru WinAPI, tad check_keys() funkcija netiek izsaukta ar tavu kodu, bet tiek izsaukta WindowProcedure, kura saņem atbilstošo ziņojumu.

Iespējams arī limitēt kadrus sekundē:
Code:
while (playing) {
  check_keys();
  move_objects();
  if (current_time-previous_time > 1000/FPS) {
    repaint();
    previous_time = current_time;
  }
}

current_tiem/previous_time - laiks milisekundēs
FPS - vajadzīgie FPS.

Saprotams, ka iespējami daudz un dažādi pārveidojui un optimizācijas šim loopam, bet daudz no tā, ko var pamainīt, ir atkarīgs no spēles vajadzībām, tb iespējām.

Ar multithreadingu iespējams darīties tā - ka ir viens threads, kurā notiek tieši objektu zīmēšana. Bet otrā threadā notiek nevis klaviatūras taustiņu pollošana, bet koda izpilde uz notikumu (līdzīgi kā delphi formām - onkeydown,keyup). Kods neizpildās mūžīgā ciklā, bet tikai uz vajadzīgiem notikumiem. Attiecīgi tā threada kodā notiek tikai objektu koordināšu maiņa uz taustiņu nospiedienu. Bet galvenajā threadā blakus zīmēšanas kodam atrodas arī tā move_objects() fja, kura pamainītās objektu koordinātes, lai uzstādītu jauno ekrāna izskatu. Taču, kā visās multithreadinga aplikācijās, rodas dažādi sarežģījumi ar threadu sinhronizāciju, u.c. tādām lietām. Tā ka šo paņēmienu ieteicams lietot tikai, ja labi pārvalda multithreadinga pprogrammēšanas teoriju.
Back to top
View user's profile Send e-mail
kaszu



Joined: 28 Dec 2004
Posts: 103
Location: Iceberg, Northpole

PostPosted: Wed Apr 20, 2005 4:50 pm    Post subject:

Viss ok, taccu ir 1 ieteikums, uz dazaadiem procesorriem (videokarteem) objektu kustiibas aatrums var mainiities, tas ir noteikti mainaas, jo piennemsim ka uz viena procca main loop 1 sekundee izpildaas 1000 reizes uz cita tas izpildiisies 50 reizes, move objects tiek izsaukts katru reizi kad izpildaas main loop, taapeec vajadzeetu:

Code:

//Time_dif ir globaalais mainiigais taapat kaa current_time un
//previous_time
void move_objects()
{
      //Piemeers
      if (upKeyPressed == true)
      {
            y = y - 500 * time_dif;
            //500, jo time_dif ir diezgan mazs
      }         
}

......

while (playing) {
  time_dif = current_time - previous_time;

  previous_time = current_time;

  check_keys();
  move_objects();

  if (current_time-previous_time > 1000/FPS) {
    repaint();
  }
}
Back to top
View user's profile Send e-mail Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Apr 20, 2005 4:57 pm    Post subject:

Nu protams, ka jāpārbīda ir nevis par abslūtu vērtību, bet relatīvi - atkarībā no paietā laika. Biju domājis, tā ir pašsaprotama lieta, tāpēc arī nepieminēju :)
Tev tikai mainloopam tagad savādākam jābūt:
Code:
while (playing) {
  time_dif = current_time - previous_time;

  previous_time = current_time;

  check_keys();
  move_objects(time_dif);

  if (current_time-previous_FPS_time > 1000/FPS) {
    repaint();
    previous_FPS_time = current_time;
  }
}

citādi repaint() nekad neizsauksies :)
Back to top
View user's profile Send e-mail
Angel



Joined: 02 Jan 2005
Posts: 113
Location: Latvija

PostPosted: Wed Apr 20, 2005 6:59 pm    Post subject:

Postu augstaak man shkiet ir kluuda,
Code:

while (playing) {
  time_dif = current_time - previous_time;

 

  check_keys();
  move_objects(time_dif);

  if (current_time-previous_FPS_time > 1000/FPS) {
    repaint();
    previous_FPS_time = current_time;
  }
  previous_time = current_time;
}

Vaidzeetu buut taa [man shkiet]
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Apr 20, 2005 7:39 pm    Post subject:

Nu tas jau pseidokods vien ir tak :) Vienalga kur tu liec to previos_time = ... Ja jau tar abi ir mainīgie, tad nekādas atšķirības nav, kurā vietā to piešķiršanu veic.
Galvenais jau saprast domu kāpēc tā vajag, tad jau kods uzrakstīsies viens un divi.
Back to top
View user's profile Send e-mail
NocK



Joined: 06 Jan 2005
Posts: 107

PostPosted: Wed Apr 20, 2005 7:40 pm    Post subject:

Nu labi, skatos jūs te tik man FPS apspriežat, bet man vēl vajag (100 reiz vairāk nekā FPS) lai es normāli pārvietoties pa ekrānu varētu! Kas un kur tomēr jāraksta lai Left+UP un figūra pārvietojas uz augšu? Tas tagad man ir vieslielākā galvassāpe.
Back to top
View user's profile Send e-mail Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Apr 20, 2005 9:08 pm    Post subject:

Tu laikam nekā nesaprati no iepriekš rakstītā. Tur netika nekāds FPS apspriests. Tur tev bija jāsaprot, ka check_keys() vietā jāieliek apmēram šāda pārbaude
if keyPressed[UP] then y := y - 1;
if keyPressed[LEFT] then x := x - 1;
...

un tur kur zīmēsi objektu(s): tur izmanto tos x,y kā koordinātes.
Back to top
View user's profile Send e-mail
s1
Guest





PostPosted: Wed Apr 20, 2005 9:31 pm    Post subject:

sorry, vēl viens offtopic, kāda varētu būt starpība ātrdarbībā starp form1.OnTimer un parasto Windows loopu?
Back to top
Guest






PostPosted: Thu Apr 21, 2005 7:23 am    Post subject:

Nu delfos kādu sīku progzu uztaisīt es varu un kautko tjip arkanoida, bet par visādiem check_keys es pirmo reizi dzirdu! varbūt vari iedot kādu gatavu piemēru? vie vnk tie visi if iekavās jāraksta? uuunn tas viss iekš OnKeyPress ir jāliek, jā?
Back to top
NocK



Joined: 06 Jan 2005
Posts: 107

PostPosted: Thu Apr 21, 2005 7:24 am    Post subject:

Ups... Augšējais topiks mans. Aizmirsu ielogoties.
Back to top
View user's profile Send e-mail Visit poster's website
s1
Guest





PostPosted: Thu Apr 21, 2005 12:39 pm    Post subject:

NocK, tavā gadījumā vajadzētu pietikt ar OnTimer procedūru, ja gribi, varu atsūtīt kādu piemēru uz delphiX.
Back to top
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Goto page Previous  1, 2, 3, 4, 5  Next
Page 3 of 5

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group