Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: kaaressa liikkuva kuva

Sivun loppuun

Zero88 [08.05.2004 00:08:46]

#

Tällainen ongelma... Täytyisi saada kuva liikkumaan puoli ympyrän muotoisesti kaaressa, mutta en muista että miten se taas tehtiinkään...se oli joku ihan yksinkertainen juttu, mutta muistikatkos iski jälleen..

setä [08.05.2004 07:48:29]

#

Määritä kaaren keskipiste (X0, Y0) ja säde R, alkukulma a1 ja kulman muutos da.

a = a1
Do until a > a1 + 4 * Atn(1)
   X = X0 + R * Cos(a)
   Y = Y0 - R * Sin(a)
   'laita hahmo paikkaan X, Y
   a = a + da
   doevents ' + mahdollinen viive
Loop

Y:n lausekkeessa on - koska Y kasvaa oletuksena alaspäin. Do-loopin sijaan voi käyttää Timeriä nopeuden säätöön.

peki [08.05.2004 07:51:18]

#

Ympyrässä saat sen liikkumaan sini- ja kosiniaalloilla:
x = paikka + säde * cos(alfa)
y = paikka + säde * sin(alfa)
alfanhan pitää olla jotain väliltä 0-2*pii
rajoitat vain alfaa 0-pii.
kasvatat alfaa piiksi ja sitten ruvet laskemaan sitä kun se saavuttaa piin. Piin saavuttamisen jälkeen lasket sen taas pikkuhiljaa nollaan.
Jos haluat sen liikkumaan eri kohdissa ympyrän kaarta, niin riittää kun muutat noita alfan rajoituksia.

Edit: Äh, setä oli nopeampi.

Zero88 [08.05.2004 12:38:15]

#

Nyt en tainnut oikeen tajuta sillä kuva ei liiku mihinkään.
Muistaisin että tolle olisi helpompikin koodi, mutta en muista mikä.. siinä oli ainakin For i=600 to 1000 step 0.2

setä [08.05.2004 12:41:44]

#

Liike riippuu alustan scalemodesta ja arvoista X0, Y0, R, a1 ja da.

Sami [08.05.2004 13:25:29]

#

Ympyrän kehällä liikuttamiseen ei taida olla mitään siniä ja kosinia yksinkertaisempaa tapaa (ja ne on todella yksinkertaisia viimeistään lukion trigonometrian kurssin jälkeen)
Sitten vielä pekille: kyllähän se alfa voi olla mitä tahansa muutakin kuin 0-2*pii

sooda [08.05.2004 13:38:45]

#

Todellakin, kun tota on vähän aikaa käyttänyt niin se on selvempää ku pässinliha. Toi pekin selitys
x = paikka + säde * cos(alfa)
y = paikka + säde * sin(alfa)
on tosi hyvä. Hyvä kanssa muistaa että noi funkkarit käsittelee arvoja radiaaneina, asteet saa radeiksi näin: esim jos kulma on 123, niin käytä cosia näin: cos(123*pi/180) jossa pi on piin arvo.

Zero88 [08.05.2004 17:54:46]

#

Oon nyt aika pihalla taas näistä jutuista. En nyt oikeen tajua, että mikä näistä koodeista määrittää sen kuvan liikeradan. Eli laitanko näin

x=picture1.left+säde(esim 25)*cos(alfa)
y=picture1.top+25*sin(alfa)

??
Oon nyt ihan pihalla taas. :/
Jos joku vois vaikka näyttää sellasen koodin mihin on jo valmiiks sijoitettu arvot niin voisin tajuta, että mistä on kysymys...

setä [08.05.2004 19:16:06]

#

Onko Picture1 kuva, jota liikutat ja liikutatko formilla vai jollain kuvakehyksellä? kerro myös mistä kohtaa haluat sen lähtevän ja minne tulevan ja kuinka päin ympyrää kierretään.

Zero88 [08.05.2004 19:52:35]

#

joo sen kuvan nimi on picture1 ja liikutan sitä formilla. se voi lähteä vaikka pisteestä (100,100) ja mennä pisteeseen (150,150) ja se liikkuu puoliympyrän muotoisesti. alhaalta ylös niinku tykkipelis...

rndprogy [08.05.2004 20:10:49]

#

Minä löysin ainakin koodivinkeista juuri tuollaisia vinkkejä.

setä [08.05.2004 20:30:27]

#

tykkipelis.., en oo nähny mutta taitaakin mennä parabelin muotoista rataa. Silloin ei sinit ja kosinit käy.

Zero88 [08.05.2004 20:57:21]

#

Siis tarkoitan että muuten "samaan suuntaan" mutta vain puoliympyrän muotoisesti...

peki [08.05.2004 21:35:23]

#

käyhän siihen sini ja kosini. Muutat vain molempien säteitä siten, että muodostuu ellipsi.
Sitten puolitat sen, noilla jo edellä esitetyillä keinoilla.
Jos tykkipeliä teet, niin suosittelisin soveltamaan fysiikan lakeja.

Zero88 [08.05.2004 21:47:49]

#

yritin jo... mutta kuva liikkuu vain yläviistoon.. :(
voisitko näyttää jonkun esimerkin, kun en oikeen muuten tajuu tätä juttuu.. Onko mitään keinoa jolloin ei tarvitsisi laitella noita alkukulmia ja kulmamuutoksia, meinaan menee jo vähän yli.

peki [08.05.2004 21:56:26]

#

'nämä ihan alkuun(globaaleiksi)
dim x as integer
dim y as integer
dim kulma as double

Const kaaren_leveys as integer = 200
Const kaaren_korkeus as integer = 100

' Tämä timeriin
alkukulma += 0.1
if kulma > 2*pi then kulma = 0
x = cos(kulma) * kaaren_leveys
y = sin(kulma) * kaaren_korkeus

Nyt sinun täytyy vain laittaa x ja y arvot pictureboxin leftiksi ja rightiksi.
Jos haluat valita vain osan tuosta kaaresta:

'tämä form_loadiin
kulma = pi ' 180 asteissa

' Tämä timeriin
kulma += 0.1
if kulma > 2*pi then kulma = pi ' nyt saat aikaan puoliellipsin
x = cos(kulma) * kaaren_leveys
y = sin(kulma) * kaaren_korkeus

Edit: ajatteluvirhe

Zero88 [08.05.2004 22:02:33]

#

Nyt sinun täytyy vain laittaa x ja y arvot pictureboxin leftiksi ja rightiksi.

siis tarkoitatko leftiksi ja topiksi?

peki [08.05.2004 22:06:25]

#

Joo, sori typoa

Zero88 [08.05.2004 22:22:46]

#

mihin kohtaan koodia määrittelen sen että picture1 likkuu?
ja laitanko noihin cos(kulma) ja sin(kulma) jonkun aste luvun?

ps.onko toi kulma+=0.1 sama kun kulma=kulma+0.1 , kun vb ei hyväksy tollasta kun kulma+=0.1

edit:älä välitä tosta cos(kulma) jutusta jota kysyin huomasin just et siel lukeekin kulma=pi

setä [08.05.2004 22:55:07]

#

Siis tossa ei kannata käyttää mitään sinejä ja kosineja, koska ammus lentää parabelin muotoista rataa. Jos ilman vastusta ei oteta huomioon, vaakanopeus on vakio ja pystynopeus muuttuu tasaisesti kiihtyen alaspäin painovoiman johdosta. Koodi on silloin todella yksinkertainen.

X = X + vx
Y = Y + vy
vy = vy + g

Antti Laaksonen [09.05.2004 00:36:08]

#

Tämä koodi toimii, kunhan formin ScaleMode on 3 eli Pixel ja formilla on Picture1-niminen kuvakehys. Koodi liikuttaa kuvaa puoliympyrän muotoisessa radassa, kuten alkuperäinen kysymys oli.

Const PII = 3.14159
Const KESKIX = 150
Const KESKIY = 100
Const LEVEYS = 100
Const KORKEUS = 100

Private Sub Form_Click()
    Dim i As Single, kx As Integer, ky As Integer
    kx = Picture1.Width / 2  'kuvan keskipiste (x)
    ky = Picture1.Height / 2 'kuvan keskipiste (y)
    'kierto vasemmalta oikealle yläkautta
    For i = PII * 1.5 To PII * 0.5 Step -0.01
        Picture1.Left = KESKIX + Sin(i) * LEVEYS - kx
        Picture1.Top = KESKIY + Cos(i) * KORKEUS - ky
        'tähän voi laittaa sopivan hidasteen
        DoEvents
    Next
End Sub

Sivun alkuun

Vastaus

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

Tietoa sivustosta