Placing Entities Efficiently

Blitz3D Forums/Blitz3D Beginners Area/Placing Entities Efficiently

Sph!nx(Posted 2008) [#1]
I've searched for information about different world editors and how to place entities efficiently around the environments but most information is outdated or hard to understand.

I found some information on 3D World Editor but cannot understand how to link the functions in the code to the items in the .DEF files. (It looks really similar to Valve's Hammer Editor and their .FGD file with entities.) The information found on this forum is really difficult for me.

I also read about droplet. I found some information on another website, I believe the creators, but it said that development has been stopped and the links are dead.


Are there any other good ways to do it? Perhaps other editors?


Thanks!


lo-tekk(Posted 2008) [#2]
You might give gile[s] a try. It's a lightmapper and might be used as an entity dropper too. See: http://www.frecle.net/index.php?show=giles.about


Ross C(Posted 2008) [#3]
Yeah, it's pretty good. Only thing you need to watch is once you save out the level and load it again, the level piece zxis centres, all get moved to the centre of the entire level being saved. Pain in the ass for rotating after you save. Does lightmap and save to .3d though!


Sph!nx(Posted 2008) [#4]
Thanks! Still a few questions regarding this though! :)

How does most of you approach the entity placement in your world? What would be the easiest way and how would I do it efficiently within Blitz3d itself?

I want to do a (simple) FPS game and keep wondering how to do this kind of stuff.


Ross C(Posted 2008) [#5]
You really need an app for placing things, or design one yourself. Manually placing things by trial and error is not much fun. I would imagine every top game deveopler using a modeller come editor app. With Gile[s] you place your entities, lightmap if nessesary, set up custom properties/scripts and save.

Gile[s] will save the level as pieces, loaded as a whole, so you don't need to worry about the actual co-ords.


Sph!nx(Posted 2008) [#6]
Thanks for your quick reply. That editor does looks interesting, but so does 3D world studio.

I need to know before I will spend money on an editor. Are there any others? Which one is best and which one is easiest to work with?

Thanks


josk(Posted 2008) [#7]
Have you looked at Unlimited Drop Pro, looks good and you can download a demo.
Click here!

Theres a bit of info if you search the forums.


Sph!nx(Posted 2008) [#8]
Well, after a browse through the forum I think Gile[s] is best for me. I bought it. Thanks everybody!

Edit :
However, I could use some more information on how get your functions working as entities in the editor... Anybody more information on this?

Thanks


Sph!nx(Posted 2008) [#9]
Sorry for my impatience but this must be a common subject which everybody is familiar with.

I'd really like to know what the most efficient way (or editor) is and where to find some more documentation on entity placement specifically. Anybody?

thanks!


Gabriel(Posted 2008) [#10]
I have no idea what "functions working as entities" means.


Ross C(Posted 2008) [#11]
Maybe he means scripts/custom properties?

If you do mean this, what i personally do, is use Gile[s] custom properties box on each entity, and enter information into it.

For instance, if i wanted the entities texture, on layer 1, to move along the x-axis (effectively scrolling it every frame in my game), id do something like:

texture_scroll_0=1 texture_scroll_x=0.1 texture_scroll_y=0

and upon loading this level into blitz, i would break up the entire level into it's seperate entities via FindChild() or GetChild(), then, read each EntityName()

The reason for that, is Gile[s] stores custom properties in the EntityName() of each entity, which is a perfect way of keeping things compact.

You simply parse each name, and extract the relevant information:

IE, search through the string and find the text:

"texture_scroll_0="

upon finding that, read from end character + 1 onwards, until you encounter a space. That will be your value you use.

It's alot to code at first, but when you get it up and running, you can alter the way your entities act in the game, simply by attaching different custom properties in the modeller. I will try and find my own small engine for handling this when i get in from work.

It may seem like alot of work, but it is worth it, as it can be reused for many games.

My current scripting/custom property reader code does the following:

Rotates texture
scrolls texture
moves entities
rotates entities
scales entities
sets collision modes,
sets pick modes,
sets particle emitters,
reads in animation information,
reads in entities and converts them to trigger points( to trigger one of the above actions)

As you see, anything blitz can do, you can set up a custom property and read it back in blitz. Most of the above have modes, such as ping pong, one shot, loop, triggered.

You just got to learn where to stop and what your game actually needs, or like me, you'll be forever writing an engine and not a game...


Sph!nx(Posted 2008) [#12]
Thanks gentlemen!

Ross C, I'm still quite n00bish, but if that system allows me to place entities inside the (giles) editor, which my own game code can read, than that's exactly what I need.


I will try and find my own small engine for handling this when i get in from work.
Wow, if you can post that as an example (I promise, just for reference) I'd be much obliged!

I simply need it to place my entities around my game world. Like enemies, items, etc.

Thanks again!


Ross C(Posted 2008) [#13]
I'm still not 100% on what you mean, by placing entities.

Generally, in Gile[s], you load your entity. Drag the position arrows with your mouse, until your happy with it's position. That's all there is too it usually.

You then save your level and it loads exactly as it was set out in Gile[s]


Sph!nx(Posted 2008) [#14]
Ok, I will try to explain what I want to accomplish. Do know, I'm still learning and this might be a bit to advanced for me, but it is really the next step I want to grasp.

Lets say I write a FPS game. In the code of my game, I've written a monster to fight. This monster will appear many times 'cause its part of an army.

Ok, I made an enviroment now and imported into Gile[s] but the monster I wrote is only in my main blitz3D code. Now I want that monster to appear in the editor (as an entity) to place around. That's the part I don't get.

Generally, in Gile[s], you load your entity. Drag the position arrows with your mouse, until your happy with it's position. That's all there is too it usually.


Yeah, thats what I mean, but how do I set this up?


Let's say I made a model(mesh) of a monster, without any function or actions, just the mesh.

I know how to render it in the game and I know how to place and position it in the code, but I would like to have it so I can place that monster every were, as many times as I want, in a level editor (like giles for example), but I don't know how...

I know, quite n00bish, but I would like to know, cause placing monsters around in the code itself (mostly trial and error work) would be an impossible job to do.

I hope you know what I mean now.

Thanks.


Sph!nx(Posted 2008) [#15]
Ok, I've got a theory about how this could work. Looking though the, hard to understand, tutorial of 3D world Studio and the documentation of Udrop.

I figured you write your code (monsters, weapons, items, etc.) and they be listed somehow inside a file outside the code, I think you would call that a script.

Now you set the desired world editor (giles?) to read that file/script so you can place the entities around?

Just a thought, been pondering my brain to pulp on this.

thanks


Sph!nx(Posted 2008) [#16]
well, after some more searches I came across the term 'objects dropper' quite a few times. Perhaps this explains it a bit more.

Still don't understand how to set it up or something. Any further help is much appreciated.

thanks!

Edit:

I think the last part of this thread covers what I mean:
http://www.blitzbasic.com/Community/posts.php?topic=59568#665873

and then specially this post :

To add custom properties scroll the right hand menu pane up, the one that has 'Basic Properties' 'Lighting Properties'.

At the bottom of this pane you will see 'Custom Properties'.

You can enter values here and then parse through them when you load your level into Blitz3D.


Can someone please elaborate a bit more? How can I parse it through and what code is needed to read the information?

thanks


Sph!nx(Posted 2008) [#17]
First, I want to apologize for my multiple posts in a row. I did this to keep it active and noted in 'active topics'. I really need this info.

Anyway, I've also found that people can write their own 'object dropper' in the code of their program/game.

I have an idea of how to write such an application myself but I don't understand how to (permanently) save the entities dropped in the 'dropper' application so that it will automatically be loaded when you run the map in the normal manner.

I figured it is saved somehow in an outside file and not in the main code of the program.

I don't really need a concrete example (though, it is appreciated of course) but a general explanation of how this technique works and perhaps a nudge in the direction of some more documentation on this matter.

Thanks!


Zethrax(Posted 2008) [#18]
Just use use the file read/write commands to load and save your data.

This is fairly basic coding, so I'd recommend you read through the documentation, do some coding experimentation, and aquaint yourself with the language more thouroughly.


Sph!nx(Posted 2008) [#19]
Thanks!

Yeah, I'm still learning but I really wanted to know this. Just needed a nudge in the right direction and I believe you just gave me that.

I will undoubtedly bug you guys some more later :P

Thanks gentlemen!


Edit :

I feel such a n00b now. I found an example file on the Giles website:
http://www.frecle.net/index.php?show=&section=giles&sub=download

You can find it under 'extras' for any other newbies with the same issue.


Ross C(Posted 2008) [#20]
I'd still say, you position waypoints/pivots at the positions you want you monster to appear at. Then, upon loading the game, you read these pivots and place your monster at those locations.


Sph!nx(Posted 2008) [#21]
Okay, I made a simple mesh of a surface with a cube on it. It's called 'map2.b3d'.

I've called the cube in the editor (3D world Studio at this point, but I have Giles too) 'cube'

I have this code when the world loads :
	map2=LoadAnimMesh("content\maps\map2\map2.b3d")
	PositionEntity map2,0,0,0

	cubemesh=FindChild(map2,"cube")


I have this code in my game loop:
			If KeyDown(17) Then
			MoveEntity cubemesh,0,0,2
			EndIf


Now when I press the 'w' key, the cubemesh should move right? I get this error : "Entity does not exist"

Any help? Thanks


Ross C(Posted 2008) [#22]
Are you positive the mesh loaded ok? Can you see it in blitz?

Also, from Gile[s] you want to save it so all the meshes are saved. I can't remember off hand what option it is, but it's after you click export.

Also, double check the exact in Gile[s] you called your entity.

I can't speak for 3d world studio, as i've never used it. It never worked properly on my PC.


Sph!nx(Posted 2008) [#23]
This time I did in giles. I went to models tab, there custom properties -> add, called it cube and kept it at integer ... should this be string?

Anyways, same code, same error. yes, the mesh loads in blitz perfectly, but somehow he does not recognise the child ... that code is good right?

thanks


Sph!nx(Posted 2008) [#24]
Tried it several times, on the same manner again ... Should I save the name of the box as standard integer or should it be something else?

I can't find anything wrong with the code I used but it still can's seem to recognize the FindChild entity.

Its getting really annoying now... Anybody?

Thanks.


Naughty Alien(Posted 2008) [#25]
have you try to declare your cubemash as a global?
Global Cubemesh

also, if you dont mind , you can upload your geometry (map2.b3d) so we can try and post eventually correct code..


Sph!nx(Posted 2008) [#26]
Ya sure! Here it is! Download!

I've declared my main mesh and childmesh in my 'load world' function, not global. Should it be global for it to work?

Thanks!


Naughty Alien(Posted 2008) [#27]
No wonder its not working..real name of entity you trying to access is this
cube[PROPS]Properties=Properties=cub[/PROPS]

and in order to work in such conditions you have to grab full name OR as i did, first 4 letters from left side (cube)..here is working code and cleaned up mesh

http://www.filefactory.com/file/da2de8/n/map2_zip


Sph!nx(Posted 2008) [#28]
I've downloaded and will try to implement it in my own code.

Thanks a lot! It's much appreciated!


Edit :

Got it now. I know what I did wrong and how to make it work the way I want.

Many thanks!!


Ross C(Posted 2008) [#29]
Yeah, don't put the entities name, in the custom properties field, unless your going to be parsing the custom properties field, via entityname :o)


Sph!nx(Posted 2008) [#30]
Hey all, another quite n00b question.

I've placed several children with the same name in the map. I've made a made it so that a mesh is placed on the same location of the child with the 'FindChild' command. It works, well sort of, it only places it at the first child I placed in the editor. I want it so that mesh is placed at all the children.

I did a little search and I believe this is done by 'CountChildren' and 'GetChild' instead of 'FindChild'. After reading topics about it I still don't get it. Can someone please give me a 'for dummies' explanation? :)

Thanks a lot!


Naughty Alien(Posted 2008) [#31]
..im not sure that I understand what you saying..on my levels there are loads of entities with same name(material/texture name) and i see no problem to access them separately...what exactly you trying to do?


Sph!nx(Posted 2008) [#32]
I placed several children around in my map editor. They all have the same name and are all equal to the root/parent.

I made a mesh at the location of that child, with the 'FindChild' command and now when I run my game,it only makes one mesh at the location of the first placed child (in the editor).

Here's the code: (its about Dev NPC)
       ; Load content
	map1=LoadAnimMesh("content\maps\map1.b3d")	
	PositionEntity map1,0,0,0
	
	
	; Maps Children
	player_spawn=FindChild(map1,"classname=spawn_player")
	devcam_spawn=FindChild(map1,"classname=spawn_devcam")
	devnpc_spawn=FindChild(map1,"classname=spawn_devnpc")
	
	; Dev NPC
	devman=LoadAnimMesh("content\models\dev_man\dev_man.b3d")
	PositionEntity devman,EntityX(devnpc_spawn),EntityY(devnpc_spawn),EntityZ(devnpc_spawn)

	; PLAYER
	player=CreatePivot()	;Create a pivot for our player character, the camera will be parented to this
	playercam=CreateCamera()
	EntityParent playercam,player ;Attach the camera to the player pivot.
	MoveEntity playercam,0,1.83,0  ;Move the camera up slightly to place it at about eye level 
	PositionEntity player,EntityX(player_spawn),EntityY(player_spawn),EntityZ(player_spawn)



Ross C(Posted 2008) [#33]
Just loop through all the child entities, and search for the name your after. It shouldn't matter they all have the same name.


;
parent = parent_entity
c = countchildren()

for loop = 1 to c

entity = getchild(parent_entity,c)
if entityname(entity) = "name you want" then
; this entity matches
end if

next


NOT real code, but gives you the idea :o)


Sph!nx(Posted 2008) [#34]
Ah, I understand now. I need to loop it or else the command to place the mesh at the child's location will be executed once.

Thanks, you all are a great help!


Sph!nx(Posted 2008) [#35]
I made this code :

If CountChildren(map) > 0 

	For childcount = 1 To CountChildren(map) 
	
		devnpc_spawn = GetChild(map,childcount)

		devnpc=LoadAnimMesh("content\models\dev_man\dev_man.b3d")	
		PositionEntity devnpc,EntityX(devnpc_spawn),EntityY(devnpc_spawn),EntityZ(devnpc_spawn)


	Next 
	
EndIf


It does find all children count, but then I mean ALL children, not just of the one I want. I used : devnpc_spawn=FindChild(map,"classname=spawn_devnpc") before but then it only found the first placed child. (in editor).

I need it so that he finds all children count, separated from each other, so the model gets placed on all children with the SAME name, not literary all children in the map.

Hope you can understand what I mean. (English is not my native language)

Thanks!


lo-tekk(Posted 2008) [#36]
Ross already explained this, i think:

insert this below the GetChild statement within the loop:

if entityname(devnpc_spawn) = "name you want" then
   devnpc=LoadAnimMesh("content\models\dev_man\dev_man.b3d")	
   PositionEntity devnpc,EntityX(devnpc_spawn),EntityY(devnpc_spawn),EntityZ(devnpc_spawn)
end if


Cheers


Sph!nx(Posted 2008) [#37]
It works! Thank you very much!


Sph!nx(Posted 2008) [#38]
Hey, me again! I'm now at the point that I want to rotate the children in the 3D world editor so I need to do two things.

1) I need only to find a certain part of a string in the 'if entityname()' command, for the countchild/getchild loop. (see above code)

2) I then need to extract the other parts of that same string and use that for further coding.

Perhaps a quote from Ross C explains it a bit better :
You simply parse each name, and extract the relevant information:

IE, search through the string and find the text:

"texture_scroll_0="

upon finding that, read from end character + 1 onwards, until you encounter a space. That will be your value you use.

It's alot to code at first, but when you get it up and running, you can alter the way your entities act in the game, simply by attaching different custom properties in the modeller. I will try and find my own small engine for handling this when i get in from work.

It may seem like alot of work, but it is worth it, as it can be reused for many games.


I understand his explanation ... in theory, but after many frustrating hours I still cant figure out how this works :\

Some more explanation or a small example code is much appreciated!

Thanks!


Ross C(Posted 2008) [#39]
When i did this, i created my own format for extracting and coding data in the Name of each entity. This is the code i use to load in my level and parse the string of the EntityName(). I copy this data to another string, and NAME the child entity with a NUMBER. This number is a handle i can use to instantly get the entity, without searching. You don't really need to know about that, so for now just ignore the line that says:

	NameEntity e\ent, Handle(e.entity) ; store the type object the entity is held in, in the entity name. Allows easy
									   ; access to the type object if you only have the mesh handle.


I first set up a type collection to store every piece of data i will be extracting, such as:

Type entity
	Field ent
	Field x,y,z
	Field name$
	Field event ; 0 = none, 1 = entity move. These are ENTITY EVENTS!
	Field ex#,ey#,ez# ; event modifiers
	Field cubemap ; set to zero for no texture. Set to 1 for update everyframe. Set to 2 for once only update
	Field texture[7] ; texture 4 is the location of cubemap textures.
	Field texture_px#[7]
	Field texture_py#[7]
	Field texture_sx#[7]
	Field texture_sy#[7]
	Field texture_rot#[7]

	Field texture_blend%[7] ; holds the different blends for the textures
	Field texture_event%[7] ; holds the value of a texture event
	
	Field texture_cube%[7] ; whether cubemap is active. 0 = no cubemap. 1 - 3 set cubemode
	
	Field EntBlend%
	Field EntType%
	Field EntPick%
	Field fx%
	Field event_handle
End Type


The cubemap field needs updating to an array, because i'm assuming only one cubemap per entity, but you could have more than one. ANYWAY, as you see, i'm storing alot of information about each child entity. NOW, these fields regarding textures:

	Field texture[7] ; stores the handle of the texture.
	Field texture_px#[7]
	Field texture_py#[7]
	Field texture_sx#[7]
	Field texture_sy#[7]
	Field texture_rot#[7]

	Field texture_blend%[7] ; holds the different blends for the textures
	Field texture_event%[7] ; holds the value of a texture event


Basically, in the 3d world editor, i would say, put as a name:

name=wateredge texture_event1=1 tx1=0 ty1=0.005 entitypick=0 entitytype=0 entityblend=3

Now, my code would hunt through this, searching for each occurance of the following: (just a snippet of the code)

		NameEntity temp\ent,temp_info$
		temp\name = temp_info$
		DebugLog("name="+temp_info$+"|")
		temp\event = extract(parse,"eventtype=")
		DebugLog("eventtype = "+temp\event)
		temp\ex = extract(parse,"ex=")
		DebugLog("ex = "+temp\ex)
		temp\ey = extract(parse,"ey=")
		DebugLog("ey = "+temp\ey)
		temp\ez = extract(parse,"ez=")
		DebugLog("ez = "+temp\ez)


There is more code to go through the individual texture layers and search for texture event properties:

		For texture_event_loop = 0 To 7
			temp_string$ = "texture_event"+texture_event_loop+"="
			temp\texture_event[texture_event_loop] = extract(parse,temp_string)
			DebugLog(temp_string+" "+temp\texture_event[texture_event_loop])
		
			temp_string$ = "tx"+texture_event_loop+"="
			temp\texture_px[texture_event_loop] = extract(parse,temp_string)
			DebugLog(temp_string+" "+temp\texture_px[texture_event_loop])

			temp_string$ = "ty"+texture_event_loop+"="
			temp\texture_py[texture_event_loop] = extract(parse,temp_string)
			DebugLog(temp_string+" "+temp\texture_py[texture_event_loop])

		Next


plugs the loop value into the type field arrays (they can only be one dimensional btw and can't be resized i think?)

The debuglog is purely so i can check it is parsing the information correctly. I have a function that you pass across a string too, and text to search for. It will search for the text, then search for an "=" sign straight after, then a number, and will stop when it finds a space, so the format has to be perfect, ie:

texture_event1=1

would work fine. Anyway, the function returns the value of that property. So, when your finished, your type collection may look something like this:

(assuming you only had 2 texture layers that is, 0 and 1)
	Field ent = handle of the entity
	Field x=10, y=20, z=70
	Field name$ = "waterfall"
	Field texture_event(0) = 0 ; 0 = none, 1 = texture move
	Field texture_px(0) = 0 ; texture modifier values
	Field texture_py(0) = 0 ; texture modifier values
	Field texture_event(1) = 1 ; 0 = none, 1 = texture move
	Field texture_px(1) = 0
	Field texture_py(1) = 0


(Please note as this point the other texture fields "texture_rx()"," texture_ry()" etc etc, mean nothing just now, as my system doesn't use them yet, and i'll probably do away with them, unless i find i need for a moving AND rotating AND scaling texture, all at once :o))

Now, when parsing each entity, the code checks the event field and the texture_event fields, generated when reading the "texture_event1=1" text from the parsed text. In this case the texture_event1 is 1, so the event field is set to 1. The code reads this, and generates a new type object for the EVENT type collection:

Type texture_event

	Field once ; 0 = do for ever, 1 = do once
	Field event_number ; 1 = texture move, 2 = texture rotate, 20 = cubemap update
	Field x#,y#
	Field entity_handle
	Field texture ; handle for a texture if an event needs a dyanmically created texture.
	Field texture_transform ; the texture number to moved/rotated/scaled... etc etc

End Type


My code will is (this is an old version) a long list of IF/CASE SELECT statements, evaluating the texture_event passed across to the function:

For example:

If texture_event1 = 1 then
;set up event for texture move
ElseIf texture_event1 = 2 then
;set up event for texture rotate
etc etc

Now, you may have noticed above the texture_px1,py1 and ez fields. These are the actualy amounts the events will be transformed by. So for the texture moving, i have:

name=wateredge texture_event1=1 tx1=0 ty1=0.005 entitypick=0 entitytype=0 entityblend=3

texture_px(1)= 0 and texture_py(1) = 0.05

the newly created event type object will take these numbers, and it will copy them into the event, so your event object will end up looking like this: (the numbers for the handles are just randomly made up by me :o) blitz produces them on loading entities/textures )

	Field once = 1 ; since it wasn't specified, it will default to 1(do forever)
	Field event_number = 1 ; meaning move texture
	Field x#=0,y#=0.05
	Field entity_handle = 25627738 ; the handle blitz assigns when loading, to keep track of it. this is so you can easily get the texture
	Field texture = 25678383; handle for a texture if an event needs a dyanmically created texture.
	Field texture_transform = 1 our data provided a texture layer to be transformed, in this case moved, and it was texture layer 1


So, every frame, in the main game, this will be performed, synced with the frame rate of course.

Here is the full code. It's a little out of date with regards to texture_events and the event generating code. Can't seem to find my new version... but i hope this has given you a basic idea. You really need to write your own though, as it can be hard to read someone elses code and emulate what they did. I'm sure you'll even make it more readable too!




Sph!nx(Posted 2008) [#40]
I will study the code carefully and try to implement this! I do need to read up on fields ... never made those before. :)

I can't thank you enough, Ross, but thanks!


Warner(Posted 2008) [#41]
1) I need only to find a certain part of a string in the 'if entityname()' command, for the countchild/getchild loop. (see above code)

To find a string inside another one, use Instr.
Instr will return the location of string2 in string1. If it can't be found, it will return zero.
If Instr("a blue cube", "cube") > 0 Then
   Print "'cube' is in 'a blue cube'"
EndIf

2) I then need to extract the other parts of that same string and use that for further coding.

For extracting a string from another string, use Mid$.
Mid$ will return the part of the string from the given starting location with the given length. See the help page on Mid$ for an example.
s1$ = "a green cube"
s2$ = "green"

cc = Instr(s1$, s2$)
If (cc > 0) Then
   Print Mid$(s1$, 1, cc - 1)
   Print Mid$(s1$, cc + Len(s2$), Len(s1$))
EndIf



Sph!nx(Posted 2008) [#42]
Wow, I'm afraid its a little to advanced for me yet. I have an idea that could work for me, but don't know how to set it up or if its even possible

this code is from inside my countchildren/getchild loop:
; spawn_npc_dev
If EntityName(spawn_npc_dev) = "classname=spawn_npc_dev" Then

	npc_dev=LoadAnimMesh("content\models\dev_man\dev_man.b3d")	
   	PositionEntity npc_dev,EntityX(spawn_npc_dev),EntityY(spawn_npc_dev),EntityZ(spawn_npc_dev)
End If


This will spawn a model at each the child, no matter how many there are with the same name. It is found by "EntityName(spawn_npc_dev) = "classname=spawn_npc_dev"


It is found by the full name of its child. Now I would like to find it ONLY through a certain part of its name :
EntityName(spawn_npc_dev) = "classname=spawn_npc_dev"


I need only need to know how to find the children by a part in its name, so I can extract other parts of its name for other purposes.

I thought of searching through the string delivered by the entityname, but cant figure out how. I tried fooling with the Mid$ but I had little success...


Thanks!


Warner(Posted 2008) [#43]
Instead, use:
; spawn_npc_dev
If Instr(EntityName(spawn_npc_dev), "spawn_npc_dev") > 0 Then

	npc_dev=LoadAnimMesh("content\models\dev_man\dev_man.b3d")	
   	PositionEntity npc_dev,EntityX(spawn_npc_dev),EntityY(spawn_npc_dev),EntityZ(spawn_npc_dev)
End If



Sph!nx(Posted 2008) [#44]
OMG ... it works! It's really that easy! Best part ... I understand the code! :P

I've now build quite a solid start of a loading console with complete user input map load system, fps view, etc. A basic fps engine with gravity, collision, jumping. Simple interactivity with the world build children, etc.

I started only 3 weeks ago and I couldn't have done this without the help of all of you!

Thanks!


Ross C(Posted 2008) [#45]
Just don't get bogged down with the engine coding part, or else you'll spend forever adding new features, rather than building your game. I have still to learn this lesson :o)

Good luck.