Fimbul's Forum Posts

    I own both CF2.5 Developer Edition and Construct 2 Early Adopter Edition (you can check my badge). Personally, I think they're both worth buying.

    CF2.5 for $34 sounds fantastic. Even though both products have a new version upcoming, both will offer discounts for old users. However, keep in mind that developing for CF is torture: the event system is really ancient, and nowhere near the level we're used to with construct.

    Unfortunately, as you can see by their release log, they move at a snail's pace. Clickteam Fusion 2.5 is basically just a rebranding of "Multimedia Fusion 2" with very few changes, and that was released in 2006. Since then, all we heard from clickteam were new exporters, because they suck up all available manpower. Clickteam Fusion 2.5 was released in 2013, and we've seen no major changes since then.

    Also, while construct 3 will be "just an editor upgrade", don't underestimate how much things will improve. I think it's a testament to the reliability of the engine that it's being reused for C3.

    It may seem like I'm hating on clickteam, but that's just because I'm comparing their product to what it could become if it wasn't for their focus on native exporters (which is one of the reasons their community is dying while ours is thriving). They really do have a sweet product that I don't regret purchasing. If you guys want to see the difference that a native exporter makes, it's seriously worth a shot - though, as Ashley says, you may find that the performance gains may not turn out to be as big as you were expecting.

    So, yeah, it's worth buying, but don't expect any extras. What you have now is what you'll have in the future.

  • I think it would be easy in WebGL mode, but extremely difficult in canvas2d mode, because the way tiling transforms work is completely ridiculous in canvas2d. IIRC that's the main reason it's not supported!

    In the long-term we aim to drop support for the canvas2d renderer and use WebGL exclusively, so we could revisit it at that time.

    Long term meaning "construct 3" or "in 5 years or more"?

    I'd love some rotatable 9-patch to do things like lasers, (as mentioned above) arrows and map editors.

  • i don't see why everyone is throwing so much hate on win10.

    Since you asked, for me personally it's not even the metro interface. That's just a symptom of what, for me, is a "dumbing down" of windows, apparently to make it more accessible to average people, but to the detriment of power users like me. Many options and features that were available and easily accessible were either removed or hidden, becoming accessible only via registry hacks or the use of third party programs.

    This is a trend that started with vista, by the way. UAC is a linux ripoff (not that it's a bad idea - far from it, it was long overdue), with zero customization options. Want to set a program to automatically gain elevated privileges? Tough luck. Want to customize how windows update downloads patches, and when/whether to apply them? Tough luck. We gave up everything that made windows good for what? Metro tiles?

    Windows 10, especially, feels like a "free to play" windows. You know that old adage: "If you're not paying, you are the product"...

    i don't see what the big "privacy fuss" is all about. like you ever spend 20hours reading eula before installing windows. just because media went batshit crazy on the privacy issue like it's something big doesn't mean that win7/8 isn't "spyin'" on you as they call it.

    Privacy is the biggest issue in this century, you can't just say "privacy fuss" and move on... Windows 7 is not a saint, but at least the data it collects is optional, and it warns you before doing anything with it. Windows 10 collects all kinds of data and phones home, with no option to disable it (besides downloading third party programs of dubious origins, registry hacks, etc.), and even if you do disable the options, there's no guarantee windows will respect them, since some updates apparently reset the choices. I doubt there will ever be an update that "accidentally" changed the privacy settings to maximum.

    sending data through internet is done no matter what windows you use. your browser collects it, google collects it, everyone collects it. you can't get rid of it.

    Sure you can. Use firefox, mess around in chrome... in fact everyone got super worried when "evercookies" were invented. There's even a linux distro (backtrack) that's specialized in leaving no traces. I could go on about TOR and VPNs and stuff but it's not necessary.

    and trust me, i'd rather have an updated windows system then some linux (i'm not saying that linux is bad, but it's got a lot of problems & driver / partition issues and so on..), because it runs fast, supports everything and their new "stuff" is somewhat taken from linux (multiple display desktops and such ideas) which is nice to see. but performance in general vs 7 (fps and other things - > way better on 10, even 8.1 was way faster). Also i dig the new "flat" look because simply win 7 (we're talking defaults here) look like garbage for todays standards (i know you can shut that off and all but ok..).

    The only thing holding me to windows is gaming and a few proprietary tools (construct 2 included). Soon these issues will disappear, and for everything else there are always virtual machines.

  • Personally wouldn't touch Win 10 with a barge pole. There aggressive push is borderline criminal. I'm sticking with Win7 until it is retired then hopping over to a competitor.

    Same. There's no way I'm installing Win 10.

    I'm probably switching to linux if they don't make "Win 11" extra special. In fact, I'm not even sure I'll wait for "win 11".

    Now all I have to do is choose a distro...

  • > A way to make plugs using events

    >

    I'm not sure what this is. Can you explain briefly?

    He wants to make plugins and behaviors without using the SDK - using only the event editor. It's something that is often requested around here and something that I personally support.

    Still, people are going to want those plugins to be able to draw in the editor as well (which I support as well, but I know it's a humongous task), so I don't know how Ashley will handle that! We have next to no information regarding Construct 3.

  • How about a nice alternative to the current method of pinning objects ? Maybe in a seperate editor. Drag in all the component parts, place the pins, save all the data and reference all the objects as one when creating the object via events. Like a container but with the pin info.

    And the pins could have different joint types, with limited angle of motion, or piston-like pins, things like that...

    like box2D and spriter, but with better editor integration.

    Sounds like something in construct 3, since we'll be able to hook into the editor.

  • saiyadjin That's what the thread was missing, a non-content "ad" link to $30 asset pack :-/

    That's his signature. He isn't trying to spam.

    Besides, I agree, this nonsense about native exporters has to be backed up by evidence. People make a fuss about performance and when Ashley requests their .capx to diagnose the issues, no one provides anything, or when they do, the performance issues are caused by things like maxing fillrate or overusing memory - aka naïve game programming.

  • Various extra tools can help with this, but it could end up a bit of a straitjacket for event refactoring, and the extra tools to help replace things become very complicated in order to ensure the integrity of the project is maintained regardless of which changes are made. For example it's not enough that "otherobject.turret" is a valid expression, since "turret" could be the name of an instance variable, so even though the "turret" name exists on "otherobject" the expression "otherobject.turret.fireRate" is a syntax error.

    I sometimes "refactor" construct projects by editing the XML, which is probably why it hadn't occurred to me. Yeah I admit that that can be a problem.

    I'm not saying it's a bad idea - it's probably actually quite a good idea. (...) That kind of thing turns otherwise simple suggestions in to a major project which will consume considerable development time and probably have a range of nasty bugs involved (...) UIDs on the other hand are pretty straightforward, and although they may not be as concise, they work nicely within the existing event system. So I think it's worth trying to think of alternative suggestions still based around UIDs, so we can try and get basically the same usability result, but without having such major consequences.

    Well if you can come up with something simple, I'd rather work with a beta/experimental feature full of gotchas than having to code bloat into a game... I'd love to adapt your Sprite[1].X idea in order to be able to type turret[character[players[0]].turret].fireRate in the expression editor and deal with bugs on my own, and that seems quite a simple solution to code, even if it's not as clean as my example.

    That's also a microcosm of all feature suggestions in general. This is another factor in having users vote on suggestions: it's easy to vote up cool and easy sounding suggestions, but few users appreciate the true scope of the consequences for the code base, development time, future maintainability etc. If I sound like I'm fighting back, I'm only trying to find the path of least resistance to get the end result you want, which can sometimes look quite different to the original suggestion.

    I understand. I don't want my ideas to pass unchallenged either, I mean if they have flaws, they should be exposed as fast as possible, and if they're too unworkable they should be discarded with the least amount of time wasted.

    I agree with you on many things (like the dreaded native exporters), and my suggestions aren't necessarily the best solutions either... I could just describe my difficulties, but I like always having a proposed solution to a problem. As long as the "disease" is treated (in this case code bloat and repetition), I'm happy, even if my "treatments" are all discarded.

    Besides that, the only complaint I have is that we don't have enough news about construct 3

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • Yeah, that worked out pretty badly for multiplayer. If the vote counts had been representative, most users would be using multiplayer. From what I can tell, it's just a small minority. So I think that shows that large numbers of users - even a majority of those participating in the vote - will vote up features that sound cool even without actually ever using it.

    don't have sales or engagement data for Scirra, but having multiplayer does "check a box", and therefore I'd expect people to be more satisfied with the product once they see it is multiplayer-capable.

    I used to be frustrated with multiplayer via websockets (which was the old way of doing it), and was a big supporter (formatting is broken in that thread) of it when it was in development.

    Overall I was pretty happy with the end result, and I'd guess that scirra was losing sales because of lack of multiplayer support before, but again I don't have any data to support that claim. Still I'm not sure I'd say multiplayer was a disaster even if people end up rarely using it.

    ... the top requests will probably be "make Construct 3D" (probably with people saying things like "it's only one extra dimension, how hard can it be?!?!")

    I say we are definitely lacking at least some support for 3D. I mean at least some textured primitives should be supported, right? I'd love to be able to do something like this in-game.

    Then if that's the highest voted feature and we quite reasonably decide not to act on it, now it's fodder for the trolls: "look, Scirra ignore their users, they don't care what we think".

    I can think of a few ways of doing it, but one way would be to return to the forum pools, where you suggest "what's next for construct" and people pick what they want most, this way you are still in control and people still get to vote.

    I don't mind that we don't have the page, since you're pretty active in the forums especially with regards to replying to posts when you're called - that's more than enough for me - but I remember that voting and discussing the proposed ideas was a lot of fun.

    > Call the expression players[0].character.turret.fireRate directly

    >

    It's a nice idea and it does look useful. But if you think it through it becomes a lot more complicated with further-reaching implications than you appear to have considered. This makes it far from a straightforward suggestion.

    I get that there are edge cases that are hard to work around, but other parts of construct have similar things anyways. There are plugins that throw warnings in the debugger when you do something unexpected, for instance. Overall this stems from the idea that user code should never generate errors, which IMHO is naïve, but I get the rationale of catering to beginners - in the end it's as if we ran code with error warning turned off and an exception catcher that does nothing. I mean, even excel has #N/A and Err:000 placeholders, but that's outside the scope.

    Imagine the following is already implemented in Construct:

    • Arrays and dictionaries can be referenced directly in the expression editor via the syntax Array[0] and Dictionary["index"]
    • - This isn't hard to imagine and is probably overdue anyways

    Objects can have arrays and dictionaries as properties - again, as requested above

    There is an expression returnValueByUID(objectUID,property) that, given an object's UID and a property, returns the value stored in that property for the object with that UID

    Other similar expressions exist: returnStringByUID(objectUID,property), returnArrayByUID(objectUID,property) and returnDictionaryByUID(objectUID,property)

    The expressions listed in 3 and 4 can already be implemented via the SDK. That way, my players[0].character.turret.fireRate expression would become:

    returnValueByUID(returnValueByUID(returnValueByUID(players[0],"character"),"turret"),"fireRate"). Again, this can already be acheived by the SDK, but the resulting expression is messy. It's still better than nothing, though.

    - fail the expression evaluation, cancel the action/condition, cancel the event, and log some kind of diagnostic error somewhere. However this can leave events in a half-run state which can leave the game in an unexpected state. This is also different to how the vast majority of events work: you never need to look up diagnostics to see why something isn't working.

    This is already what happens if you do it the current way, by picking objects sequentially using the "object UID exists" and "pick by unique ID" conditions. If the UID doesn't exist, your event sheet is left in an unexpected state. If you're a power user, you should be aware of the possible states. This is not a beginner feature.

    return a dummy value like 0. Even this is surprisingly complicated.

    I know you thought about those things and are perfectly aware of the problems with such a solution: what if 0 is the correct value? How do you distinguish a valid-returned zero from an error-returned zero? Again, an excel-like #NA or #ERR:XXX, or even a debugger warning (like already happens in some cases) would mitigate the issue, but how exactly it should be implemented is up to you. Again, all I want is a reduction in code bloat, which is generated too quickly by the current workflow.

    There's also the problem of validating expressions. Right now a strong point of the event system is it is near enough impossible to enter invalid events. However if you type in "players[0].character.", what should autocomplete show and what should the expression validator consider valid tokens to follow it?

    Which is why I suggested that there should be a "pointer" property type, so that it could "point" to a specific type of object (this is the same as saying "static typing", which I personally don't like, but whatever, better than not having it). If we could "point" to objects, then we could "point" to arrays/dictionaries, and this solves that other issue of having arrays/dictionaries as object properties.

    With pointers, the expression editor knows what to expect, and can keep working fine. It also allows more flexible families and object grouping, so the entire family feature can be simplified.

    At edit-time, the editor does not necessarily know what type of object the reference could be pointing to. So should it just dump a list of every behavior and instance variable name in the entire project after it? Is that useful to the user? What if you pick a behavior that does exist in the project, but at runtime the object instance you get does not have that particular behavior?

    Make the "pointer" static-typed: you have to specify what type of object the pointer can point to. Issue solved. I mean, you already have to specify that a property should hold an integer/string/bool, why not a pointer to a specific object?

    Perhaps a similar feature that picks by UID and *ignores picking* (so you can always get any instance) would be better, e.g.:

    Sprite[1].X

    would pick the Sprite instance with UID 1 and then get its X position. This is a lot easier to implement and avoids many difficult cases above, but still has some gotchas.

    oing by your proposed syntax, your example would become turret[character[players[0]].turret].fireRate. Same situation as above. I mean, sure, I'd rather have that than nothing but I still prefer players[0].character.turret.fireRate

  • (...) reduce code bloat (...)

    Well put. This is basically all we're asking for, really.

  • That's a terrible excuse, you can modify the elements in-place in a small buffer of vector object and generate no garbage, passing the result by value to a fixed object like you do with any other variable type, the same way you can with arrays.

    Especially considering that objects are currently recycled in the same fashion in the current iteration of the engine IIRC.

    I don't know why that wasn't done, but the SDK still had references to a deprecated vector type when I first checked, and I believe that's how it was explained in the reasons for deprecating it, but I may be misremembering.

  • > How about a "Digg" style page somewhere on Scirra.com that we can use to post these feature suggestions and "sales pitches" and then let others vote them up/down to build a C3 feature list? How useful and fun would that be?!

    >

    A place where people can add and vote for future features (with moderation oc. and a big text that this page is only about suggestions and Scirra may take it into account if they see it right and feasible). Or it could be a page that shows suggested features but not the number of votes it has.

    IIRC, Ashley said this wasn't implemented because he was concerned about competition stealing ideas from such a page.

  • This would be easier in JS, but then makes for some gotchas - for example if you put an array object's array in to an object's instance variable then change it from there, both get updated, and that might not be what you wanted.

    Better to have the gotchas than to not have proper arrays at all! I'd rather have it always be reference and if you want by copy you can manually copy the array yourself. This is just an organization feature, really.

    I'm not sure how exactly you think this would really work (...) you need the condition to pick the instance to run the actions on, so there needs to be a condition involved either way

    I'm not sure what the problem is. The current system is to have an event where we pick a variable out of an object, corresponding to the UID that we want to work with. Then we have another event that picks that object by it's UID, and we perform actions on it.

    An example: say we want to get the fire rate of a turret. The current workflow is like this:

    • Read the UID stored in the array "players" at X position 0
    • Pick the character object with the UID above
    • Read the turret property of the character object, which will be a UID (but is in fact just a number)
    • Pick the turret object with the UID above
    • Read the fireRate property of the turret object we just picked

    With my proposed system, you'd have two ways of doing it:

    • Call the expression players[0].character.turret.fireRate directly. There is no ambiguity at any point about what you are referring to, and the SOL is never modified.
    • Use the "pick an object by UID" condition to pick players[0].character.turret, then read the "fireRate" property. The expression editor doesn't understand nested expressions right now.

    This example may sound weird, but let me give you a typical scenario of an RPG:

    Each character has a healthbar and an inventory with N slots

    In the inventory, on slot 0, there is a fire sword

    That fire sword has a name, damage, attack speed, critical hit chance, etc.

    That sword's damage and critical hit chance is also divided based on it's fire damage and slashing damage

    Really the only problem is that the expression editor doesn't understand nesting (because as far as it is concerned, a UID stored in a variable is just a number), the rest is all secondary. Sure we could try to think some magic with regards to modifying the SOL, or calling methods directly by reference, but that's all secondary.

    It's feasible to make a plugin that does exactly that with the current SDK, I believe, but we'd need the path expression to be surrounded by double quotes, like jQuery Selectors. It would be better if it was more integrated with the SDK.

    [quote:28918sp9] 4 - First class functions. You should be able to return functions as well as store functions as properties of an object. This is something that javascript can already do, so why not?

    Again, if you just throw out a programming language feature, how would that really look in the event system? And why would that be useful?

    Maybe I don't need to pass around functions, sure, but we need at least a way to have methods without having to clutter the namespace with object-specific functions, as well as a proper way to do callbacks (again, without storing function names in arrays). If we were able to store functions in an object's property lists, that would solve the problem, and if we're doing that, why not go all the way and allow expressions to be passed around? Again, that is secondary, the primary goal is just to allow objects to have their own functions without polluting the global namespace with functions like addItemToPlayerInventory(item,quantity,playerUID)

    I'd add most of the other suggestions in this thread have been suggested several times in the past - we have a very long todo list, and a finite amount of hours in the day. So if you really want a feature suggestion to be taken seriously, you should go in to detail about how it would work, give several examples of previously difficult things that become a lot easier with the feature, and some reasons why it's important enough to do before all the other feature requests we have!

    Well right now I'd say the biggest thing is to extend the SDK, and for that we need an extensible editor, and for that we need C3, so I think you're already on the right track there. It's hard for me to gauge what's easy and what's hard to do since I don't know the internals of the engine.

  • Also some kind of vector type for 2D/3D

    I think there was a vector type, but Ashley removed it due to it generating too much garbage (if I recall correctly, it was instantiating a new object every time you wanted a vector), and therefore overworking the GC.

    This was a long time ago, though, and things have probably improved now that we have JIT compiling and smarter GCs.

    These are all very basic features and the argument that construct users "dont need" this kind of functionality is kind of weak, games use data types to simplify code, whereas construct forces you to build things in boilerplate using floats and ints and basic types, and makes using proper complex data-types extremely annoying.

    Amen to that.

    Having to store references to other objects by storing their IDs as a number, then having a sub-event pick them out is garbage. Same goes for polluting your function namespace by creating pseudo "methods" that take an object ID as a parameter.

    Also having to attach arrays to objects, having to dynamically spawn dictionaries, having arrays storing references to dictionary IDs, it's all horrible hacks everywhere if you want to implement a proper data structure, you usually end up reaching for the SDK all the time, which is not ideal since it breaks your flow and saps motivation.

  • 4) Some way to have Object "methods" or perhaps some way to link an Object method to call a Function Event?

    5) Function definition markup/tags to define what params a Function needs and is visible in Action Function call dialog

    6) Return multiple values or an array from function

    Love the suggestions!

    A few additions:

    1 - Start treating arrays as a proper type, instead of an object. We have string, number and bool, why not array?

    2 - Same goes for dictionaries (AKA hashmaps, AKA associative arrays), so that you can do array["position"] as well as array[1]

    3 - Pointers as a type. This means you can store references to an object inside another object, as a property. Right now you can do this by storing the object's ID, but you can't do stuff like player.weapon[1].destroy() in a single event

    4 - First class functions. You should be able to return functions as well as store functions as properties of an object. This is something that javascript can already do, so why not?

    5 - N-Dimensional arrays, as well as arbitrarily nested arrays. This, combined with the points above, would allow you to express things like player.inventory[0]["quantity"] = 1