Jump to content

ffredyk

Majitel
  • Příspěvků

    3268
  • Registrován

  • Aktivní

  • Vítězných dnů

    64

Příspěvky posted by ffredyk

  1. před 13 minutami, Boy said:

    pawno nieje ani firma. Doma to vytlačil na tlačiarňi. Každý keď zadá správne súradnice bude mať takú figúrku... To vám radšej ja dám karton mojich energeťákov. a bude o to vadší záujem.

    Já nevím, co tě tak triggeruje :D Pawno.cz funguje pod mým IČO, které je i zapsané v kontaktních informacích. Nevím jak odlišné máte zákony na Slovensku, ale mám pocit, že při prodeji produktu by jsi měl uvést daňovou identifikaci (kterou na mrkaveja nemáš). Pokud tě tak hrozně sere, že pawno.cz rozdává ZDARMA své figurky a budí to v tobě potřebu na tom udělat reklamu na svůj produkt (o kterém si myslím, že asi moc úspěšný také nebude), tak se ti omlouvám, ale pokračovat v tom budeme dál :)

  2. před 13 minutami, Boy said:

    Takú čočotinu si vytlačím na 3D tlačiasni za 5sekúnd ;)

    Jsem rád, že zde máme lidi s tiskárnami (a ještě s rekordní světovou rychlostí 2 000mm/s), ale pointa soutěže je o tom, nabídnout figurku i lidem, kteří tiskárnu nemají a chtějí originální kus od tohoto fóra :) Jak již bylo zmíněno jde o vlastní originální model.

  3. před 25 minutami, XpresS said:

    Už som raz posielal vEndovi návrhy na nové emoty. Hovoril, že na nich pozrie a odvtedy prešlo už pol roka minimálne, takže otázka, má to cenu? 

    Znovu opakuji, pokud máte něco na srdci, je tu od toho tato sekce - všichni ve vedení jsme dospělí fungující lidé, a na soukromé zprávy se zde snadno zapomíná. Když založíš topic, tak to mají všichni na očích vždy 

  4. Osobně si předsevzetí nedávám, vím že je poruším :D

    Snažím se naučit metodu vymysli-udělej: Pokud tě napadne něco, co by jsi chtěl udělat - udělej to co nejdřív, alespoň jednou. Po druhé už to bude jednodušší a tím, že to uděláš hned na to nezapomeneš. Jen mám problém to občas sám dodržovat a inklinuji k "odsouvání  na později" :D

    Každopádně co se plánů na tento rok týče v dlouhodobém měřítku - jde o dotažení několika projektů, mezi nimi i obnova Pawno.cz :)

  5. Zdravíčko přátelé :)

    Rád bych vám představil první soutěž tohoto roku - a současně bych vás rád tímto motivoval k aktivitě, psaní návodů, odpovídání na témata a diskuzi. 

    Za vaši aktivitu vás od této chvíle každý měsíc odměníme dárkem v podobě vytištěné figurky pawno.cz v modré designové barvě.
    Resp. pošleme ji tomu nejaktivnějšímu z vás :) 

    IMG_20210105_202333.jpg

    Figurka je z materiálu PETG, rozměrově je 10cm vysoká a 5.5cm do šířek. Jde o vlastní model, vytvořený na základě původní figurky jazyka Pawn - která byla i v prvním logu fóra. 

    Bodovat budeme jednotlivě každého dle množství obsahu, které za daný soutěžní měsíc vypustil do fóra - body se budou udělovat za kvalitu obsahu, relevance příspěvku, informační hodnotu a originalitu. Za každé kolo zveřejníme 3 nejaktivnější uživatele a oceníme je dle umístění takto:

    1. Figurka Pawno.cz + speciální titul na fóru dle výběru
    2. Speciální titul na fóru dle relevance
    3. Speciální titul na fóru dle relevance

    Figurka bude zabalena do krabičky a odesílána přes zásilkovnu - výherce si bude moci anonymně vybrat jakékoliv odběrné místo, kam mu ji poté zašleme.

    Speciální tituly na fóru ještě doladíme s vedením, ale představte si je víceméně takto:

    • Best Guide
    • Ultimate Tutor
    • Lord of Discussion

    Které by měli lépe přiblížit komunitní zaměření výherce soutěže :) 
    První místo si může vybrat, jaký titul chce. Dalším je přidělíme na základě způsobu jejich aktivity.

    Začínáme ihned, tak vzhůru do psaní! :)

    • Paráda! (+1) 1
    • Kappa 1
    • OMEGALUL 1
    • Zmatený 2
    • Haha! 1
    • Děkuji (+1) 1
    • Líbí se mi to! (+1) 1
  6. Zdravíčko přátelé - pokud hrajete Armu 3 (případně jiné Arma tituly) jistě dobře víte o scriptovacím jazyku SQF, na kterém je hra kompletně postavená. Veškerý funkční content je psán v tomto jazyce a dá se s ním vyčarovat cokoliv si představíte. Pro mě je Arma 3 takový sandbox, ve kterém si vytvářím a realizuje nápady a myšlenky herních typů - engine nabízí kvalitní modely postav, objektů i terénu. Dá se říct, že si v Armě 3 můžete vytvořit svou vlastní hru.

    Spoiler

    Ukázky mých výplodů:

    https://steamcommunity.com/sharedfiles/filedetails/?id=176318250 (Survivor - rychlá střílečka na vesnici)
    https://steamcommunity.com/sharedfiles/filedetails/?id=186388823 (SHOA - RTS na způsob Men of War)
    https://steamcommunity.com/sharedfiles/filedetails/?id=278701081 (Anti Air Arcade - arkádová destrukce nepřátelských letadel)
    https://steamcommunity.com/sharedfiles/filedetails/?id=756203516 (Waiting time - cinematic scéna)
    https://steamcommunity.com/sharedfiles/filedetails/?id=1420857501 (Curway: Aegis - vylepšená verze RTS systému SHOA)

    BIWiki

    Veškerou dokumentaci, podklady a zdroje najdete na jednom místě - https://community.bistudio.com

    Jsou tam rozepsané a popsané veškeré nativní funkce enginu, seznamy objektů, zbraní, vozidel a dalších zdrojů. Lze tam najít kompletní informace pro jakýkoliv druh příkazu, řešení, či návrhu. Bez tohoto se při scriptování v SQF určitě neobejdete.

    Základy SQF

    SQF je jednoduchý jazyk. Jakákoliv logika je defakto uložená v proměnné a celý interpreter jen pracuje s těmito proměnnými. Pokročilé vysvětlení zde.

    Datatypy

    Každá proměnná v jazyce SQF má vlastní způsob deklarace (a defakto automatické inicializace). Veškeré číselné hodnoty jsou podpultové floaty (tedy desetinná čísla), texty jsou stringové řetězce (a lze je rozebrat na bajty - ve formě číselných hodnot) - tedy cokoliv mezi uvozovkami "text", pole jsou jednoduché soustavy jakýchkoliv proměnných deklarovaný jako [obsah,obsah,obsah] a kód je cokoliv mezi závorkami {code}. Existují ještě speciální typy proměnných, jako například displayNull, controlNull, namespace, configNull, grpNull, locationNull, taskNull, objNull, scriptNull a pár dalších.

    Deklarace a inicializace probíhají ve stejném kroku a to při přiřazení hodnoty k proměnné, proměnné mohou měnit typy i hodnoty (jedinou výjimku tvoří kód prohnutý funkcí compileFinal - taková proměnná se zabije až se zabitím namespace, ve kterém pracuje - zůstává konstantní - vysvětlíme si později).

    Codespace

    SQF kód lze praktikovat takřka kdekoliv v enginu. Jedinou výjimku tvoří config, ve kterém pracujeme s C strukturami pro definice tříd a jejich vlastností. Celý engine hry funguje (a je postavený) na SQF - všechny kampaně, mise, addony a další komunitní obsah, obsahuje více, či méně prvků SQF.

    Kód se dá psát v Eden editoru (ve spínačích - triggerech), .sqf souborech ve složce mise/kampaně/addonu nebo v debug konzoli. Mnoho cheater řešení dříve užívalo exkluzivně děr v SQF interpreteru pro získání kontroly nad voláním funkcí za běhu - a byli psány celé v SQF.

    Lokální / globální proměnná

    SQF chápe lokalitu proměnných základně jen ve dvou bodech scope lokální a globální. Globální proměnná je deklarována s jakýmkoliv názvem, který se neshoduje s názvem nativní funkce, či již jiné deklarované globální proměnné. Lokální proměnná se deklaruje a volá s podtržítkem před názvem, spadá pod scope ve kterém je deklarována:

    globalniPromenna = 1; //Globální číselná proměnná
    
    func_cistaFunkce = //Globální proměnná obsahující kód
    {
    	_lokalniPromenna = 2; //Spadá pod scope kódu func_cistaFunkce
    };

    Hello World

    private ["_text"]; //Moderní (volitelná) deklarace lokální proměnné - kód se bez tohoto plně obejde
    _text = format["Hello world, %1", profileName]; //Vytvoření textu "Hello world, jméno-hráče"
    
    hint _text; //Vypsání textu na obrazovku (hint)

    Struktura kódu

    Každý příkaz, či operace musí být ve všech případech oddělena středníkem (;). Kód se může psát v jednom řádku (oddělený středníky) nativní funkce mohou být krmeny dvěma způsoby parametrů - před a za funkcí:

    player setPos [0,0,0]; //Příklad nativní funkce s před-za single parametry (před-odkaz na objekt hráče ; za-pozice hráče XYZ v poli)
    
    _stav = linearConversion //Deklarace lokální proměnné s hodnotou z outputu funkce linearConversion, která má jen multi-parametry za sebou v poli
      [ //Pole
      	0, //Výchozí bod konverze Z
      	60, //Výchozí bod konverze Do
      	time, //Progress konverze
      	0, //Konverzní bod Z
      	100 //Konverzní bod Do
      ]; //při time=15 je výsledek 25

    Scheduled/unscheduled

    SQF engine pracuje ve dvou prostředích. To hlavní, ve kterém poběží váš kód většinu času (resp. vy budete většinu času psát kód pro tento environment) a druhý real-time, na který engine počká před vykreslením frame. Při volání funkcí pomocí call se prostředí dědí od volajícího. Pokud ve scheduled prostředí voláme jinou funkci, spustí se také ve scheduled prostředí (a volající čeká na výsledek - neprovádí další logiku). Pokud je funkce volána z unscheduled prostředí, také bude pracovat v unscheduled. Voláním funkce pomocí spawn volanou funkci vždy spustí v scheduled prostředí. Unscheduled prostředí si můžeme vynutit trikem za použití funkce isNil.

    • Scheduled (a k němu vázaný scheduler) environment je rozhraní, ve kterém mohou scripty běžet neustále, ve smyčce, nikdy nekončící, případně i vytěžující. Běží na pozadí vykreslování, engine na ně nečeká, případně je i pozastavuje v momentě slabšího výkonu. Scheduler je systém, který se stará o rozložení dostupného výpočetního výkonu a snaží se rozdat mezi všemi scripty rovným dílem. Může se stát, že váš script poběží jen v jednom frame z deseti, při dobrém výkonu poběží v každém frame. Spouštění scriptů v scheduled environmentu může být několik framů odloženo a při spuštění několika scriptů zároveň se tyto scripty reálně spustí nezávisle na sobě, i s rozdílem několika framů. Scheduled environment je defakto všechno spuštěné ze souboru, pomocí execVM nebo spawn. 
    • Unscheduled environment je pro změnu rozhraní, ve kterém engine zpracovává exkluzivně skripty až do konce. Nekonečné smyčky jsou schopné bricknout celou hru a nesmí být v tomto environmentu spouštěné. Také všechny odkládací funkce (sleep, waitUntil) v tomto prostředí nefungují, vyhodí chybu, či jsou ignorovány. Jen v tomto prostředí máte jistotu, že se vaše scripty spustí okamžitě, projdou veškerou logiku za sebou tak jak mají a vše stihnou v jednom frame - scheduler na základě výpočetní náročnosti takového scriptu poté pozastaví, či omezí spuštění jiných skriptů ve scheduled prostředí.

    Kam psát skripty?

    • Většinou ze začátku vám bude stačit soubor init.sqf ve složce s misí (Dokumenty/Arma 3/missions/). Případně deriváty initPlayerLocal.sqf a initServer.sqf. Existují i další speciální názvy souborů, které engine spouští na základě různých událostí, to už dohledáte na BIWiki. 
    • Dalším způsobem psaní scriptů pro mise je přímo v editoru. Stačí hodit kamkoliv spínač (trigger), podmínku mu hodit jen true a do pole Po aktivaci vepsat kód (můžete si ho připravit v editoru jako VS Code). Případně do pole inicializace jednotek.
    • Pro dočasná, či jednorázová spuštění kódu lze využít i debug konzoli, která je vždy dostupná editoru. Případně lze aktivovat i pro finální verzi pomocí atributů mise. Takto spuštěné skripty se nikam neukládají, a jsou spouštěny jen pro aktuální relaci mise.

    Na závěr

    Projděte si dokumentaci, experimentujte a tvořte. Pomocí SQF se dají vytvářet nehorázné blbosti a kreace. Vaším nejlepším přítelem je i fakt, že vše publikované pro Armu 3 podléhá open-source licenci, můžete číst všechny skripty ostatních autorů, vykrádat jejich obsah a učit se z nich. Najděte si na workshopu zajímavou misi, či addon - s pomocí programu PBO Manager můžete rozbalit balík, který obsahuje veškeré zdroje, soubory a skripty, který tento addon nese, tento program vám bude i velkým pomocníkem, až budete hledat textury základní hry - můžete si pomocí jej rozbalit i základní soubory hry a čerpat informace z nich (kampaně, objekty, funkce, textury)

    Úkol pro vás: Prohledejte BIWiki a zkuste si najít další event scripty, se kterými se dá pracovat. Vytvořte misi, ve které máte za úkol ukrást nepřátelské vozidlo - zkuste se držet podobného stylu jako v misích základní hry - využívejte tasky, naučte se s nimi pracovat ve scriptu, relevantní dokumentaci vyhledejte na BIWiki. Naučte se spojit prvky editoru se scripty, využijte spínače pro aktivování scriptovacích funkcí (nativní funkce call nebo spawn).

  7. před 6 minutami, Hip said:

    Ne pozor! Koule nemají poloviční rychlost, ale procentuální rychlost v závislosti na úhlu. Pokud je úhel 0° (tedy přímo zepředu narazí do koule), tak se bílá zastaví úplně a předá 100% rychlosti druhé. Pokud náraz byl 45°, bude to půl a půl. Pokud to bude těsně pod úhlem 90° tak se bílá skoro nezastaví a druhá skoro nepohne. Více než 90° znamená, že koule druhou kouli minula, takže se to nemusí řešit. Úhel počítáš mezi vektorem pohybu a vektorem/úsečkou pozice koule 1 a 2.

    Viz. edit původní citace - došlo mi to dřív, než jsi stihl zareagovat :-P :haha:

    • Smutný 1
  8. před 10 minutami, DuFF said:

    Nevidel som, ako to na tých serveroch presne funguje, ale očakával by som, že na objekt biliardového stola je vložených niekoľko malých objektov biliardových gulí a že sa využíva ColAndreas plugin na zistenie, či guľa narazí do inej gule/hrany stola. Guliam vieš potom asi nastaviť rýchlosť a smer podľa rýchlosti a smeru gule, ktorá do nich narazila. U odrazov od hrán stola platí asi niečo na spôsob uhol dopadu = uhol odrazu.

    Používat kolizní detekci fyzikální cestou je zbytečná ztráta výpočetního výkonu (alespoň pro tento počin) - Celá věc se dá (jak již odpověděl @Hip) spočítat jen jednoduchou matematikou. Hráč po potvrzení úhlu a síly šťouchu "předá serveru" vstupní vektor, na základě kterého se vyšle bílá koule do prostoru a každým tickem se jí konstantně ubere rychlost a zároveň změří vzdálenost od ostatních koulí (s ohledem na jejich radius - resp. velikost). Pokud protne jinou kouli, spočítá se úhel mezi původním vektorem a vektorem do druhé koule (pozice bílé koule minus pozice kolizní koule) a na základě tohoto úhlu se poté vytvoří dva nové "vstupní" vektory, které se využijí pro novou aktivaci skriptu na obě koule s poloviční rychlostí bílé koule v místě kolize. A to celé se opakuje do té doby, než rychlost překročí nějaký limit (rychlost < 0.01 např) - poté se šťouch "dokončí" a začíná se na novo.

     

    EDIT: Případně se dá na základě kolizního úhlu vypočítat i poměr předané energie pro rozdělení rychlosti koulí (když bílá jen škrtne jinou kouli, nepředá ji půl rychlosti ale jen zlomek

    (90 - [uhel] / 90) * [rychlost bílé koule]

     

    • Líbí se mi to! (+1) 1
  9. před 2 hodinami, ATomas said:

    Kamo asi jsi malo zazil :D Az budu v praci a budu mit cas asi ti ukazu hned nekolik pripadu kde je UNION nevyhnutelny :D A zatez? Na multicoru koho zajima .D Dokud je vysledek vracen do timeoutu je vse cajk a odpusteno :D

    A povidej mi tu o spatne navrzene databazi, kdyz na tom fabrika jede 20 let a ver mi ze to nechces menit :D

    Kámo, mám na starost DB o miliardách záznamů.. Já si tam nemůžu dovolit ani ty posraný JOINy :D Má to sta tisíce requestů za sekundu, tam se nedá už vůbec hnout - takže mi věř, že jsem strávil několik bezesných nocí nad řešením optimalizace posraných SQL :D

    • Haha! 1
  10. před 3 hodinami, ATomas said:

    Ne vzdy JOIN je to co vyzadujes. Ja nijak blize nezkoumal jeho strukturu, ale kdyz mas data v ruznych tabulkach a srovnas si jejich strukturu a potrebujes to k te tabulce pridat, je pouziti UNION naprosto v poradku.

    Ten zátěžový overhead je zbytečný 😅 

    Nevím o ničem kde by se UNION nedal nahradit JOINem, v opačném případě máš napíču strukturu tabulek. 

    Jak psal Om3n - z hlediska výkonu, čitelnosti a organizace je už spíše nasnadě to všechno narvat do jedny tabulky

  11. před 2 hodinami, Farleon said:

    To je anténa navržená pro spojení dvou vzdálených bodů s přímou viditelností - má malý úhel. Určitě není navržená na pokrytí prostoru signálem. Mrkni spíš na něco jako tohle: https://www.i4wifi.cz/cs/210743-ubnt-unifi-ac-mesh-ap-2-4ghz-300mbps-5ghz-867mbps-1x-gbit-rj45-venkovni-poe-24v-802-3af-alta?gclid=CjwKCAiA25v_BRBNEiwAZb4-ZT4TLwQRbkQp2VGNsNAhSJ7SceoCLma0f9RLQdrq5mY4GyzcTVGouRoCZxcQAvD_BwE

    • Děkuji (+1) 1
  12. Zdravíčko přátelé - možná jste zabrouzdali na toto fórum náhodou, možná hledáte zdroje k výuce programování, či si jen stavíte informační balík a zvažujete, jestli se do toho pustit.

    Na všechny vaše základní otázky bych rád odpověděl jednou větou - programování je styl života. A dále ji rozvedu: Jakmile se jednou naučíte programovat, už se nedokážete na jakoukoliv technologii koukat stejným způsobem jako kdy dřív. Jakmile začnete myslet analyticky, změní se vám pohled na celý svět. Osvojíte si nové dovednosti nejen na počítači, ale i v běžném životě. Programování prostě nehorázně ovlivní váš každodenní život a pokud mu propadnete tak jako například já - dá se říct, že vás úplně pohltí. 

    Když se chce člověk naučit programovat, musí se naučit myslet jako stroj, představit si práci kódu, postup po řádcích a dokázat udržet v paměti kvantum informací. Při větších projektech jsem musel v hlavě udržet povědomí o několika stovkách názvů a vědět k čemu přesně slouží a případně kde jsou všude využity (a to mluvím jen o proměnných a vlastních funkcích). Nehledě na tisíce dalších názvů funkcí a dalších pojmů, které si musíte pamatovat při schopnosti jakéhokoliv psaní kódu.

    Programování rozvíjí všechny druhy mentálních schopností - logiku, matematiku, analytiku, strukturu, fantazii, kreativitu. Vy sami si určíte rychlost a intezitu, kterou to do sebe začnete prát - proto také nedoporučuji platit si výukové kurzy - budou to do vás prát rychlým tempem, protože čas jsou peníze a čím víc toho do vás co nejrychleji nahustí, tím více lidí dokážou "obsloužit".

    Ze zkušenosti vím, že většina nadaných programátorů startuje na programování ve hrách, které hrajou. Dává to smysl, protože právě pomocí her člověk najde v programování zálibu, koníček a smysl. Tvoříte vlastní svět, dle svých pravidel a realizujete vaše vlastní fantazie a nápady - tak jak se vám zachce. Objevujete nové funkce postupně a základy programovacích jazyků ve hrách jsou velmi jednoduché a často stavěné na syntaxi pokročilých jazyků, takže je potom přechod na vyšší level o hodně jednodušší. Z moderních her mohu doporučit jednoznačně Arma 3 (C-like SQF), Minecraft (Java), Rust (C#) a ze starších GTA SA:MP (C-like Pawn), CS GO (Lua / C-like Pawn), Garry's Mod (Lua).

    Začátek - první krůčky

    Učte se z dokumentace dané hry (či jazyka) za pomoci experimentování, snažte se vyřešit samostatně všechny chyby, bugy či pády - tímto způsobem se dá naučit nejrychleji, nejlépe a nejzábavněji. Pokud si myslíte, že problém se prostě nedá vyřešit, zkuste kód smazat a napsat ho úplně jinak, myslete tzv. outside-of-the-box - nemějte tunelové vidění. Jako v open-world hrách i programování má více řešení. Pokud problém vyřešíte, zkuste zapřemýšlet, proč to takhle funguje a proč to předtím nefungovalo - musíte do hlavy dostat všechny tyto informace a pospojovat relevance - poté začnete psát perfektní kódy neustále.

    Stanovte si nějaký cíl - například "Naprogramuji herní mód deathmatch, s počítáním skóre a textovými efekty vítěze" - po splnění zkuste něco obtížnějšího, něco co si nedokážete představit jak v tuto chvíli naprogramovat, ale přeci jen víte, že je to realizovatelné - například "Teď se pustím do capture the flag s náhodnými událostmi ovlivňující chování hry po každé získané vlajce" - hlavou vám proběhnou myšlenky jako "Sakra jak udělám tohle, a jak támhleto?" - v tuto chvíli je potřeba se naučit takové myšlenky vyházet z hlavy, jsou zbytečné. Řekněte si, co je potřeba udělat jako první, jako druhé a udělejte to, poté se vrhněte na další věci. Je dobré si ze začátku celý plán napsat bodově do nějakého dokumentu. 

    Spoiler

    Mozek dokáže pracovat buď v analytickém režimu, který je dobrý pro programování - nebo kreativním režimu, který se využívá pro stavbu konceptu. Někteří lidé dokáží využívat oba módy v jednu chvíli, těmto já závidím, většina z nás to neumí. Když začnete míchat programování s fantazírováním, začnete psát nefunkční odpad a zamotáte si celý koncept. 

    Proto je nejlepší začít tzv. s papírem a tužkou, načrtnout koncept do dokumentu, vymyslet všemožné funkce a prvky - představit si výsledek a jak funguje, přenést tyto myšlenky "na papír" Pokud vás v průběhu psaní kódu začnou napadat nové věci - přepněte do dokumentu a chvíli se zase věnujte vymýšlením a představováním jak to celé bude fungovat. Vždy upřednostněte fantazii před analytikou.

    Programování je obrovský blokátor fantazie, po letech programování je složité se dostat z analytického režimu do toho kreativního, protože programování zabere 80% celého času vývoje produktu. Proto může být důležité naučit se využívat fantazii naplno už na samotném počátku výuky programování, udržíte si schopnost vymýšlet kreativní a inovativní věci o hodně déle a bude pro vás jednodušší přepínat.

    V případě, že se pouštíte do HTML, PHP, či jiného webového jazyka (či neherního jazyka), si místo herních módu představte například vlastní blog, e-shop, portfolio, galerii, úložiště. Můžete zkoušet naprogramovat klony známých webů - idnes, dropbox, facebook, youtube, google - cokoliv vás napadne. V tuto chvíli nejde o výsledek - ale o experimentování, které vás zocelí ve znalostech.

    Další kroky

    Pamatujte, že v momentě kdy zjistíte, že vás to nebaví, je to moc složité na pochopení, vypadá to jakoby se někdo vyblil na klávesnici, nebo to píšou asi v latině - neztrácejte motivaci, zezačátku vždy experimentujeme - můžete se zkusit učit jiný jazyk, v jiné hře, jiném nástroji - tohle není čeština nebo angličtina, pokud se naučíte jeden programovací jazyk velmi dobře, je velmi pravděpodobné, že umíte základy dalších desítek programovacích jazyků. Jazyky se můžou lišit syntaxí, způsobem zápisu, ale ve výsledku jsou si všechny velmi podobné. Dá se říct, že největší skupina jazyků se označuje C-like (vyjadřují podobnost syntaxi jazyka C [wiki]). Poté tu máme originální Python, PHP, Pascal, Fortran, Perl, LISP. Jazyky se dělí na nespočet kategorií (druhů kategorií) a struktur, které je zbytečné znát [zdroj]. V tom největším měřítku se dají všechny jazyky obalit do 5 hlavních oddílů:

    • Strojový jazyk - to jsou jedničky a nuly, bitové informace, nečitelné pro člověka, ale jediný jazyk, ve kterém pracuje jakýkoliv procesor.
    • Assembly / LLL: low-level jazyk - jazyk vytvořený zvlášť pro různé procesory, nejnižší čitelná forma kódu (Assembler je program pro překlad tohoto jazyka na strojový jazyk)
    • HLL: High-level jazyk - velmi user-friendly jazyk, který se využívá v profesní lize, tvoří se v něm hry, aplikace, nástroje, weby a všemožné další výtvory. (C, C++, C#, PHP, Java, apod.)
    • VHLL: Very-high-level jazyk - je jazyk s velkou abstrakcí, většinou je částí již hotového produktu (tvořený v HLL), například jako součást moddovacích nástrojů her (SQF pro Arma 3, Pawn pro SA:MP)
    • Dětské jazyky - existují pro výuku programování dětem, jsou naprosto jednoduché, většinou přeložené do řeči rodné země. Nabízí naprosto minimum funkcí a slouží jen jako základní vstup do světa programování. (Scratch, Blockly)

    A nebo je můžeme rozdělit do typů dle stylu programování: (Programovací paradigmata [zdroj])

    Ve výsledku jde jen o to, zapamatovat si funkce, metody, proměnné a syntax. Vše ostatní už je jen schopnost toto všechno pospojovat dohromady - tomu se říká programování.

    • Líbí se mi to! (+1) 4
  13. Zdravíčko přátelé - možná jste někdy ve svém módu řešili animace, interpolaci, či jakýkoliv plynulý pohyb předmětu či čehokoliv jiného. Dá se samozřejmě přes lineární konverzi (jejíž algoritmus najdeme ve všech jazykových podobách na internetu) zařídit ostrý pohyb z bodu A do bodu B. Pokud ale chceme zajistit plynulejší pohyb s rozjezdem a dojezdem - tedy zrychlením a zpomalením, které nebije tolik do očí - je potřeba upravit chování naší lineární konverze tak, aby buď rovnou pracovala na algoritmu, který toto bere v potaz, případně můžeme toto nasimulovat pomocí nástrojů nám svěřených.

    Nejdříve si ukážeme "hack" verzi - tedy pro mě jako absolutního nematikáře - absolutní začátek a experiment celé pseudofunkce. Příklad si uvedeme ve hře Arma 3, pro pohyb kamery v cutscéně. Arma 3 nám nabízí funkce pro lineární pohyb kamery z bodu A do bodu B - ostrou cestou. Tím je myšleno, že po spuštění funkce se kamera fixní rychlostí přesune z jejího dosavadního bodu do bodu zadaný v parametru funkce v čase také zadaném v parametru funkce:

    _cam = "camera" camCreate [0,0,0]; //Vytvořit kameru na pozici [0,0,0]
    _cam cameraEffect ["internal","back"]; //Přepnout obraz hráče do této kamery
    
    _cam camPreparePos [10,10,10]; //připravit přesun na pozici [10,10,10]
    _cam camCommitPrepared 5; //přesun trvá 5s

    Vizuálně takový přesun je sice použitelný, nicméně není plynulý a strašně neuhlazený (hlavně při pohybu na více bodů v řadě).

    Double LERP

    Ukážeme si ten nejjednodušší způsob, který vymyslí hlavně nematikář - za pomocí lineárního pohybu, který arma nabízí, můžeme nasimulovat rozjezd a dojezd pomocí zdvojeného lerpování (linearní interpolace, kterou obstará příkaz camCommitPrepared).

    //Používáme globální proměnné pro zviditelnění kamer pro skript na EachFrame
    
    V_cam = "camera" camCreate [0,0,0]; //Vytvořit kameru na pozici [0,0,0]
    V_cam cameraEffect ["internal","back"]; //Přepnout obraz hráče do této kamery
    
    V_camPos = "camera" camCreate [0,0,0]; //Vytvoří kameru využitou na pozadí pro výpočet lineráního přesunu kamery
    
    V_camLerp = addMissionEventHandler ["EachFrame", //Vytvoříme unscheduled environment spuštěný na každém vykresleném snímku
    {
      _T_pos = getPosASL V_camPos; //Vezmeme si ASL pozici kamery pro přesun
      _C_pos = getPosASL V_cam; //Vezmeme si ASL pozici vizuální kamery
      _T_pos = vectorLinearConversion [0,1,0.1,_C_pos, _T_pos]; //Provedeme lineární konverzi (lerp) s progressem 0..0.1..1 (toto zajistí efekt akcelerace)
      
      V_cam camPreparePos (ASLToATL _T_pos); //Nastavíme výslednou (interpolovanou) pozici
      V_cam camCommitPrepared 0;
    }];
    
    V_camPos camPreparePos [10,10,10]; //připravit přesun na pozici [10,10,10]
    V_camPos camCommitPrepared 5; //přesun trvá 5s
    
    sleep 5.1; //Počkáme 5s na přesun kamery + 0.1s na dokončení akcelerace naší vizuální kamery
    removeMissionEventHandler ["EachFrame", V_camLerp]; //Zničíme lerpovací skript

    Můžeme si samozřejmě napsat kompletní funkci, která využije příkaz vectorLinearConversion dvakrát a obejde tím rovnou vytvoření druhé kamery a příkaz camCommitPrepared pro přesouvací kameru. Pro jednoduchost a čitelnost skriptu (a variabilitu) jsem předal funkci takto :) 

    Pro práci s pohybem kamery (resp. pro relevantní výpočty a manipulace) využívám výhradně pozici ve tvaru ASL (Above Sea Level), protože při interpolaci ATL (Above Terrain Level) kamera při přesunu skáče dle toho jestli pod sebou zrovna nemá kopeček, či díru :) (proto zjišťuji polohy ASL a poté překládám do ATL při nastavení pozice samotné kamery - příkaz pracuje s ATL pozicemi a sám interpoluje na ASL)

    Interpolace pomocí algoritmu

    Tou "správnou" cestou by měla být pravá matematická interpolace se zahrnutím easingu už v algoritmu. Existuje mnoho různých algoritmu na ty samé pohyby - ať už jde jen o zrychlení, jen o zpomalení, či oboje - na vše je několik variant. Ukážeme si jenom tu základní - na zbytek uvádím silný zdroj: http://gizma.com/easing/

    _posA = [0,0,0]; //Nastavení bodů
    _posB = [10,10,10];
    
    _startTime = time; //Nastavení výchozího času a délky průběhu
    _endTime = _startTime + 5; //+5s
    
    _eh = addMissionEventHandler ["EachFrame", 
    {
      _progress = linearConversion [_startTime, _endTime, time, 0, 1, true]; //Převod průběhu času na range 0..1 s clamp
      _progress = _progress * _progress * (3 - 2 * _progress); //https://www.wolframalpha.com/input/?i=x+*+x+*+%283+-+2+*+x%29 (křivka pro easing-inout)
      
      _curPos = vectorLinearConversion [0,1,_progress, _posA, _posB]; //Vlastní výpočet bodu na trase (interpolace s easingem)
    }];
    
    sleep 5; //Celý pohyb i s akcelerací bude probíhat přesně 5s
    removeMissionEventHandler ["EachFrame", _eh]; 

    Kdo chce bejt absolutní fajnšmejkr, tak tu má ještě funkci pro lineární interpolaci (i když ji skoro každej engine i samotný jazyk nabízí už v nějaké matematické třídě)

    func_myLerp = 
    {
      params ["_A", "_B", "_progress"]; //Parametry funkce
      _progress = _progress max 0 min 1; //Clamp na range 0..1
      
      (_A + (_B - _A) * _progress);
    };

     

  14. Pánové, přidám i svůj názor na téma frameworků :D

    Z praxe vím, že je to celé jen o výsledné kvalitě a zároveň o částce, kterou za výsledek dostanete.. ATomas nemá pravdu v tom, že programátor by neměl používat frameworky, naopak by měl. Ale zároveň musí rozumět tomu, co se děje pod pokličkou těchto frameworků.. Je to něco jako být mechanik a opravovat auta jen podle manuálu - opravíš to, ale ve skutečnosti nemáš tucha proč se to vysralo, jak tomu předcházet a co jsi vlastně udělal pro to, aby to zase jelo.

    Programátor samozřejmě musí znát problematiku, které se věnuje, musí se v ní orientovat, mít pojem o celé syntetice kódu. Využití frameworku ve výsledku mnohonásobně urychlí práci a ušetří peníze buď klientovi, nebo přinese víc peněz programátorovi. Navíc mainstream framework testuje tisíce lidí dnes a denně, to je číslo, které ti žádný klient nezaplatí. Testují ho whitehat i blackhat inženýři, další prachy, které nikdo do klasického vývoje jen tak nevrazí. Vyvíjí ho tým profesionálů, kteří jsou ve VĚTŠINĚ případů za to ještě placeni (granty, příspěvky od firem, či programátorů, kteří jejich framework využívají). Proto si troufám tvrdit, že v dnešní době je používání frameworku nejen DOBRÝ nápad, DOBRÝ zvyk a zaběhnutá praxe, ale dává to i mnohem větší smysl, než neustále dokola stavět základy tam, kde už jich několik postaveno bylo :) 

    A zakončím to klasickým tvrzením: Víc hlav, víc ví. (A těch hlav se okolo frameworků motá neskutečné množství :) )

    • Líbí se mi to! (+1) 1
×
×
  • Create New...