VB - odrazeni tlacitka

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Candy 12. 4. 2009 14:49

dobry chci si vytvorit pomoci timeru a vlastnosti button. Left tlacitko ktery se bude hybat do stran a odrazet se od sten. Nevim ale jak ho odrazit, nemate napady?
Candy
Junior
Uživatelský avatar

Odeslat příspěvekod gandor 12. 4. 2009 16:06

vo VB nerobim, ale toto je uplne standardny problem...
Potrebujes pravdepodobne oddelit "rychlost" od tlacitka...
takze timerom kazdy cyklus nieco ako pozicia_x=pozicia_x+dx;
tlacitkom dolava uz potom nastavujes iba ze dx= dx -1; (doprava je +1);
odrazenie potom osetrujes v timery...
if (pozicia_x + dx<0 alebo pozicia_x + dx> sirka obrazovky)
dx= dx*( -1 );

ps. verim ze bude existovat aj inaksie riesenie, lebo toto sa uci este na strednych skolach v prvych rocnikoch informatiky (kde sa ziadna optimalizacia neberie v uvahu)....
gandor
Mírně pokročilý

Odeslat příspěvekod Candy 12. 4. 2009 16:33

Podobne to delam, vlastnost left je vzdalenost od leveho okraje formu a tlacitka ke ktery pricitam jednicku pro smer doprava a naopak, jenze v
Momente, kdy je vzdalenost nula a tlqcitko se obrati nazpet, urazi pouze jeden pixel protoze pak je vzdalenost opet nenulova a button se vraci. Nejak nemuzu prijit na podminku kterou ho obratit
Candy
Junior
Uživatelský avatar

Odeslat příspěvekod aberez11 12. 4. 2009 17:19

no mna napadlo cosi taketo :-)
var left0: boolean=false //ak mas na zaciatku vlastnost button.left nastavenu na >0

if left0=false then begin
button.left:=button.left -1;
if button.left=0 then left0:=true;
end
else
begin
button.left:=button.left -1;
if button.left=form.width - button.width then left0:= false;
end;
Naposledy upravil aberez11 dne 13. 4. 2009 01:29, celkově upraveno 2
dedukcia: "Tí čo s tým nemajú problémy, s tým nemajú až také problémy. Ale tí čo s tým problémy majú, s tým majú problémy.." (prednasajuci vysvetluje studentom ako sa veci maju)
aberez11
Junior
Uživatelský avatar

Odeslat příspěvekod gandor 12. 4. 2009 22:16

Candy: njn asi si neporozumel ako som to myslel oddelit rychlost od smeru...
ak uvidis tak v mojej odpovedi menim hodnotu dx ( a nepripocitavam ani neodpocitavam nejaku kontantu 1-ky...) pri zmene smeru nastalo...
Podstatne je uvedomit si ze hodnota dx sa meni len v urcitych specialnych pripadoch (to znamena pri spusteni/vypnuti pohybu a ked sa pozicia dostava k okraju...), ale ze sa ta hodnota pricitava stale kym bezi cyklus...

Samozrejme aj to riesenie od abereza je plne funkcne a spravne... Preferujem ale svoje riesenie pre a, vecsiu variabilitu (vecsia rychlost, alebo teoreticky zastavenie) b, vecsiu spolahlivost (kontrola na hodnotu = 0 nemusi byt bezpecne... Stat sa to v beznych pripadoch nema ako, ale co ak sa preskoci nula? (pouzivas hodnotu double len blizku k nule alebo robis vecsi pohyb...) )...



ps. Netvrdim ze moje riesenie je najlepsie, rad uvidim nieco krajsie vymyslene... :)
gandor
Mírně pokročilý

Odeslat příspěvekod Candy 13. 4. 2009 13:38

mno, nevim, jestli to zadávám špatně, ale zkoušel jsem postup od abereze, napsal jsem to takhle
Kód: Vybrat vše
    Dim left0 As Boolean = False

        If left0 = False Then
            Button1.Left = Button1.Left - 1

            If Button1.Left = 0 Then
                left0 = True
            End If

        Else
            Button1.Left = Button1.Left + 1
            If Button1.Left = 461 - Button1.Width Then
                left0 = False
            End If

        End If
ale tlačítko se neodrazí, ale normálně pokračuje dál a zmizí...
Candy
Junior
Uživatelský avatar

Odeslat příspěvekod aberez11 13. 4. 2009 15:58

teraz som to checkoval v delphi a je to funkcne

Kód: Vybrat vše
var left0: boolean= false;

procedure TForm1.Timer1Timer(Sender: TObject); //interval 1ms

begin
  if left0= false then begin
    button1.Left:= button1.left -1;
    if button1.left=0 then left0:= true;
  end

  else

  begin
    button1.left:= button1.Left + 1;
    if button1.left= form1.width - button1.Width -8 then left0:=false;
  end; // 8 pixelov= okraj formulara
end;

end;


nepoznam absolutne syntax vb ale mozno robis niekde chybu s tymi blokmi podmienok
dedukcia: "Tí čo s tým nemajú problémy, s tým nemajú až také problémy. Ale tí čo s tým problémy majú, s tým majú problémy.." (prednasajuci vysvetluje studentom ako sa veci maju)
aberez11
Junior
Uživatelský avatar

Odeslat příspěvekod Candy 13. 4. 2009 16:08

když pročítám ten kód, tak to dává smysl, nevím, zkusim na to přijít a napíšu sem

edit: mno nevim, podle mě to nechce brát tu vnitřní podmínku if
edit: tak vnořenou podmínku to bere, ale to, že přiřadim k left0 true, tak to nezastaví ten pohyb.
Candy
Junior
Uživatelský avatar

Odeslat příspěvekod Candy 13. 4. 2009 16:52

hlavně po skončení algoritmu se hodnota znovu nastavi na false, takže není důvod pro pohyb do prava
edit: a nevím, co je to to begin, to vb neumí
Candy
Junior
Uživatelský avatar

Odeslat příspěvekod aberez11 13. 4. 2009 18:03

no ma to fungovat takto- kazdu milisekundu sa vykona podla podmienok kod v procedure casovaca. podmienky ktore urcuju pohyb dolava a doprava su zavisle od hodnoty left0. left0 je pravdiva ak bol dosiahnuty lavy okraj formulara (to je ked vlastnost tlacitka buton.left nadobudne hodnotu 0). vtedy v button.left kazdu 1ms navysujes hodnotu o 1 (pixel). ked dosiahne potom button.left hodnotu max (viditelnej) vzdialenosti od laveho okraja formulara (button.left= form.width - button.width - 8, kde form.width je sirka formulara v pixeloch, button.width sirka tlacitka a 8 je sirka okraja formulara) left0 zmeni hodnotu na false.
dedukcia: "Tí čo s tým nemajú problémy, s tým nemajú až také problémy. Ale tí čo s tým problémy majú, s tým majú problémy.." (prednasajuci vysvetluje studentom ako sa veci maju)
aberez11
Junior
Uživatelský avatar

Odeslat příspěvekod Candy 13. 4. 2009 18:17

Mno, takhle to chápu, funguje to jináč trochu, nakonec jsem to vyřešil úplně jinak, tak jak radil gandor:)
Kód: Vybrat vše
Button1.Left = Button1.Left - 1 * a
        If Button1.Left > 442 Or Button1.Left = 0 Then
            a = -a
        End If
plus mám tlačítko, který přiřadí jedničku proměnný a a tím spustí pohyb
Candy
Junior
Uživatelský avatar

Odeslat příspěvekod gandor 14. 4. 2009 12:39

rad som pomohol :)

ps.
Kód: Vybrat vše
Button1.Left = Button1.Left - 1 * a

staci nahradit
Kód: Vybrat vše
Button1.Left = Button1.Left + a


a z hladiska optimalnosti je lepsie zapinat / vypinat timer radsej ako nechavat hodnotu a=0...
Ale to su uz len detaily :)
gandor
Mírně pokročilý


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků