Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Törmäys(vb)

Sivun loppuun

CoDeR [05.06.2004 19:36:24]

#

semmonen kysymys tuli että miten saa niin että kun mulla on kaksi PictureBoxia ja sitä toista liikutellaan nuolinäppäimistä.(sen oon tehny jo) ni miten sais sillee et kun se liikuteltava kuva osuu siihen toiseen ni sitten se pysähtyy(eli siit ei pääsis mistää suunnasta läpi)??

..lyösin täält jo yhen esimerkin mut siin oli paljon mulle turhaa sälää ja se oli sekava ni en saanu siit mitää irti.
ja oon yrittäny tehä ite mut aina tulee joku pikku pulma.
=( .. sain kyllä sillee et se pysähtyy sen toisen kuvan kohalla mut se pysähtyy myös jos yrittää mennä vierestä.
....Neuvoja????

Gaxx [05.06.2004 19:49:30]

#

Pistä niitä ehtoja tarpeeks siihen if lauseeseen.

Eli kun x on tarpeeks pieni ja x on tarpeeksi suuri ja y on tarpeeksi pieni ja y on tarpeeksi suuri niin sitten pysähtyy.

CoDeR [05.06.2004 19:55:39]

#

ei se oikee toimi sillee ku sitte se pysähtymis paikka on niinku koko formin laajunen, eikä vaan sen kuvan laajunen minkä pitäs pysäyttää se toinen.. =(

Gaxx [05.06.2004 19:59:30]

#

Kyllä se toimii! Venaa sekka niin pistän esimerkkikoodin.

CoDeR [05.06.2004 20:01:17]

#

Ok.... muuten irckaatsä?

Gaxx [05.06.2004 20:19:57]

#

if picture1.left > picture2.left+picture2.width then
    if picture1.left+picture1.width < picture2.left then
        if picture1.top > picture2.top+picture2.height then
            if picture1.top+picture1.height < picture2.top then
            'Tähän kaikki liikkumisjutut
            end if
        end if
    end if
end if

Edit: Meni vähän kauan kun en ollu käyttäny kovin noita vb:n omia säätöhommia(piti meinaa eka vääntää ihan kokonainen esimerkki ohjelma). Oon lähinnä käyttäny api kutsuja. Sitten piti saada mahdollisimman selkeälukuinen koodi.
Toivottavasti toi on oikein ajateltu :)

En irkkaa varsinaisesti mutta kyllä irkissä tulee roikuttua joskus.

Edit: Koodi oli ajateltu päin jotain kun yks 2V kakara huutaa kurkkusuorana vieressä ja muut kailottaa jostain turhanpäiväsestä, mutta nyt koodin pitäs toimia niin kuin pitäisikin.

CoDeR [05.06.2004 20:27:45]

#

Tuleeks tohon 'Tähän kaikki liikkumis jutut ni ihan kaikki liikkumis jutut? niinku se normaali liikkuminen ja sitte sitä liikkeen pysäyttämistä koskevat jutut? =)
....sori ku oon näi daiju mut en oo koodaillu pitkään aikaan :)

edit: ja mihin toi koodi ois parasta laittaa?

Gaxx [05.06.2004 20:32:44]

#

Tossa on siis ehto millon voidaan liikkua. No olis parasta erotella jokaiselle suunnalle erikseen, mutta tossa oon yrittäny selvittää ideaa...
Koitan yrittää saada tehtyä vb:n omilla jutuilla esimerkkiohjelman.


Tai no sama se. Onhan siihen tietty toinenkin tapa, jota en itse kylläkään koskaan käytä :)

elikkä tallennat picture1:en sijainnin ennen liikkumisjuttua x ja y muuttujiin ja sitten vaan jos ollaan alueella, jolla ei sais olla, niin palautetaan picture1:en edellinen sijainti muuttujista.

Törmäystesti(tämäkin on testaamaton):

if picture1.left + picture1.width > picture2.left then
   if picture1.left < picture2.left + picture2.width then
       if picture1.top + picture1.height > picture2.top then
           if picture1.top < picture2.top + picture2.height then
                picture1.left = x
                picture1.top = y
           end if
       end if
   end if
end if

CoDeR [05.06.2004 20:39:10]

#

ok. ilmottele sit.
Lähen vähäks aikaa menee

Gaxx [05.06.2004 21:17:06]

#

Tässä vielä tönköhkö esimerkkiohjelma(joka siis ei ole mikää paras mahdollinen). Käyttää näppäimistön lukemiseen getasynckeystate API kutsua mutta ne rivit on kommentoitu...
Tarvitset formille:
timer1
picture1
picture2

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Dim abc As Boolean 'Tätä ei ole pakko käyttää, mutta suositeltavaa

Private Sub Timer1_Timer()
abc = True
If GetAsyncKeyState(39) And abc Then 'Oikealle
    x = Picture1.Left
    y = Picture1.Top
    Picture1.Left = Picture1.Left + 1
    abc = False
End If

If GetAsyncKeyState(37) And abc Then 'Vasemmalle
    x = Picture1.Left
    y = Picture1.Top
    Picture1.Left = Picture1.Left - 1
    abc = False
End If

If GetAsyncKeyState(38) And abc Then 'ylös
    x = Picture1.Left
    y = Picture1.Top
    Picture1.Top = Picture1.Top - 1
    abc = False
End If

If GetAsyncKeyState(40) And abc Then 'alas
    x = Picture1.Left
    y = Picture1.Top
    Picture1.Top = Picture1.Top + 1
    abc = False
End If

If Picture1.Left + Picture1.Width > Picture2.Left Then
  If Picture1.Left < Picture2.Left + Picture2.Width Then
      If Picture1.Top + Picture1.Height > Picture2.Top Then
          If Picture1.Top < Picture2.Top + Picture2.Height Then
               Picture1.Left = x
               Picture1.Top = y
          End If
      End If
  End If
End If
End Sub

CoDeR [05.06.2004 21:32:16]

#

Jep! pari pikku juttuu tohon piti lisätä mut kyl se sit toimi =)
edit: ja otin tost viel sen timerin pois ni nyt se o viel parempi :):) ... thx!!

Gaxx [05.06.2004 21:55:14]

#

Ite pyöritän ohjelmani omissa loopeissani enkä käytä mitään vb:n visualominaisuuksia(esim. picturebox, timer, yms.), sillä ne hankaloittavat mielestäni ohjelmointia varsinkin peleissä(en osaa ajatella niitä järjestelmällisesti tjsp.).

CoDeR [06.06.2004 23:01:56]

#

no kaipa jokainen ohjelmoi niinkuin lystää :)
... semmosta oisin viel kysässy et mitä hyötyy tost abc muuttujasta on ja mitä se tarkalleen ottaen tekee?

Antti Laaksonen [07.06.2004 00:48:02]

#

Näköjään abc-muuttujan avulla varmistetaan, että kuva liikkuu kerrallaan vain yhteen suuntaan. Muuttuja on kuitenkin tarpeeton, jos käytetään ElseIf-ehtoja erillisten ehtorakenteiden sijasta. Kuvan sijainti kannattaa myös lukea muuttujiin vain kerran. Tässä Timer-koodin alkuosa lyhennettynä:

If GetAsyncKeyState(39) Then 'Oikealle
   Picture1.Left = Picture1.Left + 1
ElseIf GetAsyncKeyState(37) Then 'Vasemmalle
   Picture1.Left = Picture1.Left - 1
ElseIf GetAsyncKeyState(38) Then 'ylös
   Picture1.Top = Picture1.Top - 1
ElseIf GetAsyncKeyState(40) Then 'alas
   Picture1.Top = Picture1.Top + 1
End If

x = Picture1.Left
y = Picture1.Top

CoDeR [07.06.2004 00:50:24]

#

joo. mut kato viel toi mun x juttu ku oot nii viisas. =)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta