skymen's Forum Posts

  • With me. Send me an email at skymen75019 at gmail dot com or go the the discord and drop me a DM

    discord.gg/AfpSQ8D

  • Hey. Two things.

    First, for a limited time, Spritefont Deluxe is Pay what you want.

    Secondly, for anyone that owns colludium's Twine plugin (https://colludium.itch.io/twine-plugin) and Spritefont Deluxe here's a free dialogue system:

    Download link:

    mega.nz

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • It's just an utilitary plugin. There isn't much to it. You can use it whenever you want to monitor a value but don't want to have to create a new variable to compare it to.

  • Yeah, hence the use of "Usually" xD.

    Well the ones that don't get abandonned are the ones made by crazy developers or that managed to gather enough attention and customers.

  • I wouldn't recommend this kind of engine, unless you want to make that exact type of game. Usually these engines get abandonned after a few years, are too limited to make anything and won't even teach you much in the end.

  • To be precise, basically they had the engine itself, not the editor that should have came with it.

    They were 3 or 4 working on it, and only one developer. They tried making games for private companies using the engine to fund the development, and that made them delay the editor more and more and they eventually just gave up when they all became too tired and burnt out to continue working on it.

  • Thanks for the info

  • Oh :o

    Nice, thanks. I'll look into this. I'll need to learn some proper webgl first. I didn't know you could get C2's gl by doing glw.gl xD.

    I guess I misread glwrap.js cause I never saw anywhere anything named this.gl, only gl.

    Oh interesting, I didn't know "multiply" was one of the options now. It didn't used to be. I'm not sure if that would cause compatibility issues on some browsers.

    Well it seems like most browsers support it. Every browser except Edge 11 and prior. Edge 12 supports it.

    According to MDN: developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation

    I hadn't thought of creating individual letters of different colors as needed and keeping them for later use. Probably works well when only using a limited amount of colors. If the user ended up trying to do gradual color transitions you may run out of video memory though.

    Yeah it works pretty well in most cases. But indeed it may become inefficient if a user uses too many colors for too many characters. However run out of video memory? How so? Maybe run out of RAM, but VRAM? I'm genuinely asking here. I create the texture on a virtual canvas, and then store it in a JS object. I never actually add the canvas to the document. Would that still use up some video memory?

    It's not bad to end a batch in c2's renderer. It does it all the time. All a batch does is it sends multiple quads using the same texture at the same time instead of separately. Besides you'd be doing your own batching of all the letters in your spritefont renderer. The only drawback is if multiple spritefont instances drawn right after each other then they could only be batched individually instead of together, but I say it doesn't matter too much.

    Yeah ok I kinda get it. I really need to learn webgl, because I didn't know most of that.

    Maybe that could be a useful example to use alongside a webgl tutorial.

    Yes thanks again. I'll look into it and maybe I can use that to make the code more optimized.

  • Hi, thanks R0J0hound for your super helfpul answer.

    Sadly I had already found a way to do this.

    Indeed what I do right now, is I draw the letter on a black canvas the size of the letter, multiply by my color, and draw the letter again in 'destination-in' mode to mask the canvas's content.

    Then to save performance, I cache the texture in an object and if I ever need to redraw that letter with that color, I don't need to redo the process. This is helpful given that in a game the colored parts of the text are often the same words.

    But indeed this is problematic on WebGL because changing an image to a webGL texture had some issues. So I decided to cache the texture as well. So I draw the image, convert it to a texture only once.

    However, this still has some overhead compared to the canvas reder mode.

    I'll need to see if recoding the same process in WebGL will save more perf compared to keeping what I have right now or not.

    Also I don't think breaking C2's batch is a good idea. I have little to no experience in WebGL so I'm probably wrong, but afaik this means that the rendering gets a lot more tedious the more I have letters since I need to create a new batch and break it for each letter. Also I wasn't able to create a new proper batch using the same params C2 uses because I can't access these values, but again, maybe it's due to my inexperience with WebGL

    		function getColoredTexture(inst, image, color, clip, scale, letter) {
    		if(!color || color === 'None') {
    			return image
    		}
    		if (inst.cachedImages !== undefined && inst.cachedImages[letter] !== undefined && inst.cachedImages[letter][color] !== undefined) {
    			return inst.cachedImages[letter][color];
    		}
    		// Create new canvas
    		var charCanvas = createCanvas(clip.w * scale, clip.h * scale)
    		var charContext = charCanvas.getContext("2d");
    		// Draw letter on it
    		charContext.fillStyle = 'black';
    		charContext.fillRect(0, 0, charCanvas.width, charCanvas.height);
    		charContext.drawImage(image,
    			clip.x, clip.y, clip.w, clip.h,
    			0, 0, clip.w * scale, clip.h * scale);
    		// Apply color
    		charContext.globalCompositeOperation = 'multiply';
    		charContext.fillStyle = color;
    		charContext.fillRect(0, 0, clip.w * scale, clip.h * scale);
    		// Restore the transparency
    		charContext.globalCompositeOperation = 'destination-in';
    		charContext.drawImage(image,
    			clip.x, clip.y, clip.w, clip.h,
    			0, 0, clip.w * scale, clip.h * scale);
    		// Restore composite operation
    		charContext.globalCompositeOperation = 'source-over';
    		if (inst.cachedImages === undefined) {
    			inst.cachedImages = {}
    		}
    		if (inst.cachedImages[letter] === undefined) {
    			inst.cachedImages[letter] = {}
    		}
    		inst.cachedImages[letter][color] = charCanvas
    		return charCanvas
    	}
    

    Here's the code and here's how it looks

    cdn.discordapp.com/attachments/183566321156358144/481403367705542659/2018-08-21_11-58-23.gif

    EDIT: Just realized I should probably not recreate a whole new canvas each time. I'll change that.

  • matpow2

    I couldn't locate the Discord for Chowdren or MP2 so i sent you a direct email with c3 file. Hope it works!

    Hi, unless I'm wrong, said Discord server is this one discord.gg/qgkAPPk

    It's not specific to Chowdren. If such server exists I recommend that matpow posts it

  • Hi, I'm making the Spritefont Deluxe addon for Construct 2 and I've been trying to make the spritefont support per letter color for quite a long time now. However I can't seem to find a way to do this.

    I tried adding a tint effect to the spritefont and changing its values during runtime. This only changes the values for the next draw and hence affects the whole Spritefont.

    I tried looking at the way the engine draws the canvas, until I finally found the code that draws the object using WebGL effects. It's in layout.js in Layer.DrawGL. There I had the code to "simulate" changing the effect used for glw rendering. However for that I'd need to push a new batch and apply a whole bunch of values that I don't have access to and that would make performance terrible If I needed to push a new batch for each letter or set of letters.

    I tried looking into how I could do this using only Javascript. Right my best bet would be to print the letter texture image on a canvas, then change every white pixel into my color, and then get the new texture image and use that to render.

    While this may work even though I didn't try yet this seems like a very inneficient way of doing it so I really don't know if that's the best way to do this.

    I'm kind of in a corner right now so if anyone has a better idea, I'd be really glad to take it.

  • Uhhh. I think this topic slightly derivated from it's original goal, so let's get back to the original subject.

    The software is really great. C3 is doing well according to scirra.

    Everything is evolving and I can only foresee a bright future for Construct 3.

    The community hasn't really changed since Construct Classic. Just different people. It's always been the same, with your same amount of kinda toxic people but it's not important. Most people are just happy with how everything is and there is no reason to think that anything will go badly.

    Now I'd really like the few people who used their post to send a negative message about a part of the community (namely the said discord server) or about scirra to stop doing that.

    Guys this is not a discord server war field nor a place to send your frustration to. So stop it.

    Now I hope that you'll have a great time using Construct again, and everyone else in the community will be happy to help you if you have questions.

  • Fair enough x)

  • All the internal layer code should also be considered private methods for the engine's use only and should not be used from the SDK. You will probably break all sorts of things if you do this, and we will not offer any support for using private and undocumented parts of the engine, so you should find a different solution.

    Yes I already know all of that thank you x).

    But in theory, if I manage to manually trigger the parts of the code that are only ran once because they assume that the layer number should never change, it should work.

    Again, note that I am not speaking about wether this is a good idea or not. I'm speaking about whether this is possible.

    Also, given that this is done as a 3rd party addon, you wouldn't offer support if the addon broke anything as it's 3rd party anyway. I'm not modifying anything in any of C2's files. In the worst case scenario, if I run into very bad issues, I'll just remove the plugin and everything will start working again.

  • The whole purpose of using the layer's constructor is that it already manages all of the parrallax, scale, and all of that stuff already.

    Also when copying a layer, it copies all of th layer's properties as well. Including these, but also including the instances on the layer in theory. This is why I don't quite understand why they don't get created and assumed something else did that.