WackyToaster's Recent Forum Activity

  • Again, the results always come out as 0 or 1 when the variable is set to Random(100)<50

    That is exactly how it's supposed to work.

    Also how can you set something as true or false when the variable isn't a Boolean?

    A boolean is in essence just a 1 (true) or 0 (false).

    Your code is wrong because you already do the comparison in random(100)<50

    And then compare the result of the comparison again with <50. Either you do

    Set Odds to random(100)

    Odds <50 / Odds >50

    OR

    Set Odds to random(100)<50

    Odds = 0 / else

  • This is an evaluation

    Basically it means "Is the value generated by random(100) less than 50?" and it's either true (1) or false (0).

  • Exactly, you have to pass a timestamp into the function. This also allows you to get a month from the past or the future if you pass a timestamp into it that's not the current time.

  • I don't think you should be using Browser.ExecJS to do this. Instead use the date plugin

    construct.net/en/make-games/manuals/construct-3/plugin-reference/date

    Which has this

    GetMonth(timeStamp)

    Extract the month (0 - 11) from the provided timestamp in local time.

    So April would return 3 and all you have to do is add one

    GetMonth(timeStamp)+1

  • Tilemap object doesn't have a check for overlap, so you'll have to work around that. It depends a little on what you are looking for. You can try "for each tile -> pick overlapping point" Or if you compare with another tilemap, compare the tiles.

    But can I suggest something because I've seen you work on this project for a while. I think all of this should be driven by arrays instead of tilemaps. No doubt this is a great learning experience either way, but I've been in a very similar position before where I was kinda checking for overlaps etc. which was honestly a bit of a nightmare not only to code in the first place, but also to maintain. In the end it SOMEHOW worked (I have no idea how even lmao) but realistically arrays will be your savior. I wouldn't necessarily suggest reworking everything now but keep it in mind for maybe the next project :)

  • This might not be in the latest stable release yet but it's already in the beta.

    editor.construct.net/r387

    The next stable release will (I suspect) drop next week.

  • Is there any way to "lock" this effect ??

    Not that I'm aware of.

    As I said I'd just make sure it looks good in the preview and ignore how it looks in the editor (or disable it in the editor entirely)

  • Some effects depend on the screen size, and the layout view simply has a different size than the actual view in game. You kind of have to ignore how it looks in the editor since what matters is how it looks in the game. Ideally it would look exactly the same but I'm not sure that's possible for some effects.

  • That's also an option, it was the first thing I thought about actually until I realized you can just do it without an invisible pixel.

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • You can check the console (press f12) for a better error message. Imo this message should actually show in the error popup from construct because the error message otherwise is largely meaningless.

  • My solution would probably be to simply not cast the ray from inside the solid at all. Check this

    But there's also the possibility to use solid collision tags

  • Well this is gonna need some more tinkering. I've managed to update the script more to my workflow, so now it exports each tag as an individual zip. It's a bit rough but it works ok for now.

    The main issue I'm still facing is that cels are not the full image but it's basically the cropped sprite, which for animations causes the origin to go all over the place due to different individual frame sizes. I need to somehow figure out how to get the origin on a consistent spot despite that.

    I can easily get the cel.bounds and I also have the sprite width/height.

    aseprite.org/api/image

    I think that should be everything I need to math it out but my brain is not braining today. Anyway, here's the updated script for now.

    -- Get the active sprite
    local sprite = app.sprite
    
    if sprite == nil then
    	print("No active sprite found.")
    	return
    end
    
    local spriteName = string.match(sprite.filename, "[^/\\]+$")
    spriteName = spriteName:gsub("%..*$", "")
    
    
    -- Create a new dialog
    local dlg = Dialog("Export animation for C3 - this will briefly hang :)")
    dlg:button{ id="confirm", text="Confirm" }
    dlg:button{ id="cancel", text="Cancel" }
    dlg:show()
    
    local data = dlg.data
    
    if data.confirm then
    	-- Extract the directory path of the original sprite file
    	local originalFilePath = sprite.filename
    	
    	local outputFolder = app.fs.joinPath(string.match(originalFilePath, "^(.-)([^\\/]-%.?([^%.\\/]*))$"), "tmp-export-for-c3")
    	if outputFolder == nil then
    		print("Failed to determine output folder.")
    		return
    	end
    	
    	for i, tag in ipairs(sprite.tags) do
    		
    		-- Use the name that was set in the dialog or the file name if no name was specified in the dialog
    		local defaultAnimationName = tag.name
    		
    		-- Construct the JSON data
    		local jsonData = {
    			["use-raw-folder-names"] = true,
    			["animation"] = {
    				["name"] = tag.name,
    				["speed"] = 0,
    				["loop"] = false,
    				["ping-pong"] = false,
    				["repeat-count"] = tag.repeats or 1,
    				["repeat-to"] = 0,
    				["frame-durations"] = {},
    				["frame-tags"] = {},
    				["frame-image-points"] = {}
    			}
    		}
    		
    		if tag.aniDir <= 1 then
    			jsonData["animation"]["loop"] = true
    		else
    			jsonData["animation"]["ping-pong"] = true
    		end
    		
    		local fps = math.floor((1000 / (tag.fromFrame.duration * 1000)) + 0.5)
    		jsonData["animation"]["speed"] = fps
    		
    		-- Flatten to merge all layers
    		local dupe = Sprite(sprite)
    		dupe:flatten()
    		
    		local origin = {{
    			originX = 0.5,
    			originY = 0.5
    		}}
    		
    		for i, cel in ipairs(dupe.cels) do
    		
    			if cel.frameNumber >= tag.fromFrame.frameNumber and cel.frameNumber <= tag.toFrame.frameNumber then
    				local filename = app.fs.joinPath(outputFolder, i .. ".png")
    				
    				cel.image:saveAs(filename)
    				
    				--jsonData["frame-image-points"].inser = {"originX":3, "originY":3}
    				table.insert(jsonData["animation"]["frame-image-points"], origin)
    				
    				local lfps = math.floor((1000 / (cel.frame.duration * 1000)) + 0.5)
    				table.insert(jsonData["animation"]["frame-durations"], math.floor((fps / lfps) + 0.5))
    				end
    		end
    		
    		dupe:close()
    		
    		--app.command.Undo()
    		
    		-- Write JSON data to file
    		local jsonFilename = app.fs.joinPath(outputFolder, "c3-import-settings.json")
    		local jsonFile = io.open(jsonFilename, "w")
    		if jsonFile then
    			jsonFile:write(json.encode(jsonData))
    			jsonFile:close()
    		else
    			print("Failed to generate JSON file.")
    			return
    		end
    		
    		local pathSeparator = package.config:sub(1, 1)
    		-- Choose the appropriate zip command based on the operating system
    		local osType = (pathSeparator == "\\") and "Windows" or "Unix-based"
    		
    		local zipCmd
    		
    		local zipFilename = app.fs.joinPath(outputFolder, defaultAnimationName .. ".zip")
    		
    		if osType:find("Windows") then
    		-- Use PowerShell on Windows
    		zipCmd = 'powershell Compress-Archive -Path "' .. outputFolder .. pathSeparator .. "*" .. '" -DestinationPath "' .. zipFilename .. '" -Force'
    		else
    		-- Use the zip command on Unix-based systems
    		zipCmd = 'zip -r "' .. zipFilename .. '" "' .. outputFolder .. pathSeparator .. "*" ..'"'
    		end
    		
    		-- Execute the zip command
    		os.execute(zipCmd)
    		
    		-- Move the zip file to the new destination path
    		local directoryPath, fileName = zipFilename:match("(.+)[/\\]([^/\\]+)$")
    		local newZipFilePath = app.fs.joinPath(directoryPath, "..", fileName)
    		
    		local moveCommand
    		
    		if osType:find("Windows") then
    		-- Windows system
    		moveCommand = "move".. " " .. zipFilename .. " " .. newZipFilePath
    		else
    		-- Unix-like system (Linux, macOS, etc.)
    		moveCommand = "mv".. " " .. zipFilename .. " " .. newZipFilePath
    		end
    		
    		os.execute(moveCommand)
    		
    		-- Remove the temporary folder
    		local removeCommand
    		
    		if osType:find("Windows") then
    		-- Windows system
    		removeCommand = "rmdir /s /q" .. " " .. outputFolder
    		else
    		-- Unix-like system (Linux, macOS, etc.)
    		removeCommand = "rm -rf" .. " " .. outputFolder
    		end
    		
    		os.execute(removeCommand)
    		
    	end
    end
WackyToaster's avatar

WackyToaster

Member since 18 Feb, 2014

Twitter
WackyToaster has 25 followers

Connect with WackyToaster

Blogs