Cb:n törmäyksentunnistus tapahtuu hieman oudosti. Yritän tässä selittää sitä:
Sinulla oli vihu -> guy -suuntainen törmäys. Se tarkoittaa, että jos
vihu liikkuu pelaajaa päin, tapahtuu törmäys. Eli jos vihu on paikallaan, ei törmäystä voi tapahtua. Joudut tämän lisäksi tekemään myös guy -> vihu-suuntaisen törmäyksen, eli jos myös
pelaaja liikkuu vihua päin, tapahtuu törmäys.
Nyt jos molemminpuolinen törmäyksentarkistus on olemassa, ja molemmat liikuvat toisiaan kohti, voittaa toinen törmäys. Eli toinen objekti työntää toisen pois tieltään. Työntäjällä on "suurempi prioriteetti". Suurempi prioriteetti on sillä törmäystarkistuksella, joka on asetettu viimesimpänä. Eli siis jos on asetettu vihu -> guy-törmäys, sekä guy -> vihu-törmäys tässä järjestyksessä, voittaa guy -> vihu, ja
guy työntää vihua pois.
Tässä tulee ongelma jos on kolmas törmäysosapuoli, yleensä kartta. Jos kartan prioriteetti ei ole suurin, työnnetään toinen objekteista kartan yli (jonkun objekteista täytyy antaa periksi). Eli aseta ukkojen ja kartan välinen törmäys vikaksi, niin saat kartan prioriteetin suurimmaksi. Huomaa että et voi asettaa törmäystä map -> ukko, se pitää aina olla ukko -> map-puolinen.
Lisäksi, kannattaa asettaa tällaisissa tapauksissa törmäyksestä liukuva (2, 2, 2). Se on tietääkseni vähemmän buginen.
Aseta seuraavat törmäysytarkistukset rivien 98 ja 99 törmäyksentunnistuten tilalle.
Code: Select all
//Asetetaan vihu -> ukko -törmäys (pienin prioriteetti)
SetupCollision en\vihu, guy,2,2,2
//Asetetaan ukko -> vihu -törmäys (suurempi prioriteetti. Nyt jos molemmat kävelevät toisiaan päin, ukon
//liike voittaa, eli ukko voi työntää vihuja)
SetupCollision guy, en\vihu,2,2,2
//Asetetaan vihu -> map -törmäys. Suurin prioriteetti, eli jos tulee vihun, pelaajan ja mapin yhteinen törmäys,
//mappi ei ainakaan "anna periksi", eli mikään näistä objekteista ei voi nyt liukua mapin hit-kohdan yli.
SetupCollision en\vihu,map,2,4,2
//Asetetaan pelaajan törmäys karttaan uudelleen. Tämä on sinänsä turha, koska ukkoon ei kohdistu yhtäkään sitä suuremman
//prioriteetin törmäystä, eli ukkoa ei voi työntää kartan hit-kohtien yli vaikka tätä ei uudelleen asetettaisikaan.
//Kuitenkin parempi tehdä varman päälle.
SetupCollision guy, map, 2, 4, 2
Tässä vielä koko toimiva koodi, jossa on testimielessä asetettu zombeille liike ukkoa kohti.
Code: Select all
Type AMMUKSET
Field obj
End Type
Type ZOMBI
Field vihu As Integer
EndType
//PlaySound "Media\SK_Battle2.mp3"
//ammoLopussa = LoadSound("Media\gong.wav")
//ampuu = LoadSound("Media\Machine gun 1.wav")
FrameLimit 40 //Sets FPS-limiting to about 40
SCREEN 800,600,0,1 //Set screen
Const MAX_ZOMBIE = 2
ammo=6
ammoreppu=34
zombimäärä=0
//hela= LoadObject("Media\hela.bmp")
map= LoadMap("Media\m1.til","Media\tileset.bmp")
PlayObject map,0,0,0.5
guy= LoadObject("media\mie.bmp",72)
SetupCollision guy,map,2,4,2
zom= LoadObject("Media\zombi.bmp")
ShowObject zom,OFF
ammus = LoadObject("Media\fireball.bmp")
ShowObject ammus,OFF
elämä=LoadImage("Media\life.jpg")
hp=100
ws = MakeImage(400,300) //Make screen to view into gameworld
For y=1 To MapHeight()
For x=1 To MapWidth()
If GetMap2(3,x,y)=1 Then PositionObject guy,TileToWorldX(x,map),TileToWorldY(y, map)
If GetMap2(3,x,y)=1 Then PositionObject ammus,ObjectX(guy),ObjectY(guy)
Next x
Next y
Repeat
If LeftKey() Then TurnObject guy,5
If RightKey() Then TurnObject guy, -5
If UpKey() Then MoveObject guy,4
If DownKey() Then MoveObject guy, -4
DrawToImage ws //Draws world into image
UpdateGame
Cls
PositionCamera ObjectX( guy ) + ScreenWidth() / 2 - 400 / 2, ObjectY( guy ) - ScreenHeight() / 2 + 300 / 2
DrawGame
DrawToScreen
DrawImage ws,0,0
If KeyDown(57) And ammo>0 Then
pati.AMMUKSET = New (AMMUKSET)
pati\obj = CloneObject (ammus)
ammo=ammo-1
//PlaySound ampuu
'Asetetaan patin törmäys kenttää
'Aseta pati samaan paikkaan missä pelaaja on
CloneObjectPosition pati\obj, guy
CloneObjectOrientation pati\obj, guy
ShowObject pati\obj, ON
SetupCollision pati\obj, map, 2, 4, 1
ResetObjectCollision pati\obj
EndIf
For pati.AMMUKSET = Each AMMUKSET
MoveObject pati\obj, 6
Next pati
For pati.AMMUKSET = Each AMMUKSET
If CountCollisions(pati\obj) Then
DeleteObject pati\obj
Delete pati
EndIf
Next pati
If Not zombimäärä=MAX_ZOMBIE Then
//Zombie-spawning
en.ZOMBI = New(ZOMBI)
en\vihu = CloneObject(zom)
zombimäärä=zombimäärä+1
For y=1 To MapHeight()
For x=1 To MapWidth()
If GetMap2(3,x,y)=4 Then PositionObject en\vihu,TileToWorldX(x,map),TileToWorldY(y, map)
Next x
Next y
//Asetetaan vihu -> ukko -törmäys (pienin prioriteetti)
SetupCollision en\vihu, guy,2,2,2
//Asetetaan ukko -> vihu -törmäys (suurempi prioriteetti. Nyt jos molemmat kävelevät toisiaan päin, ukon
//liike voittaa, eli ukko voi työntää vihuja)
SetupCollision guy, en\vihu,2,2,2
//Asetetaan vihu -> map -törmäys. Suurin prioriteetti, eli jos tulee vihun, pelaajan ja mapin yhteinen törmäys,
//mappi ei ainakaan "anna periksi", eli mikään näistä objekteista ei voi nyt liukua mapin hit-kohdan yli.
SetupCollision en\vihu, map,2,4,2
//Asetetaan pelaajan törmäys karttaan uudelleen. Tämä on sinänsä turha, koska ukkoon ei kohdistu yhtäkään sitä suuremman
//prioriteetin törmäystä, eli ukkoa ei voi työntää kartan hit-kohtien yli vaikka tätä ei uudelleen asetettaisikaan.
//Kuitenkin parempi tehdä varman päälle.
SetupCollision guy, map, 2, 4, 2
ShowObject en\vihu,ON
MoveObject en\vihu,20
EndIf
Text 300,400,"AMMO: "+ammo+"\"+ammoreppu
Text 300,430,"Zombimäärä: "+zombimäärä
If KeyHit(cbkeyr) And ammo=0 And ammoreppu > 6 Then
ammo=6
ammoreppu=ammoreppu-6
ElseIf KeyHit(cbkeyr) And ammoreppu < 6 Then
//PlaySound ammoLopussa
EndIf
For vihu1.ZOMBI = Each ZOMBI
If Distance2(vihu1\vihu, guy) < 1000 Then
distanceX = ObjectX(vihu1\vihu) - ObjectX(guy)
distanceY = ObjectY(vihu1\vihu) - ObjectY(guy)
PointObject vihu1\vihu, guy
MoveObject vihu1\vihu, 3
Box 500 + 20 / 2 + distanceX * 0.1, 0 + 20 / 2 + distanceY * -0.1, 2, 2
EndIf
Next vihu1
DrawScreen
Until EscapeKey()
Function TileToWorldX(tx,map)
Return tx * 32 -ObjectSizeX(map) / 2
EndFunction
Function TileToWorldY(ty, map)
Return -(ty * 32 - ObjectSizeY(map) / 2)
EndFunction