Ehostettu ZombieAI

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Ehostettu ZombieAI

Post by JATothrim » Sun Jun 28, 2009 4:31 pm

Muutaman illan "räpöstyksenä" koodasin Marcoderin ZombieAI.cb pohjaan yhden lisä palikan/ehostuksia ja tuloksena olikin varsin pätevä teköäly! Zombit osaavat vikaista nurkan taakse ja seurata toisiaan sen lisäksi että ne laahustavat ympäriinsä väistellen seiniä. Zombit osaavat ottaa myös sivuaskelia seuratessaan jotain objektia. Vain tähtäys (ennakon otto) ja ampunimen puutuu! Harmittavana puolena täytyy mainita, että tekoäly on varsin raskas, koska objectpick:ä käytetään varsin reippaasti. :) (FPS tippuu kun zombeja on n. 30) Näppäimet: MLB, MRB, Z

Code: Select all

SCREEN 1024, 768', 0, cbFullScreen
FrameLimit 60

//--------------------------------------------------------------------------------
// Vakioita joilla voidaan säätää ukkeleiden käyttäytymistä
//--------------------------------------------------------------------------------
Const MAX_ZOMBIES		= 5	// Kuinka monta zombieta kentällä kulkee (15 taitaa olla jo overkilliä)
Const MIN_NEXT_ACTION	= 1000	// Koska aikaisintaan arvotaan zombielle uusi suunta
Const MAX_NEXT_ACTION	= 3000	// Koska viimeistään arvotaan zombielle uusi suunta
Const RND_ROTATION		= 10.0	// Kun zombielle arvotaan uusi kääntyminen niin tämä on maksimi.
Const MIN_SPEED			= 1.5	// Zombien nopeus kun se on havainnut esteen
Const MAX_SPEED			= 2.5	// Zombien nopeus kun tie on vapaa
Const SIDE_SPEED		= 3.0	// Zombien sivuttainen nopeus.
Const WAKEUP_DIST		= 95	// Jos matkaa esteeseen on vähemmän kuin tämä niin aletaan etsiä uutta suuntaa
Const EXPLORE_ANGLE		= 60	// Kun pitää päätellä uusi suunta niin se tehdään katselemalla
                                // näin monta astetta molempiin suuntiin
Const DODGE_ROTATION	= 10.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.
Const FOLLOW_DIST		= 50.0	// Kuinka lähelle zombie seuraa kohdetta.
Const FOLLOW_SMOOTH		= 10	// Kuinka pehmeästi zombie seuraa.
Const DODGE_DIST		= 50.0	// Miten lähellä zombi alkaa väistämään estettä (seuratessa).
Const AFRAID_DIST		= 30.0	// Kuinka lähellä zombie alkaa väistämään kohdetta.

// !!! Vaihda Polku oikeaksi !!!
ChDir "C:\Ohjelmat\CoolBasic\media"
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//--------------------------------------------------------------------------------
// Kartan lataus
//--------------------------------------------------------------------------------
'map = LoadMap("cdm2_mod.til", "tileset.bmp")
'map = LoadMap("cdm2.til", "tileset.bmp")
map = LoadMap("testmap.til", "tileset.bmp")
// Asetetaan kartta poimittavaksi
ObjectPickable map, ON


//--------------------------------------------------------------------------------
// Kävelyanimointia varten tarvitaan jalat. Ladataan jalka ja piilotetaan se.
//--------------------------------------------------------------------------------
legObject = LoadObject("cannon.bmp", 72)
ShowObject legObject, OFF


//--------------------------------------------------------------------------------
// Ladataan zombie ja piilotetaan sillä tästä kloonataan muut objektit
//--------------------------------------------------------------------------------
zombieObject = LoadObject("soldier.bmp", 360)
ShowObject zombieObject, OFF


//--------------------------------------------------------------------------------
// Luodaan kokoelma
//--------------------------------------------------------------------------------
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
    Field sidestepping	As Float	//sivuttain kävely
	Field follow_obj	As integer	// Zombie yrittää seurata tätä objektia.
	Field peek_state	As integer	// "kurkistus muutuja"
	Field intrest_x		As Float	// paikka jossa suora näköyhteys loppui seurattavaan objektiin.
	Field intrest_y		As Float

    // 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


//--------------------------------------------------------------------------------
// Luodaan muutamia zombeja oletusarvoilla
//--------------------------------------------------------------------------------
For i = 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)
    

    // 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 i

For zombie1.ZOMBIES=Each ZOMBIES
	For zombie2.ZOMBIES=Each ZOMBIES
		If zombie1<>zombie2 Then SetupCollision zombie1\bodyObj, zombie2\bodyObj, 2,2,2
	Next zombie2
Next zombie1



For zombie.ZOMBIES=Each ZOMBIES
	SetupCollision zombie\bodyObj, map, 2,4,2
	ObjectInteger zombie\bodyObj, ConvertToInteger(zombie)	//hattutemppu: linkitetaan instansi objektiin.
	'SetupCollision gIntrest, zombie\bodyObj, 2,2,2
Next zombie


//--------------------------------------------------------------------------------
// Luodaan globaali picker-objekti jota käytetään "silminä"
// Luodaan myös objekti jota zombit koettavat seurata.
//--------------------------------------------------------------------------------
Global gPicker, gIntrest
gPicker = MakeObject()

//--------------------------------------------------------------------------------
// Luodaan objekti jota zombit koettavat seurata. (pelihahmo!)
//--------------------------------------------------------------------------------
gIntrest = CloneObject(zombieObject)
ObjectPickable gIntrest, 2
SetupCollision gIntrest, map, 2,4,2
SpawnObject(gIntrest)

DrawToWorld ON	//deguggausta varten..
//================================================================================
// Pääsilmukka alkaa
//================================================================================
Repeat
	//siirrä kohdetta..
	If MouseDown(1)
		ResetObjectCollision gIntrest
		PositionObject gIntrest, MouseWX(), MouseWY()
	EndIf
	//pelaa kohtella, hiiren oikea vaihtaa näppis ja cursori ohjauksen välillä.
	If MouseHit(2) Then usekeys% = usekeys Xor 1
	
	If usekeys
		If LeftKey() Then TurnObject gIntrest, 5
		If RightKey() Then TurnObject gIntrest, -5
	Else
		RotateObject gIntrest, GetAngle(ObjectX(gIntrest), -ObjectY(gIntrest), MouseWX(), -MouseWY())
		If LeftKey() Then MoveObject gIntrest, 0, MIN_SPEED
		If RightKey() Then MoveObject gIntrest, 0, MIN_SPEED
	EndIf
    If UpKey() Then MoveObject gIntrest, MAX_SPEED*2
    If DownKey() Then MoveObject gIntrest, -MAX_SPEED
	
	//z nappi vaihtaa näkymän zombeihin.
	If Not KeyDown(cbkeyz) Then PositionCamera ObjectX(gIntrest), ObjectY(gIntrest)
	
	DrawGame
    UpdateAI()
    UpdateAnimation()
    Text 0, 0, FPS()
    DrawScreen
Forever


//================================================================================
// Päivitetään zombiet
//================================================================================
Function UpdateAI()
	Danger% = False
    // Käydään kaikki läpi
    For zombie.ZOMBIES = Each ZOMBIES
        // Mikäli zombie ei ole liian lähellä seinää, eikä zombie ole seuraamassa ketään
		// ja on aika arpoa sille uusi suunta, niin tehdään se nyt.
        If zombie\tooClose = False And zombie\nextAction < Timer() And zombie\follow_obj = 0
            // 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
		
		'dist# = Distance(ObjectX(zombie\bodyObj), ObjectY(zombie\bodyObj), zombie\intrest_x, zombie\intrest_y)
		'ang# = GetAngle(ObjectX(zombie\bodyObj), ObjectY(zombie\bodyObj), zombie\intrest_x, zombie\intrest_y)
		'Line ObjectX(zombie\bodyObj), ObjectY(zombie\bodyObj), ObjectX(zombie\bodyObj) + Cos(ang)*dist, ObjectY(zombie\bodyObj) - Sin(ang)*dist        // 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ä,
		// eikä zombie ole seuraamassa.
        If zombie\tooClose = False And zombie\follow_obj = 0 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 And picked_obj <> gIntrest 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)
					zombie\sidestepping = CurveValue(SIDE_SPEED, zombie\sidestepping, FOLLOW_SMOOTH)
                Else
					d = (WAKEUP_DIST - minDist)
					zombie\sidestepping = CurveValue(-SIDE_SPEED, zombie\sidestepping, FOLLOW_SMOOTH)
                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\sidestepping = 0
                zombie\tooClose = False
            EndIf
        EndIf
		
		//Selvitetään seurattava kohde. 		
		If ObjectVision(zombie\bodyObj, gIntrest, EXPLORE_ANGLE)
			zombie\follow_obj = gIntrest
		EndIf
		
		// Zombit juonivat! Ne osaavat seurata toista jos tämäkin ON
		// seuraamassa jotain.. Mutta ne eivät kutenkaan seuraa toisiaan kun
		// "ketju" ei päätykkään kohteeseen..
		CloneObjectPosition gPicker, zombie\bodyObj
		ObjectPick zombie\bodyObj
		picked_obj% = PickedObject()
		If picked_obj <> map And zombie\follow_obj = 0
			//ok, poimittu ei ollut kartta vaan jokin muu peliobjekti..
			If ObjectVision(zombie\bodyObj, picked_obj, EXPLORE_ANGLE)
				If picked_obj = gIntrest
					//örmyli näki kohteen. Asetetaan se seuraamaan sitä.
					zombie\follow_obj = picked_obj
				ElseIf picked_obj <> 0
					
					//objekti ON zombi tsekataan "ketju" (aikaisemmat ehdot sulkivat kaikki muut tapaukset pois)
					follow_Zombie.Zombies = ConvertToType(ObjectInteger(picked_obj))	'hattutemppu osoitin. :D
					
					While follow_Zombie <> NULL
						If follow_Zombie\follow_obj = gIntrest
							//örmyli seuraa kohdetta. Asetetaan uusi kohde seurattavaksi
							zombie\follow_obj = picked_obj
							Exit
						ElseIf follow_Zombie\follow_obj = 0
							Exit
						Else
							//seuraava objekti..
							If follow_Zombie\follow_obj <> 0
								follow_Zombie = ConvertToType(ObjectInteger(follow_Zombie\follow_obj))
							EndIf
						EndIf
					Wend
				EndIf
			EndIf
		EndIf
		
		If zombie\follow_obj <> 0
			//Selvitetään onko kohde kadonnut kulman taakse.
			If ObjectSight(zombie\bodyObj, zombie\follow_obj)
				zombie\intrest_x = ObjectX(zombie\follow_obj)
				zombie\intrest_y = ObjectY(zombie\follow_obj)
				zombie\peek_state = 0
			Else
				//oli. nollataan seuraaminen ja ruvetaan laahustamaan ympäriinsä.
				zombie\peek_state = 1
				zombie\tooClose = False
			EndIf
		EndIf
			
		
		
        speed# = MAX_SPEED
        // Jos ollaan liian lähellä jotain estettä niin pienemmällä vauhdilla
        If zombie\tooClose = True Then speed = MIN_SPEED


		// Zombin Seuraus tekoäly:
		If zombie\follow_obj <> 0
			zombie\sidestepping = CurveValue(0, zombie\sidestepping, FOLLOW_SMOOTH)
			dist# = Distance2(zombie\bodyObj, zombie\follow_obj)
			If dist < FOLLOW_DIST
				//Zombi ON tarpeeksi lähellä kohdetta. (tässä kohtaa voisi vaikka ampua)
				speed = 0
			Else
				speed# = MAX_SPEED
				//Västellään mahdollisia esitä, otetaan sivuaskelia.
				// Ensin "silmä" samaan suuntaan kuin zombie
				CloneObjectPosition gPicker, zombie\bodyObj
                CloneObjectOrientation gPicker, zombie\bodyObj
                // Käännetään katsetta toiselle sivulle ja lasketaan etäisyys lähimpään esteeseen
                TurnObject gPicker, -EXPLORE_ANGLE / 2
                ObjectPick gPicker
                d1# = Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY())
				'Line ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()
				TurnObject gPicker, -EXPLORE_ANGLE / 2
                ObjectPick gPicker
				d1 = Min(d1, Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()))
				'Line ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()
                // Ja sitten vielä toiseen suuntaan.
                TurnObject gPicker, EXPLORE_ANGLE * 1.5
                ObjectPick gPicker
                d2# = Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY())
				'Line ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()
				
				TurnObject gPicker, EXPLORE_ANGLE / 2
                ObjectPick gPicker
                d2 = Min(d2, Distance(ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()))
				'Line ObjectX(gPicker), ObjectY(gPicker), PickedX(), PickedY()
				
				minDist = Min(d1, d2)
				If	minDist < DODGE_DIST
					If d1 > d2
						zombie\sidestepping = CurveValue(SIDE_SPEED, zombie\sidestepping, FOLLOW_SMOOTH)
					Else
						zombie\sidestepping = CurveValue(-SIDE_SPEED, zombie\sidestepping, FOLLOW_SMOOTH)
					EndIf
				EndIf
			EndIf
			
			If dist < AFRAID_DIST Then speed = -MAX_SPEED
			
			// Hukattiinko kohde kokonaan?
			dist# = Distance(ObjectX(zombie\bodyObj), ObjectY(zombie\bodyObj), zombie\intrest_x, zombie\intrest_y)
			If zombie\peek_state = 1 And dist < 20
				zombie\follow_obj = 0
				zombie\peek_state = 0
				zombie\intrest_x = 0
				zombie\intrest_y = 0
			EndIf
			ang = GetAngle(ObjectX(zombie\bodyObj), -ObjectY(zombie\bodyObj), zombie\intrest_x, -zombie\intrest_y)
			RotateObject zombie\bodyObj, ang
		EndIf
		
		'If CountCollisions(zombie\bodyObj) Then speed = 0
		// Nyt siirretään objektia.
        MoveObject zombie\bodyObj, speed, zombie\sidestepping
        

		count% = count + 1
		cx# = cx + ObjectX(zombie\bodyObj)
		cy# = cy + ObjectY(zombie\bodyObj)
    Next zombie
	
	If KeyDown(cbkeyz) Then PositionCamera cx/count, cy/count
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 + Cos(zombie\legPos) * zombie\sidestepping
        MoveObject zombie\rightLegObj, Sin(zombie\legPos) * 10 - 10, 9 + cos(zombie\legPos) * zombie\sidestepping
    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

Function ObjectVision(obj, obj2, fov=90, d# = 200)
    ang# = fov / 2.0

    If ObjectSight(obj,obj2) And Distance2(obj, obj2) < d Then
        dir# = GetAngle2(obj,obj2)		
        If WrapAngle(ObjectAngle(obj)+ang)>dir And WrapAngle(ObjectAngle(obj)-ang)<dir Then Return True
    EndIf
    Return False
End Function
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Ehostettu ZombieAI

Post by MaGetzUb » Mon Jun 29, 2009 4:58 pm

Itselläni FPS pysyi kokoajan yli 50. Tekoäly näytti toimivan, mutta välillä zombit jäivät pyörimään ympyrää koska toinen zombi pökitti toisen itsensä ja seinän väliin. :D
EDIT:

Voisisit vielä lisätä Team:in Zombeille, joten niistä voisi tulla taistelioita (eivät hyökkäisisi omien kimmppuun. :D) Eli jos pickerillä pickattu toisen kohteen team arvo on eri niin silloin vaikka lähdetään seuraamaan/ampumaan toista kohdetta. :D

Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
11v
Member
Posts: 73
Joined: Wed Jun 10, 2009 10:13 pm

Re: Ehostettu ZombieAI

Post by 11v » Thu Jul 09, 2009 5:25 pm

Mahtava tekoäly, yhtä kohtaa lukuun ottamatta.
Tyypit jumittuivat
Black city peleistä parhain

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Ehostettu ZombieAI

Post by JATothrim » Thu Jul 09, 2009 6:34 pm

Tiedän seikan, ja vielä mistä/miksi. Syynä on ihan että monta Zombia yrittää ahtautua yhtäaikaa liian pienestä kolosta. Ratkaisuna olisi tunnistaa milloin Zomibi jää "melkein paikoilleen" ja nollata tekoäly tietyn ajan kuluttua jälleen laahustamaan ympäriinsä. Ja koodista näin jälki käteen: koettakaa erottaa/kirjoittaa laahustus ja seuraus tekoäly, jne.. omiin funktoihinsa!
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

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

Re: Ehostettu ZombieAI

Post by elmo123 » Wed Jul 22, 2009 2:55 pm

WTF? Ohjelma jumittui kuin täi tervaan ja jäi hidastamaan upouuden XP:ni toimintaa. Järjestelmän FPS oli ≈ 1-luokkaa. Kokeilin ajaa CB:llä yksinkertaisen Hello World-ohjelman, muttei ongelmia löytynyt. Kun taas ajoin tekoälyohjelmasi, jumittui se samalla tavalla kuin aikaisemmin. Kellään muulla ilmennyt? :|
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!

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Ehostettu ZombieAI

Post by MaGetzUb » Wed Jul 22, 2009 4:51 pm

elmo123 wrote:WTF? Ohjelma jumittui kuin täi tervaan ja jäi hidastamaan upouuden XP:ni toimintaa. Järjestelmän FPS oli ≈ 1-luokkaa. Kokeilin ajaa CB:llä yksinkertaisen Hello World-ohjelman, muttei ongelmia löytynyt. Kun taas ajoin tekoälyohjelmasi, jumittui se samalla tavalla kuin aikaisemmin. Kellään muulla ilmennyt? :|
Ei ole ilmentynyt, koitas asentaa CB uudestaan, voisi korjautua ongelma sillä. ;)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Ehostettu ZombieAI

Post by JATothrim » Wed Jul 22, 2009 9:25 pm

WTF. tosiaan. Outoja nämä cb:n kokoonpano bugit. :D Ärsyttävästi koneeni on epätävallisen immuuni CB:n bugeille. mm. putpixel2 on mahdotonta kaataa ohjelmaa..
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

Post Reply