Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
V Tiraně proběhl letošní Linux App Summit (LAS) (Mastodon). Zatím nesestříhané videozáznamy přednášek jsou k dispozici na YouTube.
Teda aspoň ten kterýho si vyrobíme :D ;D Ukážu vám jak si jako udělat uplně supr klon pacmana ve svobodným herním enginu godot. Kdyby měl někdo keci tak řikejte žeto máte na podporu rasistickejch nepokojů v americe ajeto jako. Já mám řikat to samý rači prej :O :D ;D ;D Taky mužeme řikat že sme tak děsně ultimultikulti že vlastě ani jako nevíme že sme namalovali blackface :O :D :D ;D
Anavíc nám nikdo ale vůůůůbec nikdo nemůže dokázat že duchové nemaj pod čepičkama uplně stejnou barvičku jako pacman :O ;D
Budeme potřebovat jeden godot hele, tři muziky, pět různejch zvuků, vobrázky a jeden font. Godot podporuje jenom *.wav a *.ogg soubory. Wav je nekomprimovanej a je lepší ho používat pro zvukový efekty a ogg který je kompromovaný zase na muziku.
stáhnout mužete takle pár supr muzik co sem k tomu jako vybrala ale jako na těch stránkách mužete najít i jiný supr hudbičky :D ale jako byl celkem problem vybrat nějakou lepšejší :D :D ;D ;D
wget -O hudbaNormalni.ogg https://opengameart.org/sites/default/files/8bit%20attempt.ogg wget -O hudbaAkcni.ogg https://opengameart.org/sites/default/files/battle1_1.ogg wget -O hudbaMenu.ogg https://opengameart.org/sites/default/files/honey-bear-loop.ogg
zvuky sou vyzobaný z tohodletoho zipu vod Little Robot Sound Factory hele. jako font sem použila paradní akaDylan hele :D ;D
Pokud se tim někdo jako nechce mazat tak celý to muže naklonovat a pak muže luštit ty mý komentáře ve zdrojáčcích hele. Nóóó a jestli jako někoho zajímá jenom ta hra samotná tak vyexportovaný pro linux tady z uložta hele a sha1sum je e9270110f45e8cc0f39696fa26fcdf895cb3a702 :O ;D
vobrázky sou přiložený tady dole ale nemusíte je stahovat se mi je podařilo s muzikou a zvukama nacpat na gitlab ale nevim jestli to tam vydrží :O :O :D :D ;D ;D kdyžtak pak někam strčim ty vybrázky ke stažení ;D
Godot je herní engine kterej vymysleli divoši z amazonský jungle nebo tam vodněkud. V godotu budem dělat toho našeho rasovýho pacmana tak k tomu něco malilinko napišu aby to jako nevypadalo že tady chci jenom věšet pacmana :O :D ;D ;D
Godot funguje na takovým zajímavým principu že je všecko jakoby uzel stromu. Vobrázek je uzel zvuk je uzel animace je uzel prostě všecko je uzel noa každej ten uzel muže mit nějaký další podřízený/děcký uzlíky pod sebou. Hra je členěná na scény a každá scéna funguje jako takovej kořenovej uzel kam se ty nody nastrkávaj.
A aby to jako nebylo málo zajímavý tak mužeme udělat instanci celý scénky i jako podřízenej uzlík v jiný scéně. Když sem si prohlížela tutorialy tak mito připadalo jakože děsně divný dělat extra scénku třeba pro výbuch kterej v průběhu hraní spawnete nejmíň 1000000000000000x ale fakt to tak jako muže uplně v pohodě fungovat a lidi to tak jako uplně normálně dělaj :O :O
Noa ty nody grafu si jakoby mezi sebou mužou posílat signály.
Sou to vlastně takový eventy na který čekaj a reagujou přijímací metody/funkce v jinejch scénách/uzlech. Každej z předdefinovanejch oběktů nějaký signály má, i uplně vobyčejnej základní uzel má signály pro to že jako byl strčenej do stromku scény, žeje ready a tak. U voběktu timeru/časovače se nám třeba jakože hóóódně hodí signál 'timeout' kterej řiká že časovač dojel nakonec, to samý u tweenu, nóóó a my pak nato mužem nějak reagovat.
Ve skriptech si pak mužeme udělat pro svý voběkty i svý vlastní signály, v tom rasovým pacmanoj třeba duchové posílaj do svý kořenový scény signál když zakleknou pacmana, pacman tam zase třeba jako posílá signál vždycky když sežere bavlněnej bobek.
Věci v godotoj nemusíme jenom naklikávat v gui editoru ale taky mužem použít skripty. Větčinou je ten skript to samý co třída oběktu. Ty napsaný skripty se chovaj dost podobně jako třídy oběktů v jinejch jazycích například mezi sebou uměj dědit a abysme je jako nějak mohli používat tak tam nějak musíme vyrobit jejich instanci.
Godot má nějakej takovej svuj skriptovací jazyk. Kdybych ho jako měla popsat, tak bych řekla žeto je python říznutej rustem a vokořeněnej javascriptem :O :D :D ;D
Piše se to skoro uplně jako python ale proměný se musej deklarovat s 'var' před ménem jako v js, funkce se nedeklarujou slovíčkem 'def' ale 'func'. Jinak jeto skoro uplně to samý jako python.
Sou tam ale voproti pythonu nějaký věci navíc. V normálním pythonu třeba jako neni žádnej switch/case ale tady maj nějakou obdobu která se menuje match podobně jako v rustu. Mužem taky psát enum, const a další zajímavý slovíčka hele (je tam toho mnóóóóóóóóóóóhem víc než jakoby ukazuju tady).
Třeba pokud za definici proměný napišete setget a zato nějaký názvy tak vámto samo k oběktu udělá gettry a settry akorátže setter funguje uplně jinak než si jako myslíte :O :O k atributům voběktů mužete přistupovat uplně přímo jako v pythonu, si to na nějaký private/protected nehraje. settrem se tady myslí funkce která je zavolaná pokuď se atribut voběktu změní z vnějšku mimo metody samotnýho voběktu.
ukázečka:
# dědění z jinýho skriptu/třídy extends "res://nejaka/cesta/Trida.gd" # název třídy # tohleto neni poviný každej ten skript se chová jako třída # má smysl když chceme přistupovat k nějakejm 'statickejm' věcem celý tý třídy class_name NejakaVec var atributTridy var inicialioizovanejAtribut = 123456 # konstruktor třídy # novou instanci děláme NejakaVec.new(pripadnej_atribut) # pokud nám stačí výchozí kterej jakoby nedělá skoro nic tak psát nemusíme func _init(bla): atributTridy = bla # funkce která se zavlá jakmile oběkt vstoupí na scénu # pokud máme před proměnejma napsaný klíčový slovíčko onready v tenhleten vokamžik se inicialeizujou func _ready(): print('obekt vstoupil na scenu :O :O') # funkce která je volaná pro všecky voběkty na scéně furt ve smyčce každým krokem hry # tamto delta je rozdíl času v sekundách vod posledního volání tý funkce func _process(delta): atributTridy = delta * inicialioizovanejAtribut # nějaká naše vlastní funkce/metoda voběktu func nejaka_funkce(atribut): # pokud je funkce poděděná jakože se menuje stejně jako funkce v rodičovským oběktu tak mužeme volat tečkou # původní funkci # pokud nevyplníme zavolá se sama skrytě .nejaka_funkce(atribut) # self jako v pythonu. jeto ukazatel oběktu na sebe samotnýho # pokud je jednoznačný že myslíme atribut/metodu toho samýho voběktu tak self psát nemusíme self.atributTridy = atribut * 2
Nějaký herní věci který se ve zdrojáčcích voběvujou často. Nenajdete je jenom v godotu se to voběvuje všude možně :O ;D
S vobrázkama je nejvíc nejrozumější pracovat jako s atlasma. Texture atlas nebo taky spritesheet je takovej věčí vobrázek kde máte všecky ty mrňavý herní vobrázky nastrkaný a znáte pozice a rozměry pomyslnejch čtevrečků který určujou kde která texturka v tom velkým obrázku je. Si myslíte že si jako přiděláváme práci ale vono to má svý vopodstatnění. Když chceme grafikou namalovat vobrázek s texturou tak ji musíme říct souřadnice na vobrazovce kde chceme malovat noa taky ji musíme dát ten vobrázek co chceme kreslit. Do grafiky muže strčit 1000000000000000000000000000000x souřadnic nějakýho voběktu s uv mapou textury za mililililililivteřinečku nóó ale s vobrázkama jeto horší a častý přepínání textur prej bejvá častej bottleneck rychlýho vykreslování. Tim atlasem ale mužem použít jednu a tu samou texturu třeba na vykreslení věčího množství různejch věcí a texturu tak třeba přenem jenom jednou :O ;D
Ta mezera ve vobrázcích mezi věcma v atlasu je děsně důležitá!!!!!!!! :O :O ten vobrázek je tam načtenej jako celek a pak se z něho vybíraj nějaký regiony který chceme vykreslovat. Noa různejma nepřesnostma v samotným děláním s floatama a se zpracováním na grafice se muže jakoby stát že se zobrazí malililinkatej kousíneček ze sousedního vobrázku. Tomudle jevu se řiká 'tile tearing' a těma mezerama to vobejdem. (ještě bude nutný jedno nastavení v editoru)
Existuje sousta dobrej i free nástrojů co uměj ze sady vobrázků vygenerovat texture atlas, já třeba na všecky ty přiložený atlasy použila FreeTexturePacker hele.
Tween toje taková věc co umí hladce 'animovat' nějakej atribut nebo atributy voběktu v průběhu nějakýho vyhrazenýho času. Řeknete mu nějakou počáteční a koncovou hodnotu nějakýho atributu a jak dlouho změna má trvat noa von vám uplně hlaďounce a plynule tu hodnotu bude měnit. Tweenu řikáme jakou chceme přechodovou funkci při měnění toho atributu noa taky easing argumentem jestli nám třeba to měnění hodnoty nemá bejt rychlejší nazačátku, nakonci, uprostřed nebo bejt úplně plynulý. Různý kombinace přechodovejch funkcí a easingu si mužeme prohlídnout třeba na tomdlentom supr taháčku hele.
V rasovým pacmanoj je třeba tween použitej na dělání kroků všech herních figurek. Strčí se do něj výchozí bod cílovej bod řekne se jak dlouho má krok trvat a tween se zapne a figurka se krásně přesune z tý počáteční souřadnice na cílovou :O ;D
No toje taková věc která dělá spousty různej mrňavejch částiček, v týhle hře je použitej u těch požárů, výbuchů a za pacmanem když sebere molotov a děsně rychle utiká. Máme tam nějakej generátor těch particlů a ten je vypouští. Každá ta vypuštěná částečka má nastavenou nějakou dobu života a pak umře a zmizí :O :O V godotu má každej ten paricle efekt vodělený samotný to vypouštění patriclů jakože emisi noa materiál těch částeček.
Pár věcí je tady ale hodně divně voproti tomu jak to jako maj jinde. Například na barevnej přechod particlu během jeho života nemůžeme použít jen tak vobyč strčení počáteční a koncový barvy, jestli jako chceme barevnej přechod udělat jednoduše musíme použít texturu s barevným gradientem. I jiný vlastnosti particlů chcete někdy měnit v průbehu jejich života jakože kam mířej jak se zvěčujou jaká je gravitace a tak. No v gui editoru si mužete naklikat nějakou takovou křivku průbehu tý hodnoty během života částečky. Ale pokuď to chcete načítat nějak externě tak si tu křivku musíte normálně namalovat bílou barvičkou na černý pozadí.
Noa jestli chytřejší zvás napadlo použít tween tak jako smůůůůůůůůůůůůůůůůůůůla my se dostanem jenom k tomu samotnýmu oběktu emitoru částiček ale né k nim samotnejm. Tweenama mužem měnit nějakou celkovou vlastnost toho efektu ale né částečky. Navíc těch částeček muže bejt najedou tisíce miliard a pro každou byste museli mit tween atoje hezký plejtvání :O ;D
a vubec particle efekty sloužej k tomu abysme mohli tohleto generování malilinkatej částeček nějakýho efektu mohli dělat lacině. Kdybysme třeba generovali nějakým svým skriptem vohromný množství spritů s nějakým chcípacím časovačem tak to výde mnóóóhem dráš :O ;D
Mapa složená z dlaždiček, z ní sou třeba dělaný stěny bludiště nebo bobky bavlnky. Využívá obrázky texture atlasů ze kterejch je herní mapa složená a člení je do stad dlaždic, jakože do tilesets. Každá dlaždička v mapě má svou souřadnici a nějaký id/popisný číslo který řiká jakej region ty textury má bejt použitej. My ji tady budeme mit jako takovou mřížku ale muže bejt klidně izometrická nebo hexagonální a tak. Zdá se že godot neumí načítat nějakou mapku dělanou třeba v Tiled hele, a má nato nějakej svuj né zrovna moc inutiutivní a dobrej editor. Podrobnej vobrázkovej návod jak tam jako udělat tile mapu je kus dole.
Pacmanové a duchové žili byli spolu v jednom velikakakánským americkým městě v usa. Pacmanové pro duchy trhali kuličky bavlnky noa duchové je zato krmili samejma smaženejma dobrotama z kuřat z Kentucky. Toje asi něco jako kuře z Vodňan pro stoupence hnutí ano. Všecko klapalo jak mělo až jednoho krásnýho dne jeden z duchů kterej v civilu dělal policajta jednoho z pacmanů trošičku víc přidusil kolínkem při uplně normální zběžný policejní kontrole propuštěnýho recidivisty a začala mela. Vostatní pacmani se v tom zašlápnutým kriminálníkoj nějak jakoby poznali a některý dostali strach žeby je taky moh nějakej duch zašlápnout, vyběhli do ulic a začali všecko podpalovat a ničit. Noa k těmhlenctěm pacmanům se začali přimíchávat i jiný pacmani, takový kterejm, je uplně volný že jeden z nich byl zašlápnutej policejním kolenem. Tyhlety druhý pacmani si prostě chtěli trošičku porabovat a nakrást. A jeden z těchletěch pacmanů jakoby bude náš hlavní herní hrdina :D
No a tak se teda jeden ten milej pacman rozhod že ukradne duchům všecku jejich balvnku co si poschovávali po městě aže ji prodá, děsně zbohatne a bude si žít taky jako nějakej starej americkej duch.
Jenže to zase jako neni tak jednoduchý, vokrádat duchy vo jejich bavlnku. Vždycky, když ji pacman nakrade nějaký množství tak si nějakej z duchů muže dodat vodvahy, vyleze z domečku a de našemu milýmu pacmanoj doslova po krku :D Pacman bavlněný bobky musí umět krást šikovně aby ho při tom nechytli a nezaklekli, to by s pacmanem byl konec :O :O v lepším případě by se vrátil na start se zápisem v rejstříku trestů nóó a když si i potřetí nedá pozor tak se duchové pořádně naštvou a kolenem pacmanoj dupnou na krk taky pořádně a s pacmanem bude uplnej konec!!!!!! :O :O jediný co po něm muže zbejt je, že si ho jiný pacmani budou připomínat tak dlouho dokavaď nějakej jinej pacman nezastíní jeho slávu tim žese nechá střelit do zad nebo zašlápnout nějak víc :O ;D
Naštěstí pro pacmana se vobčas dá ve městě najít zápalná flaška. Duchové sou hloupí a často pacmany podceňujou, myslej si že je jentak budou nahánět po městě a zašlapávat a pak sou celý vykulený když jim nějakej pacman prohodí voknem molotov. Když pacman najde a použije molotov duchové se uplně vyděsej a začnou zdrhat a ani jako nevěděj pořádně kam.
A to je vobrovská příležitost pro pacmana! Pacman muže zavzpomínat na svý africký kořeny kdy ještě jeho dědeček dělal v jungly s misionářema kanibalizmus a může si nějakýho toho ducha chytnout a pěkně si ho vopíct a sežrat že zbydou jenom jeho vytřeštěný voči.
Jako žádná legrace ta amerika dneska si myslim :O :D ;D ;D
vo co ve hře de
V bludišti je hrozně moc bobků, v našem 188, v originále 240 a pacman je chce všecky posbírat protože za každej sebranej bobek má nějaký bodíky. Na startu se vobčas voběvuje dočasnej bonus kterej když pacman sebere tak dostane nějaký body navíc.Konkrétně jeto iphone, červená krabice s logem nike a oled televize
100 bodů: 200 bodů:
300 bodů:
požžáááááááááárrr!!!!:
Všecky tyhlety věci sem ve zprávách viděla pacmany sbírat tak sem je sem strčila jako bonusy :O :D ;D ;D Iphone je za nejmíň bodů protože když ho ukradnete z vobchodu tak se sám jakoby zamkne a je z něj cihlička hele . Jako doufám žese začnou vodvolávat na ten rasizmus budou se domáhat svejch práv a budou ty mobílky chtít po applu vodemknout :D :D :D ;D
Aby to nebylo jednoduchý tak pacmana pronásledujou čtyry duchové který sou ze svýho domečku vypouštěný vždycky když pacman nasbírá určitej počet bobků a když duchové pacmana chytnou tak ho zakleknou a zabijou. Ve čtyrech rozích a vobčas uprostřed bludiště se voběvujou improvizovaný zápalný lahve jakože molotovy. Když pacman sebere molotov duchové nachvilku budou zranitelný a pacman je muže zničit a vrátit dodomečku. Noa až pacman všecky bobky posbírá tak konec levelu hra se restartuje a pokračuje se znova vod začátku na vyší vobtížnosti.
Chování duchů je skoro uplně stejný jako v originálním pacmanoj, použila sem tendleten popis tý starodávný hry hele.
Takže duchové maj tři základní druhy/režimy pohybu, rozptýlení, pronásledování a vyděšení.
No duch má nějakou svou současnou souřadnici v bludišti noa nějakou cílovou na kterou se jako snaží furt dostat. K rozhodování kterým směrem jako jít dochází jenom na křižovatkách, kromě toho existuje v bludišti několik extra křižovatek který maj vyjímku a na nich duch nesmí zatočit směrem nahoru.
Duch příde na křižovatku a za běžnejch vokolností nesmí couvat tam vodkuď přišel, takže má na víběr mezi douvma a třema sousedníma políčkama a znich si musí vybrat na který pude. Rozhoduje se jakože dost primitivním hladovým algoritmem. Vezme každý to možný budoucí políčko a změří jeho zdálenost k cíli a vybere si to políčko, kde je ta vzdálenost nejmenčí. Vubec to neznamená že vybraná cesta bude nejkratčí, často to muže bejt jako navopak :O :O
Korejec kterej toho pacmana někdy před sto lety vymyslel k tomu řikal žeby jako neměl problém udělat takovej algorimus pohybu duchů žeby hráč byl prostě bez šance akorátže tohle je hra a hráč musí mit možnost vyhrát nebo aspoň jakože dost dlouho bojovat :O ;D
Každej duch má nějak pevně stanovený nedosažitelný políčko bludiště někde v rohu herní mapky na který se furt snaží dostat. na to kdeje hráč duch kašle a jede si na to svý políčko. Noa tim žese na to políčko nikdy vživotě nedostane no tak furt krouží ve smyčce kolem překážky v bludišti.
Duch pronásleduje pacmana a snaží se ho zakleknout. Zajímavý na tom je že se každej ten duch chová uplně jinak v tom pronásledovacím režimu.
Červenej duch míří uplně napřímo na políčko na kterým právě pacman stojí a v pronásledovacím režimu na něj jakoby furt chce nějak najet.
Růžovej duch to dělá podobně jako červenej ale nemíří přímo na políčko s hráčem áále čtyry políčka od pacmana ve směru ve kterým pacman jakoby právě kouká.
Azurovej duch je ze všech těch čtyrech duchů nejmazanější. Von to teda taky neni žádnej velikej inteligent ale narozdíl vod vostatních umí dělat takovou jednoduchou predikci budoucí pozice pacmana. Jakoby se udělá vektor mezi současnou pozicí červenýho pronásledovacího ducha a mezi souřadnicí dvě políčka od pacmana v pacmanově směru. Tenhleten vektor se eště jakoby zdvojnásobí ato jako bude cílová souřadnice azurovýho ducha. Von ten lump totiž jakoby ví že budeme věčinu času utikat právě před tim červeným duchem aže jentak neubdeme kličkovat když si nějakej směr vyberem aže přibližně v tý daný oblasti bludiště se asi jako budem skovávat a krást bavlnu. Dost mu ale todleto nefunguje když je červenej duch zežranej a schovanej v duším domečku. Jak to jako bylo řešený v originále nevim možná když byl červenej duch sežranej tak pužíval způsob pohybu jinýho ducha :O :O
Voranžovej duch je znich asi nejvěčí srabík. Když je vod pacmana dost daleko tak se chová uplně stejně jako červenej duch. Jenže když se přiblíží k pacmanoj na blíž jak osum políček tak najednou změna a začne mířit do svýho kouta na rozptylovou pozici.
Nastavá když pacman sebere molotov.Duchové sou chvilku zranitelný a pohybujou se zpomaleně bludištěm a směr si na každý křižovatce vybíraj uplně náhodně. Furt ale platí pravidlo že nesměj couvat tam vodkuď na křižovatku jako přišli.
Rasovej pacman se skládá z pěti scén, ztoho je jedna vnořená jako instance v jiný. Máme tam scénku hlavního menu, samotnou herní, scénu s highscorem a scénku credits. Pátá scénka je Bludiště, ta vobsahuje ty naklikaný tiled mapy a je instancovaná v hlavní herní scéně.
Jak mezi sebou některý skripty/třídy děděj ukazuje tenhleten diagram, žádný exportovadlo takovejdlech grafů sem tam nenašla nóó tak sem to namalovala :D
Sem se to snažila udělat všecko jako skripty aby tam jako bylo co nejmíň dělání přímo s tim jejich ediorem a taky seto dalo uplně jednoduše dyštak copypastnout nóó ale editoru se jako nikdy nedá uplně 100% vyhnout. Uzly mužeme vyrábět a strkat do scén skriptem ale samotný scény si musíme vyrobit v editoru. Noa i když to jako neni uplně nemožný tak bludiště ve kterým seto všecko jako děje dělat skriptem neni moc praktický a bude lepší ho naklikat v gui editoru. Editor je taky lepšejší na dělání gui menu a taky různejch particle efektů a jinejch věcí který je prostě potřeba vidět.
Skripty sou strčený dole pod zápiskem ale jeto 2000+ řádečků toje skoro uplně stejně velký jako goldfingerův javovskej parser se 160k řádkama akorátže trošičku menčí :O :O jako číst si to tady mužete ale myslim si žeje přehlednější číst skriptíky přímo v editoru/godotu. Skripty co se menujou jako scéna se musej scéně přiřadit vlevo nahoře nebo vpravo dole takovou ikonkou co vypadá jako cár pergamenu ;D
složitější naklikávání myšičkou rači jako ukážu prstem ;D
tahlencto tam maj jakože fakt hóóódně pitomě udělaný ale když se vám to už jednou podaří tak už si to jakoby budete pamatovat a nezvořeteto :O ;D
Udělejte novou scénku a vložte do ní děckej uzel tiledMapy. Vpravým panelu v tabu inspektoru kliněte na takovýto rošoupávátko na který ukazuju a vyberte new tileSet a vyrobí vám to novou prázdnou sadu dlaždic. A teďka jako pozor!!!!!!!! ta věcička nalevo vod rozšoupávátka co má teďko nápis [prázdný] se vám změní na tlačítko který když rozklikete tak se vám dole ve spodním panelu votevře nástroj pro editaci tý sady dlaždic.
vlevo dole je uplně nenápadný tlačítko pro přidání novýho atlasu/ textury na vygenerování tý sady dlaždic. Žetoje uplně pitomí řešení si asi jako indiáni z pralesa uvědomujou protože dokaď tam nemáte žádnej vobrázek strčenej tak vás nat jak tam vobrázek dát naviguje mrňavej textík ale napsanej přes celej panel :O :D :D ;D
No prostě to jako máčkněte myšičkou a v souborovým manageru vyberte nějakej vhodnej vobrázek kterej chcete používat jako dlaždičky. Je jako celkem chaos vědět kde na sebe dlaždičky navazujou tak sem udělala takovej vobrázek abyste tam jako měli něco jako středovou vodicí čáru ;D ;D
vpravo nahoře je potřeba specifikovat případný mezery a rozestupy mezi jednotlivejma vobrázkama dlaždic. Kuli tile tearingu tam všude máme mezery nóó a ty musíme zohlednit offsetem jakože celým posunem všech dlažidček vod levýho horního okraje vobrázku nóó a separaci jakože jaký volný místo mezi dlažičkama je. Step řiká nóó jak velkým krokem se v tý sadě jak budem pohybovat.
Jak těma parametramama hejbete byste dole měli vidět jak se mění taková fialová mříška která vohraničuje tý jednotlivý dlaždičky. Až hejbání budete mit hodotý tak voznačte v tý sadě dole kurzorem mišičky všecky ty dlaždice jakože sou aktivní v tý sadě.
noa až tohleto budete mit hotový a rozkliknete si znova ten uzel tilemapy tak byste měli vidět u pravýho panýlku nástroj pro výběr atlasu a nařezanejch dlaždiček. Na dlaždičku kliknout a malovat :D ;D
v horním panelu sou různý nástroje který nám to uměj jakoby trošičku zjednodušovat.
V nastavení projektu v nabítce hlavního meníčka musíme otevřít nastavení projektu a nějaký věci v tom nastavit :D
Potřebujem vybrat hlavní scénu která se pustí hnedka při zapnutí hry
nastavíme rozlišení na tohleto číslo jakože šířku 1344 pixelů a vejšku 1792. jeto šířka a vejška tilemapy vynásobená velikostí dlaždičky + vejška panelu v herní scéně.
dole nastavíme aspect na keep aby se nám při měnění velikosti vokna nebo při různejch velikostí monitorů neměnil poměr šířka x vejška. tim čim zatodleto automatický přizpůsobování platíme jeto žese nám mužou ve vokně dělat kolem herního viewportu černý proužky ve volným místě. Sou samozdřejmě i jiný možnosti jako třeba mit celou tu věc větčí a nedůležitý věci na malejch zobrazovátkách skovávat ale todleto je nejvíc nejjednoduší :O ;D
v renderingu nastavte pixel snapping na true aby nám to hezky všecky vobrázky zarovnávalo podle pixelů. Normálně se jinak používá co nejpřesnější souřadnice danejch věcí. Nevýhoda je že různý chybičky a nepřesnosti mužou třeba mezi dlaždičkama tile mapy dělat mezery. jinde to moc neva ale tady se to projevuje jakože dost :O :O
eště přidáme skript Score.gd v tagu autoload jako singleton. To nám umožní k voběktu Skóre přistupovat furt a vodevšad a praticky to funguje tak že nám visí uplně mimo strom scény ten uzel :O ;D
extends Node2D # prostě něco co leží na dlažicový mapě # všechny uzly maj nějakou svou pozici relativní k nadřízenýmu uzlíku # pro věci co se budou pohybovat po herní dlaždicový mapě chceme znát i jejich # logickou souřadnici, jakože na kterým políčku v tý tile mapě stojej co maj před sebou a tak class_name VecNaMape # logická pozice tý věci. odpovídá pozici v tile mapě var logicka_pozice = Vector2(0,0) func _process(delta): vypocitejLogickouPozici() # oběkty maj atribut z_index kterej určue pořadí jejich vykreslování. čim je hodnota # vyší tim dřív bude node vykreslenej voproti vostatním se stejným rodičovským uzlem # tady nastavujem na ypsilonovou souradnici, čim bude oběk na vobrazovce níž, tim dřív bude # jakoby namalovanej. takle uděláme uplně primitivní iluzi nějaký perspektivy :D ;D self.z_index = self.logicka_pozice.y # funkce volaná každým krokem která aktualizujuje logickou pozici přepočtem z pozice uzlu # logická pozice pak vodpovídá nějakýmu políčku v tilemapě func vypocitejLogickouPozici(): logicka_pozice.x = ceil((self.position.x)/64)-1 logicka_pozice.y = ceil((self.position.y)/64)-1
extends 'res://skripty/VecNaMape.gd' class_name Figurka #sou to floaty ale mužeme snima hezky prasečit jakože porovnávat vectory == nebo # různý směry kerejma se muže figurka vydat const NAHORU = Vector2(0.0,-1.0) const DOLU = Vector2(0.0,1.0) const PRAVA = Vector2(1.0,0.0) const LEVA = Vector2(-1.0,0.0) const STOJI_NA_MISTE = Vector2(0.0,0.0) # dlaždicová mapa s vokrajema bludiště var okraj=null # jak dlouho figurka dělá v tweenu krok var doba_kroku=0 var atlas=null # jestli figurka právě někam de. když je tahleta proměná 'true' tak bysme jako neměli # dělat nějakej další krok var jde=false # jakej byl směr v posledním kroku var predchozi_smer=DOLU # název animací jednotlivejch akcí kroků var animace_nahoru='nahoru' var animace_dolu='dolu' var animace_prava='prava' # výška obrázku v atlasu # má smysl při generování animací var vyska_obrazku=128 # všechny animace oběktu var animace=null # tween na dělání kroků figurky var tweenKroku=null # i přes usilovný hledání se mi nepodařilo najít funcki která by jako vracela # region z atlasu podle indexu nóó tak sem to udělala takle. # předpokládám že jakoby exituje nějakej ofiko způsob kterej je víc lepší ale # nenašla sem prostě :O :O :'( :'( var sirka_atlasu=16 func textura_z_atlasu_indexem(atlas,index): var textura=AtlasTexture.new() textura.atlas=atlas textura.region = Rect2((index % sirka_atlasu) * 64, (index / sirka_atlasu) * vyska_obrazku, 64, vyska_obrazku) return textura # funkce kterou uděláme figurkou krok zadaným směrem # směr je jeden z těch čtyr vektorů nazačátku tohodletoho souboru func jdi(kam): # začnem přehrávat vodpovídající animaci k chůzi daným směrem if kam==DOLU: animace.play(animace_dolu) elif kam==NAHORU: animace.play(animace_nahoru) elif kam==PRAVA: animace.play(animace_prava) elif kam==LEVA: #todleto neni chyba!!!!! :O :O #když de figurka doleva použije se animace chůze doprava a nastavíme #flip_h na true abyse obrázek horizontálně překlopil :O ;D animace.play(animace_prava) animace.flip_h=true if kam!=LEVA: # noa když se nejde doleva tak dáme flip_h na vypnutej animace.flip_h=false # nakonec uděláme přesun tý figurky pomocí tweenu # do tweenu budem strkat realnou pozici né logickou # cílovej bod získáme vynásobením vektoru dýlkou hrany jedny flaždičky + současná realná pozice var cil = self.position + (kam*64) tweenKroku.interpolate_property(self, 'position', position, cil, doba_kroku, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) tweenKroku.start() jde = true predchozi_smer = kam # funkce co ověřuje jestli se figurka muže vydat nějakým zadaným směrem func muzu_jit(kam): #vektory mužeme takle sčítat dohromady plusem :O ;D var pozice = logicka_pozice + kam #koukneme se jestli v mapě na daný souřadnici existuje dlažička # a jestli jako jo tak tam jít nemužem return okraj.get_cellv(pozice)==TileMap.INVALID_CELL func _ready(): animace=AnimatedSprite.new() self.add_child(animace) tweenKroku=Tween.new() self.add_child(tweenKroku) tweenKroku.connect('tween_completed',self,'_on_TweenKroku_tween_completed') animace.flip_h=false #metoda která se zavolá až tween kroku zkončí #názvy funkcí který sou napojený na signály by měli mit takovejdle formát # _on_<název uzlu>_<název signálu> #musí brát tyhlencty dva argumenty # první je objekt na kterým se tween dělá a druhej je atribut kterej se mění func _on_TweenKroku_tween_completed(objekt,key): animace.stop() # teleportace když věc vyleze dírou mimo vobrazovku # mi tu figurku jakoby teleportujem na druhou stranu a uděláme další krok aby # jakože ztý druhý strany vylezla if logicka_pozice.x <= -1: logicka_pozice.x = 21 self.position.x = (logicka_pozice.x+1) * 64 - 32 jdi(predchozi_smer) elif logicka_pozice.x >= 21: logicka_pozice.x = -1 self.position.x = (logicka_pozice.x+1) * 64 - 32 jdi(predchozi_smer) else: #pokud neni figurka v teleportu muže dělat krok podle sebe jak jako chce jde = false #funkce stuj slouží k zastavení figurky abysme mohli třeba ručně změnit jeji polohu a tak # předevšim nahrubo zastavíme tween kroku a proměnou jde na false # takle zabráníme volání callbacku _on_TweenKroku_tween_completed a nějakýho dalšího co dělá s proměnou 'jde' # tyhlety věci nám třeba mužou s figurkou hejbat potom co byse nastavila jeji nová poloha a # nedělalo byto jako dobrotu :O :O func stuj(): tweenKroku.stop(self) jde=false # nastavuje názvy animací pro směry nahoru doprava a dolu # základní se tak menujou ale duch tam má třeba navíc ještě jednu sadu animací pro sežratelnej/vyděšenej stav func prepni_animaci(prefix=''): animace_nahoru=prefix+'nahoru' animace_dolu=prefix+'dolu' animace_prava=prefix+'prava'
extends 'res://skripty/Figurka.gd' # hráč dědí z figurky class_name Hrac var akce=DOLU var bobky=null var zakleknuty=false # vokrasnej particlovej efekt když pacman sebere molotov # bude se za nim dělat taková jakože hnědá šmouha jakože děsně rychle utiká :D var efekt = null var material_efektu = null # vobyčejná normální rychlost přehrávání animace a zrychlený přehrávání když sebere bonus const NORMALNI_FPS = 28.0 const AKCNI_FPS = NORMALNI_FPS * 1.3 # hráč posílá do hlavní scény signál že sebral bavlněnej bobek signal sezral_bobek # napojíme signály k scéně func napojit_signaly(koren): self.connect('sezral_bobek',koren,'_on_Hrac_sezral_bobek') # nastavování atributů budem volat opakovaně tak nepoužijem konstruktor func nastav(okraj,bobky,logicka_pozice): self.okraj=okraj self.bobky=bobky self.logicka_pozice=logicka_pozice self.position=logicka_pozice*64 + Vector2(32,32) zakleknuty=false # vygenerování jednotlivejch animací akcí animací z atlasu # kromě animací 'dolu' 'nahoru' 'prava' který by měli mit všecky věci dědicí z figurky # je tady navíc animace 'umrel' která se bude přehrávat když bude pacman zakleknutej # func vygeneruj_animace(fps): # vezmem seznam snímků animace var seznamAnimaci=animace.get_sprite_frames() # a pokuť neexistuje tak ho jakoby vyrobíme if seznamAnimaci==null: seznamAnimaci=SpriteFrames.new() seznamAnimaci.add_animation('dolu') seznamAnimaci.add_animation('nahoru') seznamAnimaci.add_animation('prava') seznamAnimaci.add_animation('umrel') var index=0 for i in range(7): seznamAnimaci.add_frame('dolu',textura_z_atlasu_indexem(atlas,i+index)) # a ještě vokonce zpátky k začátku aby nám to hezky navazovalo for i in range(1,6): seznamAnimaci.add_frame('dolu',textura_z_atlasu_indexem(atlas,(6-i)+index)) index+=7 for i in range(7): seznamAnimaci.add_frame('umrel',textura_z_atlasu_indexem(atlas,i+index)) index+=7 for i in range(7): seznamAnimaci.add_frame('prava',textura_z_atlasu_indexem(atlas,i+index)) for i in range(1,6): seznamAnimaci.add_frame('prava',textura_z_atlasu_indexem(atlas,(6-i)+index)) index+=7 for i in range(7): seznamAnimaci.add_frame('nahoru',textura_z_atlasu_indexem(atlas,i+index)) for i in range(1,6): seznamAnimaci.add_frame('nahoru',textura_z_atlasu_indexem(atlas,(6-i)+index)) seznamAnimaci.set_animation_speed('dolu',fps) seznamAnimaci.set_animation_speed('prava',fps) seznamAnimaci.set_animation_speed('nahoru',fps) seznamAnimaci.set_animation_speed('umrel',fps/4) # vypnem animaci umření loopování aby nehrála znova vozačátku když zkončí seznamAnimaci.set_animation_loop('umrel',false) animace.set_sprite_frames(seznamAnimaci) func _ready(): doba_kroku=12.0 / NORMALNI_FPS atlas=preload('res://obrazky/hrac.png') sirka_atlasu=7 vyska_obrazku=64 vygeneruj_animace(NORMALNI_FPS) # nastavíme výchozí vobrázek spritu animace.play('dolu') animace.stop() # vyrobíme si particle efekt rychlího běhání pacmana material_efektu = ParticlesMaterial.new() # vypouštet je budem furt z jednoho jedinýho bodu material_efektu.emission_shape=ParticlesMaterial.EMISSION_SHAPE_POINT # výchozá směr. budem měnit každým krokem ale :O :O # musí to vypadat že jakoby vyletujou z něj vopačným směrem než zrovinka de material_efektu.direction=Vector3(0,-1,0) # rozptyl rychlost a zvěčení částiček efektu material_efektu.spread= 5.0 material_efektu.initial_velocity=500 material_efektu.scale = 5.0 # tahleta barvička odpovídá barvičce kůže pacmana ;D ;D material_efektu.color = Color('#431811') # blbý na html kódech barviček je že tam nejde strčit alpha a my potřebujem abyto bylo trošičku průsvitný material_efektu.color.a = 0.5 efekt=Particles2D.new() efekt.amount=16 efekt.lifetime = 0.125 efekt.process_material=material_efektu efekt.texture=preload('res://obrazky/castice.png') efekt.emitting = false # efekt bude strčenej pod pacmanem aby ho částečky nepřekrejvali efekt.z_index = -1 self.add_child(efekt) func _process(delta): # pokuť je pacman zakleknutej tak už nděláme nic nemá to cenu :D ;D if zakleknuty: return # pokud se pacman nachází na logický souřadnici vodpovídající souřadnici bobku # v bludišti tak ten bobek sebere ;D # že je v mapě na daný souřadnici zistíme metodou get_cell která nám vrátí index # druhu tý dlaždiče. nóóó a jestli žádná dlažička na tom místě neni tak vrátí INVALID_CELL if bobky.get_cell(logicka_pozice.x,logicka_pozice.y)!=TileMap.INVALID_CELL: # přepnem dlažičku na invalid. tim ji z mapy vymažem bobky.set_cell(logicka_pozice.x,logicka_pozice.y,TileMap.INVALID_CELL) # a očlem signál do hlavní scény emit_signal('sezral_bobek') # vybereme požadovanej směr kterým se hráč chce vydat podle toho jakou šipku # právě drží if Input.is_action_pressed('ui_down'): akce = DOLU elif Input.is_action_pressed('ui_up'): akce = NAHORU elif Input.is_action_pressed('ui_right'): akce = PRAVA elif Input.is_action_pressed('ui_left'): akce = LEVA else: # noa jestli nerží žádnou tak pacman bude chtít pokračovat se svým předchozím směru akce = predchozi_smer # pokud máme aktivní particle efekt upravíme jeho směr aby vodpovídal vopačným směru posledního # provedenýho krůčku if efekt.emitting: efekt.process_material.direction = Vector3(-predchozi_smer.x, -predchozi_smer.y, 0) # pokud zrovinka neprobíhá krok tweenu tak vybereme nějakou akci na základě toho # jakou šipku hráč drží, jakej byl předchozí směr a jestli máme před pacmanem překážku if !jde: # todle je skutečnej směr kterým pudem var smer = null #pacman jakoby furt teda chce pokračovat stejným směrem dál na další políčko #pokud před pacmanem neni překážka nastavíme nejdřiv jako potenciální směr pacmanův předchozí if okraj.get_cell(logicka_pozice.x+predchozi_smer.x,logicka_pozice.y+predchozi_smer.y)==-1: smer=predchozi_smer #pokud bylo zmáčknutý mačkátko s šipkou a políčko v tom směru je volný pacman pude tam if okraj.get_cell(logicka_pozice.x+akce.x,logicka_pozice.y+akce.y)==-1: #jediná vyjímka je zahejbání do domečku duchů tam hráč vlízt nemuže :O ;D #pokud stojí přededveřma do domečku nemuže zahnout dolu if akce==DOLU and logicka_pozice==Vector2(10,10): pass #jinak se směr bere normálně ze šipek else: smer=akce #pokud byl určenej směr předchozíma podmínkama deme #jinak pacman zustane stát namístě :O ;D if smer!=null: jdi(smer) # zakleknutí pacmana duchem # zastavíme tween a zahrajem animaci umření func zaklekni(): self.animace.play('umrel') stuj() zakleknuty=true # vrátí stavy pacmana do výchozího stavu func oziv(): stuj() animace.play('dolu') animace.stop() zakleknuty=false jde=false predchozi_smer=DOLU normalni_rezim() # pacman má dva pomyslný režimy, akční a normální # během akčního má zrychlený přehrávání animací a kračí domu kroku a vypouští # zadní stranou ty particly func akcni_rezim(): doba_kroku=12.0 / AKCNI_FPS var seznamAnimaci = animace.get_sprite_frames() seznamAnimaci.set_animation_speed('dolu',AKCNI_FPS) seznamAnimaci.set_animation_speed('prava',AKCNI_FPS) seznamAnimaci.set_animation_speed('nahoru',AKCNI_FPS) self.efekt.emitting = true # noa navopak normální režim kdy chodí pomalejc a nic ze sebe nevypouští ;D ;D func normalni_rezim(): doba_kroku=12.0 / NORMALNI_FPS var seznamAnimaci = animace.get_sprite_frames() seznamAnimaci.set_animation_speed('dolu',NORMALNI_FPS) seznamAnimaci.set_animation_speed('prava',NORMALNI_FPS) seznamAnimaci.set_animation_speed('nahoru',NORMALNI_FPS) self.efekt.emitting = false
extends 'res://skripty/Figurka.gd' # duch dědí z figurky class_name Duch # duch má tři režimy pohybu # 'pronásledování' kdy se pohybuje nějak podle souřadice pacmana # v tom se ty různý duši lišej a každej to dělá nějak jinak # režim 'rozptýlení' kdy se pohybuje na nějakou předem danou nedosažitelnou pozici # 'pronásledování' a 'rozptýlení' se střídaj v různejch časovejch intervalech # poslední je 'vyděšenej' když pacman sežere bonus. si duch pak vybírá směr náhodně na každý křižovatce # když vyleze z domečku de vždycky doleva # duch skoro vubec necouvá jediná vyjímka je když se přepne režim duchů z 'pronásledování' nebo 'rozptýlení' do jinýho # pak couvat musí :O :O táákže jedinej režim ze kterýho když se duch jakoby přepne a nezačne couvat je 'vystrašení' # na mapě sou čtyry křižovatky ve kterejch duch nesmí při běžným rozhodování zahnout nahoru # kromě těch tří režimů z pravidel ještě jakoby musíme vošetřit situace kdy je duch sežranej a de jako domu # kdy je doma a připravenej na vypuštění nóó akdy z domečku vychází enum RezimPohybu {ROZPTYLENI, PRONASLEDOVANI, VYDESENI, DOMU, JE_DOMA, VYPOUSTENI} # duchův nastavenej aktuální režim pohybu var rezim=RezimPohybu.ROZPTYLENI # požadovanej režim pohybu # do něj se duch přepne při nejbliší možný příležitosti.toje pro situace kdy třeba # duch právě přestal bejt vystrašenej a je potřeba pokračovat tam kde jakoby přestal var pozadovany_rezim_pohybu=RezimPohybu.JE_DOMA # pozice na kterou se duch pořád jakoby snaží dostat var cilova_pozice # rozptylová pozice na kterou si duch vybere jako cílovou v režimu rozptýlení # každej duch má svou jinou rozptylovou pozici var rozptylova_pozice # logický souřadnice různejch pro ducha zajímavejch míst v bludišti const DOMECEK_POZICE=Vector2(10,13) const VYPOUSTECI_POZICE=Vector2(9,10) const POZICE_PRED_DOMECKEM=Vector2(10,10) # jestli se jako votočí po příštím kroku var otoc_se=false # reference na voběkt hráče aby duch moh vědět jestli se s nim zdrcnul var hrac=null # rychlost animace a počet jeji snímků const snimku_za_vterinu=20.0 const kolik_ma_animace_snimku=10.0 # jak moc jakože duch zpomalí když má strach žeby i u něj doma mohla přistát zápalná flaška const zpomaleni=1.2 var exploze=null # jakouže má duch barvu. má význam při vytváření instance exploze abyto jako k sobě štimovalo var barva=null # jestli duch bliká jestli je právě bliknutej kolik uteklo doby od bliknutí a jak jako bliknutí má dlouho trvat var blika=false var bliknuty=false var cas_blikani=0.0 const DOBA_BLIKNUTI=0.1 # signály co duch posílá do herní scény 'Hra.tscn' # signál když ho hráč sežere signal sezranej # signál když duch dorazí domu. signál v sobe má skovanou informaci kterejže duch to jako je signal doma(ktery) # signál kdyý zakleknul hráče signal zakleknuti # křižovatky na kterejch duch normálně nemůže zabočit nahoru var specialni_krizovatky = [Vector2(9.0,10.0),Vector2(11.0,10.0),Vector2(9.0,20.0),Vector2(11.0,20.0)] # věc co dělá že zní padaj skoro uplně náhodný čísla :O ;D var generatorNahodnychCisel = RandomNumberGenerator.new() # efekt výbuchu const VYBUCH_SKRIPT = preload('res://skripty/Exploze.gd') # napojíme posílaný signály na vodpovídající callbacky v herní scénce # ta se tam strká jako kořen ke kterýmu seto bude napojovat func napojit_signaly(koren): self.connect('sezranej',koren,'_on_Duch_sezranej') self.connect('doma',koren,'_on_Duch_doma') self.connect('zakleknuti',koren,'_on_Duch_zakleknuti') # nastavování atributů co by normálně dělal konstruktor je řešený toudletou metodou # oběkt budem několikrát přenastavovat takže mito připadá lacinější než vyrábět furt nový a nový func nastav(okraj,hrac,logicka_pozice,rezim_pohybu): self.okraj=okraj self.hrac=hrac self.logicka_pozice=logicka_pozice self.position=(logicka_pozice*64) + Vector2(32,32) self.rezim=rezim_pohybu self.pozadovany_rezim_pohybu=RezimPohybu.JE_DOMA self.cilova_pozice = VYPOUSTECI_POZICE self.predchozi_smer=Figurka.DOLU # funkce co nám z atlasu vygeneruje potřebný animace ducha # když se na vobrázek s tim atlasem duchů mrknete tak uvidíte že ty duchové sou jednak # srovnaný za sebou podle barev (dovopravdy teda jako podle názvů ale pšššt:D ;D) nóó a taky taky že # sou seřazený ty jednotlivý animace u každýho ducha pokaždý stejně # no budem je brát z toho atlasu podle počátečního indexu func vygeneruj_animace(pocatecni_index,prefix,fps): # vezmem z animace seznam animací var seznamAnimaci=animace.get_sprite_frames() # pokud jeto nulová instance nóó tak vyrobíme novou if seznamAnimaci==null: seznamAnimaci=SpriteFrames.new() # přidáme názvy animací do seznamu seznamAnimaci.add_animation(prefix+'dolu') seznamAnimaci.add_animation(prefix+'nahoru') seznamAnimaci.add_animation(prefix+'prava') # noa teďko budem přidávat samotný snímky animací var index=pocatecni_index # přidáme animaci v seznamu s vodpovídajícím názvem texturu podle indexu for i in range(6): seznamAnimaci.add_frame(prefix+'dolu',textura_z_atlasu_indexem(atlas,i+index)) # pak ještě přidáme pozpátku snímky mimo prvního a posledního aby se nám animace jakože # vracela zpátky nazačátek for i in range(1,5): seznamAnimaci.add_frame(prefix+'dolu',textura_z_atlasu_indexem(atlas,(5-i)+index)) # posunem se v tom vobrázku zvětšením indexu a berem další animaci..... index+=6 for i in range(6): seznamAnimaci.add_frame(prefix+'prava',textura_z_atlasu_indexem(atlas,i+index)) for i in range(1,5): seznamAnimaci.add_frame(prefix+'prava',textura_z_atlasu_indexem(atlas,(5-i)+index)) index+=6 for i in range(6): seznamAnimaci.add_frame(prefix+'nahoru',textura_z_atlasu_indexem(atlas,i+index)) for i in range(1,5): seznamAnimaci.add_frame(prefix+'nahoru',textura_z_atlasu_indexem(atlas,(5-i)+index)) # nakonec nastavíme rychlosti přehrávání těch animací seznamAnimaci.set_animation_speed(prefix+'dolu',fps) seznamAnimaci.set_animation_speed(prefix+'prava',fps) seznamAnimaci.set_animation_speed(prefix+'nahoru',fps) # a nastavíme je zpátky tomu voběktu animace.set_sprite_frames(seznamAnimaci) func _ready(): #bod [0,0] spritu leží v jeho středu # my chceme aby duch jakoby stál na jednom políčku a vyčuhoval jakoby nahoru #posuneme počátek o 32 teda půlku velikosti čtverečku nahoru animace.offset.y = -32 # načtem atlas všech vobrázků s duchama atlas = preload('res://obrazky/duchove.png') # atlas je širkoej šestnáct vobrázků našířku a vobrázek je vysokej 128 pixelů # tyhlety hodnoty sou důležitý aby nám jako fungovala metoda 'textura_z_atlasu_indexem()' # poděděná z rodičovský třídy 'Figurka' sirka_atlasu = 16 vyska_obrazku = 128 # krok přesunu figurky ducha nám trvá upně stejně dlouho jako doba přehraní animace kroku doba_kroku = kolik_ma_animace_snimku / snimku_za_vterinu # před používáním generátoru náhodnej šísel ho musíme jakože iniciialioizovat #jako seed je strčenej čas právě teď generatorNahodnychCisel.randomize() vygeneruj_animace(75,'sezratelnej_',snimku_za_vterinu) var seznamAnimaci=animace.get_sprite_frames() seznamAnimaci.add_animation('voci_dolu') seznamAnimaci.add_frame('voci_dolu',textura_z_atlasu_indexem(atlas,72)) seznamAnimaci.set_animation_speed('voci_dolu',1) seznamAnimaci.add_animation('voci_nahoru') seznamAnimaci.add_frame('voci_nahoru',textura_z_atlasu_indexem(atlas,73)) seznamAnimaci.set_animation_speed('voci_nahoru',1) seznamAnimaci.add_animation('voci_prava') seznamAnimaci.add_frame('voci_prava',textura_z_atlasu_indexem(atlas,74)) seznamAnimaci.set_animation_speed('voci_prava',1) animace.play('sezratelnej_dolu') barva=Color(0.0,0.0,1.0,1.0) exploze=load('res://sceny/veci/Exploze.tscn') func _process(delta): # když končí efekt molotovu tak duch zčne blikat jakože zase přepne sou barvu # z modrý na původní a bude zase pro pacmana děsně nebezpečnej if blika: #budem si skovávat do proměný cas_blikani uplinutou dobu nóó a až když # jakoby překroční nějakou tu mez tak přepnem zvhled ducha # kterej zhled je aktivní řeší jako proměná 'bliknuty' if cas_blikani<DOBA_BLIKNUTI: cas_blikani+=delta else: if bliknuty: blikni_na_normalni() else: blikni_na_sezratelnej() cas_blikani=0.0 bliknuty = !bliknuty # budem čekat na kolizi ducha s hráčem a když seto stane tak buďto duch hráče # zaklekne nóó a nebo když je duch vystrašenej tak hráč zpapá :O ;D #pokud bude zdálenost hráče a ducha menčí než dvacetina jejich velikosti budem to # jakoby považovat za kolizi těch dvou figurek # možná vás napadá žeby jako stačilo porovnávat jestli jako sou jejich logický pozice stejný # jakože jestli self.logicka_pozice==hrac.logicka_pozice. jenže vona poměrně často nastávala situace # že duch a hráč ze sousedních políček udělaj krok proti sobě ve stejnej vokamžik a normálně # jako skrz sebe projdou :O :O dělá tota skoková změna těch logickejch souřadnic # buťto bysme museli přidat nějakou logiku navíc coby jako hlídala žese to stane nóó # a nebo to udělat takle 'fyzykálně' :O ;D if self.position.distance_to(hrac.position)<12.8: # pokud je duch vyděšenej tak ho pacman muže sníst if rezim == RezimPohybu.VYDESENI: # pošlem signál do herní scény 'Hra.tscn' žeje duch sežranej pacmanem emit_signal('sezranej') # uděláme modrej výbuch a dáme ho do stromu var bum = VYBUCH_SKRIPT.new(self.position,Color(0.0,0,1.0,1.0)) get_parent().add_child(bum) animace.stop() # přepnem vobrázek ducha na voči # voči nejsou žádná pořádná animace jeto jenom jeden jedinej vobrázek # pro každej ten směr self.prepni_animaci('voci_') animace.play('voci_dolu') modulate.a = 1.0 # vypnutí modulace alpha kanálu aby jakože nebyl průsvitnej # zrychlíme a pošlem domu doba_kroku = 0.25 cilova_pozice = DOMECEK_POZICE rezim = RezimPohybu.DOMU # noa jestli je duch v rozptylovacím nebo pronásledovacím režimu tak # pacmana normálně zabije :O :O :O :O # von ho teda nezabije ten duch duch jenom zase pošle signál do herní scény # a ta si to už nějak jakoby udělá :O :D ;D ;D elif rezim < RezimPohybu.DOMU: if not hrac.zakleknuty: emit_signal('zakleknuti') # zapnutí režimu rozptýlení # v něm de duch na svou rozptylovou pozici func nastav_rezim_rozptyleni(): # pokuť je duch doma de domu nebo právě vylejzá režim se zapne při příští příležitosti if rezim>RezimPohybu.VYDESENI: pozadovany_rezim_pohybu=RezimPohybu.ROZPTYLENI return # při první příležitosti se duch MUSÍ votočit a jít zpátky otoc_se=true rezim=RezimPohybu.ROZPTYLENI cilova_pozice=rozptylova_pozice #ducha jako nejde vyděsit když se skovává v domečku # nebo když je sežranej a mrtvej se vrací domu # pro vycházení jeto vymyšlený tak žeho de vyděsit jenom kdyžuž je za dveřma # teda když má stejnou ypsilonovou souřadnici jako má vypoštěcí pozice func nastav_rezim_vydeseni(): if rezim == RezimPohybu.VYPOUSTENI and logicka_pozice.y != VYPOUSTECI_POZICE.y: return elif rezim>RezimPohybu.VYDESENI: return if rezim != RezimPohybu.VYDESENI: # až vyděšení skončí se zase vrátí do předchozího režimu v jakým byl pozadovany_rezim_pohybu = rezim rezim = RezimPohybu.VYDESENI # zprůhledníme zpomalíme a votočíme modulate.a = 0.75 doba_kroku *= zpomaleni otoc_se = true else: # pokud už vyděšenej jakoby je tak akorát vypnem případný blikání blika = false #nastavíme zhlez spritu ducha na sežratelnej jakože modrý průsvitný animace blikni_na_sezratelnej() # ukončení režimu vyděšení # duch se vrátí do režimu ve kterým byl a přepne svuj zvhled na normální func ukonci_rezim_vydeseni(): if rezim != RezimPohybu.VYDESENI: return self.normalni_zhled() rezim=pozadovany_rezim_pohybu # uplně stejný jako s režimem rozptýlení func nastav_rezim_pronasledovani(): if rezim > RezimPohybu.VYDESENI: pozadovany_rezim_pohybu = RezimPohybu.PRONASLEDOVANI return otoc_se = true rezim = RezimPohybu.PRONASLEDOVANI #duch z domečku dycky de doleva #pošlem ho nalevo vod dveří a pak ať si stim nějak poradí sám func vypustit_ducha(): cilova_pozice = VYPOUSTECI_POZICE rezim = RezimPohybu.VYPOUSTENI # nastavení normálního zvhledu ducha # vypnem případný blikání průhlednost # nastavíme výchozí animace jakože 'nahoru' 'dolu' a 'prava' # a nastavíme normální rychlost pohybu func normalni_zhled(): blika = false modulate.a = 1.0 self.prepni_animaci() doba_kroku = kolik_ma_animace_snimku / snimku_za_vterinu # zapnutí blikání ducha func rozblikat(): #rozblikat mužem jenom vystrašenýho ducha if rezim == RezimPohybu.VYDESENI: blika=true bliknuty=false cas_blikani=0.0 # přepnem zvhled ducha z toho jakej právě okamžitě je na sežratelnej jakože # modrej func blikni_na_sezratelnej(): #nemůžeme blikat když je duch v domečku if rezim!=RezimPohybu.VYDESENI: return # musíme přepnou současnou aktuální animaci bez toho aby se jakoby zastavila # skováme si index/pořadí právě hranýho vokýnka animace do proměný 'okynko_animace' var okynko_animace=self.animace.get_frame() # vyberem aktivní animaci sežratelnýho ducha ze seznamu podle toho # kam jakoby má namířeno match self.predchozi_smer: NAHORU: self.animace.play('sezratelnej_nahoru') PRAVA, LEVA: self.animace.play('sezratelnej_prava') DOLU: self.animace.play('sezratelnej_dolu') # a v animaci dáme jako aktuální okýnko animace okýnko se samým pořadím/indexem # jako tam bylo předtim v tý minulý animaci # voni se ty animace překrejvaj takže to bude vypadat že ten duch jenom zněnil # svou barvičku self.animace.set_frame(okynko_animace) # pro další hraní zapnem sadu animací s perexem 'sezratelnej_' # to sou ty modrý self.prepni_animaci('sezratelnej_') func blikni_na_normalni(): #nemůžeme blikat když je duch v domečku if rezim!=RezimPohybu.VYDESENI: return # vezmeme index vokýnka právě hraný animace var okynko_animace=self.animace.get_frame() # uplně fuj způsobem ufiknem tamten substring 'sezratelnej_' z názvu animace aco # zbyde dáme hrát # ty animace se menujou uplně stejně akorátže sežratelný tam maj před názvem ten kus s podtržítkem self.animace.play(self.animace.get_animation().substr(len('sezratelnej_'))) # a u přepnutý animace dáme stejný vokýnko self.animace.set_frame(okynko_animace) # nakonec aktivujem výchozí sadu animací pro další hraní self.prepni_animaci() # s timdletim budou dělat něco až dětský třídy # každej duch si to dělá jakoby posvým a uplně jinak :O :O func urci_cil_pronasledovani(): pass # metoda kterou se duch jakože rozhoduje coje pro něj jako nejkratčí cesta k cíli # nóóóó neni moc chytrej :O :O :D ;D # duch má jedno až tři sousední políčka na který muže jít (couvat nesmí) noa zná souřadnici svýho cíle # změří euklidovskou zdálenost všech těch políček a cíle noa vybere si to políčko # kde mu to jakože vyšlo nejmíň func urci_nejkraci_smer_k_cili(): var vzdalenost=INF #tamto INF je jakože nekonečno. prostě max možná hodnota čísla var smer=null #jestli chceme jít s duchem nahoru se nejdřiv musíme kouknout jestli jako nejsle na tý nějaký extra křižovatce if predchozi_smer != DOLU and not specialni_krizovatky.has(logicka_pozice) and muzu_jit(NAHORU): vzdalenost=cilova_pozice.distance_to(logicka_pozice+NAHORU) smer=NAHORU if predchozi_smer != LEVA and muzu_jit(PRAVA): var nova_vzdalenost=cilova_pozice.distance_to(logicka_pozice+PRAVA) # pokud nemáne ještě vybranej směr nebo je nová vzdálenost menčí než předchozí tak políčko vyberem if smer == null or vzdalenost > nova_vzdalenost: vzdalenost = nova_vzdalenost smer = PRAVA if predchozi_smer != NAHORU and muzu_jit(DOLU): var nova_vzdalenost = cilova_pozice.distance_to(logicka_pozice+DOLU) if smer == null or vzdalenost > nova_vzdalenost: vzdalenost = nova_vzdalenost smer = DOLU if predchozi_smer != PRAVA and muzu_jit(LEVA): var nova_vzdalenost = cilova_pozice.distance_to(logicka_pozice+LEVA) if smer == null or vzdalenost > nova_vzdalenost: vzdalenost = nova_vzdalenost smer = LEVA return smer # funkce co zišťuje jestli duch jako muže nějakým zadaným směrem udělat krok dopředu func muzu_jit(smer): #duch nám nesmí projít jentak dveřma domečku #muže jenom když ho vypouštíme nebo se jako sežranej vrací #procházení ducha dveřma #chceme aby se dveře někdy chovali jako překážka noa někdy tam zase jako vubec nebyly #duch muže projít jenom když se vracej voči domu nebo ho vypouštíme z domečku #dveře sou na pozici (10,11) # poznámka - todleto nijak nesouvisí vobrázkem dveří v bludišti a jejich votvíráním. toje # řízený metodou objektu scény bludiste.tscn a duch nato kašle jak dveře jako vypadaj if not rezim==RezimPohybu.DOMU and not rezim==RezimPohybu.VYPOUSTENI: if smer==NAHORU and self.logicka_pozice==Vector2(10,12): return false elif smer==DOLU and self.logicka_pozice==Vector2(10,10): return false #zavoláme metodu muzu_jit() rodičovský třídy Figurky return .muzu_jit(smer) # funkce co vybere náhodnej směr kterým muže duch jít jakoby ze svý současný pozice # duch se nesmí vracet noa procházet vokrajema func nahodny_smer(): # nejdřiv naplníme pole možnejma směrama kterejma byse jako dalo jít var smery=[] if predchozi_smer!=LEVA and muzu_jit(PRAVA): smery.append(PRAVA) if predchozi_smer!=PRAVA and muzu_jit(LEVA): smery.append(LEVA) if predchozi_smer!=DOLU and muzu_jit(NAHORU): smery.append(NAHORU) if predchozi_smer!=NAHORU and muzu_jit(DOLU): smery.append(DOLU) # a vrátíme z pole náhodnej prvek return smery[generatorNahodnychCisel.randi() % smery.size()] #overriddnutej callback tweenu volanýho když skončí krok figurky #budem v něm dělat duchovu logiku func _on_TweenKroku_tween_completed(objekt,klic): #tou tečkou zavoláme tu samou metodu rodičovskýho oběktu ._on_TweenKroku_tween_completed(objekt,klic) #pokud duch vleze do dírovýho 'teleportu' na straně vobrazovky udělá eště jeden #krok ve stejným směru a nepřemejšlí kam má jít # v takovýp případě nám tween skončí if jde: return var smer=null # pokud se má duch votočit no tak prostě udělá krok vopačným směrem než předtim # a hotovo jako if otoc_se: smer = predchozi_smer * -1 otoc_se=false jdi(smer) return # výběr kroku podle režimu ve kterým duch právě jako je match rezim: RezimPohybu.VYPOUSTENI: #přepnem režim a pošlem ducha dál if logicka_pozice==VYPOUSTECI_POZICE: rezim=pozadovany_rezim_pohybu smer=predchozi_smer else: smer=urci_nejkraci_smer_k_cili() RezimPohybu.ROZPTYLENI: smer=urci_nejkraci_smer_k_cili() RezimPohybu.PRONASLEDOVANI: urci_cil_pronasledovani() smer=urci_nejkraci_smer_k_cili() # kdž je duch jenom takovejma vočima a letí děsně rychle domu RezimPohybu.DOMU: #noa až duch dorazí domu ho voživíme a pošlem z domečku na jeho rozptylovou pozici if logicka_pozice==DOMECEK_POZICE: #uděláme efekt výbuchu :D var instance=VYBUCH_SKRIPT.new(self.position,barva) get_parent().add_child(instance) # vobnovíme normální zhled a dáme vědět herní scéně žeje duch doma rezim=RezimPohybu.JE_DOMA emit_signal('doma',self) normalni_zhled() smer=urci_nejkraci_smer_k_cili() #pokud je duchdoma nebo vyděšenej tak se jenak náhodně poflakuje RezimPohybu.VYDESENI, RezimPohybu.JE_DOMA: smer=nahodny_smer() #noa nakonec uděláme krok vybraným směrem jdi(smer)
extends 'res://skripty/Duch.gd' var cervenejDuch=null #samo že mě tady napadlo udělat poděděnej konstruktor nastav() kterej by jako navíc bral # argument červenej duch nóó ale nesnese to když se poděděná metoda menuje stejně ale má # jinej počet argumentů :O :O :'( :'( func _ready(): rozptylova_pozice=Vector2(20,28) vygeneruj_animace(0,'',self.snimku_za_vterinu) barva=Color(0.0,1.0,1.0,1.0) #jdi(LEVA) # azurovej duch je lump nejvěčí!!!! :O :O # narozdíl vod vostatních duchů umí jednoduchej vodhad pacmanovi budoucí pozice # vezme se pozice pronásledovacího červenýho ducha a pozice dvě políčka před pacmanem # mezi těmadle dvouma bodama se udělá vektor jeho dýlka se zdvojnásobí # pak se přičte pozice tamtoho červenýho pronásledovacího ducha a máme cílovou pozici # azurovýho ducha func urci_cil_pronasledovani(): # dvě políčka před hráčem var pozice_hrace=hrac.logicka_pozice + hrac.predchozi_smer*2 # vektorovej výpočet (pacman-cervenej_duch)*2+cervenej_duch zjednodušíme na 2*pacman-cervenej_duch cilova_pozice=pozice_hrace*2-cervenejDuch.logicka_pozice
extends 'res://skripty/Duch.gd' func _ready(): rozptylova_pozice=Vector2(20,-2) vygeneruj_animace(36,'',self.snimku_za_vterinu) barva=Color(1.0,0.0,0.0,1.0) #červenej duch prostě pronásleduje pacmana a furt jakoby de na stejný políčko na #kterým pacman přávě stojí func urci_cil_pronasledovani(): cilova_pozice=hrac.logicka_pozice
extends 'res://skripty/Duch.gd' func _ready(): rozptylova_pozice=Vector2(0,28) vygeneruj_animace(54,'',self.snimku_za_vterinu) barva=Color('#cec545') #oranžovej duch normálně pronásleduje pacmana ale jakmile k sobě přídou blíž než na 8 #políček si vybere jako cíl svuj rozptylovej bod func urci_cil_pronasledovani(): if self.logicka_pozice.distance_to(hrac.logicka_pozice)<8: cilova_pozice=rozptylova_pozice else: cilova_pozice=hrac.logicka_pozice
extends 'res://skripty/Duch.gd' func _ready(): rozptylova_pozice=Vector2(0,-2) vygeneruj_animace(18,'',self.snimku_za_vterinu) barva=Color('#ffb8ff') # růžovej duch míří čyty políčka před hráče func urci_cil_pronasledovani(): cilova_pozice=hrac.logicka_pozice + hrac.predchozi_smer*4
extends 'res://skripty/VecNaMape.gd' class_name Bonus # existujou čtyry druhy bonusu # iphone, krabice nike televize apak molotvej koktejl enum {IPHONE,NIKE,TV,MOLOTOV} # signály hlavní scéně jestli jako přidat nějaký body nebo aktivovat vyděšenej režim duchů signal pridej_body(pocet) signal molotov var hrac=null var atlas=null var animace=null const sirka_atlasu=8 var druh=0 var pocet_bodu=0 # jóó teroreticky bysme mohli dědit metodu ztý společný třídy 'VecNaMape' když ji máme i # ve 'Figurce'. mi tam ale atlas nějak neštymuje ktý třídě 'VecNaMape' by se asi # jako měla menovat nějak jinak....... :O :O :/ :/ # než se ale jako voběktový vorientálci navzájem ňák jakoby dohodnou já už tam # budu mit metodu nahrubo copypastnutou :O :O fuj!!!! :O :O :D :D ;D func textura_z_atlasu_indexem(index): var textura=AtlasTexture.new() textura.atlas=atlas textura.region = Rect2((index % sirka_atlasu) * 64, (index / sirka_atlasu) * 64, 64, 64) return textura # každá ta věc jako má jednu animaci kdy se jakoby točí namístě :O ;D func vygeneruj_z_atlasu_animaci(prvni_snimek,posledni_snimek,nazev,fps=6): var seznamAnimaci=self.animace.get_sprite_frames() if seznamAnimaci==null: seznamAnimaci=SpriteFrames.new() seznamAnimaci.add_animation(nazev) for i in range(prvni_snimek,posledni_snimek): seznamAnimaci.add_frame(nazev,textura_z_atlasu_indexem(i)) seznamAnimaci.set_animation_loop(nazev,true) seznamAnimaci.set_animation_speed(nazev,fps) self.animace.set_sprite_frames(seznamAnimaci) # pokud je hráč na stený souřadnic a bonus je viditelnej takže sebratelnej # nóó tak ho jako seberem func _process(delta): if self.visible and hrac.logicka_pozice==logicka_pozice: sebrano() func napojit_signaly(koren): self.connect('molotov',koren,'_on_Bonus_molotov') self.connect('pridej_body',koren,'_on_Bonus_pridej_body') # konstruktor func _init(druh_bonusu,pozice,hrac): druh=druh_bonusu logicka_pozice=pozice self.hrac=hrac self.position.x=logicka_pozice.x*64+32 self.position.y=logicka_pozice.y*64+32 func nastav_druh(druh): self.druh=druh match druh: IPHONE: pocet_bodu=100 self.animace.play('iphone') NIKE: pocet_bodu=200 self.animace.play('nike') TV: pocet_bodu=300 self.animace.play('tv') MOLOTOV: self.animace.play('molotov') func _ready(): atlas=preload('res://obrazky/ruzne.png') self.animace=AnimatedSprite.new() self.add_child(self.animace) #jeto vždycky po devíti index těch vobrázků vygeneruj_z_atlasu_animaci(2,11,'iphone') vygeneruj_z_atlasu_animaci(20,29,'nike') vygeneruj_z_atlasu_animaci(29,38,'tv') vygeneruj_z_atlasu_animaci(11,20,'molotov') self.nastav_druh(self.druh) # volaný když hráč bonus sebere func sebrano(): # dáme vědět hlavní scénce if druh != MOLOTOV: emit_signal('pridej_body',pocet_bodu) else: emit_signal('molotov') #zneviditelníme oběkt jakože je sebranej self.visible=false
extends Control var rozliseni func vyrob_a_pridej_napis(font,align=Label.ALIGN_CENTER): var napis=Label.new() napis.set_size(Vector2(rozliseni.x,64)) napis.set('custom_fonts/font', font) napis.add_color_override('font_color', Color(1,0,0)) napis.align=align self.add_child(napis) return napis func _ready(): # načtem a zapnem muziku var hudba = AudioStreamPlayer.new() hudba.stream=preload('res://zvuky/hudbaMenu.ogg') self.add_child(hudba) hudba.play() var obrazek=Sprite.new() obrazek.texture=preload('res://obrazky/main_menu.png') var sirka = 1344 var vyska = 1792 var velikostObrazku=obrazek.texture.get_size() obrazek.centered=false obrazek.set_scale(Vector2(sirka/velikostObrazku.x, vyska/velikostObrazku.y)) self.add_child(obrazek) #načtem *.ttf fonty var font_titulku = DynamicFont.new() font_titulku.font_data = load('res://fonty/font.ttf') font_titulku.size = 96 font_titulku.outline_size=4 font_titulku.outline_color=Color(0,0,0,1) var font_textu = DynamicFont.new() font_textu.font_data = load('res://fonty/font.ttf') font_textu.size = 30 font_textu.outline_size=3 font_textu.outline_color=Color(0,0,0,1) rozliseni=get_viewport_rect().size var titulek=vyrob_a_pridej_napis(font_titulku) titulek.text='Credits' var textik=vyrob_a_pridej_napis(font_textu) textik.set_position(Vector2(0,64*9)) textik.text='V Godotu udělala Gréta volně podle \n' textik.text+='originálního pacmana vod číňana Tora Iwataniho,\n\n' textik.text+='zvuky sou vod Little Robot Sound Factory,\n www.littlerobotsoundfactory.com\n\n' textik.text+='hudba je vod TinyWorlds, Tyrfinga a Daniela Stephense,\n všecko z opengameart.org\n\n' textik.text+='font je vocaď https://fontmeme.com/fonts/akadylan-font\n\n' textik.text+='joa vobrázky sem dělala/upravovala sama,\nvšecko blender/krita/koulourpaint :D ;D' textik.text+='\n\n\npodobnost s jakoukoliv živou vosobou nebo zvířetem\n je jakože fakt čistě náhodná :O ;D\n\n' textik.text+='hra byla udělaná za účelem podpoření americkejch\nrasovejch nepokojů a pouliční civilní války\n' textik.text+='#BLEK.livesMatter!!!!!!!!!!!! :O :D :D ;D' var tlacitko_zpet=Button.new() tlacitko_zpet.set('custom_fonts/font', font_textu) tlacitko_zpet.add_color_override('font_color', Color(1,0,0,1)) tlacitko_zpet.text='Zpět' tlacitko_zpet.rect_size=Vector2(rozliseni.x/2,64) tlacitko_zpet.rect_position.x=rozliseni.x/4 tlacitko_zpet.rect_position.y=64*25 tlacitko_zpet.connect('pressed',self,'_on_TlacitkoZpet_zmacknuto') self.add_child(tlacitko_zpet) tlacitko_zpet.grab_focus() #návrat do hlavního menu func _on_TlacitkoZpet_zmacknuto(): get_tree().change_scene('res://sceny/HlavniMenu.tscn')
extends Node2D # uplně jednoduchej výbuch var efekt var casovac # konstruktor s argumentama pozicí a barvou výbuchu func _init(pozice,barva): self.position=pozice self.z_index=16 self.efekt = Particles2D.new() efekt.amount=64 efekt.lifetime=0.3 # efekt se nám pustí jenom jednou # vyhodí těch 64 particlů a další generovat nebude efekt.one_shot=true # obrázek jednotlvejch částic. nemůžem použít atlas efekt.texture=preload('res://obrazky/castice.png') var material=ParticlesMaterial.new() # částečky budem vypouštět ve směru nahoru z kruhu o poloměru 32 pixelů # materiál má defautně zapnutou gravitaci 9.8g material.emission_shape=ParticlesMaterial.EMISSION_SHAPE_SPHERE material.emission_sphere_radius=32.0 material.direction=Vector3(0.0,-1.0,0.0) #rozptyl v úhlu vypuštěnejch particlů material.spread=90.0 material.initial_velocity=128.0 material.color=barva efekt.process_material=material casovac = Timer.new() self.add_child(efekt) self.add_child(casovac) func _ready(): # začnem vypouštět efekt.emitting=true # v godotu nemá particle žádnou metodu kterou bysme jako zistili jestli efekt # má ještě nějaký živý particly a je načase voběkt vodstranit ze scény # prostě počkáme dobu delší než je doba života těch partilců takže budem mit # jistotu že už žádný particly nejsou a mužem voběkt dát do pryč ;D casovac.start(5) func _process(delta): # nemusíme jenom čekat na signály mužem koukat na zbejvající čas časovače ručně if casovac.time_left<1: queue_free()
extends Control # takže co tady jako budeme dělat :O :O # vyrobíme si jednoduchý meníčko se třema mačkátkama # jedno mačkátko začne novou hru druhý mačátko ukáže tabulku nejvyších skóre s ménama # noa poslední mačkátko ukáže credits #abyto bylo takový zajímavější tak tam strčíme obrázek pacmana kterej se jakoby přikulí ze # starny doprostředka vobrazovky a až se přikulí tak z nebe jakoby spadne obrázek titulku tý # naší hry # noa abyto nebylo takový statický tak se pacman jakoby začne houpat na místě var rozliseni var pacman=null var naklony=[20,-20] var tweenNaklaneni=null var tweenSestupuLoga=null # jak který ty kroky našeho 'inra' budou jako trvat dlouho const DOBA_ANIMACE_PRIKULENI = 1.0 const DOBA_SESTUPU_LOGA = 0.5 # si myslim že je nohem praktičtější gělat gui přímo v tom jejich editůrku ale aby jako # bylo copypastovatelný tak semho udělala ve skriptu func _ready(): # uplně nazačátku hry vynulujem počítadlo skóre Skore.skore = 0 # načtem a zapnem muziku var hudba = AudioStreamPlayer.new() hudba.stream=preload('res://zvuky/hudbaMenu.ogg') self.add_child(hudba) hudba.play() rozliseni=get_viewport_rect().size #načtem *.ttf font var font_titulku = DynamicFont.new() font_titulku.font_data = load('res://fonty/font.ttf') font_titulku.size = 48 font_titulku.outline_size=4 font_titulku.outline_color=Color(0,0,0,1) # nejdřiv na scénu strčíme obrázek pozadí by se jako vykresloval jako první a teda # jako i uplně vespod pod jinejma věcma var obrazek=Sprite.new() obrazek.texture=preload('res://obrazky/main_menu.png') var sirka = 1344 var vyska = 1792 var velikostObrazku=obrazek.texture.get_size() obrazek.centered=false obrazek.set_scale(Vector2(sirka/velikostObrazku.x, vyska/velikostObrazku.y)) self.add_child(obrazek) # všecky prvky gui budem strkat do kontejnéru kterej nám je bude v sobě hezky umisťovat a # zvěčovat na požadovaný rozměry # použijem vertikální box abynám to tlačítka jakoby rovnalo nad sebe var kontejner=VBoxContainer.new() kontejner.rect_min_size=rozliseni-Vector2(64,rozliseni.y/2) kontejner.rect_size=rozliseni-Vector2(64,rozliseni.y/2) kontejner.rect_position.x+=32 kontejner.rect_position.y=rozliseni.y/2 self.add_child(kontejner) # vyrobíme tlačítka var tlacitko_hraj=Button.new() var tlacitko_skore=Button.new() var tlacitko_credits=Button.new() # a nastrkáme je do kontejneru kontejner.add_child(tlacitko_hraj) kontejner.add_child(tlacitko_skore) kontejner.add_child(tlacitko_credits) for tlacitko in kontejner.get_children(): # iksovej rozměr nemá smysl protože vbox kontík je roztáhne na max šířku kterou muže tlacitko.rect_min_size=Vector2(0,256) # každej z prvků menu má size_flags pro vertikální a horizontální rozměr # určujou jak se prvek rozztáhne a umístí v prostoru kontejneru kterej jakoby má k dispozici # nóó a flag SIZE_EXPAND řiká mačkátkům aby se jako vertikálně rozmístili co nejdál vod sebe tlacitko.size_flags_vertical=Button.SIZE_EXPAND tlacitko.set('custom_fonts/font', font_titulku) tlacitko.add_color_override('font_color', Color(1,0,0,1)) # a dáme dlačítku hraj 'zaměření' # toje jakože ten prvek je aktivní. jeto stejný jako když někde na webu vyplňujete formulář # tak taky bejvá aktivní právě jenom jediný vyplňovátko v tom formuláři # jeto jako bysme nato třeba klikli myší # my nechcem aby hráč dával ruce pryč z klávesnice a zkoumal co jako s tim # tak tam ten focus strčíme ručně # grab_focus() funguje jenom kdyžuž je node na scéně tlacitko_hraj.grab_focus() # dáme tlačítkům popisky a signálovitý callbacky tlacitko_hraj.text='Hraj' tlacitko_hraj.connect('pressed',self,'_on_TlacitkoHraj_pressed') tlacitko_skore.text='Nejvyší skóre' tlacitko_skore.connect('pressed',self,'_on_TlacitkoSkore_pressed') tlacitko_credits.text='Credits' tlacitko_credits.connect('pressed',self,'_on_TlacitkoCredits_pressed') # přidáme logo var logo=Sprite.new() logo.texture=load('res://obrazky/pacman_logo.png') logo.centered=false logo.position=Vector2(0,-500) self.add_child(logo) # a necháme ho spadnout tweenSestupuLoga=Tween.new() tweenSestupuLoga.interpolate_property ( logo, 'position', logo.position, Vector2(0,0), DOBA_SESTUPU_LOGA, Tween.TRANS_ELASTIC, Tween.EASE_IN_OUT) add_child(tweenSestupuLoga) # přidáme vobrázek velikýho pacmana pacman=Sprite.new() pacman.texture=load('res://obrazky/pacman_big.png') pacman.centered=true self.add_child(pacman) # s velikakakánským pacmanem budou pracovat hnedka tři tweeny # tween naklánění kdy se pacman jakoby bude houpat zestrany nastranu tweenNaklaneni=Tween.new() add_child(tweenNaklaneni) tweenNaklaneni.connect('tween_completed',self,'_on_tweenNaklaneni_completed') # tween posunu kdy pcman jakoby přijede zestrany doprostředka vobrazovky var tweenPosunu=Tween.new() add_child(tweenPosunu) tweenPosunu.interpolate_property ( pacman, 'position', Vector2(-128,rozliseni.y/2-138), Vector2(rozliseni.x/2,rozliseni.y/2-138), DOBA_ANIMACE_PRIKULENI, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) tweenPosunu.start() # a tween točení abyse pacman jakoby při tom přesunu kutálel :D var tweenToceni=Tween.new() add_child(tweenToceni) tweenToceni.connect('tween_completed',self,'_on_tweenPosunu_completed') # rotaci voběktů mužem nastavovat radiánama ale i přímo vobyč úhlama ve stupních tweenToceni.interpolate_property ( pacman, 'rotation_degrees', -360, 0, DOBA_ANIMACE_PRIKULENI, Tween.TRANS_LINEAR, Tween.EASE_OUT_IN) tweenToceni.start() func _on_tweenPosunu_completed(objekt,klic): # posuneme počátek spritu dolu # toje bod středu rotace tý věci pacman.offset.y=-128 # a vokolik sme počátek posunuli dolu vo tolik posunem voběkt nahoru # aby nám neklesnul dolu pacman.position.y+=128 # noa rozhoupem ho a schodíme dolu logo tweenSestupuLoga.start() start_tweenNaklaneni() func start_tweenNaklaneni(): tweenNaklaneni.interpolate_property ( pacman, 'rotation_degrees', pacman.rotation_degrees, naklony[1], 1.0, Tween.TRANS_CUBIC, Tween.EASE_IN_OUT) tweenNaklaneni.start() func _on_tweenNaklaneni_completed(object, key): # vždycky když se pacman dohoupne tak se prohoděj ty úhly v náhlonech a zase se bude # naklánět na vopačnou stranu naklony.invert() start_tweenNaklaneni() # nakonec callbacky těch tlačítek na přepínání scén ;D func _on_TlacitkoHraj_pressed(): get_tree().change_scene('res://sceny/Hra.tscn') func _on_TlacitkoSkore_pressed(): get_tree().change_scene('res://sceny/KonecHry.tscn') func _on_TlacitkoCredits_pressed(): get_tree().change_scene('res://sceny/Credits.tscn')
extends Node2D var zivotu=3 var sezranejch_bobku=0 var level=0 #za každýho sežranýho ducha ve stejným režimu vystrašení je násobně víc bodů než za předchozího # tadleta proměná je počítadlo sežranejch duchů var combo_sezranejch=0 # z duchovního domečku vypustíme ducha žvdycky když hráč sežere několikátej bobek const KOLIK_BOBKU_NA_VYPUSTENI = 20 var sezranejch_bobku_na_vypusteni = 0 var hrac=null var okraj=null var bobky=null var bludiste=null var pozice_bobku=null #políčko kde začíná hráč const START = Vector2(10,20) var panel=null var duchove=[] var duchove_doma=[] #boužel nejde deklarovat víc proměnejch na jednom řádečku jakože var a=0,b=0,c=0 # musí se každá vzlášť :O :'( var cervenejDuch=null var azurovejDuch=null var oranzovejDuch=null var ruzovejDuch=null # na startu se občas oběvuje mizící sebratelnej bonus # muže to bejt novej iphone krabice s botama nike nová televize nebo molotovovej koktejl # za první tři sou extra body nóó a molotova se duchové děsně bojej var casovacBonusu=null var bonus=null var druh_bonusu=Bonus.IPHONE # +- v rozích herní mapky sou umístěný čtyry molotovy který když se dostanou pacmanoj do rukou # tak dostanou duchové pěknej strach :O ;D var molotovy=[null,null,null,null] const SOURADNICE_MOLOTOVU=[Vector2(1,20),Vector2(19,20),Vector2(1,3),Vector2(19,3)] var casovacVystraseni=null const DOBA_VYSTRASENI=10 var casovacBlikani=null const KDY_ZACNE_BLIKAT=DOBA_VYSTRASENI * 0.9 var casovacRezimu=null var kolikata_zmena_rezimu=0 var trvani_rezimu_rozptyleni=20 var trvani_rezimu_pronasledovani=20 #časovač vypouštění duchů # vždycky koukne jestli sou nějaký sežraný duchové vrácený domu a kdyžtak jednoho pusí ven #var casovac_vypousteni=null #const DOBA_VYPOUSTENI=30 # časovač restartu hry po tom co byl hráč zakleknutej některým duchem # nemůžeme hru zastavit a zapnout znova hnedka musíme nechat hráče pochopit cose jako stalo var casovacZakleknuti=null const DOBA_ZAKLEKNUTI=2.0 # sem si budeme skovávat instance požárů abysme je mohli rychle uhasit když restartujem level var pozary = [] var generator_nahodnych_cisel # načtem jednotlivý skripty/třídy by sme jako mohli dělat instance těch oběktů const HRAC_SKRIPT = preload('res://skripty/Hrac.gd') const AZUROVEJ_DUCH_SKRIPT = preload('res://skripty/AzurovejDuch.gd') const CERVENEJ_DUCH_SKRIPT = preload('res://skripty/CervenejDuch.gd') const ORANZOVEJ_DUCH_SKRIPT = preload('res://skripty/OranzovejDuch.gd') const RUZOVEJ_DUCH_SKRIPT = preload('res://skripty/RuzovejDuch.gd') const PANEL_SKRIPT = preload('res://skripty/Panel.gd') const BONUS_SKRIPT = preload('res://skripty/Bonus.gd') const POZAR_SKRIPT = preload('res://skripty/Pozar.gd') const ZACATEK_KOLA_SKRIPT = preload('res://skripty/ZacatekKolaText.gd') #zvuky var zvukBobek=null var zvukBonus=null var zvukSezraniDucha=null var zvukZakleknuti=null #hudba var hudbaNormalni = null var hudbaAkcni = null #strčí duchy a hráče zpátky na start a jakoby znovu nastaví jejich stavy func start_figurek(bludiste): # červenej duch začíná přededveřma duchovního domečku a de hnedka doleva cervenejDuch.nastav(okraj,hrac,Duch.POZICE_PRED_DOMECKEM,Duch.RezimPohybu.VYPOUSTENI) cervenejDuch.vypustit_ducha() # růžovej duch začíná v domečku ale hnedka ho vopouští ruzovejDuch.nastav(okraj,hrac,Duch.DOMECEK_POZICE,Duch.RezimPohybu.VYPOUSTENI) # voranžovej a azurovej duch zatim nervózne přešlapujou doma a čekaj až pacman sežere dost bobků # a tim budou puštěný ven oranzovejDuch.nastav(okraj,hrac,Duch.DOMECEK_POZICE-Vector2(1,0),Duch.RezimPohybu.JE_DOMA) azurovejDuch.nastav(okraj,hrac,Duch.DOMECEK_POZICE+Vector2(1,0),Duch.RezimPohybu.JE_DOMA) #azurovej duch při pronásledování prostě jako musí vědět kde je červenej duch tak si drží jeho referenci azurovejDuch.cervenejDuch=cervenejDuch #růžovej duch začíná v domečku ale jako právě vypuštěnej ven :O :O ruzovejDuch.vypustit_ducha() bludiste.otevri_dvere() #naši duši si vždycky vybíraj novej krok v 'callbacku' kterej je volanej při ukončení kroku #aby se jako začali hejbat musíme do nich jakože drcnout a ručně zavolat ten callback #argumenty callbacku maj smysl když je volanej z rodičovský třídy Ducha Figurky tady nemaj smysl a #je bezpečný nam nastrkat null for duch in duchove: duch._on_TweenKroku_tween_completed(null,null) duch.nastav_rezim_rozptyleni() #v pravidlech je že když se přepne režim duchů z rozptýlenýho nebo pronásledovacího # tak vokamžitě měnej směr na vopačnej než šli # my ale uplně nazačátku chceme aby nám červenej duch pokračoval furt doleva (rudý a levá tode dohromady ;D) # a současně chceme začít v rozptylovacím režimu pohybu. # prostě červenýmu duchoj přepnem tamtu proměnou co dělá že se v příštím kroku otočí a jeto :O ;D # cervenejDuch.otoc_se=false hrac.nastav(okraj,bludiste.get_node('Bobky'),START) #dáme azurovýho a voranžovýho ducha dodomečku duchove_doma = [ azurovejDuch, oranzovejDuch ] # restart různejch časovačů co tam jako máme func spustit_casovace(): casovacBonusu.start(30) casovacRezimu.paused=false #metoda start nepřepne pauznutej stav musí se ručně casovacRezimu.start(trvani_rezimu_rozptyleni) kolikata_zmena_rezimu=0 #muže nám jet blikání a vystrašení takže je jako zastavíme i když třeba zrovna teďko nejedou casovacVystraseni.stop() casovacBlikani.stop() # sou tady dvě podobný funkce 'restartuj level' a 'nový level' # restart vrátí figurky duchů a hráče nazačátek # noa novej level udělá level uplně vod začátku jako včetně tohodletoho vracení ale # taky vobnoví rozmístění bobků a malotovů na mapě a tak # restart se nevolá jenom nazačátku levelu ale taky když hráč umře aje vrácenej na start func restartuj_level(): # zastavíme možný právě probíhající tweeny kroků u všech duchů aby nám jejich metoda # _on_TweenKroku_tween_completed nepokazila nastavený stavy a pozice for duch in duchove: duch.stuj() duch.normalni_zhled() # nastartu muže ležet bonus tak ho skováme bonus.visible=false # a restartujem jeho druch druh_bonusu=Bonus.IPHONE # vynulujem počítadlo bobků pro vypouštění duchů sezranejch_bobku_na_vypusteni=0 # vrátíme figurky do jejich počátečních stavů start_figurek(bludiste) # pustíme časovače od začátku spustit_casovace() #zavoláme metodu hráče která ho vrací do výhozího stavu hrac.oziv() var priprava_text=ZACATEK_KOLA_SKRIPT.new() self.add_child(priprava_text) hudbaAkcni.stop() hudbaNormalni.play() bludiste.nastav_praporek_usa() # TODO: tenhleten kousek kódu dělal že se to někdy seklo :o :o # patrně souvisí s bugem https://github.com/godotengine/godot/issues/32383 # vopraveno bude prej až v 4.0 godotoj :/ :/ # uhasíme možný požáry """ for pozar in pozary: # kouken jestli je instance požáru validní # jakože neni null nebo už připravená na vodstranění if is_instance_valid(pozar): pozar.queue_free() pozary = [] """ func novy_level(): restartuj_level() # obnovíme rozmístění bobků v bludišti for pozice in pozice_bobku: bobky.set_cellv(pozice,0) # sežranejch bobků má pacman zase nuličku :O :'( # bude je muset spapat všecky uplně znova :O :O sezranejch_bobku=0 # znova uděláme molotovy sebratelný for molotov in molotovy: molotov.visible=true level+=1 # s každým levelem bude rozptylovací režim duchů kratčí a prodásledovací víc delší trvani_rezimu_pronasledovani = 18 + (level * 2) trvani_rezimu_rozptyleni = 10 + (10 / level) panel.nastav_level(level) func nacti_zvuky(): # načtem hudby a zvuky # používám load namísto preload # load normálně načte nějakou věc za běhu nóó a # preload jakoby za času kompilace takže seto jakoby dovopravdicky neloaduje # ale někte toje v tý binárce jako už načtený předem zvukBobek=AudioStreamPlayer.new() zvukBobek.stream=load('res://zvuky/bobek.wav') self.add_child(zvukBobek) zvukBonus=AudioStreamPlayer.new() zvukBonus.stream=load('res://zvuky/bonus.wav') self.add_child(zvukBonus) zvukSezraniDucha=AudioStreamPlayer.new() zvukSezraniDucha.stream=load('res://zvuky/sezraniDucha.wav') self.add_child(zvukSezraniDucha) zvukZakleknuti=AudioStreamPlayer.new() zvukZakleknuti.stream=load('res://zvuky/zakleknuti.wav') self.add_child(zvukZakleknuti) hudbaNormalni=AudioStreamPlayer.new() hudbaNormalni.stream=load('res://zvuky/hudbaNormalni.ogg') self.add_child(hudbaNormalni) hudbaAkcni=AudioStreamPlayer.new() hudbaAkcni.stream=load('res://zvuky/hudbaAkcni.ogg') self.add_child(hudbaAkcni) func _ready(): # vyrobíme si generátorek náhodnejch čísel a ziniciealizujeme ho generator_nahodnych_cisel = RandomNumberGenerator.new() generator_nahodnych_cisel.randomize() nacti_zvuky() panel=PANEL_SKRIPT.new() self.add_child(panel) # vyrobíme časovače a napojíme jejich signály a callbacky casovacBlikani=Timer.new() self.add_child(casovacBlikani) casovacBlikani.connect('timeout',self,'_on_CasovacBlikani_timeout') #tamten parametr one_shot řiká že časovač se pustí jenom jednou #výchozí hodnota je false a znamená to že se časovač pouští dokolečka pořád znova casovacBlikani.one_shot=true casovacVystraseni=Timer.new() self.add_child(casovacVystraseni) casovacVystraseni.connect('timeout',self,'_on_CasovacVystraseni_timeout') casovacVystraseni.one_shot=true casovacRezimu=Timer.new() self.add_child(casovacRezimu) casovacRezimu.connect('timeout',self,'_on_CasovacRezimu_timeout') casovacRezimu.one_shot=true casovacBonusu=Timer.new() self.add_child(casovacBonusu) casovacBonusu.connect('timeout',self,'_on_CasovacBonusu_timeout') casovacZakleknuti=Timer.new() self.add_child(casovacZakleknuti) casovacZakleknuti.connect('timeout',self,'_on_CasovacZakleknuti_timeout') casovacZakleknuti.one_shot=true # načtem scénu bludište a umístime ji jako instanci do stromu var scene = load('res://sceny/Bludiste.tscn') bludiste=scene.instance() # posuneme bludiště o vejšku panelu dolu bludiste.position.y=64 # budem potřebovat dlaždicovou mapu okraje okraj=bludiste.get_node('DlazdicovaMapa') # a dlaždicovou mapu s bobkama bavlny bobky=bludiste.get_node('Bobky') self.add_child(bludiste) # zapamatujeme si výchozí rozmístění všech bobků # vždycky když bude dohranej level je potřeba bobky zase vobnovit # a je škoda kuli tomu načítat celou bobkovou scénku znova :O ;D pozice_bobku=bobky.get_used_cells() # vyrobíme zapojíme a přidáme herní figurky ;D hrac=HRAC_SKRIPT.new() bludiste.add_child(hrac) hrac.napojit_signaly(self) cervenejDuch=CERVENEJ_DUCH_SKRIPT.new() duchove.append(cervenejDuch) oranzovejDuch=ORANZOVEJ_DUCH_SKRIPT.new() duchove.append(oranzovejDuch) ruzovejDuch=RUZOVEJ_DUCH_SKRIPT.new() duchove.append(ruzovejDuch) azurovejDuch=AZUROVEJ_DUCH_SKRIPT.new() duchove.append(azurovejDuch) for duch in duchove: bludiste.add_child(duch) duch.napojit_signaly(self) # v bludišti se vobčas udělá na startu dočasnej mizicí bonus bonus=BONUS_SKRIPT.new(druh_bonusu,START,hrac) bonus.napojit_signaly(self) bludiste.add_child(bonus) # v bludišti sou na čtyrech místech trvalý nemizicí molotovy koktejly for i in range(4): var molotov=BONUS_SKRIPT.new(Bonus.MOLOTOV,SOURADNICE_MOLOTOVU[i],hrac) molotov.napojit_signaly(self) bludiste.add_child(molotov) molotovy[i] = molotov novy_level() for _i in range(zivotu): panel.pridej_zivot() # signál posílanej z instance hráče ždycky když sežere bavlněnej bobek func _on_Hrac_sezral_bobek(): sezranejch_bobku+=1 Skore.skore+=10 panel.nastav_skore(Skore.skore) zvukBobek.play() # v bludišti je maximálně 188 bobků # když je pacman všecky sní tak vyhrál a začne novej level if sezranejch_bobku == 188: novy_level() return # pokud je doma skovanej nějakej duch tak započítáme bobek na jeho vypuštění if len(duchove_doma) > 0: sezranejch_bobku_na_vypusteni += 1 # noa jestli máme dost vypouštěcích bobků tak vypustíme ducha a počítadlo restartujem # ducha vypouštíme jenom když neni režim vyděšení. to poznáme podle toho jestli je timer měnění # režimu pauznutej nebo ne if sezranejch_bobku_na_vypusteni >= KOLIK_BOBKU_NA_VYPUSTENI and not casovacRezimu.paused: #pop_front odstraní z pole první prvek a vrátí nám ho #pokud je pole prázdný vrací null var duch = duchove_doma.pop_front() if duch != null: duch.vypustit_ducha() bludiste.otevri_dvere() sezranejch_bobku_na_vypusteni -= KOLIK_BOBKU_NA_VYPUSTENI # chytá signál posílanej duchem když se mu podaří zakleknout pacmana # konec levelu neni vokamžitej ale až v timeoutu časovače zakleknutí # máto ten smysl abysme nejdřiv nechali doběhnout animaci zakleknutýho pacmana func _on_Duch_zakleknuti(): zvukZakleknuti.play() hrac.zaklekni() zivotu-=1 panel.odeber_zivot() casovacZakleknuti.start(DOBA_ZAKLEKNUTI) # chytá signál z bonusu když ho hráč sebere a bonus chce přidat body # teoreticky bysme tohleto mohli dělat rovnou z bonusu mě tak napadá ale couž :O :/ func _on_Bonus_pridej_body(bodu): Skore.skore+=bodu panel.nastav_skore(Skore.skore) zvukBonus.play() # se zavolá když se pacmanoj dostane do rukou molotov func _on_Bonus_molotov(): #uděláme nějakej zvukovej efekt # mužete si pro to najít nějakej zvuk extra já sem děsně eko jak jako víte no tak sem # zreciklovala už jednou použitej zvuk sežrání ducha :D ;D zvukSezraniDucha.play() # jestli ještě nehraje akční hudba tak ji na akční přepnem # zastavíme normální a pustíme tu akční :D if not hudbaAkcni.playing: hudbaNormalni.stop() hudbaAkcni.play() # uděláme duchy vyděšenejma for duch in duchove: duch.nastav_rezim_vydeseni() # přepnem hráče do akčního režimu hrac.akcni_rezim() # zapneme blikání pacmaního praporku misto tamtoho staroamerickýho bludiste.nastav_praporek_blm() # když pacman sebere molotova tak to tam všecko kolem sebe jakoby trošičku podpálí :O :O :D :D ;D # zkusíme podpálit čtvereček 11x11 políček kolem hráče s tim že budem podpalovat jakoby # jenom plíčka kde je kostička okraje bludiště a vždycky si navíc hodíme korunou jestli totam # podpálíme aby to jako vypadalo přirozenějc :O ;D for x in range(-5,5): for y in range(-5,5): var logicka_souradnice_pozaru=Vector2(x,y)+hrac.logicka_pozice if not okraj.get_cellv(logicka_souradnice_pozaru) == TileMap.INVALID_CELL: #vygenerujem si náhodný číslo od nuly do jedný a kouken jestli je menší než 0.5 # toje skoro jako házet korunou jakože 50% šance if generator_nahodnych_cisel.randf() < 0.5: var pozar=POZAR_SKRIPT.new() # přepočítáme logickou souřadnici požáru na souřadnici v mapě přidáme (32,32) # aby jako požár byl vycentrovanej uprostřed kostičky naší herní mapy # dobu trvání dáme náhodně mezi pěti a deseti sekundama (uvnitř ve třídě plus jednu za dobu vypínání) pozar.nastav(logicka_souradnice_pozaru*64 + Vector2(32,32),generator_nahodnych_cisel.randf_range(4.0,8.0)) bludiste.add_child(pozar) #pozary.append(pozar) # vypneme časovač kterej mění rozptylovací a pronásledovací režim casovacRezimu.paused=true # a pustíme vodpočet zkončení toho režimu vystrašení # a taky začátek blikání který jako hráčoj řiká žeto vystrašení brzy skončí ;D casovacVystraseni.start(DOBA_VYSTRASENI) casovacBlikani.start(KDY_ZACNE_BLIKAT) # chytá signál posílanej z ducha když je sežranej func _on_Duch_sezranej(): zvukSezraniDucha.play() # je tady bonus za kombo sežranejch duchů # za prvního 200, za druhýho 400, pak 800 a 1600 Skore.skore+=200 * pow(2,combo_sezranejch) panel.nastav_skore(Skore.skore) combo_sezranejch+=1 # tendleten callback je volanej ždycky když duch orazí domu # signál posílá informaci kterejže duch to právě jako dorazil domu func _on_Duch_doma(ktery): duchove_doma.append(ktery) zvukSezraniDucha.play() # chytá signál z časovače měnění režimu func _on_CasovacRezimu_timeout(): kolikata_zmena_rezimu+=1 #pokud je změna režimu lichá, přepnem duchy do režimu rozptýlení if kolikata_zmena_rezimu % 2 == 0: for duch in duchove: duch.nastav_rezim_rozptyleni() casovacRezimu.start(trvani_rezimu_rozptyleni) #pokud sudá do pronásledování else: for duch in duchove: duch.nastav_rezim_pronasledovani() casovacRezimu.start(trvani_rezimu_pronasledovani) # každý příští přepnutí do pronásledování bude o počet levelů *2 sekund delší aby # jakoby rostla vobtížnost #v originále jeto složitější trvani_rezimu_pronasledovani += level * 2 func _on_CasovacBonusu_timeout(): # pokud bonus neexistuje tak ho vyrobíme a dáme na start noa jestli jako existuje # tak ho jakoby zničíme if not bonus.visible: #pokud je hráč nastartu když tam chceme šoupnout bonus nóó tak prostě #vteřinku počkáme a zkusíme to znova. jinak by nám to rovnou sebral ten bonus if hrac.logicka_pozice == START: casovacBonusu.start(1) return bonus.nastav_druh(druh_bonusu) bonus.visible=true if druh_bonusu<Bonus.MOLOTOV: druh_bonusu+=1 else: druh_bonusu=Bonus.IPHONE casovacBonusu.start(15) else: bonus.visible=false casovacBonusu.start(45) # skončení režimu vystrašení func _on_CasovacVystraseni_timeout(): # zase zapnem přepínací časovač režimu a vynulujem kombo sežranejch duchů casovacRezimu.paused=false combo_sezranejch=0 # pustíme normální muziku hudbaNormalni.play() hudbaAkcni.stop() # hráče přepnem do normálního režimu hrac.normalni_rezim() # uprostřed bludiště zase aktivujem staroamerickej praporek bludiste.nastav_praporek_usa() for duch in duchove: duch.ukonci_rezim_vydeseni() # dává nám vědět se vyděšenej režim končí :O :O func _on_CasovacBlikani_timeout(): for duch in duchove: duch.rozblikat() # řasovač zakleknutí # hráč umřel nóó a mi buťto restartujem hru a nebo zkončíme uplně func _on_CasovacZakleknuti_timeout(): if zivotu>0: restartuj_level() else: # jestli hráč už nemá životy tak přepnem celičkej stromeček scény na scénu # s highscore get_tree().change_scene('res://sceny/KonecHry.tscn')
extends Node2D # obrázek na pozadí a jeho velikost var obrazek=null var velikostObrazku=null #rozlišení vobrazovky var rozliseni=null # velkej font titulku a menčí pro vobyč text var font_titulku=null var font_textu=null # nápis var podtitulek=null # gui prvek na vyplnění nějakýho textu var vyplnovadlo_textu=null # funkce kterou vyrobíme textovej nápis/label # nastavíme mu font barvu velikost align a strčíme ho na scénu a vrátíme jeho instanci func vyrob_a_pridej_napis(font,align=Label.ALIGN_CENTER): var napis=Label.new() napis.set_size(Vector2(rozliseni.x,64)) napis.set('custom_fonts/font', font) napis.add_color_override('font_color', Color(1,0,0)) napis.align=align self.add_child(napis) return napis # umístí na scénu gui prvky pro zapsání novýho nejvyšího skóre # vyplňování ména se skládá jenom z nápisu a vyplňovadla textu func novy_zaznam(): podtitulek=vyrob_a_pridej_napis(font_textu) podtitulek.text='Máš novej rekord!!!!\nVyplň méno a máčkni enter!!!!' podtitulek.set_position(Vector2(0, rozliseni.y*0.4)) podtitulek.align=Label.ALIGN_CENTER vyplnovadlo_textu=LineEdit.new() vyplnovadlo_textu.set_size(Vector2(rozliseni.x-128,64)) vyplnovadlo_textu.set('custom_fonts/font', font_titulku) vyplnovadlo_textu.add_color_override('font_color', Color(1,0,0,1)) vyplnovadlo_textu.set_position(Vector2(64, rozliseni.y/2)) #nastavíme maximální počet znaků ména hráče na 20 vyplnovadlo_textu.max_length=20 self.add_child(vyplnovadlo_textu) #propjíme signál zadání textu (jeto máčknutí enetru při vyplňování) s metodou _on_LineEdit_text_entered vyplnovadlo_textu.connect('text_entered',self,'_on_LineEdit_text_entered') # dáme vyplňovátku 'zaměření' vyplnovadlo_textu.grab_focus() const v_posun=512 # posun všech nápisů v tabulce dolu # umístí na scénu dvacet nápisů v párech vedle sebe vždycky název hráče a # kolik jako udělal bodů func tabulka_nejvysiho_skore(): var text_rekordu='' for index in range(10): var zaznam=Skore.tabulka_nejvysiho_skore[index] var text=str(index+1)+'. '+str(zaznam[0]) var napis=vyrob_a_pridej_napis(font_textu,Label.ALIGN_LEFT) napis.set_position(Vector2(128, index*64+v_posun)) napis.text=text napis=vyrob_a_pridej_napis(font_textu,Label.ALIGN_RIGHT) napis.set_position(Vector2(-128,index*64+v_posun)) napis.text=str(zaznam[1]) # nakonec přidáme tlačítko pro návrat na hlavní stranu var tlacitko_zpet=Button.new() tlacitko_zpet.set('custom_fonts/font', font_textu) tlacitko_zpet.add_color_override('font_color', Color(1,0,0,1)) tlacitko_zpet.text='Zpět' tlacitko_zpet.rect_size=Vector2(rozliseni.x/2,64) tlacitko_zpet.rect_position.x=rozliseni.x/4 tlacitko_zpet.rect_position.y=64*11 + v_posun tlacitko_zpet.connect('pressed',self,'_on_TlacitkoZpet_zmacknuto') self.add_child(tlacitko_zpet) tlacitko_zpet.grab_focus() func _ready(): # načtem a zapnem muziku var hudba = AudioStreamPlayer.new() hudba.stream=preload('res://zvuky/hudbaMenu.ogg') self.add_child(hudba) hudba.play() #načtem *.ttf fonty font_titulku = DynamicFont.new() font_titulku.font_data = load('res://fonty/font.ttf') font_titulku.size = 96 font_titulku.outline_size=4 font_titulku.outline_color=Color(0,0,0,1) font_textu = DynamicFont.new() font_textu.font_data = load('res://fonty/font.ttf') font_textu.size = 48 font_textu.outline_size=3 font_textu.outline_color=Color(0,0,0,1) obrazek=Sprite.new() obrazek.texture=preload('res://obrazky/game_over.png') rozliseni=get_viewport_rect().size velikostObrazku=obrazek.texture.get_size() obrazek.centered=false obrazek.set_scale(Vector2(rozliseni.x/velikostObrazku.x, rozliseni.y/velikostObrazku.y)) self.add_child(obrazek) var titulek=vyrob_a_pridej_napis(font_titulku) titulek.text='Nejvyší skóre' Skore.nacti_nejvysi_skore() # nejdřiv kouknem jestli se bude vyplňovat nový skóre do tabulky a jestli jako jo # tak umístíme na scénu prvky pro vyplnění ména hráče if Skore.ma_se_skore_pridat(): novy_zaznam() else: # jinak ukážem tabulku s nejvyšíma skórema tabulka_nejvysiho_skore() # potom co bylo potvrzený méno hráče ve vyplňovadlu textu tak přidáme to # méno do tabulky uložíme do souboru vodstraníme gui prvek vyplňovadla a podtitulek # a ukážem tabulku s highscore func _on_LineEdit_text_entered(text): Skore.pridej_skore_do_tabulky(text) Skore.uloz_nejvysi_skore() podtitulek.queue_free() vyplnovadlo_textu.queue_free() tabulka_nejvysiho_skore() #návrat do hlavního menu func _on_TlacitkoZpet_zmacknuto(): get_tree().change_scene('res://sceny/HlavniMenu.tscn')
extends Control # jako počet životů budem používat texturu s obrázkem pacmanovy čokoládový tvářičky var textura_hlavy=null # do pole 'hlavy' budem nastrkávat sprity s vobrázkem pacmanovy hlavy každá bude # reprezentovat jeden život var hlavy=[] # pozadí panelu # je to jakoby jenom takovej černej obdélníček var pozadi=null # nápisy který řikaj počet bodů a jakej je právě level var skore_napis=null var level_napis=null func _ready(): pozadi=ColorRect.new() pozadi.rect_size.x=21*64 pozadi.rect_size.y=64 pozadi.color=Color(0,0,0,1) self.add_child(pozadi) #načtem *.ttf font var dynamic_font = DynamicFont.new() dynamic_font.font_data = load('res://fonty/font.ttf') dynamic_font.size = 32 # a vyrobíme a přidáme ukazatele skóre a jakej je level skore_napis=Label.new() skore_napis.set_size(Vector2(640,64)) skore_napis.set('custom_fonts/font', dynamic_font) skore_napis.add_color_override('font_color', Color(1,0,0,1)) pozadi.add_child(skore_napis) level_napis=Label.new() level_napis.set_size(Vector2(640,64)) level_napis.set('custom_fonts/font', dynamic_font) level_napis.add_color_override('font_color', Color(1,0,0,1)) level_napis.set_position(Vector2(640,0)) pozadi.add_child(level_napis) # z atlasu si načteme podobrázek s obličejčkem pacmana var atlas=preload('res://obrazky/hrac.png') textura_hlavy=AtlasTexture.new() textura_hlavy.atlas=atlas textura_hlavy.region=Rect2(Vector2(0,0),Vector2(64,64)) # mužem nastavit nějaký výchozí hodnoty nastav_skore(0) nastav_level(1) func nastav_level(hodnota): level_napis.text='Level: '+str(hodnota) func nastav_skore(hodnota): skore_napis.text='Skóre: '+str(hodnota) # přidání života je vygenerování novýho spritu s vobrázkem hlavy a umístění ji na panel # vodebrání ji zase bude ničit func pridej_zivot(): var hlava=Sprite.new() hlava.texture=textura_hlavy hlava.position.y=32 hlava.position.x=(21-hlavy.size())*64-32 hlavy.append(hlava) add_child(hlava) func odeber_zivot(): #odstraníme poslední prvek z pole i ze stromu uzlů remove_child(hlavy.pop_back())
extends Node2D var efekt=null var casovac=null var doba_trvani=0 func nastav(pozice,doba_trvani): self.position=pozice self.doba_trvani=doba_trvani func _ready(): #vyrobíme si materiál particle efektu var material=ParticlesMaterial.new() # budem je dělat po povrchu čtverečku o hraně 32 pixelů material.emission_shape=ParticlesMaterial.EMISSION_SHAPE_BOX material.emission_box_extents=Vector3(32,32,0) # a posílat nahoru # gravitace směrem dolu už je tam zapnutá defaultně material.direction=Vector3(0,-1,0) material.initial_velocity=100 material.scale=2 # různý ty random jsou vždycky v rosahu od nuly do jedný # třeba tady to jako u každýho particlu to vybere náhodný zvětčení material.scale_random=0.5 # vždycky se náhodně u každýho particlu vybere hodnota od scale_random až k jedný # a tim se vynásobí maximální velikost v tom atributu .scale # vostatní něco_random fungujou stejně #nastavíme barevnej přechod barvy jednotlivejch částic v průběhu jejich živůtků # z textury s namalovaným gradientem material.color_ramp=preload('res://obrazky/gradient.png') efekt=Particles2D.new() efekt.amount=32 efekt.process_material=material #particle efekty v godotu boužel neuměj pracovat s AtlasTexture takže tam mužem # strčit akorát tak obyč vobrázek efekt.texture=preload('res://obrazky/castice.png') self.add_child(efekt) self.casovac=Timer.new() self.casovac.one_shot=true self.add_child(casovac) self.casovac.connect('timeout',self,'_on_casovac_skoncil') self.casovac.start(doba_trvani) # efekt budeme vypínat jakoby nadvakrát # godot nemá v particle systemu něco třeba nějakej signál kterým bysme nějak jednoduše # zistili jestli jako ještě máme na scéně nějaký částice # proto nejdřiv vypneme vyrábění novejch částic počkáme dobu jejich života nóó a # pak víme že už žádný nežijou a mužem efekt odstranit :O ;D func _on_casovac_skoncil(): if efekt.emitting: efekt.emitting=false casovac.start(1) else: self.queue_free() # Called every frame. 'delta' is the elapsed time since the previous frame. #func _process(delta): # pass
extends Node # něco jako globální statická proměná do který budem vodevšat přidávat var skore=0 # proměná co bude držet tabulku nejvyšího skóre # bude to jakoby pole o deseti záznamech noa každej ten záznam bude pole o dvou prvcích # záznam se bude zkládat z ména hráče a se skóre var tabulka_nejvysiho_skore=[] #výchozí tabulka nejviších skóre. pokud neexistuje soubor s highscore tak ho vytvoříme # s timdletim vobsahem const VYCHOZI_TABULKA=[ ['Martin, looter king',99999], ['Floyd',50000], ['Chauvinovo koleno',25000], ['Barack Hussein Obama',10000], ['Černoušek Bubu',7500], ['David Černej',5000], ['Kunta Kynte',2500], ['Zemanputinslut',1500], ['Černej pasažér',100], ['Ty!!!! ;D ;D',1] ] # pod linuxem toje ~/.local/share/godot/skore.txt # ale liší se na různejch platformách. proto tam maj tamto user:// který to jako # řeší za nás ;D const CESTA_K_SOUBORU='user://skore.txt' func uloz_nejvysi_skore(): var soubor = File.new() soubor.open(CESTA_K_SOUBORU, File.WRITE) for zaznam in tabulka_nejvysiho_skore: soubor.store_line(zaznam[0]) soubor.store_line(str(zaznam[1])) soubor.close() # načtem *.txt soubor s highscore # pokud neexistuje použijem výchozí hodnoty z 'VYCHZI_TABULKA' func nacti_nejvysi_skore(): tabulka_nejvysiho_skore=[] var soubor = File.new() if soubor.file_exists(CESTA_K_SOUBORU): soubor.open(CESTA_K_SOUBORU, File.READ) for i in range(10): var zaznam=[soubor.get_line(),int(soubor.get_line())] tabulka_nejvysiho_skore.append(zaznam) soubor.close() print(tabulka_nejvysiho_skore) else: #pokud jako soubor neexistuje načtem výchozí danou tabulku skóre tabulka_nejvysiho_skore=VYCHOZI_TABULKA #funkce co zistí jestli jako má cenu skóre zapisovat do tabulky # kouknem jestli je skóre vyší než poslední záznam func ma_se_skore_pridat(): return tabulka_nejvysiho_skore[-1][1]<skore func pridej_skore_do_tabulky(meno): var posunovany=null var novy_zaznam=[meno,skore] #budem postupovat vodzhora tabulkou a až narazíme na záznam s menčím skórem tak ho nahradíme # a původní i se zbytkem tabulky postrčíme o pozici dolu for i in range(10): var zaznam=tabulka_nejvysiho_skore[i] # pokud neposouváme tabulku hledáááme..... if posunovany == null: if skore>zaznam[1]: posunovany=tabulka_nejvysiho_skore[i] tabulka_nejvysiho_skore[i]=novy_zaznam #posuneme zbytek tabulky dolu a poslední záznam 'zahodíme' else: var pomocna=tabulka_nejvysiho_skore[i] tabulka_nejvysiho_skore[i]=posunovany posunovany=pomocna
extends Node2D # tohle je takový to logo co se zobrazuje před začátkem kola hry # v pacmanoj má vietnamec nápis 'ready' já použila znova to logo z hlavního menu # jakmile tenhleten voběkt vstoupí do stromečku scény tak na chvilku pauzne hru zahraje # znělka a logo spadne z vobrazovky a hra se zase zapne var zvukVyhra = null var obrazek = null func _ready(): # strčíme doprostředka vobrazovky self.position=get_viewport_rect().size / 2 # načtem a zahrajem znělku zvukVyhra=AudioStreamPlayer.new() zvukVyhra.stream=load('res://zvuky/vyhra.wav') # budem chytat signal dohrání znělky zvukVyhra.connect('finished',self,'_on_znelka_dohrala') self.add_child(zvukVyhra) zvukVyhra.play() # přidáme vobrázek loga obrazek=Sprite.new() obrazek.texture=preload('res://obrazky/pacman_logo.png') self.add_child(obrazek) # noa pauznem hru # potřebujem pauznout všecko nóó ale taky potřebujem # aby se nám ta hra taky nějak vopauzla protože pauznutý nody prostě nic nedělaj # timery signály _process nic z toho nejdede :O :O # naštstí uzlům mužeme nastavovat atribut pasue_mode a mužem jim na pauzu udělat vyjímku self.pause_mode = Node.PAUSE_MODE_PROCESS # pause mode u tohodle voběktu předělanej a mužem pauznout celej stromeček scény self.get_tree().paused = true # metoda co se zavolá až znělka jakoby dohraje func _on_znelka_dohrala(): # vodpauzujem celej strom self.get_tree().paused = false # uděláme si tween na schození toho loga z vobrazovky var tween_spadnuti=Tween.new() self.add_child(tween_spadnuti) tween_spadnuti.connect('tween_completed',self,'_on_tween_dojel') # tween použujem na vobrázek budem měnit jeho pozici na pozici vo hodně moc víc dole během sekundy tween_spadnuti.interpolate_property ( obrazek, 'position', obrazek.position, obrazek.position+ Vector2(0,2048), 1, Tween.TRANS_LINEAR, Tween.EASE_IN) tween_spadnuti.start() # tween dojel všecko hotový už mužem oběkt akorát tak zničit a zahodit :D ;D func _on_tween_dojel(obekt, klic): self.queue_free()
a co se mi už dělat jakože nechtělo :O :D ;D ;D nóóó asi by se měl udělat nějakej spravedlivější system spawnovaní těch bonusů by je jako nešlo farmit. Hráč muže snadno sežrat všecky duchy a pak se zdržovat u startu a čekat na bonusy. Samo žeto je pitoma normální člověk by si jako našel ten texťák a přepsal v něm ručně highscore jeto obyč plain text :O ;D
Muzika se seká při přepínání ze scénky hlavního menu do highscore a do credits. Hudbu by měl asi pouštět nějakej nadřízenej uzel, asi byto jako šlo udělat podobně jako s tim skore.gd a mit to jakoby hozený bokem mimo hlavní strom scény.
Viewport je mnóóóóhem vyší než širší. Si to skoro jako řiká o udělání podpory dotykový vobrazovkya export na mobílky :O ;D
Noa samozdřejmě teďko společně najdem děsně moc bugů protože já sama to hrála asi jenom deset minut :D
Měla sem tam slušnej zásek při používání funkce 'is_instance_valid' protože mi někdy zničenej uzel vracel true a referenci na uplně náhodnej jinej uzel ale to maj bug prostě voni a věděj vo něm nejmíň už jako rok. Vdůsledku toho sito vobčas myslí že zničenej uzel eště existuje nebo misto uzlu kterej chcete zničit zničíte uplně nějakej jinej náhodnej. A jako vůle tohleto vopravit neni veliká prej si jako máme počkat na verzi 4.0 kde to jako bude celý přepracovaný :O :O :/ :/
Godot umí jednoduše exportovat do různejch formátů nejenom do linuxový binárky. Umí třeba udělat androidí *.apk nebo html webovou stránku. První co mě napadlo udělat byla ta html stránka jenže se ukázalo že s tou hrou měl každej kdo ji zkoušel hrát nějaký jiný problémky. Ve firefoxu bylo takový divně malý fps, v chromu zase mizerně fungovalo chytání eventu mačkání šipek na klávesnici prostě si pacman vobčas jel kam chtěl. a třeba v konqeroru kterej je i jinak uplně nanic vubec nejely particle efekty požárů :O :O :'( :'(
Pitomí taky je že ty vyexportovaný věci sou děsně veliký voproti tomu kdybyste to dělali přímo v nějakým tom androidím kotlin/javě nebo webově html/js. i velký čuně byto udělalo velký maximálně pár mega tu hru ale z godotu při exportu vypadne *.apk a webová stránka přes dvacet mega velký :O :O
Godot má nějaký svý mouchy ale používat se jako dá a myslim si žeby se něco dělanýho v godotu líbilo otulovejm prvnáčkům mililililililililililililililióóóóóóóóóóóóóóónkrát víc než latex :D :D ;D ;D
Tiskni
Sdílej:
Zkuste si propagovat nacismus a treba zpochybnovat holocaust.Chapu tu moznou principialni namitku (o principy ti ale stejne beztak dvakrat nejde), ale nevidim zadny prakticky argument. K cemu ti je mit moznost zpochybnovat holokaust, jak to prakticky zvysi tvoji svobodu?
Readers may wonder whether Baldaev's illustrations are accurate documents of atrocities at all, or were intended as anti-Soviet polemic. The answer is both: Baldaev depicts the Bolshevik coup of 1917 as a national tragedy following which "the peoples of Russia recalled life under the tsar as a lost paradise". He describes the Bolsheviks' antireligious militancy as the sole impetus for the moral collapse he encountered. Yet while his analysis of the Soviet disaster rests upon simplistic nostalgia for a golden age of church and monarchy, the editors of this book have convincingly corroborated many of his representations with parallel accounts from the canon of Russian Gulag literature.Drawings from the Gulag by Danzig Baldaev – review O tom to je – lidé mají různá zkreslení, jež má rigorózní proces nakládání s informacemi zohlednit či odstínit. Jsou to historické práce, co se zabývá prameny a jejich interpretací.
Pak se otevírá jiná diskuze, jak se z toho poučit, což vede na otázky, co je za tábory (různá vězení, detenční střediska aj.) ve světě dnes, co z toho můžeme ovlivnit a jak.Coz je skvela poznamka, protoze velice chytri lide se takto spalili. Co se treba casto vycita Chomskemu, jeho puvodni postoj ke Khmer Rouge, kde byl pomerne skepticky ke zpravam o genocide (na zaklade jinych zkusenosti s americkou propagandou). Na druhou stranu, je taky nevhodne podporovat treba invazi na zaklade falesnych dojmu.
Co se treba casto vycita Chomskemu, jeho puvodni postoj ke Khmer Rouge, kde byl pomerne skepticky ke zpravam o genocide (na zaklade jinych zkusenosti s americkou propagandou).Nebo Parenti a Balkán.
Mnoho nedorozumění a konfliktů plyne z toho, že historik má na danou věc jiný pohled, chcete-li nestrannější, méně zatížený zkušeností a více infikovaný metodologickými debatami uvnitř historiografie. Historik je více citlivý na různorodost zkušenosti. Zatímco pamětník má vrozenou tendenci zobecňovat svoji zkušenost na celou společnost jako celek.
Tolerance ke komunismu má kořeny za WW2 a mohutném propagandistickém úsilí Spojenců jak vylepšit obraz komunismu a SSSRv diskusi na téma Dva socialismy/Palba.cz - takže zkuste pak zkousnout to, zda je svět bi nebo kolika polární ... když někdo, kdo by měl být přítel, říká, že nepřítel není tak hrozný nepřítel.
Mohlo by se zdát, že v situaci, kdy bude historie dávnější, bude pro historika jednodušší ji uchopit. Ale v kontextu toho, co tvrdíte, se naopak zdá, že pro reflexi je vhodnější, když je ještě historie živá. Co je tedy pro reflexi blízkého historického období vhodnější? Polemizoval bych s vaším výchozím předpokladem. Myslím, že ta nedávná historie, kde existuje ještě velká skupina pamětníků, je něčím specifická, ale ne natolik, aby to změnilo parametry historické diskuse. Podívejte se na polemiku kolem Mariánského sloupu. To se týká události z poloviny 17. století. Existuje něco jako paměť konkrétních živých lidí. Ale také existuje něco jako kolektivní paměť, která je mezigenerační. I část současné generace se pak identifikuje s narativem 19. století, že Češi jsou evangelíci a že bojovali proti Habsburkům a proti katolicismu. To je také identifikace, která je často netolerantní. A to platí i pro druhou stranu. Na obou stranách jsou pak lidé, kteří nejsou schopni se o tom bavit s odstupem. A je jasné, že je to věc identity. Zda bude Mariánský sloup stát nebo ne, je otázka identity. Je zde nějaká kolektivní paměť, oni jsou posledním článkem v předávání kolektivního narativu a identifikují se s ním. Těchto lidí se to dotýká osobně i přesto, že v té době vůbec nežili. A dokonce se to ani nemuselo dotýkat jejich předků. Rozdíl v odstupu mezi historií a historikem tedy není tak velký, jak jste naznačoval. … A proto se někdy těmto diskusím říká politika paměti. Paměť není něco apolitického, co by bylo vzdáleno naší politické přítomnosti a jejich politických zápasů. Naopak. Paměť se často dostává do střetu politických zápasů. A toto je ten případ.
A proto se někdy těmto diskusím říká politika paměti. Paměť není něco apolitického, co by bylo vzdáleno naší politické přítomnosti a jejich politických zápasů. Naopak. Paměť se často dostává do střetu politických zápasů. A toto je ten případ.Nevim, me prijde jako jednodussi vysvetleni, ze lide, kterym na te neosobni pameti zalezi si proste zjednodusuji vyklad historie a pouceni z ni. Jako to dela treba Radovan vedle.
Člověk by ale měl mít právo diskutovat třeba o inteligenci jednotlivých ras/národů/etnik bez rizika „nepříjemností“ a obávám se, že tato doba už se chýlí ke konci (jak jsem se nedávno přesvědčil v jedné diskuzi).Proč?
Proč o tom vůbec někteří chtějí diskutovat? Není to třeba proto, že ve skutečnosti nechtějí diskutovat, nýbrž využít diskuzního prostoru k propagaci své agendy – typicky spojené s eugenikou?
Nad některými otázkami bys tedy chtěl kriticky uvažovat a nad jinými ne?
Obrázek ať si udělá každý sám. Já z toho vyvozuji to, že diskutovat s lidmi jako ty nemá smysl. Pro tebe je kritérium jen to, jestli se ti to hodí do krámu nebo ne. U jiných se pokoušíš o deplatforming a u sebe naopak používáš AbcLinuxu jako platformu pro šíření své zvrácené ideologie. Kdybych byl Odin, tak ještě dodám, že je mi líto tvých rodičů.
Hele, a smi se diskutovat o tom, o kterych vecech se nebude diskutovat?Smi. Akorat je otazka, jestli to ma smysl provozovat s nevzdelanci.
Nektere rozhodovani by se melo nechat jen na elitech.To ale neni co tvrdim. Rikam, ze na odbornicich by se mela nechat odborna otazka (zpusob), nikoli otazka hodnot (cil). Zpusob bez cile nedava smysl. Je to trochu jako modus ponens. Odbornici dodaji zpusob dosazeni A->B, ty (nebo kdokoli jiny) doda cil A, a spoji se to v rozhodnuti B.
Spis jsem chtel poukazat na to, ze konsensus, ze o necem se nediskutuje by mel byt v sirsi skupine, nez jen mezi temi, kteri o tematu uz diskutovali.Kazdy, i ty, ma moznost se stat prislusnikem te skupiny. Staci prokazat, ze to tema dostatecne znas. To snad neni tak hrozny pozadavek. Koneckoncu, neni svobodou tech odborniku take si vybrat, s kym budou tu odbornou diskusi vest?
Proc tolik fuzzy. Proste nam binarne rekni tvou odpoved na otazku: Pachaly USA zlociny proti lidskosti, popiraly lidska prava a vysledkem byli miliony mrtvych ? a) ano b) neOdpověď zní v obou případech "ano". Svět totiž není černobílý.
Programe náš, jenž jsi v paměti, pozdraveno buď jméno tvé, příjď operační systém tvůj, buď vůle příkazů tvých jakož na tiskárně tak i na monitoru. Data naše vezdejší dej nám dnes a odpusť nám naše vstupní i výstupní chyby, jakož i my odpouštíme viníkům s vadnými logickými obvody. Neuveď nás ve zklamání a zbav nás napěťových rázů, neboť tvůj jest algoritmus i aplikace i řešení zacyklené na věky věkův. Exit.
Sloboda je jediná - byť otrokom Boha.Pokud o něčem přestaneš pochybovat, můžeš si být jistý že je to lež. Lžeš sám sobě.
Osobne mi myslim vyhovuje archetyp saska
To platí možná tak u Odina. Tam je celkem zřejmé, že jde z části o nadsázku, humor a z části nastavuje společnosti zrcadlo.
U Davida se ale obávám, že je to myšleno vážně a že by rád tyhle myšlenky prosadil v praxi. Pokud vím, tak se angažuje nebo angažoval v Pirátské straně. On to možná pro svoji neschopnost nikam nedotáhne, ale to neznamená, že by chtěl být jen "šašek, kterému o reálnou moc nikdy nepůjde". Stačí se podívat na to, jak zneužívá svoji zdejší funkci administrátora - zjevně dělá, co může. Jiní marxisti to dotáhli dál a tam jsou ty škody řádově vyšší.
coz je vlastne takovy volnomyslenkar
Kdyby byl volnomyšlenkář, tak by nechtěl ostatní připravit o jejich práva, konfiskovat jim majetek, brát svobodu slova, brát jim právo se bránit atd.
Kdyby byl volnomyšlenkář, tak by nechtěl ostatní připravit o jejich práva, konfiskovat jim majetek, brát svobodu slova, brát jim právo se bránit atd.To neni nutne pravda, viz. Ale asi to nema smysl zminovat, protoze predpokladam, ze si to vylozis tak, ze obhajuji konkretni nazor, kdyz chci (podobne to jako dela casto David) jen poukazat na existenci takove diskuse.
protože to vrhá špatné světlo na vaši ideologiiAha, co vsechno se clovek nedozvi.
noa teď sem si toho jako všimla :O :O tučňáček!!!!!! :O :O :O :D :D :D ;D
🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧 díky!!!!!!!!!!!!!!!!! :D
Přesto se dokázali trefovat a pojmenovat to, co ostatní trápilo.Akorát z komunismu je vyléčil až komunismus...
Kdybyste si, vy hejhulové, přečetli, co ten Marx psal, dozvěděli byste se, že vycházel z určitého pojetí dějin a předpokládal vývoj … → feudalismus → kapitalismus → socialismus → komunismus, což od něj řada dalších přejala. Takže v agrárním Rusku (Číně,…) skoncovali s feudalismem a jali se industrializovat ve státním kapitalismu.Což zjevně postačilo k cestě z vidlákova k mamutímu podílu na výsledku druhé světové války, na oběžnou dráhu,… (+ takové dílčí záležitosti jako zrovnoprávnění žen, zvýšení gramotnosti, dekolonizace, omezení extrémní chudoby,…) To neznamená, že se na nějaký socialismus, natož komunismus pak vesměs nevybodli – SSSR nebo ČLR nejpozději během ~80. let – třeba protože ML je náchylný k revizionismu. K tomu navíc kontext Operation Condor nebo Jakarta Method.
Mně nepřijde, že by možnosti něco vykonat, pokud mám moc, bránila nějaká státní ideologie?IMHO ano, jestli chapu spravne tvoji otazku. Ideologie ovlivnuje mysleni obcanu, i statniho aparatu, a tedy interpretaci jakychkoli prikazu shora. Diktator nahore muze mit spravny napad, ale jeho implementace muze selhat prave diky ideologii, kvuli ktere je to o par pater niz hur pochopeno. (A to jen predpokladame, ze vsichni jednaji v zajmove shode, coz se nedeje.) Mimochodem to je jeden z duvodu, proc je "osvicena diktatura" contradictio in adjecto - i kdyby vladce osviceny byl, jeho poskoci nutne nebudou.
prosimte, soudruhu, vyjmenuj mi pet zemi, kde jim ten komunismus fungoval, a prinesl jim prosperitu a zvyseni zivotni urovne, zlepseni lidskych prav, prosperitu a bezpeci. Nebo treba aspon 3, at to nemas tezke.Vždycky mě pobaví, když fanouškovi komunismu*, tj. systému, který zatim v praxi nefungoval (nebo špatně), vyčítá toto fanoušek neoliberalismu, tj. systému, který také zatim v praxi nefungoval (nebo špatně). *) Tím nechci nutně říct, že davkol je fanoušek komunismu, moc nevim, čeho je vlastně fanoušek.
by je bylo potřeba nějak líp vodlišit vod sebe protože každej se chová uplně jinak ten duch a kdyby byli jenom bílí by se pletli ;D jinak si jako myslim že v kontextu jeto jakože dóóóst jasný ;D ;D
exportování neni nutný de to jakoby pouštět přímo v tom editoru buďto ikonkou play vpravo nahoře v panelu nóó a nebo máčkutím na klávesnici f5 jestli ji mac jako má tuhletu klávesu :D ;D
Nevím, jestli to vychází z nějakého absurdního dramatu od Veškrny či z Postavy k podpírání nebo něčeho podobného, ale povedlo se – smazané-nesmazané komentáře, cenzura-necenzura.Žádnou kulturu bych v tom nehledal - IMHO jen postupuje podle příručky. Oni tomuhle říkají "deplatforming" - je to snaha zbavit opozici možnosti komunikovat, prezentovat svoje myšlenky. Zatímco on sám zde bude popírat zločiny komunismus. A donekonečna tapetovat svojí propagandou.
jako taková hrůůůza to zase neni :D zásek bylo hlavně tamto s těma referencema z nulovejch oběktů protože každýho spíš napadne hledat chybku někde u sebe ané u nich někde :O :'( ve zdrojáčku skriptíku Hra.gd najdeš tenhleten zakomentovanej vypnutej kus kterej měl hasit požáry mezi restartama levelů
for pozar in pozary: # kouken jestli je instance požáru validní # jakože neni null nebo už připravená na vodstranění if is_instance_valid(pozar): pozar.queue_free() pozary = []
někdy to nezničilo všecky požáry nóó a někdy to zničilo uplně nějakej jinej náhodnej uzel ve stromku scény prostě supr :O :/ jako dalo byseto vobejít tim žeby se instance požáru neničila sama prostě by jenom vypnula tu emisi particlů/udělala se neviditelnou noa každým startem levelu by se tady ty voběkty ničili ale tohleto by prostě mělo fungovat taky jako ne :O :O
První co mě napadlo udělat byla ta html stránka jenže se ukázalo že s tou hrou měl každej kdo ji zkoušel hrát nějaký jiný problémky.Pro HTML verzi doporučují GLES2.
Kdybych ho jako měla popsat, tak bych řekla žeto je python říznutej rustem a vokořeněnej javascriptemNa některý věci je to fakt otravný... Mám pole, položky jsou Dictionary, chci z něj odstranit některý položky na základě podmínky. V Ruby
ary.delete_if { |item| něco_co_dá_bool }
. Tady mě nenapadlo nic lepšího než nekonečný cyklus, v něm for cyklus, který projde přes všechny položky, nastaví proměnnou, když najde položku ke smazání, vyskočí z vnitřního cyklu, příslušná položka se smaže, break z vnějšího cyklu v případě, že vnitřní cyklus nic nenastavil. Ble.
jako to bude asi vono to s tou verzí gles :D
nějaký smutný náckové pacmana na fb hejtujou a jako nejrači byho viděli smazanýho hele printscreen :O :O :O :O :'( :D :'( :D :'( :D
se to tam dalo jakoby nějak samo :O :O :D ;D asi to tam jako hází všecky zprávičky články a blogísky nóó a tohodletoho si prostě jako nějak všimli :D
Druhá povolená skupina budou asi horníci překvalifikovaný na programátory. Z té diskuze na FB jsem pochopil že jsou moc moc zlí.Dovoluji si upozornit, že slovo "zlí" může mít v rámci českých zemí celou řadu konotací. Počínaje sdělením, že jsou hrozně moc nasraní a konče tím, že výsledky jejich práce stojí za hovno. A mezi tím je ještě celá škála dalších významů. Třeba jako že jsou zlí v tom kontextu, že trhají mouchám nožičky a vraždí žáby.
hmmmm lidi co máčknou šipku jenom v zatáčcemě mě jako nenapadli :O :O
poslal jsem Malému odkaz na Anti-communist mass killings a on mě zablokoval.Chi chi, tys chtěl trollit a von se nenechal a bloknul tě!
Krásnej dabl stendrd a hypokrasy.Ano. Pokrytec Malý píše
Co s těmi, kteří nechtějí nový spravedlivý svět? Nechat je v klidu, ať si pindají a kverulují? To ne, to dělá kapitalismus, a podívejte se, jak se mu to vymstilo.přestože ta masová vraždění to vyvracejí. Navíc ani nenechá pindat a kverulovat v komentářích!
Helejte, myslím, že ani zelené, ani lidskoprávní, ani genderové ani žádné jiné podobné hnutí, označované jako levicové, není v základu proti kapitalismu. Chce něco zlepšovat, něco měnit. Ale velmi rychle se k tomu namotají — a možná jsem zaujatý, ale mám pocit, že to jsou pořád titíž — lidé, kteří docela rychle převezmou agendu, zradikalizují ji, odhalí příčinu problému (ta je vždy stejná: kapitalismus) a začnou proti tomu bojovat. Ono je to s tím bojem proti kapitalismu takové furt na jedno brdo. Vždycky to začne tím, že kapitalismus je fuj, nesvobodný, potlačuje lidská práva ve prospěch vrstvy nejbohatších, a to je potřeba vyvrátit, ukončit, zrušit, zastavit, zničit!Můj problém s tímhle postojem je, že ignoruje problémy. Tohle je pattern, který se objevuje dnes docela dost v různých oblastech, aspoň mam ten dojem. Nemusim mít nutně ikonu Marxe na nočním stolku, abych viděl, že 'reálný kapitalismus' má celkem problémy. Nemusim bejt nutně člen Greenpeace, abych viděl, že jsou tu celkem slušný ekologický problémy (což je mj. spojený taky s tim kapitalismem). Nemusim bejt nutně člen BLM, abych viděl, že policie v USA má dlouhodobě celkem slušný problém s přístupem k menšinám, bezdomovcům apod. Jak dlouho měli v USA na to, aby ty problémy řešili ne-radikálně? Doslova desetiletí. Neudělalo se vůbec nic, naopak se problémy zametaly pod koberec. A u nás to třeba v oblasti té ekologie není o moc lepší. Lidi mají tendenci problémy ignorovat, bagatelizovat, nebo rovnou popírat a včasné nebo nedejbože preventivní řešení problémů nesnášejí. Mají pocit, že někdo otravuje s něčim, co reálně není problém. A pak jednoho krásného dne problém přeroste přes hlavu a vloží se do toho radikálové, a spousta lidí jsou najednou surprised pikachu a hrozně se diví, co se to děje a proč se k problému přistupuje takhle blbě radikálně. Vždyť by to přece šlo řešit mnohem rozumněji. U nás když někam na střechu vylezou Greenpeasáci, tak se hned vyrojí 1000 a 1 rozumbrada s tím, že takhle se ten problém rozhodě nemá řešit a že to jsou pomatený fanatici, což jako sice je do značný míry pravda, ale Greenpesáci pak slezou a 1000 a 1 rozumbrada se vrátí zpět k ignoraci problému, dokud se cyklus nezopakuje. Chtějí lidé raději rozumné, racionální, neradikální řešení problémů? Ok, v pořádku, ale v tom případě je potřeba začít ty věci rozumně, racionálně a neradikálně řešit dnes a ne až za 10, 20 let, kdy z toho bude občanská válka nebo ekologická katastrofa nebo nějakej podobnej průser...
kde se ten reálný kapitalismus kromě keců místních bolševiků vlastně vyskytujeA kde sú tí reálny bolševici?
Můj problém s tímhle postojem je, že ignoruje problémy. Tohle je pattern, který se objevuje dnes docela dost v různých oblastech, aspoň mam ten dojem. Nemusim mít nutně ikonu Marxe na nočním stolku, abych viděl, že 'reálný kapitalismus' má celkem problémy.Hele, mam totaz a mozna tim lehce nabouram tvou vizi, je tech problemu ted, po letech "pokroku" vic nebo min nez jich bylo treba v roce 1980 nebo 1990? Ted, kdy se levicaci snazi 30 let "opravovat" kapitalismus, a s kazdou dalsi opravou stoji vic a vic za hovno? Je vic problemu ve mestech, kde vladnou treba 3 generace neprerusovane politici demokraticke strany, kteri bez omezeni implementuji sve socialisticke vize, nebo ve fungujicicih mestech jako colorado springs? Zilo se treba ve francii, italii nebo zapadnim nemecku lepe v roce 1990 nebo dnes? Zilo se v londyne lepe v roce 1990 nebo dnes?
Je vic problemu ve mestech, kde vladnou treba 3 generace neprerusovane politici demokraticke strany, kteri bez omezeni implementuji sve socialisticke vize, nebo ve fungujicicih mestech jako colorado springs?Neznám moc partikulárie jednotlivých oblastí USA, můj dojem je, že v USA je švihlá víceméně celá politická scéna. K té Sofiině volbě, co vás tam čeká na podzim, nezbývá než sarkasticky pogratulovat. Kdybych byl nucen se přesunout do Severní Ameriky, zvolil bych pokudmožno Kanadu. Ne, že by to tam bylo bez problémů, ale aspoň to nejsou USA.
Zilo se treba ve francii, italii nebo zapadnim nemecku lepe v roce 1990 nebo dnes? Zilo se v londyne lepe v roce 1990 nebo dnes?Podle jaký metriky? Např. u nás jsme ještě v 90. letech měli i zimy. Dnes už máme jen takový delší podzimy a když je v létě normální stav vody, tak je to na bouchání šampaňského. Jinak nemam pocit, že by v Evropě v posledních ~40 letech docházelo k nějakýmu divokýmu "levicovýmu pokroku". Nebo tím narážíš na imigranty? Chceš si postěžovat například na jejich statistiky zločinnosti? Ok, v pořádku, ale v tom případě bych se rád zeptal na naše vlastní problémy, které tomu předchází:
Jak dlouho měli v USA na to, aby ty problémy řešili ne-radikálně? Doslova desetiletí. Neudělalo se vůbec nic, naopak se problémy zametaly pod koberec. A u nás to třeba v oblasti té ekologie není o moc lepší.Kdysi tady někdo dával odkaz na jeden blogový zápisek: Jak naše generace dnešní mládeži zničila život.
Kdysi tady někdo dával odkaz na jeden blogový zápisek: Jak naše generace dnešní mládeži zničila život.Ježišmarja. Ten člověk asi hodně nesnáší 'mladou generaci'... Ani nevim odkud začít. V první řadě mi přijde jako nesmysl z toho dělat mezigenerační problém, to je opravdu hovadina. (Ano, znám video Umweltsau a ano, je zcela debilní. Však ho taky ta stanice další den stáhla a omluvila se. Takže proč v té mezigenerační animozitě pokračovat?) Ty problémy jsou mnohem dlouhodobější než aby se to dalo hodit na jednu generaci, a stejnětak i pozitiva a řešení. V jiný diskusi jsem tady zmiňoval jako krok dobrým směrem vytvoření národních parků, což ve světe nastalo před 100 lety a u nás v 60. letech. Z mýho pohledu v tom jedem všichni stejně, staří i mladí. Co tam má dál. Gréta mě nezajímá a moc nevim, proč by někoho zajímat měla. Do obličeje nikomu neplivu, ekosviní nikoho nenazývám, ke stromům se nepřivazuji, proti jádru neprotestuji. Maso trochu redukuji, specielně uzeniny a červené, ale vegan nejsem. Uhelné prázdniny jsem taky zažil (někdy kolem r. 2000) a rodičům na vesnici kdykoli zahřmí v okruhu 50km vypínají proud ještě dnes. Za všechno, co se podařilo v oblasti ekologie v posledních 30 letech jsem samozřejmě vděčný. Nejsem vítač migrantů. Neprosazuju ekologickou bezdětnost - na to už je pro mě trochu pozdě
Ani nevim odkud začít.Já bych věděl… Už jsem to někde psal, smysl by dávalo, kdyby si Prouza a jemu podobní sypali popel na hlavy, protože se svými Brontosaury selhali: meliorace jsou furt v zemi, naopak uhlí ale nikoliv a uhelné elektrárny stále běží. Chtělo by se namítnout, že se snažili. Když padlo to uhlí, u nás se říkalo: „Snaha neni koksovatelna.“ Tedy, aspoň o tématice drželi nějaké povědomí a vytvořili organizační infrastrukturu, na které lze stavět – dala by se najít nějaká souvislost s např. Hnutím Duha (ohlédnutí za 30 lety), kde je ale důležitý postřeh:
Oba jsme krátce prošli Českým svazem ochránců přírody, a třebaže jsme v něm poznali některé obdivuhodné lidi a po čase jsme se naučili vážit si i některých osobností v hnutí Brontosaurus, vcelku jsme měli k oficiálním organizacím, které minulý režim toleroval, hodně kritický vztah. Vadilo nám, že nemohou mluvit o potřebných systémových změnách, že například nemohou klást odpor jaderným elektrárnám. Nebo že uklízejí v lese a sázejí tam smrčky, když je přitom ničí kyselé deště, místo toho, aby se zaměřili na kouřící komíny.
V první řadě mi přijde jako nesmysl z toho dělat mezigenerační problém, to je opravdu hovadina.Aha. On to totiž mezi generační problém je. Jak se říká – starého psa novým kouskům nenaučíš. Tím spíš v kontextu ± exponenciálních (nebo aspoň řádově rychlejších než lidský život) technologických změn a jejich dopadů. Generační obměna je zásadní pro adaptaci (odtud též evoluce). Pokud to půjde nějak obejít (např. psychedelika, transhumanismus), budiž. Současná společnost je v pasti. Dominuje jedna nebo dvě generace, které zažily bezprecedentní podmínky (hlavně po WW2), navykly si v tomto prostředí na určitý způsob života (např. propojení osobní identity s automobilismem) a systémy (organizace, státní správa) jsou navrženy tak, že jim dávají disproporční vliv: viz nejen kandidátky politických stran, ale také volební výsledky – pak si jako Prouza starý Babiš, kterého zvolili do role premiéra zvláště další podobně staří jedinci, dovolí prohlásit, že ho nezajímá, co bude za 30 let.
si ho zahraj taky a nešpekuluj :D ;D
echo $'CZ\nUS' | xargs --max-args=1 --max-procs=0 instaluj-cedule --v-zemiParalelizace! Edukace!
Problém je v tom, že tady nejde o žádné černochy nebo o rasismus.
I černoši vědí, že BML je jen pokus extrémní levice a demokratů dostat se k moci.
https://www.youtube.com/watch?v=ItopNgRQiuY https://www.youtube.com/watch?v=pbccGbPKwok
Náš problém nejsou orteláčci, flaztenci a jiní “stopimigracaci”. Těm se jedná o to jejich. Naším problémem je dav nalevo, kterému se nejedná o to jejich, ale o to naše. Oni nechtějí bránit svoje (zatím svoje nemají), oni chtějí hlavně zničit to naše, protože to je (jak nám opakují) špatné! Tak špatné, že i když to zlepšíme, tak to bude pořád špatné, protože to je špatné od základů!
Chvíli jsme si možná mysleli, že když nechceme xenofobii a primitivismus, že vlastně jsme s nimi na jedné lodi. Nejsme, nebyli jsme a nebudeme: jsme třídní nepřítel, jsme “privilegovaní narozením”, cokoli uděláme, uděláme špatně, a někdo zleva nám to vždycky rád oznámí.
...a zapomínáte na to podstatné: Třídní boj a zničení kapitalismu je pro leftivistu nejvyšší cíl, a k jeho dosažení lze fašisty (to jsme v jejich slovníku my) podvést, klamat, osočit z čehokoli…