.[ ČeskéHry.cz ].
unit Graph a uzivatelsky vstup
Jdi na stránku Předchozí  1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 13. srpen 2014, 18:01:05    Předmět: Odpovědět s citátem

Ještě když jsem používal unitu graph, tak jsem měl "textury" uložené do datového souboru jako pole 300*300 kde hodnota daného bodu byla barva pixelu. Ze začátku chci použít tyto soubory a teprve potom začnu požívat .jpg nebo podobné. Jenom by mě zajímalo, jak se do datového souboru ukládá nebo z něj čte. Stačí jen kousek kodu, nemusíš to sem kopírovat celý jestli nechceš.
Díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 13. srpen 2014, 20:44:47    Předmět: Odpovědět s citátem

S binárníma souborama se dá pracovat např. nějak takhle - soubor se celý načte do paměti. Je to mix funkcí ZenGL (načtení) a Lazarusu (uložení). Snad postačí. HexMap obsahuje pole hexů.

Jinak pokud bys ten svůj formát nechtěl zobrazovat pixel po pixelu dá se vytvořit "OpenGL textura" a editovat v ní jednotlivé pixely - http://zengl.org/forum/index.php/topic,557.msg3436.html#msg3436

kód:

uses
   zgl_main, zgl_math_2d, zgl_log, zgl_file, zgl_utils, zgl_memory, zgl_types, Classes;

Type
THex = record
      x, y : integer;
      id : integer;
      x_id, y_id : integer;
      texture : zglPTexture;
      terraintype : byte;
    end; 

 THexMap = record
      x, y,  // x,y coordinates,
      w, h : integer; // Map width, height in hex  // = rows and colls
 
      // ..

      // Hexes
      Hex : array of array of Thex; // Hexagons
      Count : integer; // Hex count
    end;   

Var
 HexMap : THexMap;

procedure LoadMap(filename: UTF8String);
var
  i, i2 : integer;
  rdata: THex;
  _m: zglTMemory;

begin

  mem_LoadFromFile(_m, filename);

  if _m.Size = 0 then Exit;

       mem_read(_m, HexMap.DataFormatVersion, sizeof(HexMap.DataFormatVersion));

       // X Y
       mem_read(_m, HexMap.x, sizeof(HexMap.x));
       mem_read(_m, HexMap.y, sizeof(HexMap.y));

       // W H
       mem_read(_m, HexMap.w, sizeof(HexMap.w));
       mem_read(_m, HexMap.h, sizeof(HexMap.h));

      // ..

        for i := 0 to (HexMap.w -1) do
         for i2 := 0 to (HexMap.h -1) do
          begin
            mem_read(_m, rdata, sizeof(THex));
            HexMap.Hex[i][i2] := rdata;
          end;

      mem_Free(_m);
end;


procedure SaveMap(filename: UTF8String);
var
  FS : TFileStream;
  i, i2  : integer;
  c : integer;

begin
  try
    FS:=TFileStream.Create(filename, fmOpenWrite or fmCreate);

    FS.WriteBuffer(HexMap.DataFormatVersion, sizeof(HexMap.DataFormatVersion));

    // X Y
    FS.WriteBuffer(HexMap.x, sizeof(HexMap.x));
    FS.WriteBuffer(HexMap.y, sizeof(HexMap.y));
    // W H
    FS.WriteBuffer(HexMap.w, sizeof(HexMap.w));
    FS.WriteBuffer(HexMap.h, sizeof(HexMap.h));

    // ..

    // each Hex
    for i := 0 to (HexMap.w -1) do
     for i2 := 0 to (HexMap.h -1) do
      begin
       FS.WriteBuffer(HexMap.Hex[i][i2], sizeof(THex));
       inc(c);
      end;

  finally
    FS.Free;
    log_Add('Editor - Map saved: '+filename);
  end;
end;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 25. srpen 2014, 09:27:20    Předmět: Odpovědět s citátem

Tak jsem udělal konečně primitivní hru, kde chodí tučňák po obrazovce. Ještě mám dotaz, zda jde nastavit, kolikrát se má projít hlavní smyčka za sekundu. Potřebuju to, aby se mi tučňák pohyboval pořád stejně rychle bez ohledu, jak dlouho trvá jeden cyklus. Zatím to řešim tak, že udržuju 60 FPS tím, že měním hodnotu příkazu sleep, který mám v proceduře draw. Stejně mi ale FPS lítá od 50 do 80. Koukal jsem se na demo07, co je v Zengl, ale nenašel jsem to tam, i když to tam musí být, protože ty tučňáci se pohybují stejně rychle bez ohledu na to, kolik má hra FPS.
Díky za předchozí rady, už načítam datové soubory a taky vykresluju objekty jako textury a už ne pixel po pixelu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 25. srpen 2014, 09:40:08    Předmět: Odpovědět s citátem

resi se to tak, ze nepohybujes tucnakem a dany pevny krok v kazdem snimku ale pocitac si FPS a pohybujes nim o drahu, kterou by urazil za cas od posledniho snimku, pak je to FPS nezavisle
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 25. srpen 2014, 09:44:13    Předmět: Odpovědět s citátem

Takže posun objektu při každém průchodu smyčkou bude (dráha za sekundu)/FPS. Tyto výpočty bude asi dobrý umístit do procedury update?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 25. srpen 2014, 09:56:08    Předmět: Odpovědět s citátem

Doporučuju spíš násobit prodlevou mezi snímky než dělit FPS Wink. Jo je to do update, místo pozice.x += posunKonstantaPro60Fps budeš mít pozice.x += (posunKonstantaPro60Fps * 60) * prodlevaMeziSnímkyVSekundách.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 25. srpen 2014, 10:05:18    Předmět: Odpovědět s citátem

skala> dalsi moznost je mit update s pevnym casovym krokem a v kazdem snimku provest tolik update s pevnym krokem, abys dorovnal cas "ve hre" s realnym. Napr.

kód:

const stepSize = { sem dopln velikost casoveho kroku };
var inGameTime;  { Uvodni hodnotu nastavis nekde pri inicializaci }
procedure UpdateFixedStep()
begin
  { Update pro pevny casovy krok }
end

procedure Update()
begin
  while inGameTime + stepSize <= getCurrentTime() do
  begin
    UpdateFixedStep();
    inGameTime := inGameTime + stepSize;
  end
end

_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 25. srpen 2014, 10:10:17    Předmět: Odpovědět s citátem

Ještě jeden dotaz, prč je lepší psát výpočty do procedury update? Zpracovává to výpočty v ní rychleji nebo proč?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 25. srpen 2014, 10:12:22    Předmět: Odpovědět s citátem

kód:
Update(dt: Double);


dt by měla být ona prodleva mezi snímky jak píše Ladis, ale nutno otestovat

Já jednoduše zafixoval FPS pomocí VSync. Pokud má někdo lepší grafickou kartu stejně mu začnou při vysokém počtu snímků pískat cívky. Akorát teď přemýšlím, jestli to něco s prodlevou mezi snímky řeší Smile V mé hře se defakto nic moc nepohybuje, ale zkuším.

kód:
scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, TRUE );


Rychlejší výpočty v update nejsou, ale pokud bys měl složitější kalkulace v Draw mohl bys mít na obrazu různé artefakty atd.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 25. srpen 2014, 11:27:12    Předmět: Odpovědět s citátem

JC> Na pomalejším počítači budeš mít FPS omezené VSyncem nižší. A nechápu, jak REFRESH_MAXIMUM omezí na tebou požadované (chápal bych natvrdo třeba 60 fps). Jinak pískání může na druhém počítači naopak být v 60 Hz a nebýt v >60 Hz Wink.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 25. srpen 2014, 23:29:43    Předmět: Odpovědět s citátem

Pravda, je to blbost. http://zengl.org/wiki/doku.php?id=screen:scr_setoptions

No u nových grafik je to víceméně pravidlo co jsem procházel diskuze. Při těch 60 Hz může pískat leda monitor ? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 25. září 2014, 17:26:38    Předmět: Odpovědět s citátem

Zdravim, po dlouhé době zase prosim o radu. Jak se v zengl přepínají scény(stavy). Vytvářím hru, která bude mít menu, náhled mapy a vlastní herní obrazovku a nechce se mi to řečit tak, že ve funkci draw budu mít 3x podmínku if pro každou obrazovku.
Díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 25. září 2014, 18:28:10    Předmět: Odpovědět s citátem

Jinak kdo plánujete trochu do budoucna, tak počítejte jednak s FreeSync (nebo G-Sync) monitory, a pokud se povede Carmackovi přesvědčit Samsung a další výrobce na high-fps displeje (pro začátek aspoň se selektivním překreslováním nebo simulací interlace třeba ob 16 řádků pro 1kHz), tak počítejte i s tímhle. Pevná fps s VSync a nedejbože triple buffery je slepá cesta Wink
(OK jsem trochu nahypovaný z Carmackových tech-talků na Oculus Connectu Razz)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 25. září 2014, 20:13:19    Předmět: Odpovědět s citátem

skála napsal:
Zdravim, po dlouhé době zase prosim o radu. Jak se v zengl přepínají scény(stavy). Vytvářím hru, která bude mít menu, náhled mapy a vlastní herní obrazovku a nechce se mi to řečit tak, že ve funkci draw budu mít 3x podmínku if pro každou obrazovku.
Díky


Ahoj,

scény v ZenGL nejsou, budeš to muset vymyslet sám Smile Projel jsem kdysi několik zdrojáků kde to bylo impelementovaný (např. http://zengl.googlecode.com/files/mondozengl-0.3-2012.10.02.zip - což je odnož ZenGL) ale zdálo se mi to zbytečně složité. Ty tři podmínky ničemu nevadí, pomalejší to nebude, ale jde to řešit i jinak, kdyžtak o víkendu sem něco pastnu
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 24. říjen 2014, 15:19:47    Předmět: Odpovědět s citátem

Zdravim, po dlouhý době mam zase dotaz, jde v zengl nějak zkosit obrázek?
Díky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3  Další
Strana 2 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna