All Activity

This stream auto-updates     

  1. Past hour
  2. I don't know any links for good side-scroller tutorials, but the best tutorial I've ever found, and one that works with no modifications, other than using glew instead of glad to load opengl extentions, is!In-Practice/2D-Game/Breakout It'll teach you most of what you'll need to get started on a side-scroller. It uses opengl, and you make the game from scratch/with no engine. It uses libraries, but I haven't had any problems getting them to work. Libraries are there to make it quicker, and easier to get things running, so I suggest using them. Its in c++, I recommend using that to learn how to make the breakout game if you decide to follow it, then use whatever you're more comfortable with, and try to convert it to use that instead. Using 3D to render 2D things isn't that complicated. It's sometimes simpler than rendering 3D correctly, and if you have a graphics card that's up to date you can use opengl on windows. Opengl requires a lot less lines to do the same things in directx, and does everything that directx can as far as graphics are concerned.
  3. Exploring Level Design: Ridge Racer 1993

    The contrast with Sega Rally's "High Technology vs Down and Dirty environments" is also a subject I will talk about later.
  4. OK, so here is another point in Games Design I want to make. Ridge Racer, 1993, and how it created a realistic, almost fully functional city in just 1993. So almost everyone remembers the game Ridge Racer, released in the Arcades in 1993, the game was like Wipeout, marketed towards an audience of Boy Racers, Tuners and Club Culture. The game featured club music samples from the likes of The Prodigy, Kraftwerk and even Fatboy Slim's basic mix tapes. But here is something very special I want to tell you about Ridge Racer. It was pretty much one of the first games in history to have a realistic city environment that was also semi-functional. The game had a fully functioning starting light system(in the arcade version at least), an electronic checkpoint system, and a city that looks straight out of the future, with a replica of the Renaissance Center in the middle of it, also with a screen that acts as a live scoreboard. This means that the game's levels were way ahead of their time. And that it also featured a construction site with diggers creating what appears to be a new Hotel while the Airport is still functioning. And that's what I want to say that's even more interesting about the Level Design. Over the years, Ridge City was from a small coastal city to a massive power-house, and evolved into a massive Metropolis by the time Ridge Racer V came out. The original 1993 game also included planes that flew above, helicopters that also apparently had a suspicious looking "SEGA" logo on them. And of course a highway and a second road that functioned with Lorries and Cars. The game's level design though, is so brilliant, and the handling easily accessible, that here is what it's like to see the game in action. And this is what the game appears as, notice the awesome Level Design and everything, the cheer of the crowds, and the Ridge Racer theme playing. Michael G's voice booming. It's such an awesome game, with equally awesome level design. And just an example that sometimes Racing Games have the best level design. I am considering next doing Kingdom Hearts or Petscop, even though Petscop technically isn't a video game. I may be able to do some analysis into the level design. Any levels with fully functioning elements though, are my favourites. Shinji.
  5. In this daily blog (and video)-series I take a first impressions look at the best mobile games that I come by. Be sure to share your favorite mobile game with the rest of us in the comments below! Quantum Siege is a promising RTS game with 140 campaign levels in addition to the PVP battles, over 40 units to pick from to build your deck of units, and gorgeous graphics! What annoyed me the most was what seemed to be unfairly balanced online matches, but I assume that's primarily because the game has not officially launched yet. Definitely recommend checking it out if it's available in your country, as I think this game could become huge! Just know that the game comes with a 384mb additional download after installing! My thoughts on Quantum Siege: Google Play: iOS: Subscribe on YouTube for more commentaries: Or join me on Facebook: Or Instagram: Or Twitter:
  6. MMORPG, some ideas...

    Mortal Online is almost there, they just need some bugs fixed, I wish I had the $$ for the rights so I could tweak it some... I really love the thrall sys from Conan Exiles, that would be awesome in MO...
  7. Cache Coherency and Object Update

    What are these proxies? surely the same mesh data structure can be updated or replaced by an animation/movement update in one thread and read out to be rendered in another thread, and the two (or more) threads can simply iterate over all meshes in use, in the same data structure, in a plain producer-consumer pattern. You just need to ensure, with appropriate locking, that the rendering thread doesn't attempt to render meshes before they are updated; there's no need to create "messages" for each mesh. For example, if there is a collection of "mesh" components (or "mesh animation state" components, referencing shared immutable and read-only mesh data) and the threads process items in order, you only need to maintain the index of the last updated mesh.
  8. I know I'll not buy or support anything Cherrimochi does or anything Square Enix Collective is involved in after this debacle and I'd advise everyone to do the same and just stick to Zero Escape, Lone Survivor, other old games, free room escape Flash games, etc. if you want puzzles, mystery and horror. If game writing or art or puzzles were good (and plentiful: not 1 puzzle, 1 minute of voice acting, 3 minutes of anime) I could forgive a lot of technicalities like I do with the entire Zero Escape series but they are lacking in very many ways too, in addition to all the technical problems. The fact a game that is technically VN went through weeks of testing, programming, polishing and what not (according to what they say) and then you can break in on day 1 by clicking through dialogues too fast is off the scale incompetence and that's just the beginning. I can hardly buy the pressured by publisher excuse when they went to events willy nilly over two years, had way more money than they asked for initially and took twice as much time as they planned on making this AND had extra funds out of the money they got thanks to Square Enix taking over few of the things (see below). Squre Enix (Collective) did the marketing/PR for them and got them into all these events and interviews by giving them places at their boots and so on of course and it says so in the emails (which they say, allowed them to put the PR, QA and marketing funds back into development.. that went well), but I'd assume that you can't just go, overhype your game to Squre Enix of all people and have them help you and wedge you into top industry events across 3 continents. I thought Square Enix has business acumen to be able to separate hype from genuine brilliance but evidently not. You can see the credits mentioning all the external help here (that's not my video): This is more similar to No Man's Sky debacle where it was Sony propping up Sean Murry and ending up with a foot in their mouth when it turned out he overhyped the game. I wonder if I should just write to Square Enix (or Collective, as little faith I have in them) directly just for the hell of it and to cause Cherrimochi some headaches at this point for being dishonest and to b*tch for a Steam key, just to post my long negative review on Steam. Especially since they ignored my email with questions about updates for DRM free users, lack of Steam key despite what was written and missing features that they didn't put on their post-launch road map.
  9. Cache Coherency and Object Update

    This makes BusData an abstract type. Even if you are bending over backwards to avoid ordinary polymorphism and virtual method calls, you still have an abstract class that contains infrastructure but no useful data, several derived concrete classes that add useful data, and an update processing that treats these objects uniformly (everything is a BusData) as far as possible.
  10. Today
  11. How do i access the sound buffer for win32 ?

    Hi, thanks for the reply, i dont like to install stuff on my PC, also dont like to make end-users install stuff. I had found some code ( untested ) once, only i lost it and cant find it back.
  12. How do i access the sound buffer for win32 ?

    You don't have direct access to the kernel mixer from user-mode applications. Instead, use a low-level API such as XAudio. This allows you to submit your own buffers to be mixed to the audio output.
  13. 3D I like to learn about BSP rendering

    Thank you Joe, edittor wont be a problem, i also made a 3D edittor already it looks like 3D max. Yes that is what i mean for all X pixels. What you are saying is that it would be the best to make wolfenstein with a BSP ?, sounds intresting to save CPU. I,m reading your post carefully now.
  14. 3D I like to learn about BSP rendering

    For Wolfenstein: Not for each pixel, but for each vertical span (so for 320x200 display, you need to raycast 320 times - probably you meant that already and that's right.). If this sounds inefficient, i agree. Comparing this with a BSP of (optionally angled) wall segments we get something faster: Sorting segments front to back is just a traversal of a binary tree, you decide which child to visit first by a simple test determinating on which side of the splitting line the camera is. So while traversing the tree we draw walls as they appear and track occlusion: The first wall covers a horizontal range, say from 0 to 100. The next wall to draw then has 50-150. Clipping that against already drawn space gives just 100-150. Next wall has 20-70. We clip it away completely and draw nothing. Next wall has 70-320, we draw 150 - 320. Now we know the screen is completely full and any wall coming after this must be occluded - wer're done. So this is less work than 320 traced rays, similar to rasterizing triangles is usually faster than raytracing. Tracking occlusion can be done by a linked list of full/empty spaces, the list can have 320 entries at maximum, so we can just use an array of that size. (''Span list") Additionally you can chack interior nodes against the span list to reject full branches of the BSP tree early. This is quite simple. In my case it got more complex because i supported brushes of different height and multiple brushes on top of each other with empty space in between. But for a Wolfenstein restricted world it sould be almost as easy to implement as raycasting. A little more extra work is to write editor and BSP compiler.
  15. 3D I like to learn about BSP rendering

    btw : Do i need to cast a ray for every horizontal pixel ? ( x axis ). Does wolfenstein cast a ray for every pixel ?
  16. How do i access the sound buffer for win32 ?

    Hi, i have a question about accessing the sound buffer for win32. How do i do that ? I like to fill it with bytes, so i can generate realtime digital audio. thanks in advance
  17. For a sprite based 2D RPG style game, how should assets such as textures, animations, music and sound effects be distributed to and accessed by game objects? Assuming you have a resource manager dedicated to loading and containing the resources, should this manager be passed indiscriminately to wherever there is a need for a resource(s)? Should the resource manager segregate various textures and animations from sprite sheets as they are loaded and hold segregated sets (maps/lists) of these textures and animations based on a pre-determined need by different game objects so that they can be quickly set up? By this I mean, where you are certain object A needs only a set of X animations and Y sound effects throughout the lifetime of the program. If all textures, animations, music and sound effects should not be segregated as they are loaded and should instead each be stored in one big container of their respective type for all objects to freely choose from, how should the objects retrieve the resources they need efficiently and with minimal lines of code? Any object could hold any combination of textures, animations or sound effects held by the resource manager. I believe it would be easy with this approach to have very many lines of code dedicated to retrieving all the resources an object will need, for every object. Finally, should objects hold resources at all? At this point I don't see why objects shouldn't hold their own graphical resources since the objects contain the data such as position, width and height that the resources would need in order to be rendered correctly. However, I'm not so sure about resources such as sound effects, since these types of resources don't need any information from the object in order to play. Should they be held and controlled elsewhere, by dedicated music and sound effect playing systems?
  18. DX11 Tiled Shading - Cone Culling

    While I am using Tiled Based Shading I don't have any tile slices because its only 2D.. Sure in case of clustered shading it would make sense to place a sphere in a cell, because the cells are placed in depth too. In my case I only have 2D grid cells where I need to check if a cone will be visible on that tile.. Actually I tried some complex Ray/Cone test where I shot rays from the corners+center of a cell. That works, but because I only check 5 points, there are still cases where the test fails.. and also its not very fast.. I think the solution is easier as it looks.. While my tiles are only 2D also the cone should be also converted in a 2D triangle.. I only need to find a way to test a 2D rectangle/triangle for intersection plus the case when the camera is within the cone..
  19. 3D I like to learn about BSP rendering

    I looked at the wolfenstein code, i did not find something to start with, many asm code in there also, i saw this weird thing : #define TILESHIFT 161 in the file : wl_def.h If you shift something 161 positions you might as well set the value to zero. I,m going to search for more code examples if there are any more raycast examples.
  20. Assuming you always want to load a whole file,instead of some part of it could be tricky, in particular if it also involves decompressing the file while reading. (A plain archive format like tar that simply concatenates files is simpler, as you can simply seek to the correct spot, assuming the systems support file seeking.)
  21. Yep, you're getting closer Indentation looks fine (4 spaces is recommended). I'd refrain from putting things after a colon, ie if replay == "y": stats() UI() instead of if replay == "y": stats(), UI () Note: If you use the "<>" thing in the edit-bar, you get these code blocks, which preserve your indents better. (Copy code, press "<>", paste code in box, select "python" bottom right, press "insert" bottom left.) The "," in your line is actually an error too, don't try to do more than one thing at a line, Python works best doing 1 thing at 1 line. (This holds for your multi-print lines too.) When I run the program I get $ python3 Are you tough enough to play? y/ny Traceback (most recent call last): File "", line 36, in <module> if replay == "y": stats(), UI () File "", line 10, in UI print (attributes) NameError: name 'attributes' is not defined The reason for this is that functions have local variables. See the following example: def f(): # Here x doesn't exist yet x = 1 # Construct 'x', and give it a value print(x) # x still exists as long as we are in function f # Here we are outside f, and x doesn't exist f() # Call the function, inside f, x exists for a while, but it disappears again when it returns here print(x) # Will give an error, as x only exists within function f. How to do this instead? The standard solution is to return values to the caller, and store them in variables. The variables are then passed on to the next function: def stats(): again = "" buy = "" wallet = 30 attributes = {"Dexterity": 30, "Wisdom":30, "Health":30, "Strength":30} return again, buy, wallet, attributes def UI(again, buy, wallet, attributes): # Omitting all the other code replay = input("Are you tough enough to play? y/n") if replay == "y": again, buy, wallet, attributes = stats() UI(again, buy, wallet, attributes) I added a "return" statement at the end of "stats", which returns the 4 values that you create. At the bottom of the file, I catch these values into variables, with "again, buy, wallet, attributes = stats()" so the main program gets the values. It then passes them on to the other function. Other random things I noticed: lines = ("1 = exit\n" + "2 = spend money on attributes\n" + " for your character.\n" + "3 = sell an attribute.\n" + "4 = sell off an entire attribute.\n" + "Choose a number from 1-4:") choice = int(input(lines)) The "input" line is long, you can break it into smaller pieces by first constructing the string as a separate statement, before asking for input. In my code, I spend 6 lines on making the menu, nicely putting each line under each other, so it's easy to see what it prints. Don't forget the parentheses here, or Python gets confused on missing values behind the "+". Finally, you don't need to call the UI function, like you do: while again != "n": # ... while choice in choices: # ... again = input ("play again y/n") if again == "y": UI () Instead, let the top-while handle that: while again != "n": # ... while choice in choices: # ... again = input ("play again y/n") break # Break out of the "while choice in choices", so it jumps to the "while again != "n" statement, and loops back to the input.
  22. Generally, each character has everything in one behaviour tree, and that is responsible for choosing and executing whatever they are doing at that time. Some systems (e.g. Unreal) allow you to factor out subtrees into different files for convenience and modularity. It looks like LibGDX AI offers something like this too with the 'include' concept. But the top-level view is the same - one character is executing one tree at all times. My advice is to start with one single tree, and factor bits out later as necessary to keep it manageable. Regarding checking conditions and decision making, it's sometimes easier to reframe the problem. A behaviour tree provides 2 key features: The ability to try a series of things in priority order until it finds one that it can carry out. (This is a Selector node.) The ability to perform several things in order until one fails. (This is a Sequence node.) Additionally many systems offer some sort of Conditional node or Decorator system to add extra conditions on in a modular way. Pretty much everything you want can be expressed by some arbitrary combination or nesting of the above (and often there are several alternative approaches). For example, for your "enter a building, but only if the character has keys", might start as a simple Sequence, GoTo -> Open Door -> GoTo -> Close door just you said. But you could add a Decorator on that sequence which is "Fail if doesn't have keys", which means the character would attempt the next action after that Sequence instead. (That could be a 'Find Keys' task of some sort.) Regarding the concept of being 'idle', that basically refers to a low-priority state - and therefore that would be the last node of a Selector. It would only execute if more high priority nodes under that same Selector - e.g. a "Combat" node - fail (e.g. because you have a decorator that says 'Fail if there's no threat', or you simply make the Combat task fail if there's nothing to fight). The need to be able to interrupt a task when circumstances change is obviously important. A naive behaviour tree system might evaluate the tree every frame/update in order to ensure that it's always up to date, and in such a system you would just use the conditionals or decorators as normal, and higher priority tasks would be picked in Selector nodes whenever they apply, as normal. However, many behaviour tree implementations don't want to re-evaluate the tree all the time as it's quite inefficient, and they ask you to explicitly specify the conditions under which the tree is re-evaluated when a task is ongoing. In the LibGDX AI system this appears to be the role of the 'dynamic guard selector'. Note that each behaviour tree implementation is different, so it's often hard to translate a concept from one style of BT to another style until you're sufficiently familiar with both.
  23. Hi, and welcome. You're missing a step here, python is a programming language where you write functions, while Unity is a game engine, a huge library with many functions that help you make a game. Unity uses the C# programming language for writing functions (ie for using the available set of functions of Unity). The above is a bit simplified, as C# is an object-oriented language, so many functions are hiding in classes. But overall, for your interest, a logical path for you is: python -> C# -> C# + unity. There is also a Mono compiler for C#, which may be more to your liking. Sounds good. Text-based has the huge advantage that graphics don't distract you, which makes programming a LOT simpler. That gives you the opportunity to focus on Python programming itself. For your information, the sort-of standard article to read here is which includes a list of suggested projects. It seems to skip the text-based part, but I'd say keep it. As you will find out, there is a stage before it, namely deciding how it will actually work, at a lower level of detail. What objects play a role there, and what properties do they need for the functionality (eg a shop needs a set of things you can buy, each of these things needs a price. The adventurer must have money (trade-in with other items). So you must have a way to give money or items, and get items (and probably money too, eventually). Items must have an owner (well, at least one, maybe more owners?) I play this kind of think-games while doing other things that don't need much attention, like walking. Then I re-organize my thoughts by objects, so you get a list of objects that play a role and a set of properties that each item has. You also get a set of functions (like "buy" or "sell", or "look at available items") that you need in one way or another. Doing this before coding gives you more insight in what to code, and which cases to cover.
  24. I use this:
  25. "I will define 1 global with the base folder for the application, the rest will 'inherit' from there" - it's not safe to assume that you can store all your read/write files in the same place as your read only files. Usually there is a different location for "program data" to that of "user data", not only because there could be more than one user accessing the same program, but for security reasons. "file extensions can be longer than 3 characters (in Linux based FreeBSD on PS4)" - file extensions are irrelevant. "I can simply define a small list of defined subfolders (under root/ base), because it won't be more then 5 to 10 folders in total (data/shaders, data/textures, data/objects, data/sound etc.) " - you probably do want a system like this of "well-known" locations, just don't assume they can all be located under one top level directory. Consider Unity: it offers Application.dataPath (application data, considered read only), Application.persistentDataPath (per-user data), and Application.temporaryCachePath (scratch pad, not intended to persist). You would probably have your game assets relative to the dataPath, but configuration and settings relative to the persistentDataPath.
  26. Text Based RPG

    There is so much structure in this kind of programs that the only sane option is to evolve to an OO-way of writing the code. You make structs for each kind of data, then for each struct you have a set of functions that take a pointer to "its" struct as the first argument. For keeping track of what function does what, use a name convention for the function name, eg "structname_function(structname *this, ...)". I found this pattern already before OO was invented (likely I have been writing code too long ). The simple form of the above supports single inheritance, by putting the base struct as its first member. You don't get overloading or polymorphism easily, but usually that's not needed. Now, if you evolve to this kind of code structure anyway, I don't see the point of not simply switching to a language that has "class" in its vocabulary where you get all the above out of the box, inclusive extensive error checking by the compiler.
  27. I'm currently testing out behaviortree's with the LibGDX AI library. I have read a lot about behaviortree's past couple days but it's hard to get clear how I need to build the tree for my specific scenario. I'm looking to use a behaviortree for a Rimworld like game where the players units are not directly controllable. In the first place I'm wondering if I should have a single big tree for the complete AI or many smaller tree's, for example a separate tree for: Moving an item Building a building Crafting an item Resting when sleepy Eating when hungry In the examples I have seen they all talk about a "single job". Like entering a building, GoTo -> Open Door -> GoTo -> Close door. But what if I need to check if I have the keys on me? And I need to check a lot of these variables. When A unit is Idle I'd like him to maintain his primary needs if he has access to them. If his needs are satisfied enough he can take on certain jobs like building walls or crafting items. I have a a lot of different jobs but jobs like building or crafting items are relatively the same with a different outcome so I could probably make a abstract job for that, it helps but I will still end up with a really huge tree though. Another issue I'm facing is that when tasks are running, and something more important pops up (enemy spotted or some kind of emergence task) the unit should stop it's current task and act accordingly to the interruption. So since the task is running I need to do those checks on each runnable task then returned failed/cancelled and further down the sequence I need to do another check for these interruptions and handle them accordingly. I have briefly read into dynamic branches, not sure if GDX AI supports this but adding a behavior to the tree to handle an interruption seems a good idea. These dynamic branches also opens the opportunity to hold behaviors at the jobs and once a unit accepts a job it inserts that branch into it's own tree. I hope I'm clear, it's hard to explain and get a global view of a complex behavior tree. I have read several times that behavior tree's are very easy to understand and implement. Well, that might be the case for those small tree's I find everywhere. On the other hand I might be over complicating things.
  1. Load more activity