Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: törmäyskoodissa puutteita??vai onko??

Sivun loppuun

Zero88 [20.04.2004 20:59:53]

#

Tällainen ongelma...

kun laittaa törmäyskoodin

If ukkeli.Top < (hirviö.Top + hirviö.Height) Then
If (ukkeli.Top + ukkeli.Height) > hirviö.Top Then
If ukkeli.Left < (hirviö.Left + hirviö.Width) Then
If (ukkeli.Left + ukkeli.Width) > hirviö.Left Then

msgbox "kuolit"
end

End If
End If
End If
End If

Kun vihollisukkeli törmää pelaajaan niin ei käy mitään silloin kun pelaaja seisoo paikallaan...
eli miten koodia pitäis muokata???

hunajavohveli [20.04.2004 21:29:01]

#

Kenties tuo tarkistus tehdään vain silloin kun ukko liikkuu? Silloin sillä ei olisi mitään virkaa, vaikka hirviö liikuisikin ukon päälle, jos ukko pysyy paikallaan.

Zero88 [20.04.2004 21:33:07]

#

niin... mutta se on vaan aika tyhmää jos vihollinen tulee päin kun seisoo paikallaan,niin ei kuole..:(
täytyis olla joku toinen koodi

hunajavohveli [20.04.2004 21:38:25]

#

No senpä vuoksi asia täytyykin korjata. :-) Pistä koko koodi (ei kai se ole liian pitkä) esille, niin näytän, miten korjaukset tehdään.

Zero88 [20.04.2004 21:46:24]

#

ikävä kyllä se on pitkä...todellakin siis jos haluut koko pelin koodin...:)

Blaze [20.04.2004 21:51:34]

#

Lisää sama koodi sinne (tee funktio ja kutsu sitä), missä liikutat hirviötä.

hunajavohveli [20.04.2004 21:52:58]

#

Oletkos säätänyt formin ScaleMode-ominaisuuden Twipistä Pixeliksi? Jos et ole, niin tee se nyt. Ja sitten pistät tuon testauksen molempiin kohtiin, siis siihen milloin ukko liikkuu ja myös siihen missä hirviö liikkuu.
Edit: Nonih, kävipä minullekin kerran niin, että joku ehti edelle. :-)

Zero88 [20.04.2004 21:58:40]

#

Blaze kirjoitti:

Lisää sama koodi sinne (tee funktio ja kutsu sitä), missä liikutat hirviötä.

sori mutta nyt en oikeen tajunnu..:) siis mitäs mun oikeen pitäis lisätä, katos kun en oikeen ymmärrä..

hunajavohveli [20.04.2004 22:00:31]

#

If ukkeli.Top < (hirviö.Top + hirviö.Height) Then
If (ukkeli.Top + ukkeli.Height) > hirviö.Top Then
If ukkeli.Left < (hirviö.Left + hirviö.Width) Then
If (ukkeli.Left + ukkeli.Width) > hirviö.Left Then

msgbox "kuolit"
end

End If
End If
End If
End If

No siis tuo testaus. Sehän on sinulla nyt siinä kohtaa, missä ukkoa on liikutettu. Kopioit tuon saman vain siihen kohtaan, mikä tulee hirviön liikuttamisen jälkeen.

remontti-reiska [21.04.2004 12:49:38]

#

Tuo messageboxin jälkeisen endin voisi ottaa pois. Eli siis jos pistit tuon Form_Loadiin, niin sillon se toteuttaa tuon koodin vain yhden kerran sillon, kun peli latautuu. Eli pistä tuo vaikka timeriin ja sen intervaliksi vaikka 1. Muista myös else, että tuo ei jankkaa kokoajan tuota messageboksin tekstiä, kun se on kerran osunut hirviöön. Tietysti, jos tuo toteutetaan ainoastaan, jos ukkeli liikkuu, niin voithan tietenkin vaihtaa ukkelien paikalle hirviöt ja toisinpäin :). Näin tuo ainakin pitäisi toimia (hirviöthän liikkuvat aina).

hunajavohveli [21.04.2004 14:36:33]

#

Timerin käyttö ei minusta ole sopivaa, sillä se testaa aina tietyn ajan välein, eli (teoriassa) hirviö voi vaikkaa liikkua ukon ohi, ja jos timer-tarkistus ei satu siihen kohtaan, ukko ei kuole, vaikka hirviö meneekin läpi.
Mutta voit muuntaa tuon tarkituksen aliohjelmaksi:

Private Sub Tarkista()

If ukkeli.Top < (hirviö.Top + hirviö.Height) Then
If (ukkeli.Top + ukkeli.Height) > hirviö.Top Then
If ukkeli.Left < (hirviö.Left + hirviö.Width) Then
If (ukkeli.Left + ukkeli.Width) > hirviö.Left Then

msgbox "kuolit"
end

End If
End If
End If
End If

End Sub

Ja voit sitten kutsua tuota tarkistusta aina kun on tarve (ukon ja hirviön liikuessa) kirjoittamalla vain:

Tarkista

Zero88 [21.04.2004 15:19:18]

#

no joo laitoin ne näin timeriin niin nyt toimii...

If ohjus.Top < (ukkeli.Top + ukkeli.Height) Then
If (ohjus.Top + ohjus.Height) > ukkeli.Top Then
If ohjus.Left < (ukkeli.Left + ukkeli.Width) Then
If (ohjus.Left + ohjus.Width) > ukkeli.Left Then

MsgBox "kuolit"
End

End If
End If
End If
End If

If ukkeli.Top < (ohjus.Top + ohjus.Height) Then
If (ukkeli.Top + ukkeli.Height) > ohjus.Top Then
If ukkeli.Left < (ohjus.Left + ohjus.Width) Then
If (ukkeli.Left + ukkeli.Width) > ohjus.Left Then

MsgBox "kuolit"
End

End If
End If
End If
End If

onkohan toinen noista turha???

hunajavohveli [21.04.2004 15:23:00]

#

Voivoi... tuo Timer siis teorissa on todella sellainen, että se aina silloin tällöin tarkistaa tilanteen, mutta jos hirviö käy ukon päällä näiden tarkistusten välissä, niin ei tapahdu mitään.
Ja tietenkin toinen noista on turha, eihän sitä nyt kahta kertaa tarvitse tarkistaa peräkkäin.

Zero88 [21.04.2004 15:25:25]

#

joo...:) huomasin just itekkin..kun kokeilin että onko se turha. Mutta mitä haittaa siitä on jos sen laittaa timeriin?

hunajavohveli [21.04.2004 15:28:05]

#

No eihän siitä käytännössä ole mitään ongelmaa. Mutta teoriassa Timer on epävarma, ja kun kyse on Windowsista, niin käytännöstä saattaa milloin tulla teoriankaltainen. Tätä on vaikea aloittelijalle selittää, mutta uskoisin, että remontti-reiska ymmärtää mitä tarkoitan, kun sanon, ettei Timeriä pitäisi käyttää.

remontti-reiska [21.04.2004 15:29:59]

#

Ei käytännösä mitään, ellei ohjuksen nopeus ole sitten hirveä. Jos pistää esim intervaliksi 1, niin se tarkistaa sen joka millisekuntti. Näin se kyllä pystyy sen tarkistamaan, mutta siihen liittyy sitten tiettyjä riskejä.

hunajavohveli [21.04.2004 15:34:22]

#

Ehei, ei tarkista, mikäli prosessori ei pysty tuohon nopeuteen.

Zero88 [21.04.2004 15:35:36]

#

miten teen sellasen että kun törmää johonkin esim.
30pixel x 30 pixel esineeseen niin alkuperäiset koordinaatit palautuu?? esim ukko ei pääse puun läpi jne..

hunajavohveli [21.04.2004 15:35:42]

#

lainaus:

Jos pistää esim intervaliksi 1, niin se tarkistaa sen joka millisekuntti.

Ehei, ei tarkista, mikäli prosessori ei pysty tuohon nopeuteen. Ja sitä paitsi teoriassa itse hirviö ja ukko voivat liikkua nopeammin kuin joka millisekunti. Windows voi myös jotenkin kummasti hidastaa timeriä vaikka muu pysyykin kunnossa. Jos vaikka tietokoneen kellossa onkin ongelmaa niin... ei, varmempaa on että tarkistus tehdä silloin kun syytä on eikä milloinkaan muulloin.

remontti-reiska [21.04.2004 15:48:26]

#

Hunajavohveli: Tarkistaa, jos on sopiva prosessori. Mutta Zero voi tehdä kuten haluaa.

hunajavohveli [21.04.2004 15:52:39]

#

Niin varmaan, mutta myönsit itsekin, että riskejä sisältyy. Toki annan Zeron tehdä miten hän haluaa, mutta tämä oli vain oma suositukseni, vaikka tästä ei ongelmaa luultavasti synnykään.

Blaze [21.04.2004 17:56:25]

#

Zero88 kirjoitti:

alkuperäiset koordinaatit palautuu??

No liikuta vaikka ukkoa taaksepäin saman verran, kuin liikutit eteenpäinkin, jos et parempaa keksi.

Ja jostain muistan lukeneeni, että pienin mahdollinen arvo Timerin Intervalille on 18ms


Sivun alkuun

Vastaus

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

Tietoa sivustosta