AI. Try out my demo. (I don't know how to attach more than one piece of media so you will have to make your own texture for the enemies in my demo)
`Artificial Unintelligence
global bullet
global shot
global a#
global v#
global ho#
global t
global moves#
global movef#
global setup
global camv
global maxv
global distv
global recommendedfloor#
recommendedfloor#=-999999
global cam
global ai
global dist
input "Total Enemies: ",totales
sync on
hide mouse
randomize timer()
autocam off
load object "J:\test.x",2
load image "C:\Documents and Settings\Jake Stothard\My Documents\My Pictures\3D Smile.png",1
make object sphere 1,10
hide object 1
for i=3 to 1+totales*2 step 2
make object sphere i,10
make object cube i+1,1
hide object i+1
texture object i,1
yrotate object i,180
fix object pivot i
position object i,rnd(1517)-762,200,rnd(1549)-759
next i
type pos
x as float
y as float
z as float
endtype
dim a(totales) as pos
for i=1 to totales
a(i).x=object position x(i)
a(i).y=object position y(i)
a(i).z=object position z(i)
next i
cam=1
ai=2
dist=3
dim mind(totales) as integer
for i=1 to totales
mind(i)=rnd(50)+30
next i
null=make vector3(cam)
null=make vector3(ai)
null=make vector3(dist)
dim ss(totales) as float
do
sync
gosub player
gosub ai
loop
player:
first_person( 1, 0, 1)
collision(0,1,2,2,10,screen width()/2,screen height()/2,1)
gravity( 1,recommendedfloor#,-0.01,2,0,0)
return
ai:
for enemy=3 to 1+totales*2 step 2
Artificial_Intelligence(enemy,0.5,(enemy-1)/2,50000,mind((enemy-1)/2),mind((enemy-1)/2)+20,2,1)
mind((enemy-1)/2)=mind((enemy-1)/2)+rnd(2)-1
if mind((enemy-1)/2)<30 then mind((enemy-1)/2)=30
if mind((enemy-1)/2)>80 then mind((enemy-1)/2)=80
next enemy
return
function first_person( cam_obj, cameranumber, speed#)
move#=upkey()-downkey()
move object cam_obj,move#*speed#
move#=rightkey()-leftkey()
move object right cam_obj,move#*speed#
position camera cameranumber,object position x(cam_obj),object position y(cam_obj),object position z(cam_obj)
xrotate camera cameranumber,camera angle x(cameranumber)+mousemovey()/2
yrotate camera cameranumber,camera angle y(cameranumber)+mousemovex()/2
yrotate object cam_obj,camera angle y(cameraangle)
if camera angle x(0)>90 then xrotate camera 0,90
if camera angle x(0)<-90 then xrotate camera 0,-90
endfunction
function third_person( cam_obj, cameranumber, speed#, turnspeed#, distance#, height#, smooth, collision)
move#=upkey()-downkey()
move object cam_obj,move#*speed#
rotate#=rightkey()-leftkey()
yrotate object cam_obj,object angle y(cam_obj)+(rotate#*turnspeed#)
set camera to follow cameranumber,object position x(cam_obj),object position y(cam_obj),object position z(cam_obj),object angle y(cam_obj),distance#,height#,smooth,collision
point camera cameranumber,object position x(cam_obj),object position y(cam_obj),object position z(cam_obj)
endfunction
function gravity(object,floor,a#,jump#,bounce#,matrix)
if object position y(1)<floor
position object 1,object position x(1),floor,object position z(1)
moves#=0
movef#=0
t=0
if returnkey()=1
v#=jump#
else
v#=v#*bounce#
if v#<>0 and matrix>0
position object 2,object position x(1),object position y(1),object position z(1)+1
y1#=get ground height(matrix,object position x(2),object position z(2))
xz1#=object position z(2)
position object 2,object position x(1),object position y(1),object position z(1)-1
y2#=get ground height(matrix,object position x(2),object position z(2))
xz2#=object position z(2)
movef#=-(1/((xz2#-xz1#))/(y2#-y1#))
position object 2,object position x(1)+1,object position y(1),object position z(1)
y1#=get ground height(matrix,object position x(2),object position z(2))
xz1#=object position x(2)
position object 2,object position x(1)-1,object position y(1),object position z(1)
y2#=get ground height(matrix,object position x(2),object position z(2))
xz2#=object position x(2)
moves#=-(1/((xz2#-xz1#)/(y2#-y1#)))
endif
endif
else
if t=0
ho#=object position y(1)
else
position object 1,object position x(1)+moves#,a#*t^2+v#*t+ho#,object position z(1)+movef#
endif
inc t
endif
endfunction
`Make sure there are no objects with object numbers between the first and last
`that you don't want tested. Make first object be the object with lowerst object
`number that you want to have collision and lastobject be the one with the highest.
function collision(camera,cam_obj,firstobject,lastobject,radius,screencenterx,screencentery,gandc)
`I put this inside of the functioin so that all you would have to remember to do
`at the beginning of a program that uses this function is to make those four variables
`global.
if setup=0
camv=1
maxv=2
distv=3
null=make vector3(camv)
null=make vector3(maxv)
null=make vector3(distv)
setup=1
endif
`First it checks all side angles
x#=camera angle x(camera)
xrotate camera camera,0
`It simply checks four directions, meaning that it is a collision cube, not a sphere.
for angle=1 to 4
if pick object (screencenterx,screencentery,firstobject,lastobject)>0
set vector3 camv,camera position x(camera),camera position y(camera),camera position z(camera)
set vector3 maxv,get pick vector x()+camera position x(camera),get pick vector y()+camera position y(camera),get pick vector z()+camera position z(camera)
subtract vector3 distv,camv,maxv
if length vector3 (distv)<radius
move camera camera,(length vector3 (distv)-radius)
endif
endif
yrotate camera camera,camera angle y(camera)+90
next angle
yrotate camera camera,wrapvalue(camera angle y(camera))
`Now it basically turns the camera down and makes sure that you are not too close to the ground.
`If you are then it moves you back up.
xrotate camera camera,90
if pick object (screencenterx,screencentery,firstobject,lastobject)>0
recommendedfloor#=get pick vector y()+camera position y(camera)+radius
if gandc=0
set vector3 camv,camera position x(camera),camera position y(camera),camera position z(camera)
set vector3 maxv,get pick vector x()+camera position x(camera),get pick vector y()+camera position y(camera),get pick vector z()+camera position z(camera)
subtract vector3 distv,camv,maxv
if length vector3 (distv)<radius
position camera camera,camera position x(camera),get pick vector y()+camera position y(camera)+radius,camera position z(camera)
endif
endif
endif
xrotate camera camera,x#
yrotate camera camera,camera angle y(camera)
if cam_obj>0
position object cam_obj,camera position x(0),camera position y(0),camera position z(0)
endif
endfunction
`I will explain all the parameters here-
`enemy is the object which you want to have the artificial intelligence
`aspeed# is the speed you want the enemy to move at
`pia stands for position in array. Make sure each enemy has there own position in all the arrays
`sidestep is the maximum speed you want the enemies to side step.
`mindist is the closest the enemy will get to you
`max dist is the farthest the enemy will allow itself to get from you
`world is the object number you want the enemy to have collision with and not be able to see through
`attobj is the object you want the enemies to attack
function Artificial_Intelligence(enemy,aspeed#,pia,sidestep,mindist,maxdist,world,attobj)
`Returns a value of 0 if the enemy can see you.
dist#=intersect object (world,object position x(attobj),object position y(attobj),object position z(attobj),object position x(enemy),object position y(enemy),object position z(enemy))
`Make sure that you have made a size 1 cube that has an object number 1 greater than that of the enemy. Hide this cube.
position object enemy+1,object position x(enemy),object position y(enemy),object position z(enemy)
`If it can see you
if dist#=0
`Store where it last saw you
a(pia).x=object position x(attobj)
a(pia).y=object position y(attobj)
a(pia).z=object position z(attobj)
`Point the cube towards you.
point object enemy+1,object position x(attobj),object position y(attobj),object position z(attobj)
endif
`This is supposed to make the enemy slowly turn to face you. It doesn't work.
rotate object enemy,curveangle (object angle x(enemy+1),object angle x(enemy),0.000001),curveangle (object angle y(enemy+1),object angle y(enemy),0.000001),curveangle (object angle z(enemy+1),object angle z(enemy),0.000001)
`Distance formula
set vector3 cam,object position x(attobj),object position y(attobj),object position z(attobj)
set vector3 ai,object position x(enemy),object position y(enemy),object position z(enemy)
subtract vector3 dist,cam,ai
distance#=length vector3(dist)
`Artificial Angle x. This xrotates the enemy to 0 before it moves it then rotates it back.
aax#=object angle x(enemy)
xrotate object enemy,0
`if it is too far away move closer
if distance#>maxdist
move object enemy,aspeed#
endif
`if it is too close then move away
if distance#<mindist
move object enemy,-aspeed#
endif
`Pathetic gravity
move object down enemy,1
`Sees if it is too close to the ground
ag#=intersect object(world,object position x(enemy),object position y(enemy),object position z(enemy),object position x(enemy),object position y(enemy)-6,object position z(enemy))
`If it is then it moves it back up
if ag#>0
position object enemy,object position x(enemy),object position y(enemy)+(6-ag#),object position z(enemy)
endif
`If the enemy moved forwards then check collision infront of it
if distance#>maxdist
rotate object enemy+1,0,object angle y(enemy),0
move object enemy+1,6
aw#=intersect object(world,object position x(enemy),object position y(enemy),object position z(enemy),object position x(enemy+1),object position y(enemy+1),object position z(enemy+1))
move object enemy,-aw#
`If it hits a wall then go around it
if aw#>0
position object enemy+1,object position x(enemy),object position y(enemy),object position z(enemy)
move object right enemy+1,10
if intersect object (world,object position x(enemy),object position y(enemy),object position z(enemy),object position x(enemy+1),object position y(enemy+1),object position z(enemy+1))>0
move object left enemy,2
position object enemy+1,object position x(enemy),object position y(enemy),object position z(enemy)
point object enemy+1,a(pia).x,a(pia).y,a(pia).z
rotate object enemy,object angle x(enemy+1),object angle y(enemy+1),object angle z(enemy+1)
else
position object enemy+1,object position x(enemy),object position y(enemy),object position z(enemy)
move object left enemy+1,10
if intersect object (world,object position x(enemy),object position y(enemy),object position z(enemy),object position x(enemy+1),object position y(enemy+1),object position z(enemy+1))>0
move object right enemy,2
position object enemy+1,object position x(enemy),object position y(enemy),object position z(enemy)
point object enemy+1,a(pia).x,a(pia).y,a(pia).z
rotate object enemy,object angle x(enemy+1),object angle y(enemy+1),object angle z(enemy+1)
endif
endif
endif
ss(pia)=0
endif
`If the enemy move backwards then check collision behind it
if distance#<mindist
rotate object enemy+1,0,object angle y(enemy),0
move object enemy+1,-6
aw#=intersect object(world,object position x(enemy),object position y(enemy),object position z(enemy),object position x(enemy+1),object position y(enemy+1),object position z(enemy+1))
move object enemy,aw#
ss(pia)=0
endif
`If the enemy is in the distance he likes move side to side
if distance#>=mindist and distance#<=maxdist
ss(pia)=ss(pia)+(rnd(100)-50)*2*aspeed#
position object enemy+1,object position x(enemy),object position y(enemy),object position z(enemy)
rotate object enemy+1,object angle x(enemy),object angle y(enemy),object angle z(enemy)
move object right enemy+1,ss(pia)/10000+6*ss(pia)/abs(ss(pia))
ssw#=intersect object (world,object position x(enemy),object position y(enemy),object position z(enemy),object position x(enemy+1),object position y(enemy+1),object position z(enemy+1))
if ssw#>0
ss(pia)=0
endif
move object right enemy,ss(pia)/10000
endif
if ss(pia)>sidestep then ss(pia)=sidestep
if ss(pia)<-sidestep then ss(pia)=-sidestep
`Xrotate the enemy the angle it was before it was Xrotated to 0 degrees
xrotate object enemy,aax#
endfunction
Insanity is just a state of mind