Posts by Alonso

Welcome to our brand new Clickteam Community Hub! We hope you will enjoy using the new features, which we will be further expanding in the coming months.

A few features including Passport are unavailable initially whilst we monitor stability of the new platform, we hope to bring these online very soon. Small issues will crop up following the import from our old system, including some message formatting, translation accuracy and other things.

Thank you for your patience whilst we've worked on this and we look forward to more exciting community developments soon!

Clickteam.

    Actually, it is possible to do this, but I think there's a certain level of instability that's derived from having two displays going on at once. This impression is from something I read years ago, so maybe it's already been fixed.

    Just shift+click the frame or event editor icons in the toolbar. Then, at the top right of the window, click on "restore" (small twin window icon to the right of "minimize"). You'll see there are now two windows active, which you can arrange as you please via the two monitors.

    Darkhog, seems like you don't understand the concept of the extension. I frankly would've loved to have had something like the Tile Map extension when I began work on my game in 2007. But if you don't see the potential and insane convenience it offers, then you probably don't need it. No need to be douchey.

    I'd avoid using global events and instead use global behaviors (eg. an active with "global to all frames" checked and a behavior). That way you can manually place the active in whatever frames you want those events to be present. Global events are super sluggish because every time you modify any action, condition, comment, etc., MMF needs to update that change in every frame. Behaviors instead wait until you exit the behavior editor to refresh the events in all frames that have that active.

    Keep in mind behaviors are run in the order of the actives' creation in the frame. If you want that reordered, the only way to change that is to delete the older active via ctrl+x and pasting it via ctrl+v. Just realize that any events associated with it will be removed in the main event list, so copy those before you do this.

    There's also a "hack" you can use to include qualifiers inside with no side effects, I've been using it for a while myself and it's pretty harmless. Don't have time to explain why it's harmless in detail, but I made a video tutorial at some point explaining how it's used. Just know that objects in behaviors are referenced, which means that if the object isn't found in a given frame, the action/conditions for it are simply not performed.

    I'd guess the reason why the spread values work that way is because of the order in which they were created in the Frame Editor.

    If those objects are never destroyed, you can avoid that behavior by using an incremental index value yourself. Eg. every time you create any object type, you increase an object's value (a separate object; value holder) by 1 and set the ID value of the created object to that. If they are destroyed, there's probably a way to do it via a fastlooped foreach condition that compares a "time" counter each object has to know who's older than who.

    The way I did it was through using a Surface object onto which I blitted/pasted the different lightsources from an image bank of torchlights. This was done at an 8th of the game resolution. Once everything was blitted, I stretched that image to 1x and used LIJI's colorizer extension to tint the screen as I wanted. Pretty complicated. This was before MMF had HWA (back in 2007). Today I just use the Surface itself with a colorizer shader.

    You can much more easily achieve the same effect by using a layer with the subtract effect which is probably the solution posted above. It's also much less expensive. I still use my surface method because of convenience, but it does have a couple of advantages when it comes to layering objects in front or behind the "night" layer, as well as being able to use the Surface texture as a shader image parameter for other purposes.

    Once HFA is finished, we'll release all the extensions and shaders we've developed for it. I'm sure people will find them useful.

    EDIT: On the subject of using the multiply shader, there's a limitation with MMF's runtime that produces visible errors when layering shaders on top of each other. Can't remember what it was specifically, but because Subtract is an in-built effect, it's the only shader able to avoid that limitation. Just mentioning it in case you run into it.

    Here's a quick video tutorial I made on the subject. It briefly explains how to bring qualifier events into global behaviors. Useful for people who have multi-frame projects and don't want to update the code in each one.

    Although this does not cause any bugs or corrupt your mfa, make a backup before you apply this method to your game. I've been using this for months in HFA without any issues. The tweak is perfectly reversible by simply deleting the behavior that makes any reference to qualifiers.

    Please login to see this link.

    Hope you enjoy it and be sure to comment if you have questions/comments or have any other tips you'd like to share.

    Nice! But I think a Facebook event would help getting the news to more people. For whatever reason this open community forum now needs a password?

    When you've made one, post the link here and I'll share it with the k&p group at Facebook. Maybe Clickteam's FB & Twitter accounts could share it too?

    I wouldn't worry about the name thing, just make sure it works. MMF just masks the animation index reference with a string, so the name itself doesn't matter. Just check that things work normally and that condition triggers as expected. If you copy/paste something from the event editor into behaviors, the custom animation names also retained.

    Triggered/immediate conditions are run in their own event list BEFORE any non-triggered events.

    For example:

    1. Run event once -> set counter to 1
    2. Start of frame -> set counter to 2

    Even though 1. is ordered before 2., "start of frame" is a triggered condition so that will execute first in its own event list (along any other triggered conditions). THEN the normal event lists are executed (frame editor, behaviors, global events). Therefore, the counter will read 1 by the end of the loop.

    In other words, the triggered/immediate condition checks are done BEFORE the normal event lists.

    The document Joshtek attached (Please login to see this link.) explains in what order the triggered conditions will execute. For example, you'll see "timer is less than" will be executed before "start of frame". Or "user presses" is executed before either of those.

    This probably explains some odd frustrations some MMF users might have, but once you know how the system works, it's really handy to make MMF do stuff the way you want.

    Edit: it's worth mentioning that some triggered conditions will still work even if they're not at the top of the event and will always be checked to be true when they're found in the main event loop/"forced" to be run as a normal condition. Unfortunately this is not the case for all triggered conditions, so just test it if in doubt.

    You can actually use qualifiers in global behaviors, but you have to trick MMF into thinking it's referring to active objects whose names match the qualifier names. Basically, behaviors in MMF treat all objects as "referred", thereby avoiding issues if those referenced objects do NOT exist in the frame. If you name an active "Group.Good" and make a reference to it from a behavior, and then delete that object, MMF will now apply those behavior events to all actives whose qualifier is the "Good" qualifier. If the "Group.Good" active object is created again, then events will now only reference that single object again.

    I've been using this method for a few months now and I haven't found any problems, so I'd say it's pretty safe to use this trick without risk for corruption/etc. Here's a thread I posted in the Klik facebook group about it:
    Please login to see this link.

    I had a similar problem recently with the valueadd, where because all values are stored as floats and not integers, it only allows up to 9,999,999 before turning the number into scientific notation. Fixed values like 252,555,222 become 2.52555e+008, which will obviously not work for the fixed("Parent") = stored_fixed_parent comparison. The workaround I used was to have the parent store its own fixed value, and therefore I'd get the same scientific notation error, which would still let the comparison return true.

    Anyway, your situation is probably different, but here's something Looki explained to me the other day about how fixed values are generated by MMF. Pretty insightful:

    Quote

    Basically MMF allows ~32,000 objects in theory. Imagine there's an array of 32,000 elements. Each element is one object. Now, imagine that the fixed value stores the index in that array. However, 32000 only takes up 16 bit. But an integer is 32 bit. The other 16 bit in the fixed value are used to store the index of the 'generation' of this slot. Whenever a slot gets reused, it increases by one. So imagine a fixed value is a pair of two numbers (generation, slot id). Those two numbers get combined into one with bit magic. Since the slot id represents the less significant bits, it means that a really high fixed value means that you have a high generation value.

    A high generational value is of course not as common, as it requires many objects and a lot of time that an object slot would get reused so often that the generation value approaches a high number. And a high generation number is what makes float inaccurate (since the generation is responsible for the 'significant bits' of the number, thus making it really large). At generation 0 to, say, 10000, floats will be accurate. Also, the higher the generations go, the more time has elapsed, and the more 'varied' the generation values will be. Some objects like the player which last forever will always be at generation 0. So then, you have really really varied fixed values, and the chance that two are really close to each other, which would mean similar slot index AND generation index, is pretty small.

    Sorry to bump this post, but I just wanted to share another trick. I'd love to learn any new tricks, if anyone's got some to share.

    Copy several frames quickly
    Slow method:
    You can copy/paste multiple frames between two .mfas by copying from the storyboard view and pasting to the target .mfa's storyboard or project frame list (at the left). However, this will usually take a good amount of time per frame if there's a lot of stuff.

    Fast method:
    A quicker way to do it is to again select the frames in the Storyboard, but instead of Ctrl+copying & pasting, just drag the selection into the target MFA's frame list. This will take next to no time to do for some reason.

    Add comments inside condition list
    Be careful if you use this, as I'm sure this isn't a MMF feature :p. You can add a comment inside an event by doing this:

    • Create a comment
    • While the comment line is selected, go to the Insert menubar item and select "condition".
    • Choose any condition, like "always"
    • A new event will be created that will have your comment transformed into a condition

    If the comment condition is put at the top of the event, the event is transformed back into a comment.

    Right now MMF is fantastically dated in some aspects (keep in mind it's a 1994 runtime that's only been expanded since), so there's more than plenty of room for it to improve. I was happy to hear James and Andos describe Fusion 3 when we met at GDC, and to hear all the new things they're bringing to the table.

    It's a rendering glitch that happens with layers greater than layer 1 (objects seem to trail behind for one frame). This is something that's been an issue for a long time. Right now, the only thing you can do to avoid it is to limit the scrolling speed of the screen :(.

    I had completely forgotten about this thread! Thanks to everyone for their kind comments, I appreciate them very much! This Kickstarter has been an incredibly exciting experience, although it's made it a bit hard to keep up with everything that's happening.

    kpitna03 The position has already been filled, but I really appreciate the disposition and friendliness. I totally forgot to post about this, sorry!

    Thanks for the replies! The position is still open.

    I'm looking for 35~40 different enemies, but as Chaos said, you'd only need to code their particular movement cconditions (graphics will be done by someone else), and you'd either use an already-coded subpixel engine or optimise it and use that. Most of the enemies will be composed of single-sprites, so it's only about getting the movement to feel great/interesting and different for each enemy.

    The only other thing that would need coding from scratch would be making a skeletal system similar to Spine/Spriter (to be able to Please login to see this link.). Obviously not just hardcode the movement of each boss with events, but have a system that reads and interprets actives' positions/rotations/scale/frames from a text file that can be modified later on.

    I think 5-6k is a pretty good rate. It'd take 2-3 months working even less than half-time to allow you to have other jobs (most indies do), but if you wanted to be done quicker you could do it full time.

    The way we'd work is:

    1)I'll give you a part of the game's engine in .mfa format with the player's movements and skillsets so you're able to test the enemy in the environment it's designed for.
    2)You'll then code the enemy behavior on a blank .mfa and import it to the game's .mfa (or design it in that same .mfa if you prefer that route). You'll make all the adjustments necessary so the enemy behaves well in the engine and does what it's supposed to.
    3)Once you're finished with a batch of enemies, you'll send the .mfa containing them back to me so I can extract the objects and group code and paste it on my own .mfa.

    Did I answer those questions? Let me know if you need for me to elaborate on something.

    Decoamorim That example you sent over is a bit vague and hard to judge (it's just a video taken of a phone with a floating jellyfish?). If you have any examples of enemies done for a platform game, preferably that feel like something from Castlevania, that'd be great!