Jump to content
  • Advertisement

Search the Community

Showing results for tags 'Education'.

More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • Audio
    • Music and Sound FX
  • Business
    • Business and Law
    • Career Development
    • Production and Management
  • Game Design
    • Game Design and Theory
    • Writing for Games
    • UX for Games
  • Industry
    • Interviews
    • Event Coverage
  • Programming
    • Artificial Intelligence
    • General and Gameplay Programming
    • Graphics and GPU Programming
    • Engines and Middleware
    • Math and Physics
    • Networking and Multiplayer
  • Visual Arts
  • Archive


  • Audio
  • Visual Arts
  • Programming
  • Writing


  • Game Dev Loadout
  • Game Dev Unchained


  • Game Developers Conference
    • GDC 2017
    • GDC 2018
  • Power-Up Digital Games Conference
    • PDGC I: Words of Wisdom
    • PDGC II: The Devs Strike Back
    • PDGC III: Syntax Error


  • Audio
    • Music and Sound FX
  • Business
    • Games Career Development
    • Production and Management
    • Games Business and Law
  • Game Design
    • Game Design and Theory
    • Writing for Games
  • Programming
    • Artificial Intelligence
    • Engines and Middleware
    • General and Gameplay Programming
    • Graphics and GPU Programming
    • Math and Physics
    • Networking and Multiplayer
  • Visual Arts
    • 2D and 3D Art
    • Critique and Feedback
  • Community
    • GameDev Challenges
    • GDNet+ Member Forum
    • GDNet Lounge
    • GDNet Comments, Suggestions, and Ideas
    • Coding Horrors
    • Your Announcements
    • Hobby Project Classifieds
    • Indie Showcase
    • Article Writing
  • Affiliates
    • NeHe Productions
    • AngelCode
  • Topical
    • Virtual and Augmented Reality
    • News
  • Workshops
    • C# Workshop
    • CPP Workshop
    • Freehand Drawing Workshop
    • Hands-On Interactive Game Development
    • SICP Workshop
    • XNA 4.0 Workshop
  • Archive
    • Topical
    • Affiliates
    • Contests
    • Technical
  • GameDev Challenges's Topics
  • For Beginners's Forum


  • Community Calendar
  • Games Industry Events
  • Game Jams
  • GameDev Challenges's Schedule


There are no results to display.

There are no results to display.

Product Groups

  • Advertisements
  • GameDev Gear

Find results in...

Find results that contain...

Date Created

  • Start


Last Updated

  • Start


Filter by number of...


  • Start



About Me







Found 140 results

  1. I'm 20 yrs old and I already have a full time job as a technology programmer in AAA company, I'm completely self taught and I love what I'm doing, the problem is that I just don't like college, I already tried to go to university and because I've put too much pressure on myself during high school, when I started living by myself for the first time I started partying too much, now I spend at least 8 hrs a day (usualy more) at work and when I come back I study a lot, recently I started part time college and even tho I have classes only every 2nd weekend I feel like having just 4 free days a month is not enough and my youth is just disappearing, I'm ambitious but I've never felt like a degree is rly worth it and I don't want to wake up in few years feeling like I chased career too much and I didn't have any fun time, do you think I should force myself anyway and get a degree from some private, paid university that didn't teach me anything useful or something that I wouldn't teach myself on my own, or having years of experience and huge shipped titles in my cv will be enough if I'll ever want to change job for whatever reason(current company is very very good, growing rapidly and I see myself staying there for a lot of years)
  2. I'm very often facing one small problem when trying to learn some new stuff - hard to choose what to learn next. Even if the problem seems to be small it has a very huge impact on the final result I think. And because Game Programming offers so much to learn, I'm always feeling that I'm missing something important and wasting my time learning something not important or unneeded. Or usually, I'm afraid to focus on something specific and huge for a long time, because I think that I'll spend all my time on that particular filed and will not be able to solve another problem. So I've tried to fit all my thoughts in this questions. 1) Are you trying to cover all the aspects of Game Programming? Or you trying to focus on some specific aspects like physics, animations, or networking etc. 2) What is your way to find a new theory or whatever else for your learning process? (Manuals, Courses, Books, Documentation? etc.) 3) When you trying to learn while practicing, are you search for learning because of a problem that appears, or because you wants to try new things? How do you choose this new thing? And finally, Which of this two approaches was the best for you if any? Not actually in the scope of the topic, but I'm also very interested to hear your thoughts on this. What is Game Programming for you? How would you describe what should Game Programmer able to solve?
  3. Hodgman

    OOP is dead, long live OOP

    edit: Seeing this has been linked outside of game-development circles: "ECS" (this wikipedia page is garbage, btw -- it conflates EC-frameworks and ECS-frameworks, which aren't the same...) is a faux-pattern circulated within game-dev communities, which is basically a version of the relational model, where "entities" are just ID's that represent a formless object, "components" are rows in specific tables that reference an ID, and "systems" are procedural code that can modify the components. This "pattern" is always posed as a solution to an over-use of inheritance, without mentioning that an over-use of inheritance is actually bad under OOP guidelines. Hence the rant. This isn't the "one true way" to write software. It's getting people to actually look at existing design guidelines. Inspiration This blog post is inspired by Aras Pranckevičius' recent publication of a talk aimed at junior programmers, designed to get them to come to terms with new "ECS" architectures. Aras follows the typical pattern (explained below), where he shows some terrible OOP code and then shows that the relational model is a great alternative solution (but calls it "ECS" instead of relational). This is not a swipe at Aras at all - I'm a fan of his work and commend him on the great presentation! The reason I'm picking on his presentation in particular instead of the hundred other ECS posts that have been made on the interwebs, is because he's gone through the effort of actually publishing a git repository to go along with his presentation, which contains a simple little "game" as a playground for demonstrating different architecture choices. This tiny project makes it easy for me to actually, concretely demonstrate my points, so, thanks Aras! You can find Aras' slides at http://aras-p.info/texts/files/2018Academy - ECS-DoD.pdf and the code at https://github.com/aras-p/dod-playground. I'm not going to analyse the final ECS architecture from that talk (yet?), but I'm going to focus on the straw-man "bad OOP" code from the start. I'll show what it would look like if we actually fix all of the OOD rule violations. Spoiler: fixing the OOD violations actually results in a similar performance improvement to Aras' ECS conversion, plus it actually uses less RAM and requires less lines of code than the ECS version! TL;DR: Before you decide that OOP is shit and ECS is great, stop and learn OOD (to know how to use OOP properly) and learn relational (to know how to use ECS properly too). I've been a long-time ranter in many "ECS" threads on the forum, partly because I don't think it deserves to exist as a term (spoiler: it's just a an ad-hoc version of the relational model), but because almost every single blog, presentation, or article that promotes the "ECS" pattern follows the same structure: Show some terrible OOP code, which has a terribly flawed design based on an over-use of inheritance (and incidentally, a design that breaks many OOD rules). Show that composition is a better solution than inheritance (and don't mention that OOD actually teaches this same lesson). Show that the relational model is a great fit for games (but call it "ECS"). This structure grinds my gears because: (A) it's a straw-man argument.. it's apples to oranges (bad code vs good code)... which just feels dishonest, even if it's unintentional and not actually required to show that your new architecture is good, but more importantly: (B) it has the side effect of suppressing knowledge and unintentionally discouraging readers from interacting with half a century of existing research. The relational model was first written about in the 1960's. Through the 70's and 80's this model was refined extensively. There's common beginners questions like "which class should I put this data in?", which is often answered in vague terms like "you just need to gain experience and you'll know by feel"... but in the 70's this question was extensively pondered and solved in the general case in formal terms; it's called database normalization. By ignoring existing research and presenting ECS as a completely new and novel solution, you're hiding this knowledge from new programmers. Object oriented programming dates back just as far, if not further (work in the 1950's began to explore the style)! However, it was in the 1990's that OO became a fad - hyped, viral and very quickly, the dominant programming paradigm. A slew of new OO languages exploded in popularity including Java and (the standardized version of) C++. However, because it was a hype-train, everyone needed to know this new buzzword to put on their resume, yet no one really groked it. These new languages had added a lot of OO features as keywords -- class, virtual, extends, implements -- and I would argue that it's at this point that OO split into two distinct entities with a life of their own. I will refer to the use of these OO-inspired language features as "OOP", and the use of OO-inspired design/architecture techniques as "OOD". Everyone picked up OOP very quickly. Schools taught OO classes that were efficient at churning out new OOP programmers.... yet knowledge of OOD lagged behind. I argue that code that uses OOP language features, but does not follow OOD design rules is not OO code. Most anti-OOP rants are eviscerating code that is not actually OO code. OOP code has a very bad reputation, I assert in part due to the fact that, most OOP code does not follow OOD rules, thus isn't actually "true" OO code. Background As mentioned above, the 1990's was the peak of the "OO fad", and it's during this time that "bad OOP" was probably at its worst. If you studied OOP during this time, you probably learned "The 4 pillars of OOP": Abstraction Encapsulation Polymorphism Inheritance I'd prefer to call these "4 tools of OOP" rather than 4 pillars. These are tools that you can use to solve problems. Simply learning how a tool works is not enough though, you need to know when you should be using them... It's irresponsible for educators to teach people a new tool without also teaching them when it's appropriate to use each of them. In the early 2000's, there was a push-back against the rampant misuse of these tools, a kind of second-wave of OOD thought. Out of this came the SOLID mnemonic to use as a quick way to evaluate a design's strength. Note that most of these bits of advice were well actually widely circulated in the 90's, but didn't yet have the cool acronym to cement them as the five core rules... Single responsibility principle. Every class should have one reason to change. If class "A" has two responsibilities, create a new class "B" and "C" to handle each of them in isolation, and then compose "A" out of "B" and "C". Open/closed principle. Software changes over time (i.e. maintenance is important). Try to put the parts that are likely to change into implementations (i.e. concrete classes) and build interfaces around the parts that are unlikely to change (e.g. abstract base classes). Liskov substitution principle. Every implementation of an interface needs to 100% comply the requirements of that interface. i.e. any algorithm that works on the interface, should continue to work for every implementation. Interface segregation principle. Keep interfaces as small as possible, in order to ensure that each part of the code "knows about" the least amount of the code-base as possible. i.e. avoid unnecessary dependencies. This is also just good advice in C++ where compile times suck if you don't follow this advice Dependency inversion principle. Instead of having two concrete implementations communicate directly (and depend on each other), they can usually be decoupled by formalizing their communication interface as a third class that acts as an interface between them. This could be an abstract base class that defines the method calls used between them, or even just a POD struct that defines the data passed between them. Not included in the SOLID acronym, but I would argue is just as important is the: Composite reuse principle. Composition is the right default™. Inheritance should be reserved for use when it's absolutely required. This gives us SOLID-C(++) From now on, I'll refer to these by their three letter acronyms -- SRP, OCP, LSP, ISP, DIP, CRP... A few other notes: In OOD, interfaces and implementations are ideas that don't map to any specific OOP keywords. In C++, we often create interfaces with abstract base classes and virtual functions, and then implementations inherit from those base classes... but that is just one specific way to achieve the idea of an interface. In C++, we can also use PIMPL, opaque pointers, duck typing, typedefs, etc... You can create an OOD design and then implement it in C, where there aren't any OOP language keywords! So when I'm talking about interfaces here, I'm not necessarily talking about virtual functions -- I'm talking about the idea of implementation hiding. Interfaces can be polymorphic, but most often they are not! A good use for polymorphism is rare, but interfaces are fundamental to all software. As hinted above, if you create a POD structure that simply stores some data to be passed from one class to another, then that struct is acting as an interface - it is a formal data definition. Even if you just make a single class in isolation with a public and a private section, everything in the public section is the interface and everything in the private section is the implementation. Inheritance actually has (at least) two types -- interface inheritance, and implementation inheritance. In C++, interface inheritance includes abstract-base-classes with pure-virtual functions, PIMPL, conditional typedefs. In Java, interface inheritance is expressed with the implements keyword. In C++, implementation inheritance occurs any time a base classes contains anything besides pure-virtual functions. In Java, implementation inheritance is expressed with the extends keyword. OOD has a lot to say about interface-inheritance, but implementation-inheritance should usually be treated as a bit of a code smell! And lastly I should probably give a few examples of terrible OOP education and how it results in bad code in the wild (and OOP's bad reputation). When you were learning about hierarchies / inheritance, you probably had a task something like: Let's say you have a university app that contains a directory of Students and Staff. We can make a Person base class, and then a Student class and a Staff class that inherit from Person! Nope, nope nope. Let me stop you there. The unspoken sub-text beneath the LSP is that class-hierarchies and the algorithms that operate on them are symbiotic. They're two halves of a whole program. OOP is an extension of procedural programming, and it's still mainly about those procedures. If we don't know what kinds of algorithms are going to be operating on Students and Staff (and which algorithms would be simplified by polymorphism) then it's downright irresponsible to dive in and start designing class hierarchies. You have to know the algorithms and the data first. When you were learning about hierarchies / inheritance, you probably had a task something like: Let's say you have a shape class. We could also have squares and rectangles as sub-classes. Should we have square is-a rectangle, or rectangle is-a square? This is actually a good one to demonstrate the difference between implementation-inheritance and interface-inheritance. If you're using the implementation-inheritance mindset, then the LSP isn't on your mind at all and you're only thinking practically about trying to reuse code using inheritance as a tool. From this perspective, the following makes perfect sense: struct Square { int width; }; struct Rectangle : Square { int height; }; A square just has width, while rectangle has a width + height, so extending the square with a height member gives us a rectangle! As you might have guessed, OOD says that doing this is (probably) wrong. I say probably because you can argue over the implied specifications of the interface here... but whatever. A square always has the same height as its width, so from the square's interface, it's completely valid to assume that its area is "width * width". By inheriting from square, the rectangle class (according to the LSP) must obey the rules of square's interface. Any algorithm that works correctly with a square, must also work correctly with a rectangle. Take the following algorithm: std::vector<Square*> shapes; int area = 0; for(auto s : shapes) area += s->width * s->width; This will work correctly for squares (producing the sum of their areas), but will not work for rectangles. Therefore, Rectangle violates the LSP rule. If you're using the interface-inheritance mindset, then neither Square or Rectangle will inherit from each other. The interface for a square and rectangle are actually different, and one is not a super-set of the other. So OOD actually discourages the use of implementation-inheritance. As mentioned before, if you want to re-use code, OOD says that composition is the right way to go! For what it's worth though, the correct version of the above (bad) implementation-inheritance hierarchy code in C++ is: struct Shape { virtual int area() const = 0; }; struct Square : public virtual Shape { virtual int area() const { return width * width; }; int width; }; struct Rectangle : private Square, public virtual Shape { virtual int area() const { return width * height; }; int height; }; "public virtual" means "implements" in Java. For use when implementing an interface. "private" allows you to extend a base class without also inheriting its interface -- in this case, Rectangle is-not-a Square, even though it's inherited from it. I don't recommend writing this kind of code, but if you do like to use implementation-inheritance, this is the way that you're supposed to be doing it! TL;DR - your OOP class told you what inheritance was. Your missing OOD class should have told you not to use it 99% of the time! Entity / Component frameworks With all that background out of the way, let's jump into Aras' starting point -- the so called "typical OOP" starting point. Actually, one last gripe -- Aras calls this code "traditional OOP", which I object to. This code may be typical of OOP in the wild, but as above, it breaks all sorts of core OO rules, so it should not all all be considered traditional. I'm going to start from the earliest commit before he starts fixing the design towards "ECS": "Make it work on Windows again" 3529f232510c95f53112bbfff87df6bbc6aa1fae // ------------------------------------------------------------------------------------------------- // super simple "component system" class GameObject; class Component; typedef std::vector<Component*> ComponentVector; typedef std::vector<GameObject*> GameObjectVector; // Component base class. Knows about the parent game object, and has some virtual methods. class Component { public: Component() : m_GameObject(nullptr) {} virtual ~Component() {} virtual void Start() {} virtual void Update(double time, float deltaTime) {} const GameObject& GetGameObject() const { return *m_GameObject; } GameObject& GetGameObject() { return *m_GameObject; } void SetGameObject(GameObject& go) { m_GameObject = &go; } bool HasGameObject() const { return m_GameObject != nullptr; } private: GameObject* m_GameObject; }; // Game object class. Has an array of components. class GameObject { public: GameObject(const std::string&& name) : m_Name(name) { } ~GameObject() { // game object owns the components; destroy them when deleting the game object for (auto c : m_Components) delete c; } // get a component of type T, or null if it does not exist on this game object template<typename T> T* GetComponent() { for (auto i : m_Components) { T* c = dynamic_cast<T*>(i); if (c != nullptr) return c; } return nullptr; } // add a new component to this game object void AddComponent(Component* c) { assert(!c->HasGameObject()); c->SetGameObject(*this); m_Components.emplace_back(c); } void Start() { for (auto c : m_Components) c->Start(); } void Update(double time, float deltaTime) { for (auto c : m_Components) c->Update(time, deltaTime); } private: std::string m_Name; ComponentVector m_Components; }; // The "scene": array of game objects. static GameObjectVector s_Objects; // Finds all components of given type in the whole scene template<typename T> static ComponentVector FindAllComponentsOfType() { ComponentVector res; for (auto go : s_Objects) { T* c = go->GetComponent<T>(); if (c != nullptr) res.emplace_back(c); } return res; } // Find one component of given type in the scene (returns first found one) template<typename T> static T* FindOfType() { for (auto go : s_Objects) { T* c = go->GetComponent<T>(); if (c != nullptr) return c; } return nullptr; } Ok, 100 lines of code is a lot to dump at once, so let's work through what this is... Another bit of background is required -- it was popular for games in the 90's to use inheritance to solve all their code re-use problems. You'd have an Entity, extended by Character, extended by Player and Monster, etc... This is implementation-inheritance, as described earlier (a code smell), and it seems like a good idea to begin with, but eventually results in a very inflexible code-base. Hence that OOD has the "composition over inheritance" rule, above. So, in the 2000's the "composition over inheritance" rule became popular, and gamedevs started writing this kind of code instead. What does this code do? Well, nothing good To put it in simple terms, this code is re-implementing the existing language feature of composition as a runtime library instead of a language feature. You can think of it as if this code is actually constructing a new meta-language on top of C++, and a VM to run that meta-language on. In Aras' demo game, this code is not required (we'll soon delete all of it!) and only serves to reduce the game's performance by about 10x. What does it actually do though? This is an "Entity/Component" framework (sometimes confusingly called an "Entity/Component system") -- but completely different to an "Entity Component System" framework (which are never called "Entity Component System systems" for obvious reasons). It formalizes several "EC" rules: the game will be built out of featureless "Entities" (called GameObjects in this example), which themselves are composed out of "Components". GameObjects fulfill the service locator pattern - they can be queried for a child component by type. Components know which GameObject they belong to - they can locate sibling componets by querying their parent GameObject. Composition may only be one level deep (Components may not own child components, GameObjects may not own child GameObjects). A GameObject may only have one component of each type (some frameworks enforced this, others did not). Every component (probably) changes over time in some unspecified way - so the interface includes "virtual void Update". GameObjects belong to a scene, which can perform queries over all GameObjects (and thus also over all Components). This kind of framework was very popular in the 2000's, and though restrictive, proved flexible enough to power countless numbers of games from that time and still today. However, it's not required. Your programming language already contains support for composition as a language feature - you don't need a bloated framework to access it... Why do these frameworks exist then? Well to be fair, they enable dynamic, runtime composition. Instead of GameObject types being hard-coded, they can be loaded from data files. This is great to allow game/level designers to create their own kinds of objects... However, in most game projects, you have a very small number of designers on a project and a literal army of programmers, so I would argue it's not a key feature. Worse than that though, it's not even the only way that you could implement runtime composition! For example, Unity is based on C# as a "scripting language", and many other games use alternatives such as Lua -- your designer-friendly tool can generate C#/Lua code to define new game-objects, without the need for this kind of bloated framework! We'll re-add this "feature" in a later follow-up post, in a way that doesn't cost us a 10x performance overhead... Let's evaluate this code according to OOD: GameObject::GetComponent uses dynamic_cast. Most people will tell you that dynamic_cast is a code smell - a strong hint that something is wrong. I would say that it indicates that you have an LSP violation on your hands -- you have some algorithm that's operating on the base interface, but it demands to know about different implementation details. That's the specific reason that it smells. GameObject is kind of ok if you imagine that it's fulfilling the service locator pattern.... but going beyond OOD critique for a moment, this pattern creates implicit links between parts of the project, and I feel (without a wikipedia link to back me up with comp-sci knowledge) that implicit communication channels are an anti-pattern and explicit communication channels should be preferred. This same argument applies to bloated "event frameworks" that sometimes appear in games... I would argue that Component is a SRP violation because its interface (virtual void Update(time)) is too broad. The use of "virtual void Update" is pervasive within game development, but I'd also say that it is an anti-pattern. Good software should allow you to easily reason about the flow of control, and the flow of data. Putting every single bit of gameplay code behind a "virtual void Update" call completely and utterly obfuscates both the flow of control and the flow of data. IMHO, invisible side effects, a.k.a. action at a distance, is the most common source of bugs, and "virtual void Update" ensures that almost everything is an invisible side-effect. Even though the goal of the Component class is to enable composition, it's doing so via inheritance, which is a CRP violation. The one good part is that the example game code is bending over backwards to fulfill the SRP and ISP rules -- it's split into a large number of simple components with very small responsibilities, which is great for code re-use. However, it's not great as DIP -- many of the components do have direct knowledge of each other. So, all of the code that I've posted above, can actually just be deleted. That whole framework. Delete GameObject (aka Entity in other frameworks), delete Component, delete FindOfType. It's all part of a useless VM that's breaking OOD rules and making our game terribly slow. Frameworkless composition (AKA using the features of the #*@!ing programming language) If we delete our composition framework, and don't have a Component base class, how will our GameObjects manage to use composition and be built out of Components. As hinted in the heading, instead of writing that bloated VM and then writing our GameObjects on top of it in our weird meta-language, let's just write them in C++ because we're #*@!ing game programmers and that's literally our job. Here's the commit where the Entity/Component framework is deleted: https://github.com/hodgman/dod-playground/commit/f42290d0217d700dea2ed002f2f3b1dc45e8c27c Here's the original version of the source code: https://github.com/hodgman/dod-playground/blob/3529f232510c95f53112bbfff87df6bbc6aa1fae/source/game.cpp Here's the modified version of the source code: https://github.com/hodgman/dod-playground/blob/f42290d0217d700dea2ed002f2f3b1dc45e8c27c/source/game.cpp The gist of the changes is: Removing ": public Component" from each component type. I add a constructor to each component type. OOD is about encapsulating the state of a class, but since these classes are so small/simple, there's not much to hide -- the interface is a data description. However, one of the main reasons that encapsulation is a core pillar is that it allows us to ensure that class invariants are always true... or in the event that an invariant is violated, you hopefully only need to inspect the encapsulated implementation code in order to find your bug. In this example code, it's worth us adding the constructors to enforce a simple invariant -- all values must be initialized. I rename the overly generic "Update" methods to reflect what they actually do -- UpdatePosition for MoveComponent and ResolveCollisions for AvoidComponent. I remove the three hard-coded blocks of code that resemble a template/prefab -- code that creates a GameObject containing specific Component types, and replace it with three C++ classes. Fix the "virtual void Update" anti-pattern. Instead of components finding each other via the service locator pattern, the game objects explicitly link them together during construction. The objects So, instead of this "VM" code: // create regular objects that move for (auto i = 0; i < kObjectCount; ++i) { GameObject* go = new GameObject("object"); // position it within world bounds PositionComponent* pos = new PositionComponent(); pos->x = RandomFloat(bounds->xMin, bounds->xMax); pos->y = RandomFloat(bounds->yMin, bounds->yMax); go->AddComponent(pos); // setup a sprite for it (random sprite index from first 5), and initial white color SpriteComponent* sprite = new SpriteComponent(); sprite->colorR = 1.0f; sprite->colorG = 1.0f; sprite->colorB = 1.0f; sprite->spriteIndex = rand() % 5; sprite->scale = 1.0f; go->AddComponent(sprite); // make it move MoveComponent* move = new MoveComponent(0.5f, 0.7f); go->AddComponent(move); // make it avoid the bubble things AvoidComponent* avoid = new AvoidComponent(); go->AddComponent(avoid); s_Objects.emplace_back(go); } We now have this normal C++ code: struct RegularObject { PositionComponent pos; SpriteComponent sprite; MoveComponent move; AvoidComponent avoid; RegularObject(const WorldBoundsComponent& bounds) : move(0.5f, 0.7f) // position it within world bounds , pos(RandomFloat(bounds.xMin, bounds.xMax), RandomFloat(bounds.yMin, bounds.yMax)) // setup a sprite for it (random sprite index from first 5), and initial white color , sprite(1.0f, 1.0f, 1.0f, rand() % 5, 1.0f) { } }; ... // create regular objects that move regularObject.reserve(kObjectCount); for (auto i = 0; i < kObjectCount; ++i) regularObject.emplace_back(bounds); The algorithms Now the other big change is in the algorithms. Remember at the start when I said that interfaces and algorithms were symbiotic, and both should impact the design of the other? Well, the "virtual void Update" anti-pattern is also an enemy here. The original code has a main loop algorithm that consists of just: // go through all objects for (auto go : s_Objects) { // Update all their components go->Update(time, deltaTime); You might argue that this is nice and simple, but IMHO it's so, so bad. It's completely obfuscating both the flow of control and the flow of data within the game. If we want to be able to understand our software, if we want to be able to maintain it, if we want to be able to bring on new staff, if we want to be able to optimise it, or if we want to be able to make it run efficiently on multiple CPU cores, we need to be able to understand both the flow of control and the flow of data. So "virtual void Update" can die in a fire. Instead, we end up with a more explicit main loop that makes the flow of control much more easy to reason about (the flow of data is still obfuscated here, we'll get around to fixing that in later commits) // Update all positions for (auto& go : s_game->regularObject) { UpdatePosition(deltaTime, go, s_game->bounds.wb); } for (auto& go : s_game->avoidThis) { UpdatePosition(deltaTime, go, s_game->bounds.wb); } // Resolve all collisions for (auto& go : s_game->regularObject) { ResolveCollisions(deltaTime, go, s_game->avoidThis); } The downside of this style is that for every single new object type that we add to the game, we have to add a few lines to our main loop. I'll address / solve this in a future blog in this series. Performance There's still a lot of outstanding OOD violations, some bad design choices, and lots of optimization opportunities remaining, but I'll get to them with the next blog in this series. As it stands at this point though, the "fixed OOD" version either almost matches or beats the final "ECS" code from the end of the presentation... And all we did was take the bad faux-OOP code and make it actually obey the rules of OOP (and delete 100 lines of code)! Next steps There's much more ground that I'd like to cover here, including solving the remaining OOD issues, immutable objects (functional style programming) and the benefits it can bring to reasoning about data flows, message passing, applying some DOD reasoning to our OOD code, applying some relational wisdom to our OOD code, deleting those "entity" classes that we ended up with and having purely components-only, different styles of linking components together (pointers vs handles), real world component containers, catching up to the ECS version with more optimization, and then further optimization that wasn't also present in Aras' talk (such as threading / SIMD). No promises on the order that I'll get to these, or if, or when...
  4. DabbingTree

    Education Join the 1st TribaJam!

    TribaJam is going to be a 3-month game jam lasting from December 1st, 3PM EST to March 3rd, 3PM EST. At 3PM, December 1st, I will release the theme on a blog post on my IndieDB account, DabbingTree. When you learn the theme, you are allowed to start your game! I will also release how you will send your game in that blog post. RULES: 1. You must use the theme. 2. You are not allowed to start it before the jam starts. All finished entries posted in the first 7 days will be instantly disqualified. 3. No using copyrighted material AT ALL! 4. No advertising in your entry. After the jam, do whatever you want with your game. But no advertising in the entry. 5. Only one entry per person. No throwing together 40 games and entering it. 6. You are allowed to team with any number of people. Supported Systems: Xbox One Windows/MacOS/Linux iOS Android WebGL Your game entry will be all yours. We will not take the winning game or any others. I invite game developers of every kind to come and make a game!
  5. JoAndRoPo

    Daily Bonus Logic

    Hi! I have a doubt regarding the Daily Bonus. Let's say 7 days. Player receives Daily Bonus in Day#1, Day#2, Misses Day#3, Plays on Day#4, and so on. What happens when the player misses a day? Does the Daily Bonus reset back to day#1? or does the player miss the reward of the missed date and continue to receive the reward on the next day? Can you name me some games that have used a unique daily bonus logic?
  6. I am trying to understand calculating normal vectors in my game engine book. I am having issues understanding a specific section about using gradient to calculate the normal vector. I have attached an image of the page, basically i am unsure where the gradient is coming into play, or just really anything thats going on, on the page. Any help would be appreciated.
  7. Greedy Goblin

    Look what I found....

    Haha! Take a look what I uncovered the other day while digging through my books.... It even came with a good old floppy disk! (I couldn't even use it if I wanted to now)... This book was my very first on 3D graphics programming, before 3D graphics card were even a thing (for the mainstream masses anyway). Published in 1994, it's a book that served as a really good primer to understanding 3D geometry and programming even if I never bothered with the later chapters on curved geometry. All the code samples were in C (not even C++) and there was no such mention of things such as texture mapping (although it did cover shadows, reflections and refraction!). It took you right from the beginning; from the equation of a straight line, translations, matrices etc to projections (viewing pyramid) and clipping algorithms. Great stuff! I still find it useful now as I re-read the introductory chapters and refresh myself on a few basics. My other go-to book is "Real Time Collision Detection" by Christer Ericson - an absolute diamond of a book! Do you guys and girls have any books that you rely on or hold in high regard for your game development? It would be interesting to know if anyone has ever seen or read the Georg Glaeser book above. Anyway, I'll soon have another update on The Berg, but it's bed time for me now. Night all.
  8. JoAndRoPo

    Store Values

    Hi! Question#1 - Is it OK to take another game store values for my game? Will, there be any issues of any kind? Question#2 - How are store values calculated? For example, the below values is taken from Clash Royale... 80 Gems for $0.99, 500 Gems for $4.99, 1200 Gems for $9.99, 2500 Gems for $19.99, 6500 Gems for $49.99, 14000 Gems for $99.99 How are 1200 gems calculated for $9.99? and so on...
  9. Hi all, I'm looking for a career change as the job that i currently do is neither a passion or something that i really want to be doing for the rest of my life. I would ideally like to begin a career in the gaming industry as like most others i have a strong passion for gaming and all things related. I have been looking into a junior test analyst QA job and was wondering if this is the correct place to start. I'm a dedicated worker so don't mind working my way up and I love being hands on with things. I was wondering if anyone had any advice regarding this or how i can go about gaining experience in this field to give myself the best chance. I'm more than willing to do either weekend work or free work to get my foot in the door so if there is any advice or help anyone could give me that would be great. Thanks for reading, Dan
  10. Hi I have been googling for the last half an hour to find no result in what I'm looking for. Racing games have the technique called rubber banding. I just want to know what the same kinds of techniques are called for RTS games. I would give more examples but that's the only one I know of. I'm curious as RTS's are my favorite genre and plan on making them in the distant future. Thanks in advance
  11. bencinStudios

    Science Game Jam Weekend Project

    Over the weekend of September 8th and 9th, 2018, our team participated in a Game Jam hosted by the Nashville Game Developers and The Adventure Science Center in Nashville, TN. The event kicked off on Saturday morning with introductions and our challenge for the weekend: create a science-based game with an educational spin. Given that The Adventure Science Center had dedicated September as "Make It Month," creating a video game based on the science of water seemed perfectly in sync with that idea. Through a bit of brainstorming and ideation, we came up with our theme: Water. Water is one of the most interesting substances in the universe with a host of properties and uses. We wanted to use our game to teach about the 3 main phases of water - solid, liquid, and gas. The player would be tasked with navigating a 2D puzzle environment using game mechanics to heat or cool their water character to make it through obstacles and finish the puzzle. Following a ton of online research on water, we all got a little bit smarter about how water acts, what it can do, and why it's such a versatile substance! Now, to make that into some interesting and educational gameplay. We knew we wanted the experience to include the player having to change between the various phases of water to complete the level. The challenge became how to do that in an educational, yet fun way. We decided to utilize the idea of a Bunsen burner to heat the water into a gas to be able to float. We would use a freezer to turn the water into an ice cube to be able to break through obstacles. And we'd use the idea of time and friction to turn the gas or ice back into water to navigate grates in the floor. From there, the team began pulling together assets, coding, and building the game level. By the end of Day 1, you could start to see the results of the team's work. For Day 2, our goal was to put out a finished game that would be fully playable start to finish, while also providing some polished visuals and gameplay. One of the aspects added during Day 2 was our water molecule character, Mo L. Cool, who would serve up interesting facts about water or helpful hints to get the player through the puzzle. Seth, our artist, came up with a very cool, unique take on the water molecule, showing the hydrogen atoms as headphones on the "head" of the oxygen atom. Mo L. Cool would live on the game screen and pop up with info every so often throughout the game, triggered by keys the team placed in the level. By mid-Day 2, we had some Adventure Science Center guests come through to see what we were working on at the Game Jam. We decided it would be a perfect time to get some outside opinions on the game and let them play test the current version of the game. With an Xbox controller in hand, the 2 guests gave the game their best shot while providing us some helpful insights into where we could make adjustments and fixes to make the experience even better. By the end of Day 2, we had our completed prototype game, which we dubbed "Mind Over Matter." While we were able to build a complete game level and experience, there are still a few tweaks we'll be making for the final product. We'll be putting it out on our social channels plus this and other gaming sites for folks to download for free to play (very soon). It was great to see at the end of the weekend what all the other developers at the Game Jam had been working on. Each of them showed off their science-themed gaming creations to the group. Some had been working solo on their project, while others also worked in teams. Everyone had amazingly creative ideas and were able to get completed game experiences built over 2 days. We thoroughly enjoyed ourselves and look forward to future game jams! Here's a gameplay video showing our completed prototype from start to finish (that first part is tricky)! ASC Game Jam 9_17_2018 2_14_17 PM-1(4).mp4
  12. So im starting to build game for me and my friend to play but if it ends up good then i want it to be easily expandable. My question is ... Where do i learn how to set up a server? how to run code on my server? how do you open your server to the outside world. Not only your home/pc. I want to program my server in java because i'm fairly comfortable with java. I've decided i want a tcp server. Do i need separate server to handle log-ins, registers etc.? I've done a lot of googling and i still can't find any decent tutorials.
  13. Hi, I recently published a book focusing on cloth simulation for computer graphics. Details can be found here: http://www.morganclaypoolpublishers.com/catalog_Orig/product_info.php?cPath=22&amp;products_id=1295 and on Amazon: https://www.amazon.com/Simulation-Computer-Graphics-Synthesis-Computing/dp/1681734117/ Abstract: I hope you find it interesting! Thanks, Tuur
  14. Hi, I recently published a book focusing on cloth simulation for computer graphics. Details can be found here: http://www.morganclaypoolpublishers.com/catalog_Orig/product_info.php?cPath=22&amp;products_id=1295 and on Amazon: https://www.amazon.com/Simulation-Computer-Graphics-Synthesis-Computing/dp/1681734117/ Abstract: I hope you find it interesting! Thanks, Tuur View full story
  15. Hi there I'm creating this topic as an introduction to who I am and why I have found my self here. I'm a mature student(26) from England. I have just started My second year at college. So far I have learned a lot about making 2D games from my previous year. This second year is going to be involving more 3D stuff and using engines such as unity and 3DS max. which at the moment I have about an hours experience with. However I'am thoroughly enjoying it, even though I'am only on day 2 of my second year.I just have a few questions that I hope some of you lovely people can help me with. I Love Love Love video games, always have always will. I'm so excited to actually start making some games. How ever career wise I'm unsure as what path I should follow, Artist,animator,programmer ect, they all appeal to me. I've always wanted to set up a business and never new what until about a year ago when I first started studying. So I hope that in the future I will be an indie dev.Think I have rambled on enough now. I will list my questions. 1. What is the best career path to follow? I mean what is the industry lacking? 2.whats the best engine to start off with? so far I have only used construct 2. 3.Is programming as difficult as it sounds? whats the best language to use? 4.How can I get ahead of my fellow students? 5. what is your favorite game and why? I have more but I'll leave it be for now.
  16. Hi, I’d like to show you my current video project “Game Audio Lookout”. It is not a game itself but a series on YouTube about how music and sound design in games work. There is three episodes I produced within the last month and I’m planning to release them on a regular basis! Currently I made 3 episodes so far: Enhancing Gameplay with Music in Celeste - https://www.youtube.com/watch?v=NYjlfL7dHCQ On the surface, “Celeste” is a brutally hard 2D platforming game about climbing the imaginary Celeste Mountain but it is much more than that. It narrates a compelling story of main character Madeline fighting with her demon doppelgänger. Gameplay-wise, super tricky levels combined with tight controls let you fail and re-try over and over again. But what it makes it even more enjoyable is the wonderful soundtrack composed by Lena Raine we’ll have a look at in this episode of “Game Audio Lookout”. EarthBound - A Quirky Artistic Synergy of Story, Art and Music - https://www.youtube.com/watch?v=ZH4DqgvkE0k In fact, there’s many ways how the three elements writing, artwork and sound can play together. There’s AAA titles with cinematic writing, photorealistic graphics and epic orchestral music on the one hand. Another good example is the “Super Mario Odyssey” world “Steam Gardens” with its funky vibes due to a coherent artistic feel of character design, graphics and audio. But today, we’ll go back to the Super Nintendo era to have a look at one of the strangest games Nintendo ever created: “Earthbound” Deconstructing a Musical Level in Rayman Legends - https://www.youtube.com/watch?v=3UIhBZuj2HI Rayman Legends has found its way into many “Best Platformer Games of All-Time” lists. Though it closely fails to beat the uncrowned king Super Mario, it found a safe place next the Nintendo mascot. The Rayman series was created by French game designer Michel Ancel and started in 1995 with the 2D jump’n’run Rayman. It was followed by two 3D platforming games: Rayman 2 and Rayman 3. But the series went back to 2D sidescrolling with Rayman Origins in 2011. Origins was also the first Rayman game using the UbiArt Framwork which also was adopted by the 2013 release “Rayman Legends”. In this episode we’ll deconstruct one of the incredible musical stages in Rayman Legends. Playlist link to all episodes so far: https://www.youtube.com/watch?v=NYjlfL7dHCQ&list=PLBhIWrMLhhmowCQyCRaDEMWDH-l5lunnL Link to my channel: https://www.youtube.com/channel/UCm4XW_MrNfZrjQkj9iuxK9A
  17. Free until Tuesday, our 1st children's app for iOS, Abigail's Tales: First Day Butterflies.
  18. Piano Extreme is a great application to learning piano. Now you can play the piano anytime, anywhere, simply by connecting a computer keyboard to your smartphone via the USB OTG cable. In addition, the application also has a database of more than 650,000 songs, so you can easily play a song quickly. You can even play a song on your phone or directly connect to the Organ to practice. ★★★ Key Features ★★★ ✔ Full piano keyboard with 88 keys ✔ Supports a wide variety of keyboard instruments (Piano, Grand Piano, Pipe Organ, Harpsichord, Accordion, Electric Guitar, Harp, Cello Pizzicato, Guzheng, Nylon Guitar, Plucked String, Music Box, Sitar, Xylophone, Harp, Vibes, Clarinet, Ukulele, Brass, Thai Bells, Tabbla, Dizi, Banjo, Flute, Saxophone, Cellto, Hamonica, Trumpet, Violin, Panpipe, Maracas, Tuba, Dulcimer, Kalimba,...) ✔ Multi play modes help you practice more easily: Piano Tiles, Piano Keyboard, USB Keyboard, Sheet number & sheet notes ✔ Dual piano keyboard with full feature make playing music easier ✔ Support Sheet number & sheet notes with auto scroll ✔ Recording your song ✔ Connect and play on the computer keyboard ✔ Support the keyboard types on Everyone Piano✔ There are more than 650,000+ songs for you to practice Video: https://youtu.be/-9r36UOE7-k Download: https://play.google.com/store/apps/details?id=eop.everyone.piano.usb.keyboard&hl=en-us For any questions, please visit our Fanpage: https://www.facebook.com/PianoExtreme
  19. Dear GameDevs, I am plan on creating a video game. However, before I start creating the game, I would like to interview a game developer to understand a bit about the whole process of creating a game. The interview will be conducted via Skype video call or Skype Chat (I can also do discord) and will be very short (5-10 minutes). I want to interview any game developer (beginner or experienced). Regards, Shreyas Edit 1: Grammer
  20. So you're a filmmaker entering post-production on your film, a game developer working on music and audio triggers or perhaps a YouTuber wanting to enhance your videos. You need SFX and a music soundtrack but you might not have the budget to hire a professional composer or audio engineer. The question is: Can you still have a great commercial soundtrack and great SFX for your project utilizing only free resources? Definitely. Quick story about why I am writing this article: My career is in electronic music production, but I also love game design and have always wanted to create my own video game, so 2 years ago I decided to produce my first interactive horror visual novel. I was designing everything in-house: music, SFX, graphics, writing, everything. Many of you reading this are probably quite similar to me and are doing most of the work for your project yourself. I could handle the music, the writing, and the code, but there was no avoiding the obvious fact that I was terrible at drawing and I did not have the field-recording equipment necessary to record my own sound effects. I also did not have the budget to hire an audio engineer or an artist to provide me with SFX and the artwork needed for the game, so I had a dilemma. How do I immerse the player in my story without quality sound effects, artwork, and no budget to pay for them? Well, I did what I always do when I have a problem that seems impossible to overcome: I asked the internet. I spent days researching online and long story short I found dozens of websites providing free commercially-usable resources for my project. And imagine my surprise when a few of these free resources...didn't suck! Not only did I end up finishing my game without spending a penny, but I could still sell it! So I got to thinking, what about filmmakers, game developers, and YouTubers who already have great video and artwork but need great music and SFX? Are there equally-powerful free music libraries out there to search and download from? I did my research and once again found some incredible resources that I am going to share with you now! And not just that, but I'm going to help you incorporate and edit these free resources so they don't sound like you just downloaded them off random websites online. Here's what we are going to cover: Where to obtain free, commercially usable music & SFX for your project without sacrificing the quality of your end-product How to edit music and SFX you downloaded from widely different sources to create a unified soundtrack that works with your project How to create loops, fade-ins, fade-outs and layer audio to immerse the audience Licensing, what it means and what restrictions you have when using these resources (not many, I promise) How to change the format of your audio to work with your software Where to find volunteers or paid professionals if you can't find what you need So without boring you to death, let's get started with the best 9 websites to download free, commercially-usable music & SFX! TOP 5 FREE COMMERCIALLY USABLE MUSIC LIBRARIES: (For SFX, Keep Scrolling) JordanWinslow.me - My Personal Library of Hundreds of Electronic & Orchestral Soundtracks Arranged by Category for Free Download - License: Free Commercial Use With Attribution (See Terms of Service on Website) As I said before, I have been producing electronic music for over 14 years now, 5 years of which it has been my primary source of income. So I wanted to put together my own free resource for others to benefit from! These are some of my absolute best soundtracks, many of which are loopable. And I spent many days organizing them by category and mood to make it easier for you to find what you're looking for! And the best thing is, all of the tracks can be listened to without even leaving the page and can be easily downloaded in 1 click! Icons8 - Incredibly Well-Sorted, Professional Library of Hundreds of Songs from Various Artists - License: “Free for a Link” (See Website) Don’t be fooled by this company’s origin: They started off as graphic designers who made icons, thus Icons8. But they have evolved and got their hands on a rather large music library of various artists who have been curated by their team. Naturally, when a library is curated, it is subjective and therefore might not be to your tastes if you disagree with how they select their tracks for inclusion on their website, but it can’t hurt to take a look at their gallery since it is so incredibly well-sorted! Incompetech - A Classic Library of a Few Hundred Songs Ranging from Classic Rock to Jazz - License: Primarily Creative Commons: By Attribution 3.0 Incompetech has been around for quite some time and is recommended by many other bloggers because it provides a convenient category system. Unfortunately, the tracks are not organized by mood or tonal characteristics other than genre, so you will find tracks with the instruments you are looking for, but it may take some digging to find the appropriate mood you are looking for. dig cc mixter - A Massive Library of Non-Categorized Music Submitted by Various Artists - License: Primarily Creative Commons: By Attribution 3.0 Unfortunately dig cc mixter, though a MASSIVE resource with tons of great tracks, is not a great place to find music in the specific genre you are looking for as there are no categories and no search functions to speak of. If you are willing to spend the time looking through thousands of tracks though, you will find a few hidden gems on here that will fit perfectly in your project! Josh Woodward - 200+ Primarily Acoustic & Electric Guitar Driven Songs - License: Commercial Use With Attribution (See Website for Terms) The best part about Josh Woodward’s free commercially usable library is that he has tagged each and every song with different moods, themes, and styles to make it very easy for Filmmakers, Game Developers & Artists to search through tracks to find songs in the mood they are looking for! Honorable Mention: Partners in Rhyme - A Little Over 100 Free Unsorted Music Loops - License: Free for a “Thanks” or With Attribution (Vague, See Terms on Website) This library is more of a last resort as the tracks are unsorted and not as high quality as others on this list, however free is free and these tracks would be suitable for app developers or creators who are looking for this type of sound. TOP 3 FREE COMMERCIALLY USABLE SFX LIBRARIES: ZapSplat - 27,000+ Searchable Sound Effects Recorded by Professionals - License: Free Commercial Use With Attribution ZapSplat is by far my favorite free SFX resource. When I first discovered their website it had far fewer audio files and a much less appealing logo design. It appears they are dedicated to growth because they have completely redesigned their branding and added thousands of audio clips to their website! I personally used this resource in the development of my Horror Visual Novel titled “The Watchers.” Soundeffects+ - Over 5000 Free Sound Effects Sorted by 16 Categories - License: Free Commercial Use With Attribution (See Website for More Details) Soundeffects+ offers a large library sorted by the categories visible in the screenshot above. See something you’re looking for? Click the link and go check it out. Otherwise, keep scrolling! Videvo - 400 Free Sound Effects Sorted by Over 20 Categories - License: Complicated, each sound effect has it’s own license and it varies. Check each sound page for the license. Videvo is primarily a stock video provider with many free video clips, but they are also breaking into sound as well and have an expanding library of 440 clips which isn’t much but they are very well sorted so it should be easy to find something unique for your project. Make sure you check their licensing page as their licensing is quite complex compared to other websites. In the above 9 websites, you should be able to obtain all of the sound effects and music for your project as long as you are willing to put in the time filtering and searching through these libraries to find what you are looking for. It may seem like a daunting task, but I have done it personally myself in my game development and have had great success! My suggestion to you is download anything that sounds interesting to you at the time, even if you are unsure if you can use it in your project or not, and copy-paste the license information into a .txt file so you don’t forget to give proper attribution. Part 2: How to Choose the Right Music & SFX for Each Scene, and How to Edit Audio to Achieve Your Goals Once you have a selection of songs or SFX for your project it's time to edit. Since most of you will be using many different types of software I am only going to cover how to edit music in 3rd party FREE software, namely Audacity. Don't knock it, Audacity is very powerful software and unless you're considering a career in audio engineering, music production, sound design or mixing, this is probably the only tool you'll ever need. If you want more professional audio editing tools I highly suggest iZotope's RX6 software as it allows you to do incredible things such as take backgrounds out of one scene and move them into another, repair poor recordings and dubbing, and more. How to loop music that wasn't originally recorded as a loop: To achieve this the easiest method is to create a soft fade-in and fade-out on the track. You can experiment with different values but 1-2 seconds on each end usually suffices unless the music is louder or more complex, then you can try up to 4 seconds on each end or even more for atmospheric loops. Here is an easy to follow video tutorial on fade-ins, fade-outs and looping audio: https://youtu.be/ryLpfVecUDs How to make everything sound cohesive, as if everything was designed specifically for your project: Keep in mind, layering audio is an incredibly easy, yet very powerful tool at your disposal. You can loop one audio track while another one continues to play underneath it to keep the player from noticing the loop. You can even create elaborate scenes with chattering people, blowing wind, ambient tones, and musical accompaniment. All of these types of atmospheres can be downloaded at the above free resources! It is important to consider the stylistic and tonal changes of the music you downloaded when switching from one song to another. Don't just go from a percussive action track straight into a somber atmospheric melody. Transitioning is key: utilize fade-ins and fade-outs during most, if not all of your audio changes so the experience draws the audience further into your story rather than taking their focus off the screen and into the audio. Oh yeah, and... Epic Music Does Not Make a Boring Scene More Epic! I think there is a huge problem in the video game industry specifically (filmmakers don't scoff, it's a problem in your industry too, but perhaps less pronounced) where game developers think if they make the music louder and louder and more and more epic it will somehow make the game more fun or the experience more immersive. Well, it doesn't. Many times have I been playing through a game or watching a film where the audio is 10X more dramatic than what is happening on screen and it makes me just want to mute it or turn it down. This is not the experience you want to give your audience, trust me. Consider the emotion of every scene before you place any music and ensure that listening to the music by itself gives you the feeling you want the player to have, but don't expect the music and sound effects to do the work for you on making the scene enjoyable and immersive! Once you have a rough draft of your soundtrack & SFX library, go back to Step 1 and make SURE you didn’t miss any audio that may be in other categories you didn’t listen to that might fit the scenes you’re working on. Part 3: Obtain the Appropriate License to Use the Music & SFX and Ensure You Have Given Proper Attribution Whenever you’re working with royalty free music & SFX you always have to keep in mind that just because the music is free doesn’t mean you don’t have to cite the author. For example, if you’re using my personal Royalty Free Music Catalog I linked to earlier then this part is very simple: If you will not make money from your project directly or indirectly (this includes advertisements and YouTube monetization) then all you have to do is put “Music Downloaded From https://JordanWinslow.Me/RoyaltyFreeMusic” in your credits, description or somewhere easily visible in your project. If you will make money from your project directly or indirectly, simply fill out the Commercial License Request Form found on the website and enter in the title of your project and your project’s information for EACH project you will require music for. All of the sites I linked above have very similar licensing agreements, so just read up on the individual website before you download, and ensure you create a .txt document with all the links you need so you don’t forget! The best part about all of the above libraries is that almost every song and SFX clip you download can be legally edited, looped, layered, remixed and changed any way you see fit! The only restriction is you cannot sell or distribute your edited or remixed audio clips as standalone clips if they were your own because technically the author still retains copyright ownership over the files. But that does not mean you can't sell your film or video game with the edited audio! If you are confused, double-check the licensing page on each website to be sure. And that’s how you spend time instead of money to create a custom soundtrack for your film, video game or YouTube video! What to Do if you Still Haven’t Found What You’re Looking For, or the Audio You Downloaded isn’t the Correct Format If the audio you downloaded isn’t in the correct format for your software, you can use the free open source tool Audacity to convert it by using the "Export" menu to change the format of your audio or use this free online audio converter. Keep in mind that certain audio formats like .mp3 have restrictions on where they can be used. I recommend .ogg since it is an open source audio format with great quality and compression. Now if for some reason you don’t find the music or SFX you need in those libraries of thousands of songs and SFX, it’s probably time to consider looking for a volunteer composer or simply hiring a professional. You can find low-cost audio engineers and composers on websites like Fiverr and Upwork, but keep in mind that quality products do not often come with low price tags, be wary of anything that seems "too good to be true" because it probably is. And be sure to listen to their portfolio thoroughly before making a decision! I know it’s not easy to make a career out of your passions when you’re on a limited budget, believe me, just read My Story if you want to know how I spent 6 years in poverty before becoming a successful electronic music producer & composer. But I guarantee if you put the time into finding music and SFX in the above libraries, or looking for a great volunteer, you can get your project done at no cost other than the hardware and software you purchased! If you have any questions, feel free to reach out to me any time! See you later, creators! Electronic Music Producer, Composer & Audio Engineer https://JordanWinslow.Me
  21. Hello future and present game designers! I've researched into this topic and even had an interview with a well-known composer about whether I should attend a music school. Acquiring the knowledge, contacts, and confidence in music makes attending one seem like a good choice. Also, would my school of choice matter in this decision? In my case, the University of Southern California is the more accredited school for video game designers, but the University of Irvine is closer to home (where I won't have to move away). Any advice is appreciated. Thanks.
  22. Hi! How do you calculate tournament timings in online games? For example, if it's morning here (everyone is awake) and if it's night on the other side of the planet (everyone is asleep), then how do you let players all around the world play the tournament? Is it that players have to select their country before starting a game and accordingly the tournament is created for each nation depending on their time zone? Can you give me some examples of games using different methods, if any? I hope you understand what I'm trying to ask here? Even I'm not sure if I asked the right question? Thanks!
  23. Hello once again to this entry to our devblog. This one will show the basics how we reworked the compound clouds to look - let's be honest - a lot better than they did before. The last version consisted of one class CompoundCloud which was represented by a procedural mesh component. That one started out as a simple cube and then offset the positions of the vertices by a randomly chosen amount between two previously chosen values. That looked... functional at best. And interaction with the player was pretty much not practical and computationally expensive. So the next idea we came up with was to make a cloud of sphere meshes and just have the player collect every one of those. This resulted in a new hierarchy. At the top there's still the CompoundCloud but it now has an array of Compound_ParticleComponents for its representation. Each one of those has a sphere mesh to handle collision and a particle system to look pretty. A short demo of the new system can be found here. We should probably start with the particle system. Not many steps requiered here. 1. Create a new particle system 2. Click on "Required" and in the first section ("Emitter") set a material (will be shown later) and the Screen Alignment to "PSA Rectangle" (this might not make a difference to the standard but it's set to that for our system). Then scroll down and set a cutout testure in the section "Particle Cutout". We used our heart icon you might have seen in one of our update videos. (we also changed the background color to something light so you can actually see what is happening) 3. Click an Spawn. There's a little more to do here. First of all set the rate in the "Spawn" section to "Distribution Float Uniform". Same for the rate scale. Play around with the values a bit or just take what we got there. Next set the particle burst method to interplated. The burst scale distribution should be "Distribution Float Particle Parameter". Once again play around with the values until you have something you like. 4. Go into "Lifetime" and set Min to 2 and Max to 1.1 (Again, once you're done with this tutorial just play around with this values) 5. Go to "Initial Velocity" and reduce the Min and Max values. We recommend between 2 for all Max and -2 for all Min. This will keep your particles closer together and not have them shoot in one direction. 6. Next up add a seeded initial location and set its bounds to something you like. 7. And the final step is to add a seeded sphere. You should now have something roughly looking like this. The Material: (absolutly nothing special) Now for the interesing part: The code. This is perfectly doable in blueprints, too but since we're mostly working in C++ I'll show how we solved it in code. I'm also only gonna show the constructors of the CompoundCloud class and the Compound_ParticleComponent class since this tutorial mostly deals with the look of the clouds. If you're interested in how any other part works just let me know and maybe I'll make a short explanation for that in the future. The code then: uint8 particleCount = StaticMaths::RR(CLOUD_PARTICLE_MIN, CLOUD_PARTICLE_MAX); We get a random value for the number particle systems we want to use. In our case this is our own function that simply determines a number between two other numbers. std::string center = "CenterSystem"; UCompound_ParticleComponent_Cell* temp = CreateDefaultSubobject<UCompound_ParticleComponent_Cell>(FName(center.c_str())); particles.Add(temp); RootComponent = temp; Then we set up the center component. All the other systems will circle around this one. This also functions as the rootComponent for the actor. The UCompound_ParticleComponent_Cell is the second class and we will deal with it later. for (uint8 i = 0; i < 100; i++) { for (int j = 0; j < pow(i, 2); j++) { //define the name for the current particle system //ParticleSystem_<circleNum>_<Num>_<randomSeed> std::string name = "ParticleSystem_"; name.append({ static_cast<char>((i + 1)) }); name.append({ "_" }); name.append({ static_cast<char>(j + 1) }); name.append({ "_" }); name.append({ static_cast<char>(j + i) }); //create the particle system with the newly defined name UCompound_ParticleComponent_Cell* temp = CreateDefaultSubobject<UCompound_ParticleComponent_Cell>(name.c_str()); particles.Add(temp); temp->SetupAttachment(RootComponent); //set up random location within a circle double a = (((double)rand() / (RAND_MAX)) + 1) * 2 * PI; double r = (CLOUD_RADIUS_STEPS * (i + 1)) * sqrt(((double)rand() / (RAND_MAX)) + 1); double x = r * cos(a); double y = r * sin(a); FVector location = FVector(x, y, 0); temp->SetRelativeLocation(location); //finally: check if number of elements in array is particle count //if so, stop this loop if (particleCount - 1 == particles.Num()) { break; i = 100; j = pow(i, 2); } } if (particleCount - 1 == particles.Num()) { break; i = 100; } } This part is where the magic happens. Basically we want to have somewhat circular shapes around the center system. So the outer for-loop with i counts the circles. The 100 is a dummy value since there will never be that many circles and it would be a waste of resources to actually calculate the true number of circles. We only need to know the number of particleComponents which is our particleCount. The inner loop with j counts from 0 to i to the power of 2. So on every circle there are i*i particleComponents. Next up is a bit of naming. Not really relevant. Then we create another particleComponent and add it to the actor and the array. What comes next might be interesting for some: this formular basically determines a random position on a circle. So we take (i + 1) times our pre-defined cloud radius steps to get the radius of our current circle and we have all the data we need. Everything else can be determined from that and a random number. Whe then set that location for the particleComponent. At the end of the inner loop we check if we already have all the particles we need. If so set i and j to their max values so the loops stop. This is why we didn't need to calculate how many circles there will be when we start the loops. Don't worry, the particleComponent involves less maths. //instantiate mesh component and particle system component particleSystem = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("ParticleSystem")); mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh")); particleSystem->SetupAttachment(this); mesh->SetupAttachment(this); //Collision binding mesh->bGenerateOverlapEvents = true; mesh->OnComponentBeginOverlap.AddDynamic(this, &UCompound_ParticleComponent_Cell::BeginOverlap); mesh->OnComponentEndOverlap.AddDynamic(this, &UCompound_ParticleComponent_Cell::EndOverlap); We create default subobject for the mesh and the particles system and then bind the collision functions. Easy as that. //get the mesh and set it auto meshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Game/Meshes/ball.ball'")); if (meshAsset.Object != nullptr) { mesh->SetStaticMesh(meshAsset.Object); mesh->SetVisibility(false); mesh->RelativeScale3D = FVector(5.f); } else { Logging::Log("Could not find Asset 'ball' at path in Compound_ParticleComponent_Cell"); } Then we load the mesh and set it. We also scales up the sphere mesh since it turned out to be way too small and the player would miss it a lot of the time. (That Logging::Log there doesn't really concern you. It's a function we wrote that simple writes a message into a file and onto the screen. Helpful for debugging. I left it in there for this tutorial because I think you should always have something in your code tell you when something goes wrong.) //get the needed particle system and set it in the component try { //static ConstructorHelpers::FObjectFinder<UParticleSystem> psAsset(TEXT("ParticleSystem'/Game/ParticleSystems/PS_CompoundCloud_SingleCelled.PS_CompoundCloud_SingleCelled'")); auto psAsset = ConstructorHelpers::FObjectFinderOptional<UParticleSystem>(TEXT("ParticleSystem'/Game/ParticleSystems/PS_CompoundCloud.PS_CompoundCloud'")); if (psAsset.Succeeded()) { particleSystemType = psAsset.Get(); particleSystem->SetTemplate(particleSystemType); } else { Logging::Log("Could not find Asset 'PS_CompoundCloud_SingleCelled' at path in Compound_ParticleComponent_Cell"); } //particleSystem->Template = particleSystemType; } catch (int e) { Logging::Log("Could not find Asset 'PS_CompoundCloud_SingleCelled' at path in Compound_ParticleComponent_Cell\nCause: FObjectFinder Access Violation"); Logging::Log(e); } We had some trouble loading particleSystems this way so I left in both ways to do it and the try-catch block in case one of you might have a similar problem. So that's basically it. Bye and keep on evolving.
  24. Wojtek Mos

    Game Industry Conference

    With more than 3.200 attendees, over 500 visiting companies, 121 talks and plenty of B2B opportunities, Game Industry Conference is the biggest game dev event in Central and Eastern Europe. Set to run for three days plus the side events day, the conference brings together the industry experts, professionals and important figures, providing them with an environment where they can make connections, exchange knowledge and present their ideas. Game Industry Conference takes place alongside the Poznan Game Arena, one of the most important and largest game expos in Europe. Over 71.000 visitors enjoy the show by testing games and hardware from more than 130 expositors. The two events form a significant gateway into the Central and Eastern Europe video game industry as well as the best place to meet most of the people from the Polish game industry, which, with more than 400 studios and 5.000 people working in games development, is one of the most dynamic and fastest-growing industries in the region.
  25. Georgia Game Developers Association announced CIMFest 2018 for July 14! This weekend, on July 14th, the Georgia Game Developers Association is holding their third annual Columbus Interactive Media Festival (CIMFest). This event is a yearly programmed event that brings together a variety game industry talents throughout the heart of Georgia and looking to support the growing network of southern game developers and students throughout the region. CIMFest is a single day event hosted by Columbus State University, held at the Student Davidson Center. Check-in will start around 9AM EST and will conclude around 6PM EST. CIMFest will be featuring guest speakers like Chris Patterson, owner of Bricks and Minifigs in Columbus; Jesse James Allen, editorial director at Falcon’s Creative Group, a theme park and interactive design studio in Orlando; and Joe Cassavaugh, the CEO, designer and engineer of Puzzles by Joe. “We have seen a significant interest in both digital entertainment and video game development from the Columbus area. CIMFest is the perfect opportunity for students and professional developers alike to increase their skills and reach. Anyone interested in game development would benefit from going,” said Andrew Greenberg, Executive Director of the Georgia Game Developers Association. This event is open to the public but offers lower rates for GGDA members, Students (School ID required), and CSU Alumni. All attendees will receive full access to all programming associated with this event. Registration is available here for this event, payment will be acquired at the door upon arrival. More information on scheduled speakers and sessions can be found at the official site for the Georgia Game Developers Association.
  • 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!