20. Říjen 2017 - 03:26

Autor Téma: PureBASIC  (Přečteno 8088 krát)

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #15 kdy: 6. Květen 2013 - 22:14 »
Ale jo, asi hodně záleží na stylu práce, každopádně tady respektuji tvé daleko větší zkušenosti s textovkama, takže věřím, že tohle už máš daleko víc domyšlené.

Tu "12" si budu muset konečně zahrát  8)
Jedna stará textovka vydá za desítky dnešních nadutých her.

panprase

  • Administrátor
  • Superčlen
  • *****
  • Příspěvků: 565
    • Zobrazit profil
Re: PureBASIC
« Odpověď #16 kdy: 6. Květen 2013 - 22:54 »
Ale jo, asi hodně záleží na stylu práce, každopádně tady respektuji tvé daleko větší zkušenosti s textovkama, takže věřím, že tohle už máš daleko víc domyšlené.

Tu "12" si budu muset konečně zahrát  8)

No zkušenost, jak se to vezme, o nějaké se snažím už minimálně pět let a jediné co ze mne vypadlo byla narychlo spíchnutá "12", která má pár chybek a nejsem schopnej se dokopat k její opravě, k tomu dojde až budu testovat Jablečnou verzi a následně i Win nativní verzi + tam chci dodělat nějaké featurky, které požadují fanoušci. No a snad konečně dorazím i "Zabil jsem Mistica, pánové..."
První den přiletěli, druhý den uděřili, třetí den zvítězili

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #17 kdy: 7. Květen 2013 - 00:03 »
"12" jsem si už spustil a chytnul mě ten lidský, realistický příběh  :) Tak budu chvilku zkoušet řešit. A samozřejmě na Mistica se těšim  ::)

Já bych chtěl zkusit nějaký ten dungeon, na způsob Elviry nebo Waxworks z Amigy. V PureBasicu to udělám jak nic, páč má skvělou práci s texturama. Dokonce i ve Freebasicu to udělám pomocí bitmapu, v zásadě jde cokoli, ale chtělo by to pořádně rozmyslet nápad.

Posílám pro ukázku pár pohybů (ovládáš klávesou), které jsem napodobil z Dungeon Masteru z Amigy, udělal jsem to ve Freebasicu, dokreslování přitom ještě zpomaluji na každém pohybu o 25 ms, takže úplně v pohodě:

http://www.edisk.cz/stahnout-soubor/78379/dungeon.zip_1.26MB.html

Myslím, že přesně takhle oni to udělali, a do prostoru dávali pak jen nějaké objekty - potvory, obrazy či předměty. Pohyb bych pak rozšířil na všechny strany, ale asi bych to musel líp nakreslit, tohle je přesně dle předlohy Dungeon Master.
« Poslední změna: 7. Květen 2013 - 00:07 od zxretrosoft »
Jedna stará textovka vydá za desítky dnešních nadutých her.

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #18 kdy: 11. Květen 2013 - 22:03 »
Několik lidí odsud už mi psalo na e-mail či soukromně, abych jim vysvětlil jak dělám to nebo ono. Většina z dotazů jde za grafikou. Mimochodem když už se s tím namáhám pak vysvětlit, tak by bylo dobré v rámci slušnosti odpovědět alespoň "Díky!"  :) Ale to jenom tak mimochodem, je to vaše vizitka  ::)

Tak zkusim to raději veřejně pro všechny, páč se dotazy množí. Nejprve si musíte nakreslit ten spirte, se kterým chcete pohybovat. To je základ. Je to úplně jednoduché, v malování ve Windows si nakreslíte malý obrázek, ten převzorkujete bod po bodu a body neukotvujete absolutně, ale relativně, tj. např. bod č. 1 nebude na pozici 10,10, ale na pozici 10+x,10+y.

Někdy si vystačíte s běžnýma tvarama, které se nemusí vzorkovat bitmapově, např. pohyb prstenu (jak se mě někdo ptal) udělám pomocí elipsy, kterou pořád zužuju. Je to pár řádek v Basicu a kdysi to vyšlo i v ABC  :D

Předělal jsem to třeba takhle do Freebasicu (rotace kolem osy Y):
Výsledek ke spuštění: http://www.edisk.cz/stahnout-soubor/25198/osaY.zip_48.86KB.html

Kód: [Vybrat]
dim shared as single a,b,x,y,i
const pi as double=4*atn(1)

screen 20,32,,0
cls

a=10
b=50
x=500
y=300

zacatek:

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(100,100,150)
next i

sleep 10

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(0,0,0)
next i

a+=1

if a>50 then goto dalsi

goto zacatek

dalsi:

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(100,100,150)
next i

sleep 10

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(0,0,0)
next i

a-=1

if a<0 then goto zacatek

goto dalsi

sleep
end


Rotace kolem osy X:
Výsledek ke spuštění: http://www.edisk.cz/stahnout-soubor/66027/osaX.zip_47.42KB.html

Kód: [Vybrat]
dim shared as single a,b,x,y,i
const pi as double=4*atn(1)

screen 20,32,,0
cls

a=50
b=10
x=500
y=300

zacatek:

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(100,100,150)
next i

sleep 10

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(0,0,0)
next i

b+=1

if b>50 then goto dalsi

goto zacatek

dalsi:

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(100,100,150)
next i

sleep 10

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(0,0,0)
next i

b-=1

if b<0 then goto zacatek

goto dalsi

sleep
end

Pochopitelně v kombinaci uděláte i nějaký posun třeba takhle:
Výsledek ke stažení: http://www.edisk.cz/stahnout-soubor/67568/posun_x.zip_47.48KB.html

Kód: [Vybrat]
dim shared as single a,b,x,y,i
const pi as double=4*atn(1)

declare sub pocet

screen 20,32,,0
cls

a=50
b=10
x=500
y=300

zacatek:

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(100,100,150)
next i

sleep 10

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(0,0,0)
next i

b+=1

if b>50 then goto dalsi
x+=1

goto zacatek

dalsi:

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(100,100,150)
next i

sleep 10

for i=0 to 2*pi step .01
    pset (a*cos(i)+x,b*sin(i)+y),rgb(0,0,0)
next i

b-=1

if b<0 then goto zacatek

pocet

y+=1

goto dalsi

sleep
end

sub pocet
    if x>800 then
        x-=1
    elseif x>1 then
        x+=1
    end if
end sub

Stejným principem uděláte třeba míček, který se bude odrážet od hran obrazovky, nebo více míčků, ve 3D to už budou namísto prstenu ty sprity...

Např. nakreslím si koně v ArtStudiu na C64 :) To bude můj sprite. Udělám si ho 2x s jinýma nohama, páč chci aby se sprity střídaly a aby se kůň pohyboval (viz obrázky v příloze).

Pak už je to jednoduché. 2 koně v pohybu (schválně zpomalené):

http://www.edisk.cz/stahnout-soubor/46099/2kone.zip_54.93KB.html

Nebo třeba 7 koní:

http://www.edisk.cz/stahnout-soubor/77320/7koni.zip_70.03KB.html


V PureBasicu je to zobrazování úplně jiné. PureBasic už je v tomhle směru objektový jazyk, jste o úroveň výš, takže sprity se řeší jinak (téměř jako na C64) a každý objekt ve zobrazení se čísluje.
Jedna stará textovka vydá za desítky dnešních nadutých her.

panprase

  • Administrátor
  • Superčlen
  • *****
  • Příspěvků: 565
    • Zobrazit profil
Re: PureBASIC
« Odpověď #19 kdy: 12. Květen 2013 - 00:35 »
Cyve abys nedostal ban za offtopoc!

Ba ne kecam, je to pekny, co leybysme si treba zitra pro rali objekty, koukam na ne jako nudle z blata. Pravda graju si s blitzem ale to je stejny. 

Diky, libi se mi to tu !
První den přiletěli, druhý den uděřili, třetí den zvítězili

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #20 kdy: 12. Květen 2013 - 11:51 »
Cyve abys nedostal ban za offtopoc!

Ba ne kecam, je to pekny, co leybysme si treba zitra pro rali objekty, koukam na ne jako nudle z blata. Pravda graju si s blitzem ale to je stejny. 

Diky, libi se mi to tu !


Díky!  :) No na ty objekty se podívat můžem, kdyby byl zájem  8) ::)
Jedna stará textovka vydá za desítky dnešních nadutých her.

panprase

  • Administrátor
  • Superčlen
  • *****
  • Příspěvků: 565
    • Zobrazit profil
Re: PureBASIC
« Odpověď #21 kdy: 12. Květen 2013 - 15:46 »
Já jsem pro, sice tak trošku chápu, no jak se to vezme, nechápu je ani zaboha, uniká mi vůbec důvod proč dělat objekty.
První den přiletěli, druhý den uděřili, třetí den zvítězili

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #22 kdy: 12. Květen 2013 - 16:44 »
Já jsem pro, sice tak trošku chápu, no jak se to vezme, nechápu je ani zaboha, uniká mi vůbec důvod proč dělat objekty.

No ber to tak, že objekty byly vymyšleny hlavně pro ty, kteří neumí pořádně programovat  :D

Skládání objektů do programu je jako skládání lega. Máš už hotové dílky a ty prostě dáváš dohromady a mezi nimi děláš už jen vztahy a algoritmy. Nepřemýšlíš tedy nejdřív nad tím, jak vytvořit ten objekt, ale spíš nad tím, jak již někým jiným vytvořený objekt použít a kde. V objektovém programování nejsi už nějaký dělník, který staví barák z cihliček, ale spíš architekt, který dává celé kusy baráku dohromady.

Proto se to stalo tak efektivní, páč za daleko kratší čas uděláš dobrý efekt (což se zalíbilo taky hlavně těm, kdo to jinak moc neumí  :) ), zatímco strukturovaným programováním by ti to trvalo dlouho a bylo by to pracné. Kdo hledá něco hlubšího, v objektovém programování to nenajde  :)

Např.: Tohle jednoduché menu jsem v PureBasicu pomocí objektů udělal 10 řádky za cca 1 minutu. Kdybych to chtěl udělat ve Freebasicu či obecně bez objektů, trvalo by mi to tak půl dne, než bych to nakreslil a rozchodil. Celkový počet řádků by byl cca 1000.

Výsledek by byl ale stejný. To je fakt.
Jedna stará textovka vydá za desítky dnešních nadutých her.

panprase

  • Administrátor
  • Superčlen
  • *****
  • Příspěvků: 565
    • Zobrazit profil
Re: PureBASIC
« Odpověď #23 kdy: 12. Květen 2013 - 22:29 »
Fajn, to dává smysl, teďko bychom si mohli projít nějaký ten příklad, co?
První den přiletěli, druhý den uděřili, třetí den zvítězili

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #24 kdy: 13. Květen 2013 - 22:42 »
OK, tak jednoduchý příklad.

Typickým objektem je třeba ukazatel průběhu.

Pomocí objektu ho (PureBASIC) udělám okamžitě, cca 10 řádek kódu:

Kód: [Vybrat]
OpenWindow(0,0,0,320,160,"Průběh",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ProgressBarGadget(0,10,30,300,25,0,100)

For i=1 To 100
  SetGadgetState(0,i)
  Delay(100)
Next i

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow

Výsledek:
http://www.edisk.cz/stahnout-soubor/79561/progress.zip_10.71KB.html

Jaké úsilí bych musel vynaložit, kdybych to chtěl udělat bez objektu?
  • Nejdřív bych nakreslil nějaký obdélník, pak bych si musel nakreslit tu 3D čárku, což bych udělal asi přes krátký cyklus.
  • Udělal bych cyklus pro nakreslení čárek vedle sebe na 100 %. A další cyklus by počítal, kde přesně se nacházím a kolik je to %.
  • Musel bych to nějak rozškálovat, odkdy dokdy se kreslí každá čárka, jinak by se kreslily půlky čárek.

Zkrátka nádhera, ale není to snadné. Objektem to trvá hned a ani nevim, že programuju  :D

A to není to nejhorší. Teď si představ, že bych zjistil, že chci ten objekt roztáhnout o pár bodů nebo naopak zmenšit. Všechno znova. V OOP dám jenom jiný číslo. Sekunda práce.
Nebo kdybych ho chtěl vertikálně. A větší počet. Např. tohle pomocí objektu na 20 řádek + výkon prvňáka:

http://www.edisk.cz/stahnout-soubor/36986/progress2.zip_10.81KB.html


Bez objektů je všechno komplikace a musíš 1000x víc přemýšlet, domýšlet, projektovat, programovat.

Objekty programování neskutečně usnadnily. Ale krásu bych v nich nehledal. Intelektuální satisfakce, když člověk naprogramoval něco čistě strukturovaně a v nižším jazyku, s ohledem na paměť, procesor atd., tomu se tohle lego nemůže nikdy rovnat  :P
« Poslední změna: 13. Květen 2013 - 22:44 od zxretrosoft »
Jedna stará textovka vydá za desítky dnešních nadutých her.

wankes

  • Nováček
  • *
  • Příspěvků: 17
    • Zobrazit profil
Re: PureBASIC
« Odpověď #25 kdy: 14. Květen 2013 - 12:51 »
moc hezké....
jak bys obecně v basicu vyřešil situaci, kdy máš v textovce události ...data řádky...50-70 kladné, 71-90 neutrál, 91-115 negativní
ranodomize ti nastaví na začátek...musíš vše předem načíst do stringů a pak RND nebo to lze udělat nějak elegantněji ?


(příklad - Zvednout daně dělníkům ? dáš ANO a nastane něco 50-70, dáš NE a nastane něco z 91-115
 řádek 50 DATA "Zvedl jsi dane tim tva obliba v EU stoupla o", 16
atd....
(ex-STklub Brno, Sega MegaDrive, Sharp MZ, kalkulatory HP/TI)

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #26 kdy: 14. Květen 2013 - 21:39 »
moc hezké....
jak bys obecně v basicu vyřešil situaci, kdy máš v textovce události ...data řádky...50-70 kladné, 71-90 neutrál, 91-115 negativní
ranodomize ti nastaví na začátek...musíš vše předem načíst do stringů a pak RND nebo to lze udělat nějak elegantněji ?


(příklad - Zvednout daně dělníkům ? dáš ANO a nastane něco 50-70, dáš NE a nastane něco z 91-115
 řádek 50 DATA "Zvedl jsi dane tim tva obliba v EU stoupla o", 16
atd....

Já nevim, jestli to chápu úplně správně, ale jestliže dáš ANO, pak nastane něco z možností, které se nacházejí mezi řádky 50-70?

Jestli jo, tak tohle se řeší přes CASE, který náhodné číslo pošle na daný řádek. CASE funguje např. ve FreeBasicu i v PureBasicu stejně.
Mám dát příklad?
Jedna stará textovka vydá za desítky dnešních nadutých her.

wankes

  • Nováček
  • *
  • Příspěvků: 17
    • Zobrazit profil
Re: PureBASIC
« Odpověď #27 kdy: 14. Květen 2013 - 22:42 »
50 DATA "Zvedl jsi dane tim tva obliba v EU stoupla o"

na řádcích jsou data, tam case nepomůže a randomize tak také nefunguje, ne?
(ex-STklub Brno, Sega MegaDrive, Sharp MZ, kalkulatory HP/TI)

zxretrosoft

  • Plný člen
  • ***
  • Příspěvků: 227
    • Zobrazit profil
    • zxretrosoft
Re: PureBASIC
« Odpověď #28 kdy: 17. Květen 2013 - 00:44 »
50 DATA "Zvedl jsi dane tim tva obliba v EU stoupla o"

na řádcích jsou data, tam case nepomůže a randomize tak také nefunguje, ne?

Jak to? Tak tomu teď asi nerozumím. Přece ty řádky v moderním Basicu jakéhokoli druhu nemusíš vůbec řešit, naopak používáš právě ten CASE, aby tě poslal na určité místo.

Tvůj případ (v PureBasic):

Kód: [Vybrat]
Global x.l

Declare obliba1()

If OpenWindow(0,0,0,1024,768,"Odskok CASE",#PB_Window_NoActivate | #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
 
  x=Random(100,1)
 
  Select x
    Case 50 To 70
      obliba1()
  EndSelect
 
  Repeat
    Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
EndIf

Procedure obliba1()
  LoadFont(2,"arial",16)
  SetGadgetFont(#PB_Default,FontID(2))
  TextGadget(80,16,15,700,20,"Obliba nic moc = " + Str(x))
 
  Repeat
    Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
EndProcedure

A přesně takhle udělám jakoukoli oblibu  ;)

(P.S. Místo té procedury můžeš dát klidně ten svůj blok DATA, po CASE pak restore na ten konkrétní blok, ale takhle je to lepší.)
« Poslední změna: 17. Květen 2013 - 00:52 od zxretrosoft »
Jedna stará textovka vydá za desítky dnešních nadutých her.

wankes

  • Nováček
  • *
  • Příspěvků: 17
    • Zobrazit profil
Re: PureBASIC
« Odpověď #29 kdy: 17. Květen 2013 - 21:00 »



OK díky, kouknu na to
(ex-STklub Brno, Sega MegaDrive, Sharp MZ, kalkulatory HP/TI)