Tätä pidin viimeisenä vaihtoehtona....
En saa luodin osumista vihuun ja vihu-seuraa-pelaajaa -juttua toimimaan. Jos zombi näkee molemmat pelaajat sen pitäisi lähteä ensin näkemänsä perään.
Code: Select all
'JACK AND JOHN 2
SCREEN 1024,768,0,0
SetWindow "Jack & John 2", 3, "Are you sure you want to quit?"
Goto Valikko
Valikko:
Goto Level1
Level1:
//--------------------------------------------------------------------------------
// Vakioita joilla voidaan säätää ukkeleiden käyttäytymistä
//--------------------------------------------------------------------------------
Const MAX_ZOMBIES = 40 // Kuinka monta zombieta kentällä kulkee
Const MIN_NEXT_ACTION = 500 // Koska aikaisintaan arvotaan zombielle uusi suunta
Const MAX_NEXT_ACTION = 1000 // Koska viimeistään arvotaan zombielle uusi suunta
Const RND_ROTATION# = 1.0 // Kun zombielle arvotaan uusi kääntyminen niin tämä on maksimi.
Const MIN_SPEED# = 2.0 // Zombien nopeus kun se on havainnut esteen
Const MAX_SPEED# = 2.5 // Zombien nopeus kun tie on vapaa
Const WAKEUP_DIST = 95 // Jos matkaa esteeseen on vähemmän kuin tämä niin aletaan etsiä uutta suuntaa
Const EXPLORE_ANGLE = 50 // Kun pitää päätellä uusi suunta niin se tehdään katselemalla
// näin monta astetta molempiin suuntiin
Const DODGE_ROTATION# = 15.0 // Kun zombie on lähellä estettä niin tällä määrätään kuinka
// jyrkällä käännöksellä yritetään väistää.
// Piemenpi arvo on jyrkempi käännös.
lavagunioverheat=LoadSound("Button 1.wav")
lavaguniääni=LoadSound("Button 2.wav")
ääniAmmu = LoadSound ("Cannon.wav")
musa = PlaySound ("SK_Battle2.mp3")
boom=LoadSound("Boom 1.wav")
moment=0
Jack_Elossa=1
John_Elossa=1
Jack_Tapot=0
John_Tapot=0
Jack_Overheat=0
Jack_Overheat_Image=LoadImage("Overheat.png")
Jack_Health_Image=LoadImage("life.png")
John_Health_Image=LoadImage("life.png")
Jack_Health=100
John_Health=100
jytym_aika=0
Kamerakohde=1
ZombieHealth=60
OverheatMittari=0
efekti=MakeImage (ScreenWidth(),ScreenHeight())
Overheataika = 100 //1000 = 1 sekunti, 2000 = 2 sekuntia, 100 = 0,1 sekuntia jne.
'---------------------------------------------------
Type AMMUS 'luo kokoelma, jonka nimi on AMMUS
Field obj
End Type
Type AMMUS2 'luo kokoelma, jonka nimi on AMMUS
Field obj2
End Type
Type ZOMBIES
Field bodyObj As Integer // Tämä on itse objekti
// Seuraavia tarvitaan liikkumisen tekoälyyn
Field nextAngle As Float // Kulma johon zombien pitäisi liikkua
Field rotation As Float // Tällä käännetään objektia (TurnObject)
Field nextAction As integer // Ajankohta jolloin zombielle arvotaan uusi suunta
Field tooClose As Byte // Zombie on liian lähellä seinää tai toista zombieta
// Seuraavia tarvitaan kävelyn animointiin
Field leftLegObj As Integer // Vasen jalka
Field rightLegObj As Integer // Oikea jalka
Field prevPosX As Float // Objektin edellinen positio
Field prevPosY As Float // Objektin edellinen positio
Field legPos As Float // "Animointiframe" eli jalkojen asettelu tämän mukaan
EndType
'--------------------------------------------------------
FrameLimit 40 'rajoita nopeutta
DrawToWorld ON 'mahdollistaa piirtämisen maailmaan
'lataa kartta
kartta = LoadMap("cdm2.til","tileset.bmp")
ObjectPickable kartta, ON 'aseta se poimittavaksi
PlayObject kartta,0,0,1 'animoi kartta
'lataa pelaaja
jack = LoadObject ("guy.bmp",72)
ObjectPickable jack, 2 'aseta se poimittavaksi
pati=LoadObject("bullet.bmp")
ShowObject pati,OFF
SpawnPoint=LoadObject("car2.bmp")
PositionObject spawnpoint,400,520
pati2=LoadObject("bigbullet.bmp")
ShowObject pati2,OFF
maali=LoadObject("Cow.bmp")
jytym=LoadObject("Car.bmp")
ShowObject jytym, OFF
PositionObject jytym, 35156,4531
zombieObject = LoadObject("soldier.bmp", 72)
ShowObject zombieObject, OFF
legObject = LoadObject("leg.bmp", 72)
ShowObject legObject, OFF
enemy2=LoadObject("soldier.bmp",72)
PositionObject enemy2, 5630,563653
ShowObject enemy2,OFF
'-----------------------
fontti=LoadFont("Impact",20,OFF,ON,OFF)
bigfontti=LoadFont("Impact",70,OFF,OFF,OFF)
SetFont fontti
'lataa kamu
john = LoadObject ("soldier.bmp",72)
ObjectPickable john, 2 'aseta se poimittavaksi
PositionObject john, 32,150 'sijoita ylemmäs
'törmäykset
SetupCollision jack, john, 2, 2, 2
SetupCollision john, jack, 2, 2, 2
'kartta-törmäykset on hyvä esitellä viimeiseksi
SetupCollision jack, kartta, 1, 4, 2
SetupCollision john, kartta, 1, 4, 2
PositionObject maali, 500,200
For t = 1 To MAX_ZOMBIES
zombie.ZOMBIES = New(ZOMBIES)
// Ensin jalat että ne jää kropan alle
zombie\leftLegObj = CloneObject(legObject)
zombie\RightLegObj = CloneObject(legObject)
zombie\bodyObj = CloneObject(zombieObject)
zombie\rotation = 0
zombie\tooClose = False
// Laitetaan kartalle satunnaiseen paikkaan ja asetetaan törmäystunnistus
SpawnObject(zombie\bodyObj)
zombie\nextAngle = ObjectAngle(zombie\bodyObj)
SetupCollision zombie\bodyObj, kartta, 2, 4, 2
// Asetetaan zombie poimittavaksi että zombiet osaavat väistellä toisiaan
ObjectPickable zombie\bodyObj, ON
// Animaation varvitsemat alustukset
zombie\prevPosX = ObjectX(zombie\bodyObj)
zombie\prevPosY = ObjectY(zombie\bodyObj)
Next t
zombinäkeejackin=ObjectSight(Zombie\Bodyobj,Jack)
zombinäkeejohnin=ObjectSight(Zombie\BodyObj,John)
Global gPicker
gPicker = MakeObject()
Repeat
'---------------------------
'Ukon ohjaus
If KeyDown(cbKeyA) Then TurnObject jack,5
If KeyDown(cbKeyD) Then TurnObject jack,-5
If KeyDown(cbKeyW) Then MoveObject jack,3
If KeyDown(cbKeyS) Then MoveObject jack,-2
If KeyDown(cbKeyQ) Then MoveObject jack,0,-2
If KeyDown(cbKeyE) Then MoveObject jack,0,2
If LeftKey() Then TurnObject john,5
If RightKey() Then TurnObject john,-5
If UpKey() Then MoveObject john,2
If DownKey() Then MoveObject john,-1.7
If KeyDown(cbKeyn) Then MoveObject john,0,-2
If KeyDown(cbKeyb) Then MoveObject john,0,2
If ObjectsOverlap(jack,maali,3) Or ObjectsOverlap (john,maali,3) Then
Goto level2
EndIf
UpdateGame
If Jack_Elossa=1 And Kamerakohde=1 Then
CloneCameraPosition jack
Else
CloneCameraPosition john
EndIf
UpdateGame
DrawGame 'tämä komennetaan ennen piirtokomentoja
DrawToWorld ON
'--------------------------
ObjectPick jack
e=PickedObject()
'jos poiminta osui omaan
If e=john And Jack_Elossa Then
Color cbGreen
Circle PickedX()-4,PickedY()+4,8,OFF
EndIf
'jos poiminta osui karttaan
If e=kartta And Jack_Elossa Then
Color cbWhite
Circle PickedX()-4,PickedY()+4,8,OFF
EndIf
'vihuun
If e=zombie\bodyobj And Jack_Elossa Then
Color cbRed
Circle PickedX()-4,PickedY()+4,8,OFF
EndIf
'------------------------
ObjectPick john
ei=PickedObject()
'jos poiminta osui omaan
If ei=jack And John_Elossa Then
Color cbGreen
Circle PickedX()-4,PickedY()+4,8,OFF
EndIf
'jos poiminta osui karttaan
If ei=kartta And John_Elossa Then
Color cbWhite
Circle PickedX()-4,PickedY()+4,8,OFF
EndIf
'vihuun
If e=zombie\bodyobj And John_Elossa Then
Color cbRed
Circle PickedX()-4,PickedY()+4,8,OFF
EndIf
'-----------------------------------
If KeyDown(cbKeyF) And reload=0 And OverHeatMittari = 0 Then
PlaySound lavaguniääni,50
luoti.AMMUS = New(AMMUS) 'luo uusi ammus
luoti\obj=CloneObject(pati) 'tee klooni
'asetetaan pati samaan paikkaan
CloneObjectPosition luoti\obj,jack
'käännetään pati samaan suuntaan
CloneObjectOrientation luoti\obj,jack
reload=0 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
'Päivitä kaikki ammukset
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
If GetMap(2, ObjectX(luoti\obj), ObjectY(luoti\obj)) <> 0 Then
DeleteObject luoti\obj
Delete luoti
ElseIf ObjectsOverlap (luoti\obj,john,3)
DeleteObject luoti\obj
Delete luoti
John_Health=John_Health-1
ElseIf Distance2(jack,luoti\obj) =200 Then
DeleteObject luoti\obj
Delete luoti
EndIf
Next luoti
If KeyDown(cbKeyF) And reload=0 Then
Jack_Overheat = Jack_Overheat + 1.3
EndIf
If Jack_Overheat > 100 Then
PlaySound lavagunioverheat
Jack_Overheat = 100
Overheatmittari = 1
EndIf
If Timer() > timeStamp + 100 Then
timeStamp = Timer()
Jack_Overheat -2
EndIf
If jack_overheat=0 Then
Overheatmittari = 0
EndIf
If jack_overheat < 0 Then
Jack_overheat = 0
EndIf
Color cbOrange
If Jack_Overheat = 100 Then
Text 10, 120, "Overheated!"
EndIf
'----------------------
If KeyDown(cbKeyM) And reload2=0 Then
PlaySound ääniAmmu,100
luoti2.AMMUS2 = New(AMMUS2) 'luo uusi ammus
luoti2\obj2=CloneObject(pati2) 'tee klooni
'asetetaan pati samaan paikkaan
CloneObjectPosition luoti2\obj2,john
'käännetään pati samaan suuntaan
CloneObjectOrientation luoti2\obj2,john
reload2=50 'lataus
EndIf
'päivitä aseen lataaminen
If reload2>0 Then reload2=reload2-1
'Päivitä kaikki ammukset
For luoti2.AMMUS2 = Each AMMUS2
MoveObject luoti2\obj2,6
If GetMap(2, ObjectX(luoti2\obj2), ObjectY(luoti2\obj2)) <> 0 Or ObjectsOverlap(luoti2\obj2,jack,3) Or ObjectsOverlap(luoti2\obj2,ZOMBIE\bodyObj,3)Then
ShowObject jytym, ON
Jytym_aika=1
moment=Timer()
CloneObjectPosition jytym, luoti2\obj2
PlaySound boom
DeleteObject luoti2\obj2
Delete luoti2
EndIf
Next luoti2
If Timer()>moment+600 And jytym_aika = 1 Then
jytym_aika=0
ShowObject jytym,OFF
PositionObject jytym,5312,5235
EndIf
'-------------------
'--------------------------------
'OMIEN VAHINGOITTUMINEN SEKÄ KUOLEMINEN JA SPAWNAUS
'Johnin pati Jackiin
If ObjectsOverlap(jytym,jack,3) Then
Jack_Health= Jack_Health -1
EndIf
'Johnin pati itseensä
If ObjectsOverlap(jytym,john,3) Then
John_Health= John_Health -1
EndIf
'Ketasu
If Jack_Health=0 Then
Jack_Elossa = 0
ShowObject Jack,OFF
PositionObject jack,5435,53151
CloneCameraPosition john
EndIf
If John_Health=0 Then
ShowObject john,OFF
PositionObject john,431513,5315
John_Elossa = 0
EndIf
'GAME OVER
If Jack_elossa=0 And John_elossa=0 Then
ShowObject jytym,OFF
ShowObject maali,OFF
ShowObject kartta,OFF
CopyBox 0,0,ScreenWidth(),ScreenHeight(),0,0,SCREEN(),Image(efekti)
teksti$="GAME OVER"
Goto loppu
EndIf
'HENKIINHERÄTTÄMINEN
If ObjectsOverlap(jack,spawnpoint,3) And john_elossa=0 Then
CloneObjectPosition john,spawnpoint
ShowObject john,ON
John_Health = 50
John_Elossa=1
EndIf
If ObjectsOverlap(john,spawnpoint,3) And jack_elossa=0 Then
CloneObjectPosition jack,spawnpoint
ShowObject jack,ON
Jack_Health = 50
Jack_Elossa=1
EndIf
'----------------------------
'JA SITTEN: VIHOLLISET!
'---------------
'MUSA
If SoundPlaying(musa)=0 Then
musa = PlaySound ("Media\SK_Battle2.mp3")
'satunnainen tapahtuma..
'tasataanko ääni oikealle vai vasemmalle
If Rand(1,2)=1 Then
SetSound musa,0,100,-100 'vasen kajari
Else
SetSound musa,0,100,100 'oikea kajari
EndIf
EndIf
'- Päivitä Zombeja
If zombinäkeejackin=0 Or zombinäkeejohnin=0 Then
UpdateAI()
UpdateAnimation()
EndIf
If KeyDown(2) Then
CloneCameraPosition jack
Kamerakohde=1
ElseIf KeyDown(3) Then
CloneCameraPosition john
Kamerakohde=2
EndIf
DrawGame
Text 600, 0, FPS()
'---------------------
'Enut yms.
DrawToWorld OFF
Color cbBlue
Box 0,0,220,120
Box 804,0,220,120
Color cbRed
Text 10,10,"Jack"
Text 10,65,"Kills:" +Jack_Tapot
Text 974,10,"John"
Text 930,65,"Kills:" +John_Tapot
Text 400,10,"FPS:" +FPS()
If john_elossa=0 Then
Color cborange
Text 814,40,"John is dead!"
EndIf
If jack_elossa=0 Then
Color cborange
Text 10,40,"Jack is dead!"
EndIf
DrawImageBox Jack_Health_Image,10,40,0,0,jack_health*2,26
DrawImageBox Jack_Overheat_Image,10,100,0,0,jack_Overheat,26
DrawImageBox John_Health_Image,814,40,0,0,john_health*2,26
'---------------------
DrawScreen 'piirrä näyttö
Forever
//================================================================================
// Päivitetään zombiet
//================================================================================
Function UpdateAI()
// Käydään kaikki läpi
For zombie.ZOMBIES = Each ZOMBIES
// Mikäli zombie ei ole liian lähellä seinää ja on aika arpoa sille uusi suunta
// niin tehdään se nyt.
If zombie\tooClose = False And zombie\nextAction < Timer() Then
// Arvotaan seuraavan käännöksen ajankohta eli koska tähän iffiin
// tullaan seuraavaksi
zombie\nextAction = Rand(MIN_NEXT_ACTION, MAX_NEXT_ACTION) + Timer()
// Arvotaan zombielle uusi kääntyminen
zombie\rotation = Rnd(-RND_ROTATION, RND_ROTATION)
EndIf
// Käännetään zombieta
TurnObject zombie\bodyObj, zombie\rotation
// Seuraavaksi alkaa varsinainen tekoäly jossa tutkitaan ympäristöä.
// Tämä tehdää kuitenkin vain mikäli zombie ei ole liian lähellä jotakin estettä.
If zombie\tooClose = False Then
// Nyt lasketaan etäisyys edessä olevaan esteeseen.
// Etäisyys lasketaan objektin keskeltä sekä reunoista eli objektin koko leveydeltä.
minDist# = 0
dist# = 0
// Ensin "silmä" keskelle objektia
CloneObjectPosition gPicker, zombie\bodyObj
CloneObjectOrientation gPicker, zombie\bodyObj
// Poimitaan lähin este
ObjectPick gPicker
minDist = Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY())
// Siiretään "silmä" toiseen reunaan ja poimitaan lähin este
MoveObject gPicker, 0, -15
ObjectPick gPicker
minDist = Min(minDist, Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()))
// Ja vielä toiseen reunaan ja poimitaan lähin este
MoveObject gPicker, 0, 30
ObjectPick gPicker
minDist = Min(minDist, Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()))
// Jos este on niin lähellä että siihen pitää reagoida niin tutkitaan se nyt.
If minDist < WAKEUP_DIST Then
// Ensin "silmä" samaan suuntaan kuin zombie
CloneObjectOrientation gPicker, zombie\bodyObj
// Käännetään katsetta toiselle sivulle ja lasketaan etäisyys lähimpään esteeseen
TurnObject gPicker, -EXPLORE_ANGLE
ObjectPick gPicker
d1# = Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY())
// Ja sitten vielä toiseen suuntaan.
TurnObject gPicker, EXPLORE_ANGLE * 2
ObjectPick gPicker
d2# = Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY())
// Tutkitaan kumpaan suuntaan on pidempi matka seuraavaan esteeseen
// ja suunnataan sinne.
// Kääntymisen jyrkkyyteen vaikuttaa vielä etäisyys esteeseen eli
// mitä lähempänä ollaan niin sitä jyrkemmin käännytään
d# = 0
If d1 > d2 Then
d = -(WAKEUP_DIST - minDist)
Else
d = (WAKEUP_DIST - minDist)
EndIf
// Asetetaan kääntymisnopeus
zombie\rotation = d / DODGE_ROTATION
// Asetetaan tavoitekulma
zombie\nextAngle = WrapAngle(ObjectAngle(zombie\bodyObj) + d)
// Asetetaan vielä tooClose-muuttuja päälle eli tekoälyä ei päivitetä
// ennen kuin objekti on kääntynyt tavoitekulmaan.
// Samalla myös objektin nopeutta vähennetään.
zombie\tooClose = True
EndIf
Else
// Zombie on liian lähellä jotain estettä.
// tooClose-muuttuja nollataan vain jos tekoälyn asettama tavoitekulma on saavutettu.
If Abs(ObjectAngle(zombie\bodyObj) - zombie\nextAngle) < 3 Then
// Objektin kulma on nyt riittävän lähellä tavoitekulmaa joten
// kääntäminen voidaan lopettaa.
zombie\rotation = 0
zombie\tooClose = False
EndIf
EndIf
// Nyt siirretään objektia.
speed# = MAX_SPEED
// Jos ollaan liian lähellä jotain estettä niin pienemmällä vauhdilla
If zombie\tooClose = True Then speed = MIN_SPEED
MoveObject zombie\bodyObj, speed
Next zombie
EndFunction
//================================================================================
// Kävelyanimaatioiden päivitys
//================================================================================
Function UpdateAnimation()
For zombie.ZOMBIES = Each ZOMBIES
CloneObjectPosition zombie\leftLegObj, zombie\bodyObj
CloneObjectOrientation zombie\leftLegObj, zombie\bodyObj
CloneObjectPosition zombie\rightLegObj, zombie\bodyObj
CloneObjectOrientation zombie\rightLegObj, zombie\bodyObj
ox# = ObjectX(zombie\bodyObj)
oy# = ObjectY(zombie\bodyObj)
px# = zombie\prevPosX
py# = zombie\prevPosY
zombie\prevPosX = ox
zombie\prevPosY = oy
zombie\legPos = WrapAngle(zombie\legPos + Distance(ox, oy, px, py) * 3.0)
MoveObject zombie\leftLegObj, -Sin(zombie\legPos) * 10 - 10, -9
MoveObject zombie\rightLegObj, Sin(zombie\legPos) * 10 - 10, 9
Next zombie
EndFunction
//================================================================================
// Siirretään objekti satunnaiseen kohtaan kartalle
//================================================================================
Function SpawnObject(_obj)
While True
x = Rand(1, MapWidth())
y = Rand(1, MapHeight())
tBack = GetMap2(0, x, y)
tHit = GetMap2(2, x, y)
If tBack > 0 And tHit = 0 Then
wx = (x * 32 - 16) - ((MapWidth() * 32) / 2)
wy = ((y * 32 - 16) - ((MapHeight() * 32) / 2)) * -1
PositionObject _obj, wx, wy
RotateObject _obj, Rand(0, 360)
Exit
EndIf
Wend
EndFunction
Level2:
End
loppu:
koko=0
Repeat
DrawToImage efekti
koko+1
For i=0 To 10
For j=0 To 10
Color 0,0,0
Circle i*ScreenWidth()/10-koko/2,j*ScreenHeight()/10-koko/2,koko
Next j
Next i
DrawToScreen
DrawImage efekti, 0,0
If koko>75 Then
Color vari,vari,vari
Text ScreenWidth()/2-Len(teksti)*4,ScreenHeight()/2-6,teksti
if vari<253 Then vari+2
EndIf
If KeyDown(cbKeySpace) Then
Goto valikko
EndIf
DrawScreen
Forever
Tähän koodiin olen poimiskellut kaikenlaista mitä olen foorumeilta löytynyt.