Tälläinen oli vanhalla foorumilla nimellä "botti ihmisen näkökentällä" tai jotain sellaista.
Tarvitsisin siis koodinpätkän jolla saa vihollisen seuraamaan sinua jos se näkee sinut.
Seuraava vihu
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Seuraava vihu
Etsimään!
Ja eihän tämä sinänsä ole vaikeaa itsekään toteuttaa. Simppeli systeemi:
1. Tarkista, onko pelaaja riittävän lähellä bottia. Jos ei, haahuiluta bottia randomisti ja jatka kohdan 1 suorittamista. Jos taas on, siirry kohtaan 2.
2. Tarkista kulma ja kartta (onko pelaaja seinän takana piilossa). Jos on suora näköyhteys, siirry kohtaan kolme. Muutoin botti kuulee pelaajan ja alkaa kääntyillä. Kääntyiltyään aikansa (mikäli ei näe pelaajaa, jos näkee, kohtaan 3) palaa kohtaan 1.
3. Pistä muistiin, missä pelaaja oli, ja kävelytä bottia pelaajan suuntaan. Jos pelaaja katoaa näkyvistä, mennään paikalle, jossa hänet nähtiin. Siellä siirrytään kohtaan 2.
Näin se siis seuraa, ampumista en ruvennut miettimään, sillä realistinen tulitaistelutekoäly menee jo vaikeaksi.
Ja eihän tämä sinänsä ole vaikeaa itsekään toteuttaa. Simppeli systeemi:
1. Tarkista, onko pelaaja riittävän lähellä bottia. Jos ei, haahuiluta bottia randomisti ja jatka kohdan 1 suorittamista. Jos taas on, siirry kohtaan 2.
2. Tarkista kulma ja kartta (onko pelaaja seinän takana piilossa). Jos on suora näköyhteys, siirry kohtaan kolme. Muutoin botti kuulee pelaajan ja alkaa kääntyillä. Kääntyiltyään aikansa (mikäli ei näe pelaajaa, jos näkee, kohtaan 3) palaa kohtaan 1.
3. Pistä muistiin, missä pelaaja oli, ja kävelytä bottia pelaajan suuntaan. Jos pelaaja katoaa näkyvistä, mennään paikalle, jossa hänet nähtiin. Siellä siirrytään kohtaan 2.
Näin se siis seuraa, ampumista en ruvennut miettimään, sillä realistinen tulitaistelutekoäly menee jo vaikeaksi.
Re: Seuraava vihu
Tässä olisi koodinpätkä tuohon näkökenttäsysteemiin. Siinä tarkistetaan että vihollinen on ylipäänsä näkökentässä eikä selän takana. Seinän taakse ei tietenkään voi nähdä.
Koko tarkistuksen olisi voinut tehdä yhdelläkin funktiolla mutta tuo ObjectDirection on käyttökelpoinen muissakin yhteyksissä.
Varsinaisen seuraamisen ja muun tekoälyn joudut soveltamaan itse.
Toista ukkoa ohjataan nuolilla ja toista WASD.
Koko tarkistuksen olisi voinut tehdä yhdelläkin funktiolla mutta tuo ObjectDirection on käyttökelpoinen muissakin yhteyksissä.
Varsinaisen seuraamisen ja muun tekoälyn joudut soveltamaan itse.
Toista ukkoa ohjataan nuolilla ja toista WASD.
Code: Select all
SCREEN 800, 600
map = LoadMap("media\cdm2.til", "media\tileset.bmp")
player1 = LoadObject("media/soldier.bmp", 72)
player2 = CloneObject(player1)
MoveObject player1, 0, 20
MoveObject player2, 0, -20
SetupCollision player1, map, 2, 4, 2
SetupCollision player2, map, 2, 4, 2
Repeat
// Ukkojen ohjaus
MoveObject player1, (UpKey() - DownKey()) * 5
TurnObject player1, (LeftKey() - RightKey()) * 5
MoveObject player2, (KeyDown(cbKeyW) - KeyDown(cbKeyS)) * 5
TurnObject player2, (KeyDown(cbKeyA) - KeyDown(cbKeyD)) * 5
DrawGame
DrawToWorld ON, ON, ON
// Tutkitaan näkeekö ykkönen kakkosen
If CanSee(player1, player2, 45) Then txt$ = "Näkee" Else txt$ = "Ei näe"
CenterText ObjectX(player1), ObjectY(player1), txt, 2
// Tutkitaan näkeekö kakkonen ykkösen
If CanSee(player2, player1, 45) Then txt$ = "Näkee" Else txt$ = "Ei näe"
CenterText ObjectX(player2), ObjectY(player2), txt, 2
DrawToWorld OFF, OFF, OFF
DrawScreen
Forever
//================================================================================
// Tutkitaan missä kulmassa _obj2 on objektista _obj1 katsottuna
//================================================================================
Function ObjectDirection(_obj1, _obj2)
a# = GetAngle2(_obj1, _obj2) - ObjectAngle(_obj1)
If a > 180 Then a = a - 360
If a < -180 Then a = a + 360
Return a
EndFunction
//================================================================================
// Tutkitaan näkeekö objekti 1 objektin 2
//================================================================================
Function CanSee(_obj1, _obj2, _fov)
// Ensin tarkistetaan että kakkonen on ykkösen näkökentässä
If Abs(ObjectDirection(_obj1, _obj2)) > _fov Then Return False
// Tarkistetaan ettei ole seinää välissä
Return ObjectSight(_obj1, _obj2)
EndFunction