Jase00's Recent Forum Activity

  • Ohh interesting. I generally have the opinion to "stick to Chrome" for anything web based. I use Firefox as a main browser for day to day stuff, but always run web games and such in chrome.

    Good to know it lasted for many days!!

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • (if Ashley reads this: please reach out, I will need a small expansion in the edittime SDK (only one extra function) to make this project fully work with the best user experience possible and without needing to hack the editor and potentially risk future developers projects)

    Really cool, fascinating to see such a smooth 3D editor!

    That last sentence is worrying...

    A plugin at runtime breaking is one thing; open your project, run the game, errors and cannot play, but at least you can still open your project. But an edittime plugin breaking, wouldn't that mean possible corrupt projects one day if unlucky?

    At minimum maybe a check to see if you have personally verified each C3 release would work with this editor, just to prevent risking anyone's projects.

    Maybe never use the hacky stuff, even if limiting, and rally the community to get whatever functions are needed. Even if you made a bleeding edge editor that does absolutely everything Unreal can do, it's not worth it if it could destroy a project suddenly.

    I am assuming "risk breaking developers projects" means corrupt projects, as if this simply stopped working on an update, then that's not so bad, simply cannot use the 3D editor until it's updated, so what else could break? Correct me if I'm wrong!

  • One workaround for the "server might reconnect as peer instead of host" would be to have the server build of your game be unique, in that it indeed will only accept being host in your events (if it's peer, disconnect). And your build for players has same system but in reverse, if a player becomes host, instantly disconnect themselves.

    Not the most ideal if a game was popping off with players, might struggle to get server to connect at right time.

  • ... Wow that's extremely surprising, nice catch.

    Tested and got:

    72% CPU when holding space with Array method.

    100% CPU (2fps) when holding space with Hierarchy method.

    It's especially weird considering there's extra picking with the Array method, having to pick the Array for each parent, doesn't make logical sense at all as I thought picking extra object would always be a bad idea!

    My project is heavily using hierarchies and picking of children/parents, with loops just like this with "for each child". I'm often battling CPU usage even though I have mostly made my project "function-based" so not a lot of events running every tick (but still a few bits essential to run every tick), but once a handful of hierarchies appear onscreen with about 10 to 20 children per parent, does tend to spike CPU to 30% or so (which is acceptable but then when more gameplay stuff is occurring, reaching 70% and such)

    I really hope this is simply a bug, otherwise this is a temptation to refactor 8k events to move back to the UID method. Do love hierarchies though, but wow.

  • I don't have a deep desire to see event behaviours, mainly because it feels doable right now, and I envision the downsides of what we have right now would also affect event behaviours.

    Say you made a custom platformer movement in events for a "Player" object, all in 1 group,and then you want to copy this to a new project? Well then you better have any objects/families with same name and same variables in other project before you can copy/paste this group. Once everything exists then you can indeed copy and paste.

    Let's assume we have behaviour event sheets... Same issue, any "on sprite collide with ground", the new project will need that ground sprite, any vars from the ground sprite need to be added, etc, before you can copy that behaviour to a new project.

    Maybe the more reasonable solution would be a better copy/paste system, like a special paste or import/export functionality that, instead of attempting to paste and having C3 say "cannot find sprite, cannot find var", it would automatically know to copy the relevant objects/families across. Maybe being able to export a group of events as JSON which captures all relevant objects along with instance vars, effects, and their defaults, so that they can be imported into a new project.

    I sorta see the idea of "applying an event behaviour to any object" but then this is also achievable with families, throw a new object into the family and boom, the group of events applies to them.

  • I think the "pro" vibe is due to artists using software that let's line art wisp away, like the eyebrows of the image you posted, they're just a 3 thickness line, doesn't trail off into thin line.

    You could still use paint and emulate this effect, although not ideal and makes it more preferable to get the right software (many of which are free) and equipment (drawing tablet so you can make those wispy lines instantly).

  • Bring it on!!

    Hah yeah I liked skymen's suggestion of the SOL variable idea - feels like you design around your events to always keep things tightly knit in once place, but having some method, almost like dynamic containers or a var like skymen said, that seems like a powerful enhancement.

    And yeah I thought you meant "not possible". Reasonably possible is fair, I will preface that I'd take reasonably as "having a grasp on general coding things like loops, data types, being familiar with the C3 method of picking, being familiar with being kind to your cpu and such and not just throwing things together expecting optimal results", to what degree one must know these things is a difficult one, due to people learning at different rates (I myself am a slow learner and prob explains why I can never grasp traditional programming languages), but in a general sense, if you're aware of those types of things, then everything "is possible", and complex systems are "reasonably possible", complex systems being the fun part that lures me into game dev, both a challenge but achievable.

  • The addon called Empty Shell may be what you need.

    This is an object that let's you mimic the image of another sprite. Haven't explored it much myself but can imagine it would help with an inventory system like this.

    construct.net/en/make-games/addons/933/empty-shell

    ugh, I wrote a novel.

    Honestly, it's cool, I find this all interesting to learn about and understand, and took the time to read this. My replies come from someone with no experience with JS or traditional programming languages, and simply an event-sheet guy lol.

    The stacking buffs example is actually a good one. If you know in advance the types of buffs that can exist, and the number of stats they affect, then making a system for that is easy. When things become difficult is when you don't know how many types of effects will exist before hand(or the number is high), nor the objects that can be affected. Some a problem is best solved by a completely abstract system to accommodate designers future ambitions.

    If designed right, couldn't this be future-proof? 2 different ways pop to mind: A data-driven way to handle buffs (i.e. you have an array of "CurrentBuffs" that grows/shrinks, and stores a Dictionary/JSON string within the array that has a list of stats to alter, maybe another dimension for timer so 10x2x1 size array, 10 being 10 different active buffs, Y0 being the JSON string, Y1 being the timer), a loop to iterate and subtract from the countdown timers in the array, but you'd only "apply" that JSON string in a function, so not needing to constantly load the JSON data every tick (e.g. players have instance vars for "Speed_Default", "Speed_Current", then can always mathematically get the final buff result when this function runs by taking the default vars and applying a buff equation). The JSON data can have keys like "Speed : 10", "Damage : 120", "ParticleType : Smoke" and whatnot, to allow you to apply these values to the player upon a buff changing. Overall being the idea of not constantly reading from the array/JSON/Dictionary, unless required such as a buff change/add/end, and a hefty yet tightly designed function to apply all stats found.

    2nd idea being same thing but likely worse idea as you later mention conditional branches - An Array but with the name of the buff, and then within events, applying whatever effects based on the buff. This is also future proof as you can always add a new buff name like "Poison" and then add a new line in a function for your "AddBuff" function that checks "Array.at() = "Poison"". Again though, I get this would quickly balloon up into a huge list of subevents.

    Take mario as an example: We have a character that can walk/run, duck slide, wall jump, and a few other things. Now lets give mario an inventory for items that can alter his stats, and even add completely new abilities. Without deep oop, or ecs architecture, the easiest way to solve this problem is to embed conditional branches in mario's behavior logic that checks for items containing abilities. Not too bad... so far... especially if the number is low.

    But now extend that to all characters and allow any character to have any ability. Now every character needs conditional branches. Now keep adding abilities into the game. With new abilities might come the need for new stats, etc... and the base class for characters is getting hefty.

    This, depending on the type of game, could be redesigned - Does every enemy really need to have all the base functionality of the player? Perhaps a fair chunk of it, yes, say you made a platformer behaviour within events and want to apply this to both Mario and Goomba enemies, then yeah I follow the paradigm of wanting to keep it all under one roof - However couldn't a single boolean to say "IsPlayer" with much of the enemy-only code be done within the loop, to dramatically lower event checks? This would of course mean you'd have to pick and choose what works for enemies and what works for players, maybe not ideal in a specific type of project.

    Again I'm an event guy, but from what I've gleaned from looking at source code of C++ games, there's so sooo so many booleans checking things, state of player, state of A B C - Could be similar to what could be done here, despite the desire to lower conditional branches, one way or another you have to check some sort of value to determine whether the entity can do an action or not.

    The issue at this point isn't that you can't make the game, Its that you've created a situation where adding a new behavior to a single character requires a deep understanding of all characters and all abilities in the game so far, typically requires modyifying the code base in multiple places, and if you want to remove an ability, you have to remember all the places it has code for it. This becomes unmaintainable. A single developer likely can do this if well organized- but only to a point; and as part of a team - this is nearly impossible if you have two people working on the same system.

    Would the question be "why would abilities be stretching far across your event sheets"? If it was abilities such as wall jump, double jump, wouldn't this all be in the same area/group/event block sub events? I understand where maybe you need to alter the camera or something for a fast "dash" ability, but then designing this neatly is doable, functions in the general player events to affect the camera (then C3 lets us right-click the function and jump to the function event block, making this smooth to navigate).

    If some features do need to stretch everywhere, then yeah it's difficult to navigate. One trick is to have a unique comment that is text that is never used anywhere else, like "@@@WallJump" then pasting this in all areas of all event sheets that are relevant, and then any dev can do CTRL+F, find this string, and the "find" dialogue presents itself as a neat list of all areas to check if you need to edit the walljump code.

    The second issue is that every character, from a performance standpoint, no matter how simple, is as complicated as the most complicated character, as every character needs to have a conditional tree for every ability it could posses and the stats to go with it. Every object is bloated with data it doesn't need and this can hurt performance. We haven't even gotten to input support, ai support, or flexible and dynamic stats, etc... which also has to balloon to fit the conditionals. If you take a game like vampire survivors, and require bullets to also have abilities or dynamic effectors, you now have a code structure that kills performance so completely you have to do something about it.

    I agree with the balloon moment here, lets take multiplayer game example rather than "players and enemies" as you'd expect to have exact same abilities for multiple players, it does start to impact performance when you have all these checks to do for each player. This is where I feel, lol, even more booleans to "break it down" could help. I'm not a "group disable/enable" type of user, but I often see folks use this and find there's a lot of benefit to performance - I feel booleans give you that little bit more control over things rather than groups, and utilising the booleans as much as you want for each player is a great aid, can reuse whatever you've found from collision checks such as "IsOnGround" across your ability events, even if these checks are later on and such.

    Even if it's ballooned into a hectic mess of abilities, all those conditional checks don't need to be checked if a player is standing still/doing this and that. Breaking things down so that a typical tick is just going "Ok, for each player, first player, moving around, so gotta check X Y Z, do this do that, ok done... Next player, only moving right, not near walls so no wall jump checks (and wall collision is baseline check so get the data from the wall collision to help lower addition checks later)... 3rd player, they're in air, against a wall, are they pressing a key, they are, do this, do that".

    In either system, the goal is to create a framework that efficiently facilitates adding functionality to objects arbitrarily at runtime, and reduces the complexity of maintaining and creating new functionality in this environment. Good for the game, good for the developer.

    (Also replying to general "family" stuff here).

    I agree that at face value, you cannot arbitrarily add functionality to objects at runtime - You have to know in advance, yes. And I agree with the family thing, it's not like you can make some families such as "PlayerMovement" "PlayerWallJump", etc, and then dynamically throw any object into these families at runtime, PLUS the downside of having "PlayerMovement" family with all it's instance vars like XSpeed and YSpeed, so then the "PlayerWallJump" family comes in, you cannot affect the vars from PlayerMovement family, meaning UID picking, which I agree needs to be minimal or else you're cycling through many player objects for seemingly no reason just to change a single var. Nested families would be great here.

    Dictionaries almost solve this, esp with containers, but yep, cannot use containers with families so you cannot add a dictionary to a family, and definitely we all want to avoid doing "For each player, pick dictionary with var "PlayerUID" that matches player.uid", as then this has to cycle through 100's of dictionaries to pick the correct one, not ideal, almost like doing a 2nd for each loop but worse since the 31st player in the "for each player" loop, sure, it's cycling the players, but the dictionary UID check would be checking ALL dictionaries each time until it finds the correct one (or if it's based on order, then sure the first few players will find the matching dictionary quickly, but then the later players in the loop will be checking essentially all dictionaries).

    Definitely room for improvement, feels so close to being attainable!!

    At the end of the day, for ECS, you will have to use a Foreach loop for every system, and then loop through the components, running various custom actions like "Check" "Enter" "exit" "update" etc... The overhead of the small scale OOP to pick related families, dictionary lists of components, etc... and then dynamic routing of state/input through components, means that the performance overhead of each system scales with its complexity and its possible to achieve better performance than the simple/basic branching conditionals if the project is complicated. Also, adding functionality is as easy as the system is designed for, and allows the functionality to be self contained. apart from the fact that you still have to boiler plate every object.

    I am not so fearful of "for each" loops. I tend to have a base For Each loop that contains all Player functionality, so in my mind, this is cycling each player once per tick - Of course this gets hectic and bad for performance when you need to pick a dictionary or something like I mentioned in last paragraph, in my case I haven't used families so that I can take advantage of containers (Only in recent year, after 12 or so years of Construct lol), having a base "Player" object with a dictionary in container, kinda works like an adaptable runtime-editable version of instance vars, add and remove at any time, keep it small if needed but can expand into a huge list if needed. Again though I do wish families could utilise this, hope we get to see this.

    For a more "trigger-based" project, I find I use a lot of for each loops and doesn't ruin performance, mostly because of filtering down the picked objects list and rarely putting "for each" at the top of the event block - Just checked my project and I have apparently 600 for each loops (it's an 8k event project), but few are running "every tick", perhaps I've added them in some events that weren't necessary, but overall has no impact on performance. If I did have many for each loops at the base of event blocks, then yeah this would be hell on earth.

    The takeaway? Construct isn't the right solution for a sufficiently complex project with high dynamic object counts. It literally becomes a case of, this isn't possible, and better off in a different engine.

    I humbly disagree with "this isn't possible", could maybe agree with "better off in different engine" although for my case, what engine has a god-tier event sheet editor, GDevelop I revisit, but I cannot shake off the opinion of "clunky" and working against me (not to say it's just awful, there's cool features within the workflow), but, I have no completed project to show for this. I have made some great strides being event-only, performant platformer behaviour with custom jump-thrus and Sonic-style physics supporting up to approx 12 active online multiplayer players with equipment that both "applies buffs if holding weapon" and "applies buffs if equipped even if not currently holding weapon". I fear to come across as arrogant, but I note this as more of an explanation as to why I get a bit passionate when folks say performance is bad in C3 and such - I do see the other side though, I imagine if I recreated whatever I've done into Unity/Godot, it would let me have 24 or more players, but the project's goal wasn't to support 100 players, just 8 players was ideal! I'm making a game, not benchmarking (although it's fun to benchmark!). If I wanted a gamemode with a lot of Bot players for the 8 players online to battle, then those bots could be the same "Player" objects, but then can think outside the box to save on CPU, lesser collision checks (always the biggest CPU eater in my experience), hiding abilities that the bots never use in a boolean, or in an online multiplayer case, letting the host be the more heavier collision handler whilst players see a more broken collision bot but gets updated due to syncing from host.

    For my own project, I really wanted to finish a game with construct, so I went from a bullet hell style game with high numbers to a game with fewer but much more impactful threats. It actually turned out to be good for game feel, as it reduces noise and makes choices more meaningful. Each enemy is an intimate threat, instead of one of a 1000.

    Both projects sound cool - I bet the bullet hell one was a tricky moment, can't utilise Collsion Cels due to being all onscreen and such - I suppose a bullet hell is always a tricky one due to collision checking, almost feels like the type of project where you need to solve it in a minimal way, once you get that right combination of events, suddenly it will all just perform wonderfully, but cracking that sounds like an interesting challenge.

    Same old arguments from Ashley.. Over 12 pages he's trying to convince us that his priorities — limiting features for easier support — should be ours as well.

    Construct creators have a long history of not listening to their customers. C3 will remain an excellent tool for education and hobbyists, but sadly it will most certainly lose its potential as a serious engine for professional game development.

    Limiting features for easier support - it's features that Scirra relied on addon devs to not touch, unsupported stuff, hence Ashley's repetition of the "red warning box" that was ignored, which yeah, fair, tinkerers be tempted, but now there's a bountiful selection of addons available to download that did ignore that red warning box. I made post about FPS limiter and not noticed bugs, I just read the description of the addon, didn't realise it was plastered with experimental, may break, has gpu schedule issues. Am I being stubborn by thinking "well OK but I still want it even tho it's literally a hacky addon where the dev says they're not sure why it is buggy", I think I am being stubborn, there's something incorrect about this addon, otherwise Scirra would have added FPS limit a decade ago.

    "Not listening" feels wrong, I've been here for over a decade and that's one of the great things about this engine, the lead dev literally responding to all sorts of queries. Definitely could be improved but to say having a history of not listening is not true. Ashley not changing his mind doesn't count as "not listening", he's written and listened to so many woes in this thread. Nice to actually hear why this is happening and it's not a money grab thing like unity and we sit on our hands wondering what happens next, you can email Scirra and always get a response. They listen, doesn't mean they bend over.

    C2 was open source briefly, and Scirra made decision to close source, THAT should have been the writing on the wall for anyone interested in open source, and has been ever since. Cool, whatever, maybe people left back then due to this, they wanna choose what they do with their business and make a living however they feel was best, much like we want control over how we handle and sell our games. I hated sub being introduced, I hate the sub now, but it gives me value because the event sheet editor is top tier.

    I totally understand the concern and will be affected too as I use a bountiful amount of experimental addons (not even realising they are experimental because missed the descriptions) and pay my sub too, but now this has been known and people are still going apeshit, goddamn the entitlement echoed by many is just trash.

    How about being productive cooperate like Scirra said they would, hold Scirra up to that, make a push for those sdkv2 things. Suggestion platform barely gets more than a classroom of people voting on things, where's the demand and community cooperation?

    LTS exists if there's no possible workaround. Not ideal, I fear rolling back, but that's a form of literally listening to the community.

    And, above all, make your goddamn games. Hobbiest and education? I'm neither, and have not hit a dead end with designing games. Prove me wrong.

  • Generally it's fine either way, it may be more suitable to use frames if you need to iterate, but overall it's more readable if you had 2 animations (say you have 2 items, health and ammo, better to have them named like this and clearer in your events when you see "set anim to Health" rather than "set frame to 0").

    Oh, wait, we have animation frame tags now, so I guess either way works fine!

    Perfomance wise, I believe it's not a concern.

    I am of the belief that, overall, you can make whatever 2d game you need with whatever system the game needs, whether stacking buffs, equips, anything. Maybe not one-click out of the box, but, idunno, I don't touch JS and yet to hit any dead ends with some wacky ambitious ideas. I'd be curious to know what isn't possible in events or sdk-safe JS that can't be done for making any 2D system. Or is it to eek out more performance by using these undocumented js functions?

    Different story with 3D, I can see the benefit of, say, loading a 3d object, which is only possible with 3rd party addon.

Jase00's avatar

Jase00

Member since 5 Jan, 2012

Twitter
Jase00 has 11 followers

Trophy Case

  • 12-Year Club
  • Jupiter Mission Supports Gordon's mission to Jupiter
  • Forum Contributor Made 100 posts in the forums
  • Forum Patron Made 500 posts in the forums
  • Forum Hero Made 1,000 posts in the forums
  • Regular Visitor Visited Construct.net 7 days in a row
  • Steady Visitor Visited Construct.net 30 days in a row
  • Enduring Visitor Visited Construct.net 90 days in a row
  • Unrelenting Visitor Visited Construct.net 180 days in a row
  • Continuous Visitor Visited Construct.net 365 days in a row
  • RTFM Read the fabulous manual
  • x15
    Quick Draw First 5 people to up-vote a new Construct 3 release
  • x7
    Lightning Draw First person to up-vote a new Construct 3 release
  • x7
    Great Comment One of your comments gets 3 upvotes
  • Email Verified

Progress

26/44
How to earn trophies