Botti typellä

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

Botti typellä

Post by Alienvalloittaja » Wed Oct 17, 2007 4:58 pm

Okei, olen tonkinut tätä täältä ja vanhalta foorumilta mutta mitään sopivaa ei ole löytynyt...

Tarvitsisin siis koodin, jolla saa lauman typebotteja liikkumaan itsenäisesti ympäri karttaa. Pelaajia on kaksi. Jos joku boteista näkee jomman kumman pelaajista, se lähtee tulemaan päin. Jos se näkee molemmat pelaajat, se lähtee lähempänä olevaa kohti. Kun botti saa pelaajan kiinni, sen pitäisi jäädä möllöttämään paikalleen pariksi sekunniksi (pakoaika uko(i)lle) ja lähtee taas saalistamaan.

Kiitos jo etukäteen.

Toivottavasti joku jaksaa väkertää sellaisen...

User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Botti typellä

Post by CCE » Wed Oct 17, 2007 5:36 pm

Tässähän sinä suorastaan pyydät jotakuta muuta tekemään itsellesi valmista peliä.

Ja ehei, en ole koodannut sinulle riviäkään, mutta onneksi Marcoder on.
Kyseessähän on siis hyvin toimiva, sekä helppokäyttöinen zombi tekoäly.
Kaikkea mitä sinä haluat se ei vielä tee, mutta täytyyhän sinunkin jotain koodailla ;)

http://www.coolbasic.com/oldforums/inde ... topic=5151

Alienvalloittaja

Re: Botti typellä

Post by Alienvalloittaja » Thu Oct 18, 2007 8:02 pm

Juu, sain tuon toimimaan. Mutta millä nimellä zombia pitää kutsua, kun luoti osuu siihen?

...Or ObjectsOverlap(luoti\obj, ?zombinnimi?,3 Then...

FuJi
Member
Posts: 70
Joined: Tue Aug 28, 2007 3:09 pm

Re: Botti typellä

Post by FuJi » Thu Oct 18, 2007 8:57 pm

Alienvalloittaja wrote:Juu, sain tuon toimimaan. Mutta millä nimellä zombia pitää kutsua, kun luoti osuu siihen?

...Or ObjectsOverlap(luoti\obj, ?zombinnimi?,3 Then...
Jos zombi on luotu typeillä niin esimerkiksi näin:

Code: Select all

if objectsoverlap(luoti\obj,zombi\obj,2) then...

User avatar
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: Botti typellä

Post by MAVmaggot » Thu Oct 18, 2007 9:00 pm

FuJi wrote:
Alienvalloittaja wrote:Juu, sain tuon toimimaan. Mutta millä nimellä zombia pitää kutsua, kun luoti osuu siihen?

...Or ObjectsOverlap(luoti\obj, ?zombinnimi?,3 Then...
Jos zombi on luotu typeillä niin esimerkiksi näin:

Code: Select all

if objectsoverlap(luoti\obj,zombi\obj,2) then...
eipä toimi tässä koodissa. jos tähän koodiin lisäsi sen luoti jutun niin se kannattaisi tehdä mielummin objectsoverlapin sijasta countcollisionilla. lue siitä lisää manuaalista.

Edit: oho anteeksi typeryyteni, totta kai voi.
zombie\bodyobj:llä kutsutaan, mutta pitää repeat looppiin tehdä for...each rakenne eli:

Code: Select all

For it.ZOMBIES = Each ZOMBIES
  if ObjectsOverlap(pati\obj, it\bodyobj) Then health-1
Next it
toi sen takia että se toimii kaikkiin zombeihin eikä vain yhteen; uusimpaan.

Alienvalloittaja

Re: Botti typellä

Post by Alienvalloittaja » Thu Oct 25, 2007 7:33 pm

Tein noin, mutta se sanoo että luoti\objia ei ole olemassa vaikka on. :x

Ja miten saadaan tässä koodissa vihu tulemaan päin jos ObjectSight on tosi? Se ei vaikuta mitenkään. Veikkaan syyksi jalkojen liikkumista, mutta miten se tehdään? :|

User avatar
elmo123
Active Member
Posts: 153
Joined: Sun Sep 09, 2007 4:19 pm

Re: Botti typellä

Post by elmo123 » Thu Oct 25, 2007 9:19 pm

Sinun täytyy zombeja päivitettäessä katsoa läpi jokainen pati tai pateja katsottaessa toisinpäin.

ja toinen ongelmasi:

Code: Select all

For...Each...
If ObjectSIght(pelaaja1) Then PointObject zombie\obj,pelaaja1:MoveObject zombie\obj,3
Next...
tuollasta...

offtopic:
taiat olla alotteleva koodari? :?
Kiinnostuin pelien tekemisestä ennen 1. luokkaa.
Sitten 3. luokalla tuli CB. Ja siitä se alkoi.

Blender! TF2! CB! Game Maker! Nokia-mollaus! Kitaransoitto! Breakdance! MadTracker! Minecraft!

Kerosiinipelle

Re: Botti typellä

Post by Kerosiinipelle » Sun Nov 04, 2007 7:44 pm

Ei toimi. Zombit eivät edelleenkään reagoi mitenkään kumpaankaan asiaan, seuraamiseen tai luodin osumiseen. :cry:

offtopic: Kyllähän minä olen tällä kaikenlaista väkerrellyt mutta tekoälyistä ei ole vielä paljoa kokemusta.

User avatar
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: Botti typellä

Post by Pate5 » Mon Nov 05, 2007 11:54 am

Voisitko koittaa pistää vähän sitä omaa koodiasi, niin olisi vähän helpompi auttaa. Itselläni on aika paljonkin kokemusta typeistä,luedeista ja tekoälystä.
CoolBasic henkilökuntaa
Graafikko

Kerosiinipelle

Re: Botti typellä

Post by Kerosiinipelle » Sat Nov 17, 2007 5:15 pm

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.

Niin, ja tässä on aseen ylikuumenemistoimintO!

User avatar
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: Botti typellä

Post by MAVmaggot » Sat Nov 17, 2007 8:33 pm

näyttää siltä että animoit zombiet ja päivität ai:n VAIN JOS zombie näkee jomman kumman pelaajista.

Kerosiinipelle
Newcomer
Posts: 5
Joined: Sat Nov 17, 2007 5:18 pm

Re: Botti typellä

Post by Kerosiinipelle » Sun Nov 18, 2007 2:26 pm

Ai niin, juu. Se johtuu eräästä kokeesta jonka tein...

No laittakaa niin että ne päivittyvät vaikka eivät näkisikään ketään.


EDIT: Ai niin, ne päivittyvät silti vaikka eivät näkisikään ketään. Miksi?

User avatar
MAVmaggot
Advanced Member
Posts: 468
Joined: Fri Aug 31, 2007 10:18 pm
Location: bitspace

Re: Botti typellä

Post by MAVmaggot » Sun Nov 18, 2007 3:13 pm

tuleeko siinä joku virheilmoitus vai mitä?

edit: ehkä ne näkevät pelaajan heti kun peli alkaa jolloin ne päivittyvät

Kerosiinipelle
Newcomer
Posts: 5
Joined: Sat Nov 17, 2007 5:18 pm

Re: Botti typellä

Post by Kerosiinipelle » Sun Nov 18, 2007 6:55 pm

Ei siinä mitään virheilmoitusta tule...

Eiväthän ne kaikki näe pelaajaa saman tien. Vai pitääkö vain yhden nähdä?

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Botti typellä

Post by koodaaja » Sun Nov 18, 2007 7:30 pm

Kaveri tulee ainakin tuplasti nälkävuotta pidemmän, puoliksi copypastetun koodin kanssa sanomaan että "no laittakaapa tällainen ja tällainen ominaisuus, kun itse evotan niin pahasti". Aijaa. Ja sitten vielä tällainen väläytys, johon sinun pitäisi itse vastata: "vai pitääkö vain yhden nähdä?"

Sanotaanpas tähän tällainen löytämäni omituisuus koodissasi: zombinäkeejackin ja zombinäkeejohnin päivitetään ihan alussa, vain yhdellä zombilla. Sitä vartenhan pitäisi jokaisella zombilla olla oma muuttuja, eli lykkää uusi fieldi tuohon typeen. Lisäksi se tulisi päivittää aina vihuja läpikäytäessä, eikä vain kerran ennen päälooppia. ( ja ei, älä kysy että miten nämä tehdään )

Post Reply