UPDATE - 4/24/09
Alright guys, big goings-on. I can now successfully make 3D maps using the 2D map editor! Now, this time around it is pretty simple-- all tiles are simply cubes and the id of the tile determines which texture the cube gets. This, however, proves the validity of using RMXP to make 3D games.
Now, not only is drawing these 2D maps in 3D with my tool possible, it is also, so far, much much faster than drawing the maps in 2D using RGSS Graphics Module. In fact, during my testing I get 250+ frames per second.
Alright, so enough talk. Let's get to the awesome: *BIG Image Warning*
Layer 1 in RMXP
Layer 2 in RMXP
Layer 3 in RMXP
Full map in 3D
Now, the RGSS code running the demo: (No explanatory comments this time, guys )
DF_GameWindow.set_dimensions(0,0,0,0) device = DF3DDevice.new(Video::EDT_DIRECT3D9, [800,600], 32, false) smgr = device.scene_manager driver = device.video_driver camera = smgr.add_camera_scene_node_FPS camera.set_position(-100,300,-100) camera.set_target(0,0,0) $data_tilesets = load_data("Data/Tilesets.rxdata") $data_common_events = load_data("Data/CommonEvents.rxdata") $game_map = Game_Map.new $game_map.setup(1) for i in 0...20 for j in 0...15 for k in 0...3 if $game_map.data[i,j,k] != 0 node = smgr.add_cube_scene_node(64) node.set_position(i * 64, k * 64, j * 64) node.set_material_flag(Video::EMF_LIGHTING, false) texture_name = ($game_map.data[i,j,k] - 383).to_s + ".png" node.set_material_texture(0, driver.get_texture(texture_name)) end end end end lasttime = Time.now while device.run DF_Input.update if DF_Input.trigger?(DF_Input::KEY_F) p driver.get_fps end time = Time.now if time - lasttime > 5 Graphics.update lasttime = Time.now end driver.begin_scene(true, true, [255, 160, 160, 255]) smgr.draw_all driver.end_scene end device.drop
And, of course, there's a demo to be had!
Arrow Keys to move (for now. I will change it later so you can use WASD)
F to show FPS
CTRL + F4 to quit
Link: Download Now!
I still need help with art and with moral support!
Please contact me if you are a 3D artist.
If you want to offer moral support, keep posting!
Third Release (RGSS Controls the 3D)
And here is the magical RGSS code that does it. (Normally, you would put this in a scene, but you guys know how to make scenes so I didn't bother)
#First, let's move the 2D window out of the way: DF_GameWindow.set_dimensions(0,0,0,0) #next, let's create out device. The parameters are: #Driver type, screen size (in an array), bits per pixel, and fullscreen #This device is the central point of the 3D engine. Absolutely everything #can be accessed through this device. device = DF3DDevice.new(Video::EDT_DIRECT3D9, [800,600], 32, false) #Now, let's get our scene manager. The scene manager does stuff like adding nodes #and cameras smgr = device.scene_manager #Now, let's get our driver. The driver handles actually rendering. driver = device.video_driver #Let's get our mesh! (Note that you should probably add error handling here. #smgr.get_mesh will return nil if it can't find the file so make sure you #always check that the mesh was actually created. I didn't do any error handling #but a simple check for nil would suffice) mesh = smgr.get_mesh("sydney.md2") #Let's create an animated scene node from the mesh. Again, normally you #want to check for errors. node = smgr.add_animated_mesh_scene_node(mesh) #now, let's add a camera to the scene node! Camera are how you view everything #in the scene. Note that it is possible to have more than one camera and #you can switch between them, or even have them render to different parts #of the screen. camera = smgr.add_camera_scene_node #move our camera, since both the camera and scene node are at the same, default #position right now. (Which is (0,0,0)) Note that the parameters here are x, y, z. #when your camera is at (0,0,0) and has no rotation, x is sideways, y is up, #and z is forwards/backwards camera.set_position(100,100,100) #Rememeber how I said that the default position is 0,0,0? Well, since we never moved #our node, it is at 0,0,0 right now. So, Let's tell the camera to look there: camera.set_target(0,0,0) lasttime = Time.now while device.run #check if our device is still running #begin rendering the scene. I will not explain what these parameters are yet #it's not important right now, and it's kind of complicated XD driver.begin_scene(true, true, [255, 160, 160, 255]) smgr.draw_all #draw all of the scene nodes driver.end_scene #finish rendering the scene #this junk is just so Graphics doesn't whine. time = Time.now if time - lasttime > 5 Graphics.update end end #Now, alway always always remember to drop your device when you are done. #The device is something you should only drop at the end of your game, after #the device no longer runs. device.drop
Second Release (First look at game logic)
I will post the RGSS code tomorrow, so you can see what it is like, but I am out of time.
Alright, first a screenshot. ON this screenshot I only took a picture of the 3D window, since you guys know it is actually RMXP (vgvgf can vouch for me, since he actually decrypted the project and looked XD)
And the new demo can be downlaoded here:
3D RMXP Walking Demo
Arrow keys to walk
Mouse to look
F to print current FPS (Please tell me what you get)
Ctrl+F4 to quit (not alt, note that alt is disabled while running this)
First Release (3D rendering)
Do I have it now? Good. That is exactly what it looks like: a 3D program running from RMXP. (I will explain why there are two windows, the little one and the big one*)
Don't believe me? Try it yourself:
RMXP in 3D Demo