• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
Capoeirista

C# Custom Property Editor

5 posts in this topic

Hey folks,

 

I'm having trouble setting up (at runtime) a custom property editor for an object in my game's engine...

 

So say I have an engine object with a texture ID attribute, and to modify that ID I want to pop up a texture browser. I can't specify the editor to use for the attribute in the engine object source file, as I don't want there to be any UI stuff in my engine project, but I have added a custom attribute:

 

class Object
{
 [TextureIDAttribute]
 public int TextureID
 {
   get;
   set;
 }
}

 

In my editor I've created an ICustomTypeDescriptor for my engine objects :

 

class EngineObjectDescriptor : ICustomTypeDescriptor
{
 ...

 private Object myEngineObject;
}

 

And the GetProperties() method loops through all of the Object's properties, adding an instance of my custom PropertyDescriptor (ObjectPropertyDescriptor) for each one.

 

The trouble is no matter what I return from the overridden ComponentType & PropertyType accessors in the PropertyDescriptor, the GetEditor() function (which I assume is used to display a custom editor for the property) is never called (it isn't called in the ObjectPropertyDescriptor class either) - the ID of the object is always displayed as a non-editable integer.

 

I can change PropretyType to int32, and then I get a little value scroll thing, but what I really want is to have a button displayed that launches a texture browser and then sets the ID that way :

 

9uEfBeO.png

 

I've checked that the IsReadOnly attribute of the PropertyDescriptor is set to false, so not sure what's going on.

 

Any advice would be greatly appreciated :)

0

Share this post


Link to post
Share on other sites

Come to think of it I don't really need to display a button - the name of the texture should be enough. I just need to launch my custom editor when the user clicks on the value to change it.

0

Share this post


Link to post
Share on other sites

use Reflection.
I've implemented some static class variables trying to do this kind of thing before. But I wanted something cleaner.

AngelXNA has its own way of modifying instance variables at runtime (using Forms), incorporating it into serialization too I think. But it's too complex for my liking.

I've got a simple system (looks messy) for generic properties at static time and runtime, I don't know if it's complete enough yet and there are small issues with using templated types as properties. And I can't use int because I get exceptions when the compiler assumes it can convert to/from float but actually can't.


Well basically what you want to do is enumerate Type. "public MemberInfo[] GetMembers();"
and then specify a set of explicit get/set methods in your own code dealing with the Form once you have the class's editable members.

One concern though is manually putting in the values. There are other ways of input- you might consider sliders or, in Skyrim there's this pie/circle thing that you drag in a circle to change the values with more granular control over it.

1

Share this post


Link to post
Share on other sites

I've got all of the properties for the engine's Object class registered using reflection :
 

PropertyDescriptorCollection propertyCollection = new PropertyDescriptorCollection(null, false);

// Get the properties
if( myObject != null )
{
   // Add the properties for the object
   PropertyInfo[] propertyInfo = myObject.GetType().GetProperties();
   foreach( PropertyInfo property in propertyInfo )
   {
     if( property.Name == "ID" )
     {
       propertyCollection.Add( new EngineObjectPropertyDescriptor(myObject, property.Name) );
     }
}

 

So at runtime the Object (myObject) get's it's ID member added to the PropertyGrid. I'm just testing this out on a single class member, so I can get the process down.

 

I've got Get/Set methods in the EngineObjectPropertyDescriptor, but they're just operating on the basic object type... is this where I need to trigger my custom property editor (in this case the Texture Browser)? It seems like the Set method would only get called once a value has been entered in to the text box for the string property (assuming I use a string to display to the user). At the moment Set is only getting called if I set the PropertyType to int32.

Edited by Orangeatang
0

Share this post


Link to post
Share on other sites

Well basically what you want to do is enumerate Type. "public MemberInfo[] GetMembers();"
and then specify a set of explicit get/set methods in your own code dealing with the Form once you have the class's editable members.

I'm not sure if I can do that using a PropertyGrid - I could populate a grid layout with each member instead, but I'd prefer to use a propertygrid so I've got all of the search functionality, and collapsing items etc.

 

It seems like a property grid should work, but it's just a bit of a pain to set up.

0

Share this post


Link to post
Share on other sites

I'm not sure if you can have custom UITypeEditors for individual properties... I'm fairly certain it's tied almost entirely to the actual type of the property. So if "ID" is of type Int32, you'll get the standard text input box. 

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0