Seuraava vihu

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Kerosiinipelle

Seuraava vihu

Post by Kerosiinipelle »

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.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Seuraava vihu

Post by koodaaja »

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.
Marcoder
Active Member
Posts: 120
Joined: Tue Aug 28, 2007 8:21 am

Re: Seuraava vihu

Post by Marcoder »

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.

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
Kerosiinipelle

Re: Seuraava vihu

Post by Kerosiinipelle »

Okei. Kiitos, tästä on paljon apua.
Post Reply