Tokinsom's Forum Posts

  • Note that in general if you have a feature request you can submit it here.

    I suggested this like 4 years ago and it got tons of upvotes 🥴

    Ain't happening.

  • That sounds about right. There are still far too many things tied to the .c3proj to safely have more than 1 contributor add content to a project at a given time.

    The other killer is modifying objects that exist throughout the project. For example, if Contributor A adds a variable to an object which exists in all layouts, then all of those layout files get updated. This means no other contributor can edit any one of those layouts without resulting in a conflict.

    At least, that's how I remember it happening. Only solution there is Contributor A has to inform others about it so they can push & pull the new object variable before resuming work.

  • Yeah this is an extremely long-standing issue with new pages in chrome defaulting to white. I've actually developed muscle memory to close my eyes when opening chrome/C3 for the first time lol. Apparently it's much more difficult to fix than one would think. I thought it only happened when entering a new domain, however...

    Searching something along the lines of "white flash when opening chrome" will give you a lot of results, but no permanent fixes it seems.

  • The new random UID option is a life saver. Thanks Ashley.

    It should only be a conflict if two people both try to commit changes at the same time that both affect the same line (e.g. both adding an object to the same folder).

    Ah you know what in all my testing I was just adding objects to the root objects folder, so that would explain that. Wouldn't introducing new effects/behaviors to the project go on the same line though? I will do some more testing...

  • Ashley

    It seems that C3 is still mostly unusable with source control on account of the .c3proj file and UID shuffling.

    The .c3proj

    If more than 1 collaborator adds a new behavior, effect, object type, family, layout, event sheet, script, or timeline, it modifies the .c3proj and creates a conflict. This might be the case with removing and renaming as well. This can be resolved by hand, but is obviously very error prone and can easily corrupt the project.

    As it stands, all users except one must basically only touch existing contents.

    I'm not the expert here but one potential solution that comes to mind is replacing the .c3proj entries with individual files and populating the project bar etc. from those instead (basic project properties can remain as one file). Each object already has its own .json file anyway so why not just extend this format to the aforementioned assets instead of making lists inside the .c3proj?

    UID Shuffling

    Furthermore, UID shuffling can be detrimental and risks breaking many things in your game or outright corrupting it. UIDs are the only auto-assigned reference that instances get which are identical in both the editor and runtime. They are often used extensively to manage objects in save data or managing connections between objects in and across layouts. The only alternative is manually-assigned instance variables but...imagine a Mario level with hundreds of coins per level or a Metroidvania with hundreds of items scattered throughout the world, each one given a manually assigned variable to prevent from respawning or what have you. That is just insane, but there are C3 users who are doing just that to prevent their objects' only real IDs from being scrambled.

    Again, not the expert here, but sequential UIDs might not be the safest approach. I believe skymen had proposed some sort of UUID but he would need to elaborate on that.

    Taking a quote from your GitHub tutorial: "Source control is widely regarded as mandatory for any kind of professional development." I strongly agree with this sentiment but as it stands even small teams cannot use C3 together with confidence. I see that improvements have been made over C2, we aren't quite there yet. If Construct 3 is to be viewed as professional software, especially with paid tiers and increasing prices, then its compatibility with source control needs to be locked in. Thank you for reading and I hope you give these issues your consideration.

  • This controller is only meant to be used in wired or 2.4ghz mode for PC, and bluetooth mode for Nintendo Switch. It *can* work on PC over bluetooth with the right drivers/software (Steam is providing them while it's running) but it isn't exactly meant to. In other words, it's an issue with the controller and some weird decisions on 8bitdo's part.

    This is a perfectly valid request undeserving of the sarcasm and useless snarky responses.

    "Simulate Jump" only works if the object is on the floor, and the built-in double jump feature is silly and shouldn't be used for coyote time anyway.

    Instead "Simulate Jump" should just execute when it's called, allowing any amount of proper mid-air jumps and/or coyote time jumps determined by instance variables. If the player only wants "Simulate Jump" to work on the floor then they can pair it with the "Is On Floor" condition instead of it checking for them. It's not rocket science.

    Also, not only does setting the y vector to a negative value not give you jump sustain, but it doesn't trigger "On Jump" either. Seems the only ways to trigger "On Jump" are by using "Simulate Jump" when on the ground, or by executing a built-in double jump...so, y'know, there's that.

  • Color values in Construct are a bit odd. You might have to store just the values as a string and then use rgbEx255(dictionary.get("values")) instead.

  • As the title says.

    Let's say my player jumps in water so I give its sounds a low-pass filter effect...but my player is also in a large cave so I give its sounds a delay effect as well.

    My player then jumps out of the water aaaaand...I can only remove all the effects, not just the low-pass filter from the water.

    I suppose I could just reapply the delay from the large cave every time my player exits the water but that's not applicable for all cases and I think that would cause a "judder" in the delay effect anyway.

  • As I've mentioned in the earlier posts, "Set Canvas Size" does not affect internal resolution as you are suggesting it does - it merely changes the external resolution but without changing the window size.

    Please take a look at this .gif: media.giphy.com/media/A2OHsceP7gBTRADQvm/giphy.gif

    Or the .c3p itself here: dropbox.com/s/mbe5ma4s677pt0c/Internal%20Resolution%20Test.c3p

    This is what happens when setting the canvas size to 200%, 300%, etc.

    I get the exact same results regardless of fullscreen quality mode or any other project properties / display modes.

    If it is supposed to work how you are suggesting then maybe this is a bug?

  • I think there is some confusion over the terminology here. I'm not talking about window size / canvas size / external resolution, which is all "Set Canvas Size" affects. I'm talking about internal resolution or what is maybe more commonly known as resolution scale, which pertains to rendering quality. It is, admittedly, kind of hard to describe because it's implemented differently in various games and engines. C3 already has it, my only issue is that I have no control over it.

    Please take a look at the images below.

    These are from a C3 project with a 320x180 viewport, in fullscreen, on a 2560x1440 display.

    With low quality fullscreen, the internal resolution stays at 320x180 (100% resolution scale). This results in blurry text and chunky pixels on the rotated object.

    However, with high quality fullscreen the internal resolution is automatically changed to the display's 2560x1440 (800% resolution scale), resulting in ultra crisp text and smoothed-out pixels on the rotated object.

    This is the desired result, but I don't need the internal resolution or "quality" to be quite so high because it can become taxing on the GPU. I would like to limit the internal resolution to something lower like 1280x720 (400% resolution scale), while keeping the external resolution at 2560x1440. This way I get slightly crisper text and smoother movements / rotations, but not quite as much as I would with the full-on 2560x1440 internal resolution. In exchange I get better performance.

    You might be thinking "Well, a 340x180 game should not be using high quality fullscreen anyway" but that is not always true. Many low-res pixel art games these days opt for higher internal resolutions or "high quality fullscreen" because it makes movements & scrolling smoother, and allows them to use text instead of spritefonts. 380x140 was just for the example images anyway, as it makes the difference in fullscreen quality modes very apparent.

    Hopefully this explains the issue well enough. I know I'm not the best at it. I can try to find other references or examples if needed.

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • Hey Ashley

    Thanks for the response. I tried that out but it seems setting the canvas size affects the external resolution regardless of fullscreen quality mode, or whether or not the game is in fullscreen.

    To elaborate - my game has a native resolution of 640x360. On a 4K display with Fullscreen Quality [High], the internal resolution / resolution scale is automatically set to a whopping 6x / 600%.

    I don't think the "fullscreen quality" option should be a simple "high" (automatic resolution scale) or "low" (native) - it should be something the developer can set themselves, or give to the player so they can find an appropriate setting based on their device specs.

    I've been thinking of ways this could be implemented and it could be as simple as adding a dropdown list ranging from 1x - 8x or so with "automatic" as a default to keep the current functionality.

    Is this something you would consider?

  • It seems that setting the "Fullscreen Quality" project property to "High" automatically sets the internal resolution as high as possible based on window/screen size.

    This can vastly improve the visuals of your game, but it can also be very taxing on the GPU for 2k or 4k displays. There are diminishing returns beyond a certain point, anyway.

    Ashley That said, would it be possible to let us set the internal resolution ourselves in order to find a proper balance between visual quality and performance? Ideally this could be turned into an in-game option so players can find that balance themselves. At the very least, an option to cap the internal resolution to a multiple of the viewport size would suffice.

  • I'm not sure if you realise, but scheduled audio does not actually usually work with audio categorised as music. These tracks are normally backed by <audio> elements, which don't support sample-accurate playback - only Web Audio buffers do, which is how audio categorised as sound is played.

    On some platforms for various reasons like compatibility we actually ignore the audio categorisation and play everything as sound anyway (i.e. via Web Audio buffers). I've never seen or heard of any particular negative consequence of doing that, so I think it's fine to do that in your case too if you need sample-accurate playback of music tracks, and audio categorised as sound can be played with unlimited overlap.

    No I was not aware of this, and am now doubly confused. I thought the whole point of audio scheduling was to eliminate the potential 16ms+ "seam" between audio loops (which the built-in loop option is NOT immune to) as well as consistently repeating sounds like in the audio scheduling demo found in the start page. So then, how on earth are you supposed to seamlessly loop music outside of the method I've proposed above?

    As for workarounds, considering this particular game is strictly for desktop PC & consoles (chowdren) would it be okay to put my music tracks in the sound folder and play them as such? I considered this earlier but I thought it would instantly load every music track into memory instead of "streaming" on the fly, but perhaps that's some old web-based C2 logic I'm wrongly applying here?

  • Ashley I've done this before with mixed results and would ultimately consider it a workaround/hack. Having the tail mixed into the start is really obvious in some cases. Also, what of tracks with a one-off intro? If the tail of the looped section is baked into the beginning then you get the tails of both the intro & the loop stacked on top of each other. Alternatively, if the entire track is 1 file with a "loop back point" to skip the intro on successive plays, then that similarly cuts the tail of the looped section. All in all it's a hassle and the results are not perfect nor flexible.

    My composer and I were both excited to utilize audio scheduling and not have to bother with all of that, and everything is already coded with track tags, files, segments, durations, etc. in a JSON file so we can basically structure and loop music tracks however we want, flawlessly and without "tricks". This even allows us to change up song structure on the fly e.g. dynamic boss music based on its remaining health! All we need is the limitation of two identical tracks playing simultaneously to be lifted, and we're golden! I implore you to give it some consideration.