Jump to content
  • Advertisement


  • Content Count

  • Joined

  • Last visited

Community Reputation

839 Good

About JordanBonser

  • Rank
  1. JordanBonser


    What a great post! This is something I can totally relate to. The hardest part of indie development is time management. It is far too easy to start a new project when you've hit a roadblock or motivation has depleted.
  2. [font=arial]Original Post at: jordabonser.com?[/font] [font=arial]A pre-WWDC announcement has been made by Apple to inform of a new app store revenue model, but how does this effect indie developers?[/font] [font=arial]The New Revenue Model[/font] [font=arial]This new model is an extremely positive change for both developers and users if done properly. The model allows for subscription based revenue with the a 70/30 split in the first year moving to a 85/15 split if a user is still subscribed to the app after a year. [/font] [font=arial]Problems with the Current Revenue Model[/font] [font=arial]The current revenue model is a 70/30 split between developer and Apple, with the main sources of income being:[/font] [font=arial]Paid app[/font] [font=arial]Free app with Adverts[/font] [font=arial]Free app with in-app purchases[/font] [font=arial]Paid Apps[/font] [font=arial]When the app store was first released the paid app was the most obvious approach as that is how software has been sold for years. The main problem with this is that nobody wants to pay GBP2.99 for a game that might be fun. The risk to a user is just too high especially when you combine this with developers that abuse this risk by saturating the market with low quality games as a get rich quick scheme. Even if it is a quality game, a user may not know whether they will actually like the game which is why the other approaches spawned.[/font] [font=arial]Free apps with adverts[/font] [font=arial]This approach was often used to allow a developer to get there app to the widest audience. If all users could use the game without paying then the barrier for entry is non-existent. The problem with this is that due to low screen real-estate these apps caused frustration. This approach was often used in combination with paid apps but there was a difficult balance between how much you should give for free. If you give too much then there is no reason to buy the paid version. If you give not enough then the user will just be frustrated and not bother with the app at all.[/font] [font=arial]Free apps with in-app purchases[/font] [font=arial]?This approach has become much more popular over recent years as a way of keeping the barrier for entry down but also having a way of gaining revenue. The problem from a development point of view is that there is a risk in that the game would need to be such a high quality to make users want to buy additional items in the game to further their progress. This often discouraged indie developers from this approach and was left to the large development studios that had the time and resources to ensure that high quality.[/font] [font=arial]How will the Subscription Model Solve these Problems?[/font] [font=arial]The advantages that I'm going to talk about are reliant on Apple implementing the model to allow:[/font] [font=arial]low subscriptions i.e. as little as 10p, 5p[/font] [font=arial]users to freely end the subscription on a monthly basis by uninstalling the app i.e. not be contracted to pay the subscription for 12 months.[/font] [font=arial]?As a user I believe that this new revenue model will essentially create games of a much higher quality. Indie developers will now have an incentive and a means to fund the on-going work to create content for a game. Indie developers will also have less risk when coming up with game ideas. A cool idea for a game or a unique mechanic can be released into the wild with a few levels to gather user feedback in a similar way to how Beta's work. The users will be more inclined to try a game if they can potentially pay just a low cost one month subscription to try it out. If this idea takes off then more content can easily be created without the developer having to staple on some annoying revenue scheme such as in-app purchases. If it doesn't gain popularity then the developer can move on without having invested too much time. Users can play a new game without having to put up with any annoying adverts or in the knowledge that they will never be able to complete it without buying something from an in-app store. This will allow them to actually be immersed in the game in the way the developer originally wanted. To summarise I believe this new model will support creativity and give reassurance to users and developers:[/font] [font=arial]Users will be able to try apps out without fear of being ripped off.[/font] [font=arial]Developers can create apps without the fear of not being rewarded for their time and effort.[/font] [font=arial]I believe I would actually consider becoming an iOS developer if this subscription is done the way I hope. Cheers[/font]
  3. That's a really interesting read. Great idea, turning a problem into something that will actually allow for more immersion and support the storyline.
  4. JordanBonser

    CMake: Changes for Linux

      Ahh that's like the complete opposite of what I want to do. I think Visual Studio is great for development and I want to keep Windows as my main development platform. I will just be using Linux for testing out the changes and doing any Linux only development.   Thanks for the tip on using the MSVC compiler from the commandline. I think I will do that as a validation step to check my CMake files are working.
  5. JordanBonser

    OpenGL Vulkan and What to expect this year...

    It does seem really great. I just need to start slowly whilst I'm learning. I'm thinking I may adapt a simplistic art style for my game at first. Just using Vertex Colours rather than Texturing and having purposefully low poly models to minimise the time needed so I can get on with development.
  6. So the past few days I've been working with CMake to try and get my some of the JBEngine Libraries running for Linux. The first thing I did was use vcxproj2cmake tool to generate the CMakeLists.txt from my already created Visual Studio Project Files. To start with I concentrated on the Maths and Sound Libraries as they were the easiest to do. Maths Libraries only requires some third party includes of glm and the Sound Library only has one library dependency on FMOD. [font=arial]Working with vcxproj2cmake[/font] To get the tool working I ended up having to copy all it's files into the same directory as the project file. It just didn't seem to work with a path. Secondly I then had to manually change all the paths that I had entered (or Visual Studio had generated) for the include and library directories in the Visual Studio Projects. Microsoft tends to default to using "\" for directories where as Unix system use "/". Once I had done this It finally generated a CMakeLists.txt for me, but this was only the beginning! Creating Cross-platform code Being the naive developer that I was a few years ago I had scattered through my source code the use of the "\" for directories instead of "/". This was one of the first things I had to address. It was mostly the includes in the files so it wasn't too hard to track down. This wasn't too time consuming for the Maths and Sound libraries as there are no more that 5 files in each. Doing this for the whole JBEngine Source may be a little more tedious. The next problem I encountered was resolved by this Stack Overflow post: Why does MSVC Let me do this. I was essentially passing an anonymous object to a function. It was a little confusing to track down as it wasn't a simple example: ? part of the bounds header: [code=:0]void Union(Bounds& bound);void Union(vec3& v); implementation of Bounds Union function [code=:0] void Bounds::Union( Bounds& bound ){ Union(bound.GetMin()); Union(bound.GetMax());} What you don't see here is that Bounds.GetMin() and Bounds.GetMax() do not return a reference. This means that the returned vec3 object from the functions are newly created and therefore anonymous objects. MSVC automagically resolves this in some way but g++/gcc does not do this for you. This took me a little time to figure out as I had never even had to think about this sort of thing before. They were the only real code issues that I faced, the rest was all about learning CMake. Learning CMake So I started off with an already "complete" CMakeLists.txt which would work for Windows. Unfortunately this was never going to work out the box for Linux. Well at least it didn't for the Sound Library. First of all I had to get the Linux version of the FMOD Libs. I had quite a bit of trouble getting used to how CMake works, specifically with include and library paths and also using the if(UNIX) branches for OS specific target_link_libraries. I finally managed to get CMake working and now I only had to deal with the make compilation issues. What I hadn't realised is that fmod had changed significantly since I got the library for Windows so then I had to adapt the code to use the new library. Once I had managed this I then created a Test application to play a sound. So it was all quite easy I just had problems with: vcproj2cmake code issues cmake issues library compatibility issues. and then more code issues due to the new library. It really was a breeze. On a serious note it wasn't half as bad as I thought, and I've learnt much more about CMake. The next things I will need to look at are: Adding CMake Dependencies i.e. JBEngine Library requires all the other smaller Libraries such as Sound, Maths, Renderer etc. Ensuring I haven't broken anything in Visual Studio whilst messing around with the project files. Looking into Visual Studio Project/Solution Generation from CMake.
  7. [color=#000000]Originally posted at: [/color][color=#000000]http://www.jordanbonser.com/blog/february-16th-2016[/color][color=#000000] on 16th February[/color] [color=#000000][font='Open Sans']So Vulkan was released today! What better reason to do a blog post, when it's been so highly anticipated for so long. I can't wait to get stuck into the API and Reference documents and start trying to throw some tech demo's together. [/font] [font='Open Sans']I have just got hold of the SDK and had a little play around with the Demo's, I've not managed to get much done but the whole thing does look much more "DirectXy" which will likely have it's good and bad points. for example the horrendously long class/struct names. I've already seen "VkPipelineInputAssemblyStateCreateInfo" as a name and I'm sure there will be plenty longer. It will obviously have it's benefits in terms of performance but I'm not sure I will really experience that for a while. Anyway here is a quick video of me after messing with the textures a little with the cube demo:[/font][/color] [color=#000000][font=Roboto][size=2][/font][/color] [color=#000000][font='Open Sans']As you can see it all looks a little messed up. The cube is spinning incredibly slow as well as I don't think it uses delta time for the rotation, so the recording application almost halted the rotation. What can you expect from a half hour mess around?[/font][/color] [color=#000000]So what will I be doing this year?[/color][color=rgb(102,102,102)][font='Open Sans'] [color=#000000]It's been a while since my 2015 post-mortem and I really wanted to point out some of the things I will be concentrating on this year. I have just fully moved in to my new flat with Meg in Blackpool so that is the reason I haven't done any real work or blogged for a while. So this year my main focus is going to be on:[/color] [color=#000000]Getting my Space Invaders game finished off, and I mean fully polished![/color] [color=#000000]Developing my skills in Blender.[/color] [color=#000000]Slowly making parts of the JBEngine OpenSource.[/color] [color=#000000]Trying to contribute much more to the OpenSource Community.[/color] [color=#000000]Getting stuck in to Vulkan, hopefully integrating it with the JBEngine at some point.[/color] [color=#000000]Making the JBEngine Cross Platform.[/color] [color=#000000]So far I've not done so well on these goals other than the last two. You can't really call a 30 minute play with the demo's "Getting stuck in" though. I have been working on getting the Maths and Sound libraries of the JBEngine to compile for linux. I started using CMake last Saturday and I really feel like I was getting somewhere. I am going to set myself a target of getting those two libraries working for Linux, and OSX in the next week or so which shouldn't be too difficult. Anyway that's pretty much it, oh and I did do some work with blender over the past month so here is some dev art to laugh at:[/color] [color=#808080][/color][/font][/color]
  8. [color=rgb(102,102,102)][font='Open Sans'] [color=rgb(0,0,0)][font=arial]Whilst trawling the [/font][/color]gamedev.net[color=rgb(0,0,0)][font=arial] developer journals for inspiration, I stumbled across a post that someone had done as a reflection of what he had achieved from the previous year and what his plan was for 2016. I thought this was an amazing idea so I'm going to do it myself. Hopefully this should give me some motivation to finish things off and also some direction with what I want to learn next. So here goes...[/font][/color] [color=rgb(0,0,0)][font=arial]2015: Looking Back[/font][/color] [color=rgb(0,0,0)][font=arial]Game Project[/font][/color] [color=rgb(0,0,0)][font=arial]Just looking back at my posts from last January I was at that point still developing the in's and out's of my Entity Component System. I had only just implemented Awesomium and was still working on my "Level Editor" for this amazing game I was one day going to make. If I could have given myself some advice It would have been to give up on the Level Editor and the ECS and condense my project down massively. Unfortunately I had to learn the hard way![/font][/color] [color=#000000][font=arial]I managed to get the ECS working in the end and I am fairly happy with the implementation as it uses some complex patterns (CRTP, Observer) to achieve what it does. Also I learnt a lot about using templates in C++. [/font][/color] [color=#000000][font=arial]The Level Editor and the original game idea I scrapped although that wasn't until June when I decided to get a fresh project and integrate the new ECS into it. I suppose I can put this down to a learning exercise.[/font][/color] [color=#000000][font=arial]It was August 8th when I decided to create a "Space Invaders Remake" using the new baseline JBEngine and ECS. Since then this project had come a long way and is now approaching the finishing up and polish stage. I am really impressed with the work I have done on this. Whilst working on this game I have had to re-work/refactor a lot of the physics code in JBEngine, which is something that can now be reused in future projects. [/font][/color] [color=rgb(0,0,0)][font=arial]Career and Development[/font][/color] [color=rgb(0,0,0)][font=arial]I have come a very long way in terms of my career since the beginning of last year! I had just started out at Inspired Gaming and although I knew I had lot's of knowledge about programming, I still felt as though I was a junior developer. ?[/font][/color] [color=rgb(0,0,0)][font=arial]Inspired Gaming?[/font][/color] [color=rgb(0,0,0)][font=arial]I went through a big change in terms of adapting to a new codebase after being so used to working with Arden's monster of a codebase. Learning an application's flow and the architecture is something that only comes through practice, and working at Inspired gave me that. Some of the key skills I will take away from Inspired are:[/font][/color] [color=#000000][font=arial]Proficiency with Visual Studio[/font][/color] [color=#000000][font=arial]Better Multi-Threading Knowledge[/font][/color] [color=#000000][font=arial]Visualising Program Architecture[/font][/color] [color=#000000][font=arial]Working on a single project through Requirements/Design/Implementation/Test and Deployment[/font][/color] [color=#000000][font=arial]Working closely with Project Managers/StakeHolder and Testers.[/font][/color] [color=#000000][font=arial]Time Management?[/font][/color] [color=#000000][font=arial]Along with the technical skills I have developed much more socially, being able to join a new team and integrate quickly. Joining a new company is difficult but as long as you put in that extra effort at the start to socialise, it makes your job and your life much more enjoyable. I have made some great friends at Inspired and will hopefully be seeing them soon in 2016.[/font][/color] [color=rgb(0,0,0)][font=arial]IBM[/font][/color] [color=rgb(0,0,0)][font=arial]In June of this year I left Inspired Gaming and joined IBM. At the time I was very fearful of this decision as the role was to work as C Developer rather than C++ which I had been doing in my previous jobs. To me this felt like a step back in terms of gathering skills but I also have always wanted to work for one of the Big Blue's so I went for it. I think having one of the industry giants such as IBM on my CV couldn't hurt either.[/font][/color] [color=rgb(0,0,0)][font=arial]Whilst working at IBM I have actually only done a small amount C development. Instead I pushed for the opportunity to work on a newly starting project which has required me to use python.[/font][/color] [color=#000000][font=arial]I have learnt a lot since being at IBM specifically more about hardware, networking, storage and virtualisation. A lot of the things I have learnt is how much of a nuisance it can be working for a massive corporation. Having company wide decisions pushed on you when it is not the correct decision for your situation. Here is a list of the technical skills I have learned since being at IBM: [/font][/color] [color=#000000][font=arial]Learning to various Linux distributions[/font][/color] [color=#000000][font=arial]ssh'ing onto various machines and having to perform tasks using the command-line only[/font][/color] [color=#000000][font=arial]Using Eclipse[/font][/color] [color=#000000][font=arial]RTC (Rational Team Concert)[/font][/color] [color=#000000][font=arial]python, with Flask, SQLAlchemy and virtual env[/font][/color] [color=#000000][font=arial]Using Virtual Machines[/font][/color] [color=#000000][font=arial]Connecting Hardware/Server Room knowledge[/font][/color] [color=#000000][font=arial]People Management/Project Management skills[/font][/color] [color=#000000][font=arial]Program Design[/font][/color] [color=#000000][font=arial]The list could go on and on! The main piece of work that I have worked on at IBM I have been the lead developer on. This has required me to create a design document, providing a solution that we will then implement. I have also had to give direction to and collaborate with a team of 3-6 other developers to allow them to accomplish what is in the design.[/font][/color] [color=#000000][font=arial]I have once again had to integrate myself into another team, this one being now up to 80 people. This has been fairly easy as the work environment at the IBM Manchester Lab is really friendly. I have already made some great friends and feel as though I am now an integral part of the team.[/font][/color] [color=rgb(0,0,0)][font=arial]?Social Life[/font][/color] [color=rgb(0,0,0)][font=arial]In terms of my living arrangements I have moved flat and I am going to be moving again shortly. I moved from Manchester's Northern Quarter in February of 2015 to a flat just off Deansgate Locks. This has given me the opportunity to see more of the city. Some great bars for the summer like Duke's 92, Rain Bar, Atlas bar and many amazing restaurants.[/font][/color] [color=#000000][font=arial]?For the past year I have been in a relationship with Megan (Megatron). We have had some amazing experiences together already! Going for long weekend breaks to Chester, Grasmere, Windermere. A great holiday in Portugal, going to see Wicked! and a lot of hilarious nights out. I can't wait for the adventures we will be having next year.[/font][/color] [color=rgb(0,0,0)][font=arial]In terms of my fitness, whilst being at IBM I've managed to maintain my enthusiasm for going to the gym, and playing squash. I now enjoy playing Table Tennis almost every day at work and playing Football on Monday nights.[/font][/color] [color=rgb(0,0,0)][font=arial]Conclusion[/font][/color] [color=rgb(0,0,0)][font=arial]So all in all this year has been an amazing one for my career, social life, projects and personal development. I realise this post is now pretty long so I think I will leave the "What's Next" part to be a separate post.[/font][/color] [color=rgb(0,0,0)][font=arial]Happy New Year [/font][/color][/font][/color]
  9. Okay so having a quick look through the API and headers for Physx that I have.    It seems that a PxRigidBody derives from PxRigidActor which derives from PxActor.    What I think you will either want to do is store all the PxRigidBodies in an array when you create them. (Most likely using CreateRigidDynamic() or equivalent functionality).   Or alternatively loop casting the actors to rigidbodies to then apply the force to them. e.g. for( unsigned int i = 0; i < nbActors; i++ ) { auto rigidBody = dynamic_cast<PxRigidBody*>(actors[i]); if( rigidBody ) { rigidBody->AddForce( forceVal ); } }
  10. JordanBonser

    .x file skinning problem

    The best piece of advice I can give you is to simplify the example you are using.    Create a Model with just two or three bones, maybe just two cylinders that are connected at a right angle.   This way you can more easily debug the information.
  11. JordanBonser

    BooH released, lessons learned and more

    Well done! I am one of the many who get caught up with the new shiny features and have yet to fully produce a game. I think I will take a similar route to you and maybe complete an old school arcade game to get something released :).    Once again congratz!
  12. JordanBonser

    What drives you in whatever you like?

    My main form of motivation is seeing other peoples work.   I follow quite a few blogs on here and I also use IndieDB and other sites to get that spark.    I think it's a combination of "I could do that! Right, time to get back to work" and "Wow, that would be really cool to try out".
  13. JordanBonser

    Entity Component System: Messaging with CRTP

    Thanks Aardvajk, this is the first time I've tried implemeting CRTP and it is definitely really powerful. I'm glad I've given someone inspiration to try something new :)   Juliean this is actually really strange, I've been using your blog posts along with EntityX as reference for all the work I've been doing. In fact the whole messaging system I only tried after you mentioned that you would like to make yours work that way. So thank you for the inspiration to try it :)
  14. So after a long while fighting with templates I have finally got a decent implementation of the ECS. I now have Systems, Components and Component Pools. There is a Component Pool for each component and that holds every single component of that type. Each System keeps track of each of the entities that is registered for it and then on update the system loops through all the entities getting the components that it needs for that entity and performing the actions on it. This new way of doing things, having systems work on their own will give me the opportunity to add thread pools once that is necessary. This will allow me to use worker threads for sections of entities registered for the system. So that is the general usage of the Systems and Components. The next part I will talk about is messaging, this has been a very tricky part of the Entity System. I have again used CRTP to accomplish this, and I believe allowing a system to register for messages is easier than ever now. The Messaging system is technically something completely seperate from the Entity System/Component architecture and because of this it is not just Systems that can listen for messages. Okay so how does it work? So the Message class is where the CRTP occurs, each derived message type will supply itself as the template parameter for the base class:class DerivedMessage : public Message{public: DerivedMessage(); virtual ~DerivedMessage(){};protected: }; This allows for much easier dispatch of the messages now to show how to make a class receive messages: first of all you have to derive the class that will listen to the messages from the MessageListener class supplying the message you will be using:template < class MessageType >class MessageListener{public: virtual void HandleMessage(MessageType* message) = 0;};class MovementSystem : public System, public MessageListener, public MessageListener{public: MovementSystem(MessageManager* msgManager); virtual void Update(); virtual ~MovementSystem(void); void HandleMessage(MovementMessage* message); void HandleMessage(RotationMessage* message); virtual void RegisterMessages();}; The next step is merely to register to receive the messages of a certain type in the RegisterMessages function. This is called just after creation of any System.void MovementSystem::RegisterMessages(){ mMessageManager->RegisterListener(this); mMessageManager->RegisterListener(this);} and then of course all that is left is to handle the messages with each of the HandleMessage functions. Finally this is a little demo program that shows the use of the ECS and messaging:int _tmain(int argc, _TCHAR* argv[]){ MessageManager messManager; EntityManager manager(&messManager); Entity* newEnt = manager.CreateEntity( string( "MyFirstEntity" ) ); newEnt->AddComponent( newEnt ); newEnt->AddComponent( newEnt ); newEnt->AddSystem(); messManager.SendMessage( 40.0f, 0.2f, 0.0f ); messManager.SendMessage( 20.0f, 0.0f, 0.0f ); return 0;} I have used variadic templates throughout to make creating Messages and Components really simple. So I believe this is a fairly flexible approach, there are probably a few more things that I could do to make this better but for now I am going to leave it as it is and try and re-implement all the functionality that is in my previous version of the ECS. Once this is all integrated back into my Engine then I will run some tests and see if there is need for any more changes. All is going well after a lot of frustrating times with templates. There are still some things that need tidying up to ensure the system is a little more robust but I am very happy with the progress. Thanks
  15. [font=verdana]Exporting...[/font][color=rgb(90,90,90)][font=Arial] On Thursday I managed to get the Export of the Levels to work. This involves exporting the Assets ( Meshes, Textures, Sounds ) and the Entities( Components, Data Components ). After doing this the only thing I had left to do is allow editing of the rotation of the entities, which posed a problem. Up until now I had been directly editing the Matrix of the Mesh Instance I had selected. This was fine except to do rotation I would need to store the Euler Angles that could be edited from the User Interface.[/font][/color] [color=rgb(90,90,90)][font=Arial] This got me thinking, I should be using the Entity Component System(ECS) for all of this data realistically, and I will also be wanting to edit values of the Data Components from within the Level Editor as this will make entity creation much better. In my current system for ECS there isn't any way of getting a Data Component for an Entity without doing a dynamic cast based on some sort of ID which could potentially go wrong. So I started looking at different solutions for ECS since my first initial implementation. I came across this post: ECS, Component, Entities and Systems, which suggests the use of the Curiously Recurring Template Pattern(CRTP) for the ECS. [/font][/color] [color=rgb(90,90,90)][font=Arial] [font=verdana]First Attempt[/font][/font][/color][color=rgb(90,90,90)][font=Arial] Most of Thursday night was spent refactoring my current ECS from a virtual inheritance style hierarchy to this CRTP version. Needless to say after a lot of Linking Errors and all sorts of crazy going on I decided to scrap it and revert my changes.[/font][/color] [color=rgb(90,90,90)][font=Arial] [font=verdana]Second Attempt[/font][/font][/color][color=rgb(90,90,90)][font=Arial] So for my second attempt I decided to create a seperate project for my ECS and get it all set up with the templates before integrating it into the engine. I am part way through this, I've got all the Components and Data Components working I just haven't dealt with the messaging yet. I have really mixed things up, instead of storing Components within the entity I have created pools of all the same types and they just have reference to their entity. This way has a few benefits such as cache coherency, the updates will also be Component Priority dependant rather than Entity Creation dependant. This approach will also give me better opportunity to perform multi-threading when the time comes, each pool could use worker threads to update chunks of the Components. One thing I am likely to change is the wording I previously used, in most descriptions of an ECS the words System and Component are used where as mine uses Component and Data Component which really confuses things as: Component = Data Component System = Component For the sake of anyone wanting to use the Engine and reading up on Component Systems it seems more appropriate to use the most common terminology. Okay so finally a demo of what access to the new Components will look like:[/font][/color][color=rgb(90,90,90)][font=Arial] auto posComponent = entity->GetComponent();also as I have used Variadic templates so the adding of Components to entities is clean and simple: entity->AddComponent( x, y, z );Okay so there is still a lot of work to be done but I'm hoping to get this all nailed pretty soon so I can really start using the ECS. Cheers [/font][/color]
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!