Kostka - člověče nezlob se – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kostka - člověče nezlob se – Delphi – Fórum – Programujte.comKostka - člověče nezlob se – Delphi – Fórum – Programujte.com

 

TB0
Newbie
29. 12. 2014   #1
-
0
-

Ahoj, jsem v Delphi začátečník a potřeboval bych poradit s takovou jednou "banalitou". Naprogramoval jsem si v Delphi imitaci klasické hrací kostky, jenom bych to chtěl trochu vylepšit. Když jakoby hodím kostkou, chtěl bych, aby to chvilku dělalo tento efekt:

http://ohradaubilovce.sweb.cz/hod1.html

zatím se mi toho nepovedlo nijak dosáhnout, vždycky se mi objevila konečná strana kostky.

Předem díky :)

Nahlásit jako SPAM
IP: 2a00:1028:8d1f:15d2:a199:...–
lukas.balaz0
Super člen
30. 12. 2014   #2
-
0
-

#1 TB
hoď sem kód

Nahlásit jako SPAM
IP: 80.242.41.–
TB0
Newbie
30. 12. 2014   #3
-
0
-

Nevím jestli to moc pomůže, protože to nefunguje. 

procedure TForm1.Kostka(N:integer);
begin
  Case N of
    0: Begin Image1.Picture:=nil; ImageList1.GetBitmap(0,Image1.Picture.Bitmap); end;
    1: Begin Image1.Picture:=nil; ImageList1.GetBitmap(1,Image1.Picture.Bitmap); end;
    2: Begin Image1.Picture:=nil; ImageList1.GetBitmap(2,Image1.Picture.Bitmap); end;
    3: Begin Image1.Picture:=nil; ImageList1.GetBitmap(3,Image1.Picture.Bitmap); end;
    4: Begin Image1.Picture:=nil; ImageList1.GetBitmap(4,Image1.Picture.Bitmap); end;
    5: Begin Image1.Picture:=nil; ImageList1.GetBitmap(5,Image1.Picture.Bitmap); end;
  End;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  randomize;
  For I:=1 to 20 do begin Kostka(random(6)); sleep(10); end;
end;
Nahlásit jako SPAM
IP: 2a00:1028:8d1f:15d2:a199:...–
lukas.balaz0
Super člen
30. 12. 2014   #4
-
0
-

#3 TB
O jazyku Delphi som doteraz nepočul :D , takže sa na to môžem pozerať len s algoritmického hľadiska. Ak tam nemáš žiadne syntatické chyby, prečo ti to nefunguje ? Ako som pochopil z tvojho prvého príspevku, procedúra Kostka funguje. Tak napíš, čo ti to robí ...

Ešte skús dať randomize každý raz v tom cykle, ale to by nemal byť problém. Potom sa pozri sem: http://stackoverflow.com/questions/9656017/strange-behaviour-of-function-sleep-used-in-repeat-until-in-delphi ... nemám šajnu, či sa ťa to týka ale možno. A hlavne si urob nejaké debug výpisy do konzoly v každom tom case v procedúre Kostka ... možno sa tam v skutočnosti dostaneš, ale už sa to z nejakého dôvodu nezobrazí (alebo zobrazí príliš rýchlo a ignoruje to sleep, pozri ten link vyššie)

Nahlásit jako SPAM
IP: 80.242.41.–
TB0
Newbie
30. 12. 2014   #5
-
0
-

#4 lukas.balaz

Problém je ten, že po zmáčknutí tlačítka se program jakoby zasekne (to bych přikládal příkazu Sleep) a pak se zobrazí to poslední vygenerované číslo. Prostě mezitím ta kostka neproblikává, ale je tam číslo, z předchozího hodu.

Nahlásit jako SPAM
IP: 2a00:1028:8d1f:15d2:8815:...–
Sniper
~ Anonymní uživatel
215 příspěvků
30. 12. 2014   #6
-
0
-

@lukas.balaz

Prosimtě když o tom nic nevíš tak neraď dokavaď si o tom něco nepřečteš. Tohle je zjevně dělaný v okně pomocí VCL, tak jaký "vypiš do konzole" proboha!

Jak je napsáno na tom stackoveflow - tohle běží v GUI vlákně, takže nepoužívat sleep (popravdě nedoporučuju ho používat nikde a nikdy). Důvod proč to nefunguje je jednoduchý, máš to napsaný v cyklu, přičemž ten proběhne celý aniž bys aktualizoval UI, takže se nezobrazí obrázky mezi, jen ten poslední protože UI se aktualizuje (překreslí) až když cyklus doběhne.

Takhle nějak bych to asi pořešil já (pomocí timeru - stačí přidat na form timer, nastavit mu interval podle libosti a enabled na false):

procedure TfMainForm.Kostka(N: Integer);
begin
// nějaká animace, načtení obrázku atp.
end;

procedure TfMainForm.FormCreate(Sender: TObject);
begin
Randomize;
end;

procedure TfMainForm.tmrAnimujKostkuTimer(Sender: TObject);
var
  N: Integer;
begin
repeat
  N := Random(6);
until N <> tmrAnimujKostku.Tag;
tmrAnimujKostku.Tag := N;
Kostka(N);
end;

procedure TfMainForm.btnStartStopClick(Sender: TObject);
begin
tmrAnimujKostku.Enabled := not tmrAnimujKostku.Enabled;
end;
Nahlásit jako SPAM
IP: 90.179.201.–
Sniper
~ Anonymní uživatel
215 příspěvků
30. 12. 2014   #7
-
0
-

Program se zasekne protože běží ten cyklus a nezpracovávají se zprávy windows (neber si to osobně, ale na tebe asi moc pokročilá záležitost) => program neodpovídá. Obecně řečeno, když děláš něco co trvá dlouho (zpracování dat např.), dělej to v pracovním vlákně. Pokud to musí běžet v GUI vlákně, tak se do výpočtu vkládá Application.ProcessMessages, což donutí vlákno zpracovat zprávy co se nahromadily ve frontě a až pak pokračovat dál ve výpočtu.

Nahlásit jako SPAM
IP: 90.179.201.–
TB0
Newbie
30. 12. 2014   #8
-
0
-

#7 Sniper
Děkuju moc, kód funguje.

Mám ještě dvě otázky.Jak mám udělat, aby výpočty běžely v pracovním vlákně, jak píšeš výše? A jakým způsobem bys v Delphi řešil hrací plochu hry "Člověče nezlob se" a celkově pohyb figurek.

Nahlásit jako SPAM
IP: 2a00:1028:8d1f:15d2:8815:...–
Sniper
~ Anonymní uživatel
215 příspěvků
31. 12. 2014   #9
-
0
-

Vlákna - vytvořil bych potomka TThread a tam bych to řešil (celkově to je trochu komplexnější, než to řešit na fóru jedním příspěvkem). Když zadáš do googlu "delphi threads" nebo "delphi TThread" tak ti vyjede hromada návodů a ukázek jak na to, včetně synchronizací atp.

Ohledně animace - to záleží jak to vlastně kreslíš. Předpokládám že OGL nebo DX se nekoná a kreslíš to buď pomocí canvasu nebo používáš VCL a hýbeš s obrázky po formu. No zase bych použil timer, vytvořil bych si objekt který bude spravovat animace a vždy, když budu chtít něčím pohnout tak tam zadám novou animaci a timer to ve svém eventu bude animovat (bude to posouvat podle uběhlého času o daný vektor). Když animace doběhne tak bych ji ze správce vymazal aby tam nesmrděla.
Nedávno jsem z nudy udělal prográmek na "simulaci" orbit, a tam je taky jednoduchá animace (kreslená do canvasu), tak se můžeš inspirovat: http://uloz.to/…imulator-zip

Nahlásit jako SPAM
IP: 90.179.201.–
TB0
Newbie
25. 1. 2015   #10
-
0
-

Tak sem se k tomuto projektu po delší době vrátil. S kostkou jsem si vyhrál a přidal i pár blbinek. Stále jsem se však nedostal k tomu nejdůležitějšímu - pohybu figurek. 

Hrací plochou je obrázek vložený do komponenty TImage. Stále řeším nejlepší způsob pohybu figurek. Měl jsem několik nápadů, žádný mně ale nepřipadá vhodný. (Některé moc primitivní a nepraktické, jiné pro mně nenaprogramovatelné).

Budu rád za jakékoliv nápady a rady. :)

Nahlásit jako SPAM
IP: 2a00:1028:8d1f:15d2:70af:...–
peter
~ Anonymní uživatel
4016 příspěvků
26. 1. 2015   #11
-
0
-

Nakreslis si policka. Ocislujes. Vyrobis 4 pole se seznamem policek, na ktere muze dana barva slapnout. U hrace zaznamenas polohu "i" policku pro jeho barvu.
fig = pole (0..16) // ve hre muze byt 16 figurek
fig.barva = 0; // 0 az 3, 4 barvy
fig.poloha = 0; // 0 az 39, kazda barva ma rekneme 40 policek
i = 0; // cislo zvolene figurky
id_policka = barva[fig[i].barva][fig[i].poloha]
id_policka soupere podobne, cyklus pro vsechny figurky. Pro vyhozeni plati, ze musi mit rozdilne barvy, fig[i].barva != fig[j].barva. Pro ulozeni v domecku zas plati delka trasy a zda neni prislusne id_policka obsazeno (coz muzes sledovat bud projitim polohy vsech figurek, nebo si udelas pole vsech policek - jenze tam muzou byt 4 figurky stejne barvy, treba, tak to musis promyslet).
A taky, zajimava otazka, kdyz jsou na policku 2 figurky stejne barvy a vstoupi na ne souper, jsou mi odebrany jedna figurka, obe a nebo moje dve figurky preperou jeho, ikdyz vstoupila posledni a tudiz jde ven on? :)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:ad9f:b4...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý