XHXIAIEIN's Forum Posts

  • There is not enough data for training, and there are very few freely available examples online, this is not enough for training.

    To pull this off, every Construct3 developer would need to have a spy in their engine that would peek at their code and collect it in big data, and then learn somewhere on the servers.

    Who would agree to give AI access to their projects?

    In fact, this is another area where Scirra has a real advantage over many other engines: a rich collection of high-quality example projects.

    https://editor.construct.net/#open-example-browser

    github.com/Scirra/Construct-Example-Projects

  • dop2000 reply pretty much captures what I was trying to say

    Oh yeah? If I search for "array" in the examples, I get 65 matches — and none of them immediately answer a basic question like "how do I find a specific number in an array?"

    And many beginners don’t even know the examples exist.

    I'm old-school - if I have a question, I check the documentation and Google. Five years ago beginners learned from YouTube tutorials. These days, people use AI - half the forum posts now start with "I asked ChatGPT first but…"

    That's the new reality. Like it or not.

    It also highlights why making Construct more readable for AI, through proper documentation and structure, would matter in practice.

    Many beginners now instinctively turn to GPT first when trying to solve a problem, but they often receive answers that look correct on the surface yet don’t fully match how Construct actually works.

  • What I want to clarify is that I’m not calling for Scirra to integrate AI features directly into the engine. That really isn’t necessary. Competing in that space would require the kind of large-scale technical resources that companies like Google or OpenAI have — teams of thousands of engineers constantly iterating on model capabilities.

    In fact, I would rather Scirra not attempt to implement in-engine AI features right now. It may be wiser to wait until the technology matures further. Given how fast model capabilities and compute are evolving, today’s integrations can quickly become obsolete.

    At the moment, simply saving projects as folder projects already allows developers to use external tools like VS Code or Cursor for AI-assisted workflows.

    The main idea of this post is different.

    Rather than adding AI features, I’m suggesting that Scirra provide the necessary foundation for AI to grow around Construct. In other words, a clear reference that allows AI to read and understand Construct properly. The cost of doing that would likely be much lower, and it wouldn’t require maintaining AI features directly.

    The goal is not automation for its own sake, but enabling AI to understand Construct’s internal data structures well enough to produce accurate and stable results.

  • AI tools are advancing quickly, and many engines have started integrating them into development workflows. Regardless of how effective current implementations are, AI-assisted tooling is clearly becoming part of normal software development. So the question isn’t really whether Construct should have AI — but what kind of interaction would actually work for it.

    Most AI discussions around game engines focus on generating full projects. For Construct, that direction feels awkward. Generated projects may look impressive, but they’re difficult to iterate on and rarely survive real production. A more interesting possibility might be different: not AI generating Construct projects, but AI understanding Construct projects.

    Why this matters for Construct

    Construct projects follow a strict internal structure. The editor already knows exactly what a valid event looks like, how actions connect to conditions, and what data can be pasted back into the project.

    AI, however, doesn’t know those rules. Because of that, current assistance relies on approximation. Even when providing an existing JSON snippet and asking it to modify it, the model may still hallucinate — introducing unsupported fields or invalid data types that the editor cannot accept.

    The output often looks correct, but fails when actually used inside C3.

    If the structure were defined

    If the project format were formally documented, developers wouldn’t need to build their own datasets and repeatedly feed projects to AI just to approximate how Construct behaves. Instead of spending tokens on trial-and-error learning, tools could work against a known structure and interact with existing projects more predictably.

    What could that look like in practice?

    • checking why a condition never triggers even though it looks correct
    • pointing out picking or event order issues that change behavior
    • adjusting an existing mechanic (for example adding coyote time or input buffering) without rewriting it
    • modifying a snippet while preserving instance variables and object references
    • given a layout clipboard fragment, reorganizing object positions automatically (for example aligning or sorting placed instances)

    The shift wouldn’t really be about automation, but about reliability — moving from approximate suggestions to tools that can reason about the project.

    What might make that possible

    Instead of building AI features directly into the editor, another approach could be making Construct easier for external tools to understand. A clear reference of what is valid would allow experimentation to happen outside the engine, rather than requiring constant iteration inside it.

    I have three ideas that might help with this.

    The first is providing a complete JSON schema for the project format. That would give external tools something stable to target instead of approximating behavior through examples. I’ve already opened a request here:

    https://github.com/Scirra/Construct-feature-requests/issues/709

    The second is publishing the documentation in a GitHub repository and providing a Markdown version. This would make version changes transparent (so developers can see what actually changed between releases), and it also allows tools to reliably reference up-to-date documentation.

    At the moment the manual is written in BBCode, which is difficult to consume programmatically. I experimented with converting it using an AI-assisted pipeline (bbcode → html → markdown) and published the result here:

    https://github.com/XHXIAIEIN/Construct3-Manual

    If useful, the repository and scripts can be freely reused — no credit needed.

    The third is continuously updated example projects. Real projects show patterns that documentation alone cannot describe, and they act as reference behavior for tooling instead of guesswork. I also suggested this here:

    https://github.com/Scirra/Construct-feature-requests/issues/708

    Together these aren’t really “AI features”, but they make it much easier for tools and community projects to understand Construct without relying on guesswork.

    AshleyTomDiegoM Interested to know your perspective on where AI could fit into Construct.

  • The hide timer is 0.5 seconds for an inactive bar (if focused it will stay visible). If it takes longer than 0.5 seconds for an inactive bar to hide, that might be a bug. Do you have steps to reproduce a longer hide time?

    This issue is easy to reproduce.

    1. The Properties bar is docked and pinned on the left.

    2. The Layer bar is docked and unpinned on the left.

    3. When the mouse hovers over it, the Layer bar expands. Now, it overlaps with the Properties bar.

    4. Then, I click from Layout 1 to Event sheet 1 in the top main-tabs. Its hide-timer will reset whenever I switch tags.

    5. The Layer bar will then remain visible for 2-5 seconds before hiding.

  • This overlapping situation is driving me crazy and making me very uncomfortable. I don't know what to do, I don't know what I can do. All I can do is stretch the bar behind me and waste 2-3 seconds waiting for it to hide automatically.

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • Here's a small suggestion:

    Auto hide when the width is very small

    when I adjust the width of a bar to a certain threshold, the bar can hide and unpin it. This would be similar to the experience of dragging a panel to hide it in VS Code.

    Use click-to-show bar instead of auto display mouse hover

    Mouse hover is very counterintuitive to me, because most of the time I just want to hide it, not use it. If I do use it frequently, I usually pin it instead of unpin. it would be more friendly if I could decide whether or not to show.

    Or force it to hide when I click on other places, instead of hide auto after a timer. Otherwise, I really want to just press X to close the bar and force it to be disabled.

    or Support click the close to hide

    Allows move position in the context menu

    hope to allow move to the left/right side of the screen.

    Allows drag the bar to the sidebar to hide it

    Hode I could drag a floating bar to Unpin and merge them.

  • I find VS Code's panel pinning feature very convenient. There's a fixed sidebar that, when collapsed, becomes a small icon within that sidebar. It only reappears when I click it again.

  • Really insightful discussion!

    It’s amazing to see how many different ways there are to achieve the same result in Construct.

    I also really liked this old blog post, Common mis-used events and gotchas.

    Ashley: So for maximum performance, avoid "for each" unless you really need it.

    Tips like this are super valuable. I think people really need something like a Construct Cookbook or CheatSheet that shows the best practices for doing things the right way.

    Because there are so many different ways to achieve the same goal, simply taking the time to think about whether to use A or B is already very meaningful.

    — just like Jase00 said, “This is a good example of understanding ‘under the hood’ a bit more so that we can make decisions on what to use and how to structure things.”

  • You do not have permission to view this post

  • Their are the same, there is no difference. The only difference is that the action of Set Layout scale changed to Set Layer scale.

    Eventsheet Clipboard

    {"is-c3-clipboard-data":true,"type":"events","items":[{"eventType":"variable","name":"minZoomScale","type":"number","initialValue":"0","comment":"","isStatic":true,"isConstant":false},{"eventType":"variable","name":"maxZoomScale","type":"number","initialValue":"0","comment":"","isStatic":true,"isConstant":false},{"eventType":"block","conditions":[{"id":"on-start-of-layout","objectClass":"System"}],"actions":[{"id":"set-eventvar-value","objectClass":"System","parameters":{"variable":"minZoomScale","value":"ViewportWidth(\"UI\") / LayoutWidth"}},{"id":"set-eventvar-value","objectClass":"System","parameters":{"variable":"maxZoomScale","value":"minZoomScale * 3"}}]},{"eventType":"block","conditions":[{"id":"on-mouse-wheel","objectClass":"Mouse","parameters":{"direction":"any"}}],"actions":[{"id":"set-layer-scale","objectClass":"System","parameters":{"layer":"\"Game\"","scale":"LayerScale(\"Game\") - Mouse.WheelDeltaY/1000"}},{"id":"set-layer-scale","objectClass":"System","parameters":{"layer":"\"Game\"","scale":"clamp(LayerScale(\"Game\"), minZoomScale, maxZoomScale)"}},{"id":"set-layer-scroll","objectClass":"System","parameters":{"layer":"\"Game\"","scroll-x":"scrollx","scroll-y":"scrolly"}}]}]}
    

    Layout Clipboard (Tiny)

    {"is-c3-clipboard-data":true,"type":"layouts","families":[],"object-types":[{"name":"ScrollingBG","plugin-id":"TiledBg","isGlobal":false,"editorNewInstanceIsReplica":true,"instanceVariables":[],"behaviorTypes":[],"effectTypes":[],"image":{"width":8,"height":8,"originX":0.5,"originY":0.5,"originalSource":"","exportFormat":"lossless","exportQuality":0.8,"fileType":"image/png","imageDataIndex":0,"useCollisionPoly":true,"tag":""},"ui-state":[["ScrollingBG",{}]]},{"name":"BoardSprite","plugin-id":"Sprite","isGlobal":false,"editorNewInstanceIsReplica":true,"instanceVariables":[],"behaviorTypes":[],"effectTypes":[],"animations":{"items":[{"frames":[{"width":8,"height":8,"originX":0.5,"originY":0.5,"originalSource":"","exportFormat":"lossless","exportQuality":0.8,"fileType":"image/png","imageDataIndex":1,"useCollisionPoly":true,"duration":1,"tag":""}],"name":"Animation 1","isLooping":false,"isPingPong":false,"repeatCount":1,"repeatTo":0,"speed":0}],"subfolders":[],"name":"Animations"},"ui-state":[["BoardSprite",{"animations":"{\"expanded\":true,\"subfolders\":[]}"}]]}],"items":[{"name":"Layout 1","layers":[{"name":"Background","overriden":0,"subLayers":[],"instances":[{"type":"ScrollingBG","properties":{"initially-visible":true,"origin":"top-left","wrap-horizontal":"repeat","wrap-vertical":"repeat","image-offset-x":0,"image-offset-y":0,"image-scale-x":24,"image-scale-y":24,"image-angle":0,"enable-tile-randomization":false,"x-random":1,"y-random":1,"angle-random":1,"blend-margin-x":0.1,"blend-margin-y":0.1},"tags":"","instanceVariables":{},"behaviors":{},"showing":true,"locked":false,"world":{"x":0,"y":0,"width":1280,"height":960,"originX":0,"originY":0,"color":[1,1,1,1],"angle":0,"zElevation":0}}],"effectTypes":[],"isInitiallyVisible":true,"isInitiallyInteractive":true,"isHTMLElementsLayer":false,"color":[1,1,1,1],"backgroundColor":[1,1,1,1],"isTransparent":false,"parallaxX":0,"parallaxY":0,"scaleRate":1,"forceOwnTexture":false,"renderingMode":"3d","drawOrder":"z-order","useRenderCells":false,"blendMode":"normal","zElevation":0,"global":false},{"name":"Game","overriden":0,"subLayers":[],"instances":[{"type":"BoardSprite","properties":{"initially-visible":true,"initial-animation":"Animation 1","initial-frame":0,"enable-collisions":true,"live-preview":false},"tags":"","instanceVariables":{},"behaviors":{},"showing":true,"locked":false,"world":{"x":645,"y":477,"width":768,"height":768,"originX":0.5,"originY":0.5,"color":[1,1,1,0.5],"angle":0,"zElevation":0}}],"effectTypes":[],"isInitiallyVisible":true,"isInitiallyInteractive":true,"isHTMLElementsLayer":false,"color":[1,1,1,1],"backgroundColor":[1,1,1,1],"isTransparent":true,"parallaxX":1,"parallaxY":1,"scaleRate":1,"forceOwnTexture":false,"renderingMode":"3d","drawOrder":"z-order","useRenderCells":false,"blendMode":"normal","zElevation":0,"global":false}],"scene-graphs-folder-root":{"items":[],"subfolders":[]},"effectTypes":[],"width":1280,"height":960,"unboundedScrolling":false,"vpX":0.5,"vpY":0.5,"projection":"perspective","eventSheet":"Event sheet 1","ui-state":{"propertiesBar":{"properties":[{"name":"Layout","expanded":true,"children":[{"name":"Size","expanded":false,"children":[]},{"name":"Vanishing point","expanded":false,"children":[]}]},{"name":"Effects","expanded":true,"children":[]},{"name":"Editor","expanded":true,"children":[{"name":"Margins","expanded":false,"children":[]},{"name":"Grid size","expanded":false,"children":[]},{"name":"Grid offset","expanded":false,"children":[]}]}],"scrollPosition":0},"layersBar":{"name":"<root>","children":[{"name":"Game","expanded":true,"children":[]},{"name":"Background","expanded":true,"children":[]}]},"grid":{"show":false,"snap":false,"width":32,"height":32,"offsetX":0,"offsetY":0},"marginWidth":1000,"marginHeight":1000,"showCollisionPolygons":false,"showMeshes":false,"showTranslucentInactiveLayers":false,"showSceneGraphConnections":true,"tabColor":[0.9999999999999999,0.95,0.8000000000000002,1],"tabTextColor":null,"layers":[{"name":"Background","propertiesBar":{"properties":[{"name":"Layer properties","expanded":true,"children":[]},{"name":"Scroll & zoom","expanded":true,"children":[{"name":"Parallax","expanded":false,"children":[]}]},{"name":"Appearance","expanded":true,"children":[]},{"name":"Effects","expanded":true,"children":[]},{"name":"Editor","expanded":true,"children":[]}],"scrollPosition":0},"visibleInEditor":true,"locked":false,"parallaxInEditor":false,"opacity":1,"translucent":false},{"name":"Game","propertiesBar":{"properties":[{"name":"Layer properties","expanded":true,"children":[]},{"name":"Scroll & zoom","expanded":true,"children":[{"name":"Parallax","expanded":false,"children":[]}]},{"name":"Appearance","expanded":true,"children":[]},{"name":"Effects","expanded":true,"children":[]},{"name":"Editor","expanded":true,"children":[]}],"scrollPosition":0},"visibleInEditor":true,"locked":false,"parallaxInEditor":false,"opacity":1,"translucent":false}],"instancesRoot":{"expanded":true,"subfolders":[],"misc":{"global":true,"layout":[]}},"view":{"x":769.7980689868821,"y":281.17029110551056,"z":186.15435578388136,"activeLayer":"Game"},"selectedInstances":[],"lockedInstances":[],"instanceCollections":[{"uids":[3],"properties":{"properties":[{"name":"Object type properties","expanded":true,"children":[]},{"name":"Common","expanded":true,"children":[{"name":"Position","expanded":false,"children":[]},{"name":"Size","expanded":false,"children":[]}]},{"name":"Instance variables","expanded":true,"children":[]},{"name":"Behaviors","expanded":true,"children":[]},{"name":"Effects","expanded":true,"children":[]},{"name":"Container","expanded":true,"children":[]},{"name":"Template","expanded":true,"children":[]},{"name":"Properties","expanded":true,"children":[]},{"name":"Editor","expanded":true,"children":[]}],"scrollPosition":0}},{"uids":[2],"properties":{"properties":[{"name":"Object type properties","expanded":true,"children":[]},{"name":"Common","expanded":true,"children":[{"name":"Position","expanded":false,"children":[]},{"name":"Size","expanded":false,"children":[]}]},{"name":"Instance variables","expanded":true,"children":[]},{"name":"Behaviors","expanded":true,"children":[]},{"name":"Effects","expanded":true,"children":[]},{"name":"Container","expanded":true,"children":[]},{"name":"Template","expanded":true,"children":[]},{"name":"Properties","expanded":true,"children":[]},{"name":"Image transform","expanded":true,"children":[]},{"name":"Tile randomization","expanded":true,"children":[]},{"name":"Editor","expanded":true,"children":[]}],"scrollPosition":0}}]}}],"folders":[],"imageData":["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAO0lEQVR4AazPQQ0AMAgDwAYHw+MsTNM0zMY08AUJ8O2PD03u16Sp7PuTnWfJBE0GCksVLNzBBiaaEygAAAD//yTx288AAAAGSURBVAMAHNAj3Wfvb3EAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAIklEQVR4AdzKMQ0AAAwCwRb/LqujAQew88lvh9unGxPqAAIAAP//91C77AAAAAZJREFUAwBC2hcRaFLvWgAAAABJRU5ErkJggg=="]}
    
  • I often need to work with arrays and JSON, using them for data structure conversion, more complex filtering, sorting, and more. However, the Eventsheet ACE functionality is limited and operations can be complex. Using JavaScript can save a lot of time.

    So, I use a function that takes Array.AsJSON and converts it into a true array using JavaScript. Then, I process the data internally, convert it back to a string, set the return value, and then make Array Load.

    const array = JSON.parse(localVars.arrayJson);
    ...
    runtime.setReturnValue(JSON.stringify(array));
    

    This part of the JavaScript is perfect for AI to help. Simply tell it the data structure you want and the desired result, and it will handle it perfectly.

  • About scale and offset scroll specific layers, Now is easy to make in Construct 3, The Layer has many properties and expressions:

    • LayerScale(layer)
    • LayerScaleRate(layer)
    • LayerScrollX(layer)
    • LayerScrollY(layer)

    For Construct 2, If I remember correctly, c2 should contain these examples. If not, that's okay, you can check them out in Construct 3, which is also available in the free version.

    1. Touch: Panning
    2. Touch: Zooming

    Since these two samples only demonstrate specific gestures, you need to combine them if you want to both zoom and pan gestures.

    ===

    By the way, these three examples are also worth reading. They all apply drag and drop to practical examples.

    1. Hidden Objects
    2. Place Stickers
    3. Kitty Katcher
  • Tom I have an idea. Maybe can allow Affiliates to publish their own offers or discounts, Others people can subscribe C3 at a discounted price?

  • They have moved from X to Bluesky

    Construct: bsky.app/profile/construct.net

    Ashley: bsky.app/profile/did:plc:foxdqaopnh3x6nypnuafx6mz