Olen tekemässä peliä jota kuvataan yläviistosta niin miten kannattaisi tehdä kuvan scrollaaminen? ja miten saisin aina kenttää tulemaan kun liikutaan (esim: liikutaan oikealle niin näkyy jonkun aikaa asfalttia ja sitten tulee seinä.) Kiitos jo etu käteen.
Sinun täytyy tehdä sitten mappi joka on suurempi kuin näyttösi resoluutio, jotta sitä kannattaisi/täytyisi scrollata. Sitten teet kamera-muuttujan ja piirrät mapista ruudulle vain kameran kuvaaman alueen.
Joku saa kyllä selittää paremmin...
Pelissä ei tule olemaan koko näytössä pelaamis mahollisuutta joten sitä pelataan ikkunassa niin tuo mapin teko joka on suurempi kuin ikkuna on helppo asia. Tuota loppua en kyllä oikein onnistunnut sisällistämään.
Kai tuo peli nyt siis on tilepohjainen?
Idea on siis se, että jos kenttä on vaikka 100x100 ja kerralla näytettävä alue vaikka 9x9, niin piirretään aina alue (x-4) - (x+4) , (y-4) - (y+4), eli siis jos kamera on keskellä kenttää niin alue (46-54, 46-54)
Jos taas ollaan jossain nurkassa niin (1-9, 1-9)
Toivottavasti tästä tajuaa edes jotain. :P
Peli on tämän tapainen http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=23310
Ei tuosta kuvasta ota selvää. Onko se siis tilepohjainen vai ei?
Eräs helppo tapa on piirtää taustakuva PictureBoxiin, joka on huomattavasti Formia suurempi. Sitten vaan siirrät PictureBoxia haluttuun paikkaan Move-metodilla tai muuttamalla Left- ja Top-ominaisuuksia.
setä kirjoitti:
Eräs helppo tapa on piirtää taustakuva PictureBoxiin, joka on huomattavasti Formia suurempi. Sitten vaan siirrät PictureBoxia haluttuun paikkaan Move-metodilla tai muuttamalla Left- ja Top-ominaisuuksia.
Mutta tuo on erittäin hidasta.
Koneesta ja näytönohjaimesta tietenkin riippuu. Omalla koneellani meni 800x600 ikkunassa 3000x2000 pikselin kuvan siirto laidasta laitaan 1,4 s pikseli kerrallaan. Nopeammalla vauhdilla ei taustasta näe enää mitään.
hunajavohveli: ei ole tile pohjainen. mikä olisi hyvä keino tähän hommaan?
Kannattaa kerralla piirtää graffat vaikka directx:llä tai opengl:llä koska vb on _hidas_
vbn piirtäminen tulee riittämään aivan hyvin tähän tarkotukseen.
Tässä on joskus aiemmin tekemäni demo taustan skrollauksesta, joka on toteutettu ylempänä esittämälläni periaatteella. Ikkunaa voi pienentää, jolloin skrollauksen tarve lisääntyy.
http://personal.inet.fi/atk/korant/hawk.zip
Juuri tuollaista tarvisin. saisinko mitenkään lähdekoodia?
En valitettavasti löytänyt tuon demon lähdekoodia. Mutta tässä on testiohjelman koodi, jolla testasin nopeutta. Ehkä voit siitä soveltaa itsellesi.
Option Explicit Dim T As Single Dim X0 As Single, Y0 As Single Dim L As Single, H As Single Private Sub Form_Load() Picture1.Width = Image1.Width Picture1.Height = Image1.Height Picture1.Top = -500 Picture1.Picture = Image1.Picture H = -500 End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) X0 = X: Y0 = Y End Sub Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 0 Then Exit Sub L = L + X - X0 H = H + Y - Y0 Picture1.Move L, H End Sub Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button <> 2 Then Exit Sub T = Timer If Picture1.Left >= 0 Then Do While Picture1.Width + Picture1.Left > Me.ScaleWidth Picture1.Left = Picture1.Left - 1 DoEvents Loop Else Do While Picture1.Left < 0 Picture1.Left = Picture1.Left + 1 DoEvents Loop End If Me.Caption = Timer - T End Sub
Lomakkeen ja kuvalootan ScaleMode = 3 (Pixel). Laiskuuttani en ole kommentoinut mutta ehkä saat selvää. Kuva on alunperin ladattuna Image1:een, jonka koko asettuu kuvan mukaan.
Setä: miten tuon koodin pitäisi toimia?
Laita Image1 alimmaiseksi tai näkymättömäksi. Valitse jokin kuva Image1:n Pictureksi. Kun käynnistät ohjelman, kuva kopioidaan Pictureboxiin ja asetetaan koko kuvan mukaan. Tarkoitus on, että kuva on selvästi lomaketta suurempi.
Voit raahata taustaa hiirellä. Jos Klikkaat oikealla hiiripainikkeella PictureBoxia, se siirtyy laidasta laitaan vuoroin vasemmalle ja vuoroin oikealle. Siirtymiseen kuluva aika tulee näkyviin otsikkopalkkiin. Pitäisi toimia VB5:llä ja VB6:lla.
En onnistu soveltamaan tuota sinun koodiasi setä mitenkään järkevästi. Sano jos keksit uudestaan tai löydät tuon hawkin lähdekoodin nimittäin juuri tuollaista scrollausta minä tarvitsisin.
MouseMove-tapahtumassa taustaa siirretään hiirellä. MouseUp-tapahtuma 2-painikkeella käynnistää taustan siirtymisen itsestään pikseli kerrallaan joko vasemmalle tai oikealle. Etkö saa niitä toimimaan. Kerro miten haluat taustaa skrollata. Tuon hawkin lähdekoodin olen ilmeisesti hukannut. Koodin alussa oleva 500 täytyy pienentää, jos kuvan korkeus on alle 1000 pikseliä.
EDIT! Löytyi sittenkin tuosta kannettavasta. Hawk-koodissa on piirretty hävittäjän kuva viivoilla (typerä ratkaisu ja pirullisen pitkä koodi). Hävittäjän liike ja taustan skrollaus on ohajattu ajastimella, joten oleellinen juttu on Timer-tapahtumassa. Lisäsin vähän kommentteja jotta saan itsekin siitä selvää. Koko projektin voi ladata kohtapuoliin tästä:
http://personal.inet.fi/atk/korant/prhawk.zip
Setä: Linkki väärin antaa "Not Found"
Malta hetki, siinä lukee "kohtapuoliin"
EDIT: No ny toimii!
Vielä tuosta scrollaus koodista kun en onnistu sitä niin muokkaamaan.
If Cos(a) < 0 Then 'liikutaan vasemmalle 'jos lähestytään kartan reunaa, kaarretaan takaisin If xm < 100 Then e = -0.02 * Sgn(Sin(a)) 'jos lähestytään ikkunan reunaa, siirretään karttaa If xm < 150 - pic.Left Then pic.Left = 0.98 * pic.Left + 3 - xm / 50 'oudolla lausekkeella pehmennetään scrollauksen alkua 'äkillinen nykäisy näyttää rumalta End If If Cos(a) > 0 Then 'samat kujeet kun mennään oikealle If xm > pic.Width - 100 Then e = 0.02 * Sgn(Sin(a)) If xm > ScaleWidth - pic.Left - 150 Then pic.Left = _ 0.98 * pic.Left + (ScaleWidth - xm) / 50 - 3 End If If Sin(a) < 0 Then 'ja ylös If ym < 100 Then e = 0.02 * Sgn(Cos(a)) If ym < 150 - pic.Top Then pic.Top = 0.98 * pic.Top + 3 - ym / 50 End If If Sin(a) > 0 Then 'ja alas If ym > pic.Height - 100 Then e = -0.02 * Sgn(Cos(a)) If ym > ScaleHeight - pic.Top - 150 Then pic.Top = _ 0.98 * pic.Top + (ScaleHeight - ym) / 50 - 3 End If End Sub
Niin tuo pic on se hävittäjä? ja miten minun noitten a, ym ja xm:än kanssa pitäisi tehdä? minulla se "hahmo" on Mainfigure jos tarvitsee tietää.
Kartta on kuvakehyksessä pic eli kun siirretään karttaa siirretään siis kuvakehystä. Hahmon (tässä siis hävittäjä) koordinaatit ovat xm ja ym, nopeus v, nopeuden muutos eli kiihtyvyys dv, nopeuden suunta a ja suunnan muutosnopeus e.
Kiitos setä tuo auttoi ja paljon. Mutta tuo Kuvakehys jäi hämärään mikä se on?
Kuvakehys on PictureBox eli kuvaloota, johon voi sijoittaa paitsi kuvia myös muita kontrolleja kuten painonappi, tekstiruutu jne. Kuvakehys toimii kuten Formi muiden kontrollien alustana.
Hmm tuota pictureboxia en pysty käyttämään tässä työssäni. Olisiko muita vaihto ehtoja scrollaamiseen?
Mihin tälläät taustan. VB:ssä ei kai ole muita vaihtoehtoja kuin Formi, PictureBox tai Image, joka on huonoin vaihtoehto. Jos voit maalata taustan formille niin voit sen tehdä yhtä hyvin pictureboxiin.
Setä: minulla on pelissä imageja aika paljon joita tarvitsen ne ei näy picture boxin takaanta. se on se ongelma.
Mikset voi laittaa niitä imageja pictureboksiin. Sinnehän ne on laitettava, jotta skrollaus pelaa. Hawk on piirretty pictureboxiin.
mulla on tehty valikot imageista nii ne ei näy pictureboxin takaa.
Tee valikot pictureboxeihin. Siis jos on mahdollista. Imagenhan voi aina pudottaa pictureboxiin, jonka taas voi sijoittaa imagen paikalle. Picturboxit taas voidaan järjestää niin, että tausta on aina alimmaisena.
Pitäisi muuttaa sitten noin 100 riviä koodia :S
Search&replace
Aihe on jo aika vanha, joten et voi enää vastata siihen.