Code: Select all
setupcollision vihollinen\obj,vihollinen\obj,2,2,2
Code: Select all
setupcollision vihollinen\obj,vihollinen\obj,2,2,2
tuossa asetat törmäyksen samaan objektiin->MAV.ghost wrote:mite teen tyypeille törmäyksen tunnistuksen?Tosta tulee mav,nii miten sitten teen sen?Code: Select all
setupcollision vihollinen\obj,vihollinen\obj,2,2,2
Code: Select all
for vihu2.vihutyyppi =each vihutyyppi
setupcollision vihu/obj, vihu2/obj, 2,2,2
next vihu2
ghost wrote:ei taida toimii noinkaa koska nyt se törmäyksen tarkistus on vihu2\obj ja vihu\obj,mut mite saan kaikille vihuille ettei ne mee päällekkäin
Code: Select all
// Käydään kaikki viholliset läpi ja asetetaan jokaiselle
// törmäystunnistus muiden vihollisten kanssa.
For vihu.VIHOLLISET = Each VIHOLLISET
// Asetetaan törmäysvihu-muuttujaan tällä kierroksella
// mentävän vihun jälkeen VIHOLLISET-kokoelmassa tuleva
// vihollinen.
törmäysvihu.VIHOLLISET = After( vihu )
While törmäysvihu <> NULL
// Niin pitkään kuin törmäysvihu-muuttuja osoittaa
// johonkin VIHOLLISET-kokoelman jäseneen, voidaan
// sille ja For-loopin "vihu"-jäsenelle asettaa
// törmäystunnistus.
SetupCollision vihu\obj, törmäysvihu\obj, 2, 2, 2
SetupCollision törmäysvihu\obj, vihu\obj, 2, 2, 2
// Siirrytään tarkastelemaan seuraavaksi listassa
// olevaa vihollista
törmäysvihu = After( törmäysvihu )
Wend
Next vihu
// Eli esimerkiksi sinulla on viholliset 1,2,3,4,5. Tällöin
// For vihu.VIHOLLISET kohdassa "vihu" muuttujaan asetetaan
// vihollinen 1, ja törmäysvihu.VIHOLLISET = After( vihu )
// muuttujaan asetetaan vihollinen 2. Tämän jälkeen näille
// vihollisille asetetaan keskenään törmäystarkistus:
// SetupCollision vihu\obj, törmäysvihu\obj tarkoittaisi siis
// että asetetaan vihollisen 1 ja vihollisen 2 objekteille
// törmäykset.
//
// Sitten sen jälkeen asetetaan törmäysvihu-muuttuja osoittamaan
// seuraavaan VIHOLLISET-kokoelman jäseneen, eli viholliseen 3.
// Tällöin törmäys asetetaan vihollisen 1 ja vihollisen 3 välille.
//
// Seuraavaksi törmäysvihu on vihollinen 4, ja törmäys asetetaan
// viholliselle 1 ja viholliselle 4. Tämän jälkeen törmäysvihu
// asetetaan viholliseksi 5 ja sama homma tapahtuu uudelleen.
//
// Nyt kun vihollisen 5 jälkeen ei enää tule vihollisia, on
// "törmäysvihu" muuttujan arvo NULL, eli se ei osoita mihinkään
// kokoelman jäseneen, jolloin While-silmukaan ei enää mennä.
// Seuraavaksi hypätää "Next vihu" kohdassa siihen, että "vihu"
// muuttuja osoittaa viholliseen 2, ja törmäysvihu sitten
// viholliseen 3. Sitten näille kahdelle asetetaan törmäys, ja
// muuteaan "törmäysvihu" osoittamaan viholliseen 4 ja niin edelleen.
//
// Näin saadaan jokaiselle viholliselle keskenään törmäystarkistus,
// eikä niille tule vahingossa tuplamäärä tarkistuksia (kuten jos
// käytettäisiin kahta sisäkkäistä For-Each silmukkaa).
Unohdin että SetupCollision asettaa törmäykset vain yhteen suuntaan. Sitä kun tulee niin harvoin käytettyä, HC-koodarit pelaa koordinaateilla ja matematiikalla.
Code: Select all
For vihu.Vihut = Each Vihut
For vihu2.Vihut = Each Vihut
If vihu <> vihu2 Then
SetupCollision vihu\obj, vihu2\obj, 2, 2, 2
SetupCollision vihu2\obj, vihu\obj, 2, 2, 2
Endif
Next vihu2
Next vihu
Ei näin.MaGetzUb wrote:Code: Select all
For vihu.Vihut = Each Vihut For vihu2.Vihut = Each Vihut SetupCollision vihu\obj, vihu2\obj, 2, 2, 2 SetupCollision vihu2\obj, vihu\obj, 2, 2, 2 Next vihu2 Next vihu
Joo huomasinkin etten ollut laittanut ehtoa väliin, hienoa kun ei tullut ajateltua kirjoitin vaan.SPuntte wrote:Ei näin.MaGetzUb wrote:Code: Select all
For vihu.Vihut = Each Vihut For vihu2.Vihut = Each Vihut SetupCollision vihu\obj, vihu2\obj, 2, 2, 2 SetupCollision vihu2\obj, vihu\obj, 2, 2, 2 Next vihu2 Next vihu
Tuossa käydään läpi kaikki permutaatiot, kun pitäisi käydä läpi vain kaikki kombinaatiot. VesQ:n tapa on muuten oikea, mutta siinä törmäys asetetaan vain yhteen suuntaan, eli mielivaltaisesta vihuparista vain listassa "ylempänä" oleva voi törmätä toiseen. Ongelman voi korjata helposti lisäämällä toisinpäisen törmäyksen asetavan SetupCollision-käskyn.
Oletetaan, että meillä on instanssit A, B, C. Alussa vihu = A ja vihu2 = A, joten ensimmäiset SetupCollision-kutsut asettavat törmäykset A -> A sekä A -> A. Pieleen menee.
Lisäksi huomataan, että toisella vihu2:n iteraatiolla vihu = A ja vihu2 = B. No ei tässä vielä mitään, mutta entäs sitten, kun onkin näin: vihu = B, vihu2 = A? Sama asia tehdään toiseen kertaan. Taas menee pieleen.
Code: Select all
For vihu.Vihut = Each Vihut
For vihu2.Vihut = Each Vihut
If vihu <> vihu2 Then SetupCollision vihu\obj, vihu2\obj, 2, 2, 2
Next vihu2
Next vihu
Jeps, korjasinkin ongelman jo. Ei oo vaan aikoihin tullut temppuiltua SetupCollisionin kanssa niin tuppaa unohtumaan se, että törmäykset asetetaan vain yhteen suuntaan.SPuntte wrote:VesQ:n tapa on muuten oikea, mutta siinä törmäys asetetaan vain yhteen suuntaan, eli mielivaltaisesta vihuparista vain listassa "ylempänä" oleva voi törmätä toiseen osapuoleen. Ongelman voi korjata helposti lisäämällä toisinpäisen törmäyksen asettavan SetupCollision-käskyn.
...niinhän ne tekevätkin?MaGetzUb wrote:Eikö vihollisten kannattaisi kaikkien törmätä toisien kanssa? Niin sitten ne eivät lähtisi liukumaan seinien lävitse.
Koodissasi viholliset törmäävät edelleenkin vain yhteen suuntaan, mikä taidettiinkin mainita pariin kertaan.Tuxi wrote:MaGetzUbin koodi korjattuna:Code: Select all
For vihu.Vihut = Each Vihut For vihu2.Vihut = Each Vihut If vihu <> vihu2 Then SetupCollision vihu\obj, vihu2\obj, 2, 2, 2 Next vihu2 Next vihu
Code: Select all
For vihu.VIHOLLISET = Each VIHOLLISET
// Asetetaan törmäysvihu-muuttujaan tällä kierroksella
// mentävän vihun jälkeen VIHOLLISET-kokoelmassa tuleva
// vihollinen.
törmäysvihu.VIHOLLISET = After( vihu )
While törmäysvihu <> NULL
// Niin pitkään kuin törmäysvihu-muuttuja osoittaa
// johonkin VIHOLLISET-kokoelman jäseneen, voidaan
// sille ja For-loopin "vihu"-jäsenelle asettaa
// törmäystunnistus.
SetupCollision vihu\obj, törmäysvihu\obj, 2, 2, 2
SetupCollision törmäysvihu\obj, vihu\obj, 2, 2, 2
// Siirrytään tarkastelemaan seuraavaksi listassa
// olevaa vihollista
törmäysvihu = After( törmäysvihu )
Wend
Next vihu
Code: Select all
For vihu.Vihut = Each Vihut
For vihu2.Vihut = Each Vihut
If vihu <> vihu2 Then SetupCollision vihu\obj, vihu2\obj, 2, 2, 2
Next vihu2
Next vihu
Code: Select all
Else If reload1=0 Then
Code: Select all
If Lower (kok$) = "y" Then
PaintObject ukkeli,bot
PlayObject ukkeli,0,4
PointObject ukkeli,ukko
If ObjectSight(ukkeli,ukko) Then
MoveObject ukkeli,3
Else
If reload1=0 Then
PlaySound "Tiedostot\Machine Gun 1.wav",100
luoti.AMMUS = New(AMMUS)
luoti\obj=CloneObject(pati)
CloneObjectPosition luoti\obj,ukkeli
CloneObjectOrientation luoti\obj,ukkeli
reload1=20 'Luodin lataus nopeus
EndIf
EndIf
If reload1>0 Then reload1=reload1-1
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,20 'Luodin lento nopeus
If ObjectsOverlap (ukko,luoti\obj) Then
ObjectInteger ukko,ObjectInteger(ukko) -2'Luodin hittaus
DeleteObject luoti\obj
Delete luoti
ElseIf GetMap( 2, ObjectX(luoti\obj), ObjectY(luoti\obj) ) Then
DeleteObject luoti\obj
Delete luoti
EndIf
Next luoti
EndIf
EndIf
Code: Select all
...
If NOT ObjectSight(ukkeli,ukko) Then
...
Tämä voisi auttaa.pietari-poika wrote: Esimerkiksi näkymättömissä olevien paikkojen tummennus jotenkin tähän tyyliin...? Mites tällaisen saisi järkevimmin toteutettua?
Näin isommille resoille.pietari-poika wrote: 2. Eri resoluutiot ja pelin skaalautuminen.
Pelissä olisi hyvä jos se toimisi monella eri resoluutiolla. Reson vaihtohan käy helposti SCREEN-komennolla, mutta ongelma on se, että tällöin isommalla resolla pelaajan näköala kasvaa ja vastaavasti pienemmällä resoluutiolla pienenee. Miten saisin pelin toimimaan monella eri resolla siten, että objektit ja tilemapit sun muut olisivat aina samassa skaalassa suhteessa näytön kokoon?
SDK:sta.pietari-poika wrote:3. Mistä löydänkään sen koodin jossa on parempi vaihtoehto framelimit-komennolle?
Code: Select all
FrameLimit 40 'rajoita nopeutta
Include "SDK/include/cbTimer.cb"
Include "cbMap.cb"
tim=InitFlipFlopTimer(500)
MapLoad("Media\cdm2.til","Media\tileset.bmp")
PlayObject gCurrentMap,0,0,1
ukko = LoadObject ("Media\guy.bmp",72)
ukko2=CloneObject(ukko)
SetupCollision ukko,gCurrentMap,2,4,2
SetupCollision ukko2,gCurrentMap,2,4,2
PositionObject ukko2,0,200
Repeat
UpdateTimer()
'Ukon ohjaus
If LeftKey() Then TurnObject ukko,5
If RightKey() Then TurnObject ukko,-5
If UpKey() Then MoveObject ukko,2
If DownKey() Then MoveObject ukko,-2
If Not Distance2(ukko,ukko2)<50 Then
If ObjectSight (ukko,ukko2) Then
MoveObject ukko2,1.5
If GetTimerData(tim) Then
lastseenx=GetTileX(ObjectX(ukko))
lastseeny=GetTileY(ObjectY(ukko))
EndIf
PointObject ukko2,ukko
Else
an=GetAngle(ObjectX(ukko2), ObjectY(ukko2), GetTileWorldX(lastseenx), GetTileWorldY(lastseeny))
If Not done Then RotateObject ukko2,an
MoveObject ukko2,1.5
done=1
EndIf
EndIf
DrawGame
Text 0,0, Int(GetAngle2(ukko,ukko2))
Text 0,20, Int(ObjectAngle(ukko2))
CloneCameraPosition ukko
DrawScreen
Forever
Code: Select all
an=GetAngle(ObjectX(ukko2), -ObjectY(ukko2), GetTileWorldX(lastseenx), -GetTileWorldY(lastseeny))
Toi vaikuttaa varsin hyvältä. Tosin kun fovin kasvattaa tossa 360 asteeseen niin tossa default laatuasetuksella systeemin epätarkkuus kasvaa käsittämättömän suureksi. Sitten kun kasvatan qualityä suhteessa laskettavan alueen määrään, niin fps tippuu sieltä kuudestakympistä johonkin noin kymmeneen, mikä tekee homman mahdottomaksi. Lisäksi toi vähän bugaa kun pelaajaa kääntää paikallaan, joten ehkä voisin yrittää tehdä jotain optimointia. Nyt kun kyseessä on 360 asteen kokoinen alue eikä vain sektori, pelaajaobjektia ei tarvitsisi käyttää alueen skannaamiseen vaan sen voisi toteuttaa erillisellä, piilotetulla objektilla, jolloin tuo paikallaan kääntymiseen liittyvä bugi katoaisi. Pitänee perehtyä ton koodinpätkän sielunelämään ja kokeilla jos sieltä saisi jotain karsittua...naputtelija wrote:Tämä voisi auttaa.pietari-poika wrote: Esimerkiksi näkymättömissä olevien paikkojen tummennus jotenkin tähän tyyliin...? Mites tällaisen saisi järkevimmin toteutettua?
Vaikuttaa hieman hankalalta... Ehkä tässä vaiheessa pitäydyn vielä yhdessä resoluutiossa ja käytän peliä vaikka ikkunoituna.naputtelija wrote:Näin isommille resoille.pietari-poika wrote: 2. Eri resoluutiot ja pelin skaalautuminen.
Pelissä olisi hyvä jos se toimisi monella eri resoluutiolla. Reson vaihtohan käy helposti SCREEN-komennolla, mutta ongelma on se, että tällöin isommalla resolla pelaajan näköala kasvaa ja vastaavasti pienemmällä resoluutiolla pienenee. Miten saisin pelin toimimaan monella eri resolla siten, että objektit ja tilemapit sun muut olisivat aina samassa skaalassa suhteessa näytön kokoon?
Ok, thanks, pitää kattella tota. Muistelin vaan että joku olisi kirjoittanut joskus sellaisen muutaman (~10?) rivin framelimitterin, jonka pitäisi toimia paremmin kuin cb:n oma. Käsittääkseni siinä toimintaperiaate oli kuitenkin sama, eli pelin ajan mitta on edelleen frame (eikä "oikea aika") mutta toimii paremmin kuin cb:n oma.naputtelija wrote:SDK:sta.pietari-poika wrote:3. Mistä löydänkään sen koodin jossa on parempi vaihtoehto framelimit-komennolle?