Don't underestimate how difficult it will be to "clone" the virtually flawless platformer controls of SMB3. The subtle momentum cues, acceleration, jump heigh, animation framerates, etc. The same can be said for Mega Man or Zelda.
For example, I've seen plenty of Zelda "clones" (virtually all of them) that miss the subtle fact that Link "snaps" to half-tile positions when he moves. If he didn't do this, navigating the coarse tile-based maps would consist of a lot of bumping into things. With the half-tile snap, Link always either clearly collides with the tile or doesn't. It's an incredibly subtle detail, but if you miss it, the game feels "loose" in comparison to the original.
And that's for a slow-moving game like Zelda. Imagine SMB3, with jumping and running... there's a bunch of subtle leading under the hood that coerces the player into what their likely intention is, as opposed to their literal controller movements. It makes jumps perfect. And it's one of the big differences between Western and Eastern game developers.
In regards to using Flash... that's a fine idea, and I would encourage it. Particularly if you target Flash Player 8 or 9, where the bitmap performance is orders of magnitude better.
And in regards to keyboard controls not being adequate for SMB3... the keyboard is actually ideal, as it is digital, just like the original NES (and SNES) controller, whereas most modern gamepads are analog. Now, the ergonomics might not be as ideal, but certainly the "response curve" so to speak is the same.
The real problem the poster may have been alluding to, though, is that many games have incorrect input polling, normally because they use a series of if/then/else/if or switch statements. As a result, only one input is applied at a time. It's better to simply test the keys to see if they're depressed (as opposed to responding to events) and to check all keys equally as opposed to in cascade form. This will eliminate any keypress precedence that's unintended. You can see this problem in most games by pressing left then pressing right (while continuing to hold down the left key). If the left key wins, then they're cascading... if the left key cancels the right key (so neither wins), then they're doing things correctly. If the left key is ingored, they're also cascading (incorrectly).
Better tech like Flash has solved the hard technical problems of a game's implementation, like saving us from having to worry about bit twiddling graphics, but it doesn't save us from the subtle qualities of game *design* and balancing.
Super Mario Brothers 3 remake
Wow, this thread is the first to make me really want to make a side scroller ala SMB. I think it was the mention of new powerups.
But isn't the Maryo project pretty much remaking the game as well? Or you could if you used their editor...
But isn't the Maryo project pretty much remaking the game as well? Or you could if you used their editor...
Quote:
Original post by sanch3x
Wow, this thread is the first to make me really want to make a side scroller ala SMB. I think it was the mention of new powerups.
Can you program via Actionscript? If so, id like to work with ya on such a project
Quote:
Original post by Anonymous Poster Quote:
Original post by Kwizatz
You can embed a flash player into a Windows Application (it's a COM object), thus taking advantage of its features like the vector graphics engine and action script, while still using DirectInput/SDL/Win32 for input, doesnt have to be browser based.
That could be done? Interesting. I have been working with Flash lately, and is plagued by the lack of more options with input (Only one mouse button, slow keyboard responsness). Can you perhaps give a little guide about how to incorporate Flash with DirectInput? May be a link to a tutorial? Thanks in advance.
--geekman--
Well, in Visual Studio 6.0 there was a way to add custom controls (COM controls that is), it created a LOT of filling code so you would basically just drag a flash player object into a dialog resource and access its functionality thru a proxy class, I think doing it with C# would be a lot easier than C++, but it is still doable in C++.
I don't think there are many tutorials (if any), so I'll see if it is still posible on Visual Studio 2005 and get back to you.
Here is some article about it.
Ok, I checked on VS2003, you can still do it, you need to create a Dialog MFC application then left click on the toolbox and click the add/remove items item, then click on the "COM Components" tab and look for "Shockwave Flash Object" check the checkbox and click OK, the object will be available on the toolbox.
From there, drag and drop an object into the dialog, change its properties, etc.
If you dont want to use MFC, you can use the CShockwaveFlash.cpp and CShockwaveFlash.h files to set up a non MFC application, though you may need to know your way around WinAPI.
If you're a C# kind of guy, its probably pretty similar, but less painful since you dont have to use MFC.
Cheers!
From there, drag and drop an object into the dialog, change its properties, etc.
If you dont want to use MFC, you can use the CShockwaveFlash.cpp and CShockwaveFlash.h files to set up a non MFC application, though you may need to know your way around WinAPI.
If you're a C# kind of guy, its probably pretty similar, but less painful since you dont have to use MFC.
Cheers!
Quote:
Original post by headfonez
Can you program via Actionscript? If so, id like to work with ya on such a project
Sorry bud I'm currently involved with another project so I wouldn't be able to contribute. (however I never used Actionscript)
EDIT: Here is an article on using ActiveX controls without MFC.
Quote:
Original post by Anonymous Poster
Thanks Kwizats, at least I have some leads now:)
Sadly, I'm a C++ guy, and worse, I'm a C++ Builder guy :(, I managed to install the ShockwaveFlash object as a component, but don't know how or what can I access the object, I need to dig in to Adobe/Macromedia's website for more documentation of what can I do to the object. Thanks for the link of the article, I'll start my adventure from there. ;)
C# and .NET are new things to me, look like I've got lots of reading to do.
--geekman--
Here is the CShockwaveFlash.h file generated by VS2003, perhaps it can help you, as you can see it basically defines a CWnd class with a bunch of wrapper functions for Flash Functionality, you have the Play,Forward, DoFSCommand and all those in there, in MFC, you just instanciate a window of this class, load a swift file and go from there.
The DECLARE_DYNCREATE macro probably just sets the basic window functions, but I am not sure.
// CShockwaveFlash.h : Declaration of ActiveX Control wrapper class(es) created by Microsoft Visual C++#pragma once/////////////////////////////////////////////////////////////////////////////// CShockwaveFlashclass CShockwaveFlash : public CWnd{protected: DECLARE_DYNCREATE(CShockwaveFlash)public: CLSID const& GetClsid() { static CLSID const clsid = { 0xD27CDB6E, 0xAE6D, 0x11CF, { 0x96, 0xB8, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 } }; return clsid; } virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL) { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); } BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE, BSTR bstrLicKey = NULL) { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID, pPersist, bStorage, bstrLicKey); }// Attributespublic:// Operationspublic: long get_ReadyState() { long result; InvokeHelper(DISPID_READYSTATE, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } long get_TotalFrames() { long result; InvokeHelper(0x7c, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } BOOL get_Playing() { BOOL result; InvokeHelper(0x7d, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL); return result; } void put_Playing(BOOL newValue) { static BYTE parms[] = VTS_BOOL ; InvokeHelper(0x7d, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } long get_Quality() { long result; InvokeHelper(0x69, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } void put_Quality(long newValue) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0x69, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } long get_ScaleMode() { long result; InvokeHelper(0x78, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } void put_ScaleMode(long newValue) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0x78, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } long get_AlignMode() { long result; InvokeHelper(0x79, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } void put_AlignMode(long newValue) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0x79, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } long get_BackgroundColor() { long result; InvokeHelper(0x7b, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } void put_BackgroundColor(long newValue) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0x7b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } BOOL get_Loop() { BOOL result; InvokeHelper(0x6a, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL); return result; } void put_Loop(BOOL newValue) { static BYTE parms[] = VTS_BOOL ; InvokeHelper(0x6a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_Movie() { CString result; InvokeHelper(0x66, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_Movie(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x66, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } long get_FrameNum() { long result; InvokeHelper(0x6b, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } void put_FrameNum(long newValue) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0x6b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } void SetZoomRect(long left, long top, long right, long bottom) { static BYTE parms[] = VTS_I4 VTS_I4 VTS_I4 VTS_I4 ; InvokeHelper(0x6d, DISPATCH_METHOD, VT_EMPTY, NULL, parms, left, top, right, bottom); } void Zoom(long factor) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0x76, DISPATCH_METHOD, VT_EMPTY, NULL, parms, factor); } void Pan(long x, long y, long mode) { static BYTE parms[] = VTS_I4 VTS_I4 VTS_I4 ; InvokeHelper(0x77, DISPATCH_METHOD, VT_EMPTY, NULL, parms, x, y, mode); } void Play() { InvokeHelper(0x70, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); } void Stop() { InvokeHelper(0x71, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); } void Back() { InvokeHelper(0x72, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); } void Forward() { InvokeHelper(0x73, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); } void Rewind() { InvokeHelper(0x74, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); } void StopPlay() { InvokeHelper(0x7e, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); } void GotoFrame(long FrameNum) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0x7f, DISPATCH_METHOD, VT_EMPTY, NULL, parms, FrameNum); } long CurrentFrame() { long result; InvokeHelper(0x80, DISPATCH_METHOD, VT_I4, (void*)&result, NULL); return result; } BOOL IsPlaying() { BOOL result; InvokeHelper(0x81, DISPATCH_METHOD, VT_BOOL, (void*)&result, NULL); return result; } long PercentLoaded() { long result; InvokeHelper(0x82, DISPATCH_METHOD, VT_I4, (void*)&result, NULL); return result; } BOOL FrameLoaded(long FrameNum) { BOOL result; static BYTE parms[] = VTS_I4 ; InvokeHelper(0x83, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FrameNum); return result; } long FlashVersion() { long result; InvokeHelper(0x84, DISPATCH_METHOD, VT_I4, (void*)&result, NULL); return result; } CString get_WMode() { CString result; InvokeHelper(0x85, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_WMode(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x85, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_SAlign() { CString result; InvokeHelper(0x86, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_SAlign(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x86, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } BOOL get_Menu() { BOOL result; InvokeHelper(0x87, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL); return result; } void put_Menu(BOOL newValue) { static BYTE parms[] = VTS_BOOL ; InvokeHelper(0x87, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_Base() { CString result; InvokeHelper(0x88, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_Base(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x88, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_Scale() { CString result; InvokeHelper(0x89, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_Scale(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x89, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } BOOL get_DeviceFont() { BOOL result; InvokeHelper(0x8a, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL); return result; } void put_DeviceFont(BOOL newValue) { static BYTE parms[] = VTS_BOOL ; InvokeHelper(0x8a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } BOOL get_EmbedMovie() { BOOL result; InvokeHelper(0x8b, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL); return result; } void put_EmbedMovie(BOOL newValue) { static BYTE parms[] = VTS_BOOL ; InvokeHelper(0x8b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_BGColor() { CString result; InvokeHelper(0x8c, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_BGColor(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x8c, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_Quality2() { CString result; InvokeHelper(0x8d, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_Quality2(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x8d, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } void LoadMovie(long layer, LPCTSTR url) { static BYTE parms[] = VTS_I4 VTS_BSTR ; InvokeHelper(0x8e, DISPATCH_METHOD, VT_EMPTY, NULL, parms, layer, url); } void TGotoFrame(LPCTSTR target, long FrameNum) { static BYTE parms[] = VTS_BSTR VTS_I4 ; InvokeHelper(0x8f, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target, FrameNum); } void TGotoLabel(LPCTSTR target, LPCTSTR label) { static BYTE parms[] = VTS_BSTR VTS_BSTR ; InvokeHelper(0x90, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target, label); } long TCurrentFrame(LPCTSTR target) { long result; static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x91, DISPATCH_METHOD, VT_I4, (void*)&result, parms, target); return result; } CString TCurrentLabel(LPCTSTR target) { CString result; static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x92, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, target); return result; } void TPlay(LPCTSTR target) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x93, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target); } void TStopPlay(LPCTSTR target) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x94, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target); } void SetVariable(LPCTSTR name, LPCTSTR value) { static BYTE parms[] = VTS_BSTR VTS_BSTR ; InvokeHelper(0x97, DISPATCH_METHOD, VT_EMPTY, NULL, parms, name, value); } CString GetVariable(LPCTSTR name) { CString result; static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x98, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, name); return result; } void TSetProperty(LPCTSTR target, long property, LPCTSTR value) { static BYTE parms[] = VTS_BSTR VTS_I4 VTS_BSTR ; InvokeHelper(0x99, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target, property, value); } CString TGetProperty(LPCTSTR target, long property) { CString result; static BYTE parms[] = VTS_BSTR VTS_I4 ; InvokeHelper(0x9a, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, target, property); return result; } void TCallFrame(LPCTSTR target, long FrameNum) { static BYTE parms[] = VTS_BSTR VTS_I4 ; InvokeHelper(0x9b, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target, FrameNum); } void TCallLabel(LPCTSTR target, LPCTSTR label) { static BYTE parms[] = VTS_BSTR VTS_BSTR ; InvokeHelper(0x9c, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target, label); } void TSetPropertyNum(LPCTSTR target, long property, double value) { static BYTE parms[] = VTS_BSTR VTS_I4 VTS_R8 ; InvokeHelper(0x9d, DISPATCH_METHOD, VT_EMPTY, NULL, parms, target, property, value); } double TGetPropertyNum(LPCTSTR target, long property) { double result; static BYTE parms[] = VTS_BSTR VTS_I4 ; InvokeHelper(0x9e, DISPATCH_METHOD, VT_R8, (void*)&result, parms, target, property); return result; } double TGetPropertyAsNumber(LPCTSTR target, long property) { double result; static BYTE parms[] = VTS_BSTR VTS_I4 ; InvokeHelper(0xac, DISPATCH_METHOD, VT_R8, (void*)&result, parms, target, property); return result; } CString get_SWRemote() { CString result; InvokeHelper(0x9f, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_SWRemote(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x9f, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_FlashVars() { CString result; InvokeHelper(0xaa, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_FlashVars(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0xaa, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_AllowScriptAccess() { CString result; InvokeHelper(0xab, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_AllowScriptAccess(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0xab, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_MovieData() { CString result; InvokeHelper(0xbe, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_MovieData(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0xbe, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } LPUNKNOWN get_InlineData() { LPUNKNOWN result; InvokeHelper(0xbf, DISPATCH_PROPERTYGET, VT_UNKNOWN, (void*)&result, NULL); return result; } void put_InlineData(LPUNKNOWN newValue) { static BYTE parms[] = VTS_UNKNOWN ; InvokeHelper(0xbf, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } BOOL get_SeamlessTabbing() { BOOL result; InvokeHelper(0xc0, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL); return result; } void put_SeamlessTabbing(BOOL newValue) { static BYTE parms[] = VTS_BOOL ; InvokeHelper(0xc0, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } void EnforceLocalSecurity() { InvokeHelper(0xc1, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); } BOOL get_Profile() { BOOL result; InvokeHelper(0xc2, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL); return result; } void put_Profile(BOOL newValue) { static BYTE parms[] = VTS_BOOL ; InvokeHelper(0xc2, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString get_ProfileAddress() { CString result; InvokeHelper(0xc3, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL); return result; } void put_ProfileAddress(LPCTSTR newValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0xc3, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } long get_ProfilePort() { long result; InvokeHelper(0xc4, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } void put_ProfilePort(long newValue) { static BYTE parms[] = VTS_I4 ; InvokeHelper(0xc4, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue); } CString CallFunction(LPCTSTR request) { CString result; static BYTE parms[] = VTS_BSTR ; InvokeHelper(0xc6, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, request); return result; } void SetReturnValue(LPCTSTR returnValue) { static BYTE parms[] = VTS_BSTR ; InvokeHelper(0xc7, DISPATCH_METHOD, VT_EMPTY, NULL, parms, returnValue); } void DisableLocalSecurity() { InvokeHelper(0xc8, DISPATCH_METHOD, VT_EMPTY, NULL, NULL); }};
[Edited by - Kwizatz on July 14, 2006 11:12:13 AM]
Here's a little blog-whoring for you... I've promoted the sh*t out of Flash for games here: Found: That game framework I was looking for...
If you check out some products like SWFStudio, MDM's Zinc and Screenweaver (free, open source), you can get all those embedded Flash benefits without writing the code yourself *plus* the commercial guys have already paid Macromedia/Adobe so that you can even *include* the Flash Player ActiveX control in your download ... zero config issues!
Personally, it's the route I'm going for *all* future development.
If you check out some products like SWFStudio, MDM's Zinc and Screenweaver (free, open source), you can get all those embedded Flash benefits without writing the code yourself *plus* the commercial guys have already paid Macromedia/Adobe so that you can even *include* the Flash Player ActiveX control in your download ... zero config issues!
Personally, it's the route I'm going for *all* future development.
Update #1.
This is the base of the editor. There are no graphics as of yet, only turquoise colored representations. The white button creates an object, and the light blue button duplicates the object thats currently selected. Warning, do not press the orange button, it is the save feature, which is not yet implemented (as you will see). Its obvious I just wanted to show my current progress and let the world know that this is a project that someone is working on :).
The lower right button deletes an object
[Edited by - headfonez on July 19, 2006 5:29:46 AM]
This is the base of the editor. There are no graphics as of yet, only turquoise colored representations. The white button creates an object, and the light blue button duplicates the object thats currently selected. Warning, do not press the orange button, it is the save feature, which is not yet implemented (as you will see). Its obvious I just wanted to show my current progress and let the world know that this is a project that someone is working on :).
The lower right button deletes an object
[Edited by - headfonez on July 19, 2006 5:29:46 AM]
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement
Recommended Tutorials
Advertisement