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???
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.
niin... mutta se on vaan aika tyhmää jos vihollinen tulee päin kun seisoo paikallaan,niin ei kuole..:(
täytyis olla joku toinen koodi
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.
ikävä kyllä se on pitkä...todellakin siis jos haluut koko pelin koodin...:)
Lisää sama koodi sinne (tee funktio ja kutsu sitä), missä liikutat hirviötä.
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. :-)
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ä..
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.
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).
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
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???
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.
joo...:) huomasin just itekkin..kun kokeilin että onko se turha. Mutta mitä haittaa siitä on jos sen laittaa timeriin?
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ää.
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ä.
Ehei, ei tarkista, mikäli prosessori ei pysty tuohon nopeuteen.
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..
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.
Hunajavohveli: Tarkistaa, jos on sopiva prosessori. Mutta Zero voi tehdä kuten haluaa.
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.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.