Posts by StrudelCaboodle

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.

    So, I’m in the process of updating an old app I released in 2017. I want to make sure ads and IAPs are still working in my Android app, and I had a couple of burning questions that I thought you all might be able to help with.

    1. Do Chartboost and AdMob still work with the Clickteam Fusion Android Extension? Are there updated guides to integrating them?
      I know this has been discussed before, but I wanted to double-check and see if these two ad networks are still compatible. And, if so, which one is the best to use in 2024? Do you have any recent experiences or insights?
    2. What’s the deal with IAPs these days?
      I read the forum post titled “Update for the Play Billing Library version and Play Core Maven dependency” , but I’m a little fuzzy on whether it’s absolutely necessary or what exactly a “Play Core Maven” even is. I mean, does it sound like something that could help my app? Either way, can I still integrate IAPs the old way, or is there a new, shiny method I should be aware of?

    Any updated guides or pointers to integration documentation would be greatly appreciated! I’m all ears (and keyboard). Thanks a bunch in advance for any help you can provide!

    Cheers

    I don't see anyone talking about this, even though it's such a huge deal! If I have this right, according to the 295.2 Change Log notes, shaders and bg shaders are all now compatible with Android and iOS?

    Unfortunately, there doesn't seem to be any documentation or instructions on this feature or how to use them properly on mobile, unless I'm mistaken? I don't think there's even a list of mobile-compatible shaders or where to get them. I had to really dig around to find some.
    For example, all I could find was this blurb from the Change Log:
    "Android runtime: supports background shaders (note: for this, use the bckgTexture sampler, also please note that the image is flipped on the Y Axis as OpenGL usually does - check the BgBloom shader to see how to handle this)."
    But what does this mean? What is the "bckgTexture sampler" and what is the BgBloom shader? Where can I find them in CF?

    I tested Looki's Drop Shadow shader by applying it to a layer in order to have it affect all objects on that layer, rather than having to apply it individually to each object one-by-one, and while this method worked on PC, it didn't work on Android...

    What a coincidence. I just made exactly what you're talking about a couple weeks ago.


    What worked for me was

    1) At the start of frame, Start loop "ID" NObjects (active) /2 times

    2) Then On loop "ID", if alterable value of (active) = 0, pick one of (active) and set alterable value to LoopIndex("ID") + 1

    This will assign [1 thru however many duplicate actives you have] to half of your active objects.

    Then simply duplicate line 2) so that [set alterable value to LoopIndex("ID") + 1] will be applied to the other half of your actives.

    Nice thing about this code is it will apply it to ANY amount of duplicate actives you have in your frame, as long as there's an even number of them.

    Thank you for the quick response, Fernando!

    Ok, we're getting somewhere! It seems that resolved my initial issue, but now I'm getting a different error:

    --------------------------------------------------------------------------------------

    Downloading Please login to see this link.
    ..............................................................................................................................................................
    Unzipping C:\Users\bitbite\.gradle\wrapper\dists\gradle-7.5-all\6qsw290k5lz422uaf8jf6m7co\gradle-7.5-all.zip to C:\Users\bitbite\.gradle\wrapper\dists\gradle-7.5-all\6qsw290k5lz422uaf8jf6m7co
    Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
    > Task :app:preBuild UP-TO-DATE
    > Task :app:preDebugBuild UP-TO-DATE
    > Task :app:compileDebugAidl NO-SOURCE
    > Task :app:compileDebugRenderscript NO-SOURCE
    > Task :app:generateDebugBuildConfig
    > Task :app:javaPreCompileDebug
    > Task :app:checkDebugAarMetadata FAILED
    > Task :app:generateDebugResValues

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':app:checkDebugAarMetadata'.
    > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
    > The minCompileSdk (31) specified in a
    dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
    is greater than this module's compileSdkVersion (android-29).
    Dependency: androidx.appcompat:appcompat:1.4.1.
    AAR metadata file: C:\Users\bitbite\.gradle\caches\transforms-3\f052799bd1514fad727c14656fc8e64d\transformed\appcompat-1.4.1\META-INF\com\android\build\gradle\aar-metadata.properties.

    * Try:
    > Run with --stacktrace option to get the stack trace.
    > Run with --info or --debug option to get more log output.
    > Run with --scan to get full insights.

    * Get more help at Please login to see this link.

    Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

    You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

    See Please login to see this link.

    BUILD FAILED in 1m 7s
    4 actionable tasks: 4 executed

    --------------------------------------------------------------------------------------


    My Build API is set to 29, with minimum Android version set to 4.4 and Target Android Version set to 8.0

    Display Mode is OpenGL ES 1.1 though i'm not sure if that has to do with anything.


    EDIT: And solved! I followed Linky's advice from another thread, and changed my settings as such:


    App Android properties:

    • Build API: 33
    • Minimum Android version: 5.0
    • Target Android version: 13.0

    Thanks again!

    Hello,

    It has been roughly a year since I've exported an apk, and have never had an issue before. Recently tried exporting an apk from a project I've had no problem exporting from several times in the past and got this error, though:

    --------------------------------------------------------------------------------------

    Downloading Please login to see this link.

    Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
    at sun.net.Please login to see this link.
    at sun.net.Please login to see this link.
    at sun.net.Please login to see this link.
    at sun.net.Please login to see this link.
    at sun.net.Please login to see this link.
    at sun.net.Please login to see this link.
    at sun.net.Please login to see this link.
    at org.gradle.wrapper.Download.downloadInternal(Download.java:66)
    at org.gradle.wrapper.Download.download(Download.java:51)
    at org.gradle.wrapper.Install$1.call(Install.java:62)
    at org.gradle.wrapper.Install$1.call(Install.java:48)
    at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69)
    at org.gradle.wrapper.Install.createDist(Install.java:48)
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107)
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
    at sun.security.validator.Validator.validate(Validator.java:260)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
    ... 22 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
    ... 28 more
    --------------------------------------------------------------------------------------

    A couple of notes, I am not on a secured network, nor using a proxy or VPN.

    I'm using CF 2.5 R295.10 and have just updated Android Studio to the latest jellyfish version.

    My Pathname of the JDK directory is pointing to jdk1.8.0_65, and the Pathname of the Android SDK directory is \AppData\Local\Android\Sdk

    Any help would be much appreciated!

    Bumping this thread. Push/pop up notifications are an essential aspect of having a successful mobile app. They help ensure more engagement with users, which means more eyes on your app and any ads/in-app purchases you may have. It's a bit baffling Clickteam doesn't even have an extension for this important function when just about every other development platform does.

    Any word on this would be excellent!

    Running a loop can achieve exactly what you are looking for

    Example:

    Code
    [I]- Run loop "Fill" 10 times[/I]
    
    
    [B]*On loop "Fill":[/B]
    [I]-- Write value 0 to (LoopIndex("Fill") + 10)[/I]

    Use more math techniques / loops to achieve the results you want

    Alright! Got it working using a combination of fast loops and some other trickery. Thank you for the help, Linky

    Is there an elegant solution for "clearing" or setting CHUNKS/PARTS of an array to 0 without affecting the whole array?

    I'm trying to find a simple way to set multiple values in an array in a range of the X Y and Z coordinates. Eg: write 0 to (10,10,10) thru (20,20,20) of an array, but not (0,0,0) thru (9,9,9).

    Fusion won't let me say "Write Value 0 to (Range(10,20), Range(10,20), Range(10,20)) of Array"

    Thanks!

    1) I am interested in this as well if anyone has done this please let us know!
    2) This is possible simply upload a text file and use the GET object to read it (it is also possible to use google docs but you will need to parse the data to get the content) as seen Please login to see this attachment.
    3) I have done this using and time and date API Please login to see this link. Simply GET this URL "Please login to see this link.". But I have yet to figure out how to do this using my own server as that service is not that reliable

    This is awesome! I just wish there was a clear tutorial for implementing my idea in a CF app. One that walks through the process of using the GET object in conjunction with the PARSE object to display a set of text or numbers in an app. I had no idea you could do this with Google Docs or that World Clock website!

    So it looks like in order to display a "total damage done to giant community boss monster" i'll need to have a website that receives Player Damage Dealt from the app, total up those numbers, and then have the app GET that total number from the website? Would anyone be willing to create a tutorial for that?

    Thank you, this has been really encouraging!

    Sorry if these have been asked before, but I can't find a definitive answer on these specific questions:

    1) Is there any way to get an app (mobile, in particular) made in CF to send notifications to players telling them, for example, that their factory has finished being constructed? Or that daily rewards are waiting for them? Something like this is -essential- for boosting the play time of any app.

    2) Is there a way to get an app to read data from a server, and then transcribe that data in the app somewhere? For example, a billboard that appears in the game's town square that displays the total amount of damage players from around the world have done to a big boss enemy.

    3) Can we make our apps read the date and time from a server, rather than from the players' device, in order to prevent players from exploiting time-sensitive events in the game by setting their device's date and time forward or backward?

    Thank you!

    If this extension does what I'm hoping it does, then it's going to be a huge help, and I will definitely purchase it! I'm surprised CF Mobile exporters didn't come with the push notification functionality; considering how crucial notifications are to the success of any mobile game. Not having notifications was a serious downside to building mobile games with Fusion, but hopefully this extension remedies that!

    Quick question, haoujey- does your OneSign push extension come with a step-by-step on how to integrate it into an app? I have little to no experience working with "backend" stuff in CF2.5, and I read elsewhere that you said the backend work is the trickiest part of implementing this extension? Just making sure I can even implement your extension after I purchase it. Thank you!

    Here's the code I used that, according to the Android IAP tutorials, should have worked, but didn't:
    +Is Billing Available
    +Only one action when event loops
    -Query Inventory for these SKUs "35kgems"
    -Query Inventory for these SKUs "200kgems"

    +User clicks with left button on [buy 35k gems button]
    -Purchase SKU: "35kgems" with Id:1

    +Purchase Id:1 was Ok
    -Create [success graphic] at (0,0) from [buy 35k gems button]
    -Add 35000 to Funds (global value)
    -Write value to array
    -Save array
    -Consume SKU:"35kgems" with Id:1

    The problem here is that it allows me to purchase the gems (I'm doing test purchases through my developer account, via the internal test rollout on Google Play), but the game doesn't reward the player with them.

    Edit:

    The code that does get the game to recognize that the player purchased the gems goes like this:

    +Is Sku "35kgems" purchased
    +Only one action when event loops
    -Create [success graphic] at (0,0) from [buy 35k gems button]
    -Add 35000 to Funds (global value)
    -Write value to array
    -Save array
    -Consume SKU:"35kgems" with Id:1

    The problem with this, is I have to leave the frame and come back in order for it to activate and reward the player with the 35,000 gems.

    Is there a fix yet for the In App Purchase ID's not working?
    - Purchase Id:1 was OK doesn't do anything, but checking to see if the SKU itself was purchased does work. The problem with this workaround, however, is that the - Is SKU "x" purchased? only checks at the start of the frame, so users would have to purchase the item, leave the screen, and come back in order for it to reward them.

    That's great to hear, Fernando, thank you!

    I completely understand why the Chartboost Object had the flag set on.

    For now, I went into my Android Manifest and added this code underneath <!-- Permissions -->:
    <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />

    I got the code from this guide: Please login to see this link.

    Hopefully this is an adequate solution for Google for now. I also hope I placed this code in the correct area!

    I asked Google about an acceptable method for leaving this permission in my app, since I don't see a way to remove it. This was their response:

    "Regarding the WRITE_EXTERNAL_STORAGE permission, if this must stay and is not being used for newer devices it should either be set to a maxsdk in the manifest, or trigger a permission request upon startup letting the user know what this is being used for.

    Android does not automatically trigger the permission. If it is needed on older devices, it should be set to maxsdk."

    This is great, only problem is, I don't understand how to go about doing this. Any ideas? My ideal solution would be to trigger the permission request upon startup, rather than simply removing the permission altogether. Would the app crash if Chartboost tried caching a Rewarded Video with this permission turned off?

    Much appreciated.

    So just a quick follow up.

    In my experience with the Chartboost object, and latest version of Clickteam Fusion, you absolutely need to have a location set for Rewarded Videos if you want the application to be able to detect whether the video has been "Closed". I assume it's the same case for detecting whether a Rewarded Video has been "Cached", "Completed", and "Successful" though I haven't tested these because "Closed" works perfectly fine for my uses.

    Hope this helps anyone struggling with the Chartboost object.

    What's the status on the state of the Chartboost object forcing the "WRITE EXTERNAL STORAGE" permission upon building the APK? Google says my app is ineligible for the Indie Game Corner on the Play Store because of this permission, but I don't know how to turn it off without removing Chartboost entirely.

    Does the Chartboost object still force this permission on, even if it's unchecked in the Android settings in the latest CF2.5?

    Another alternative is that I explain to the user why they need to accept the "WRITE EXTERNAL STORAGE" permission, but I'm not sure how to do that. Is there a way to ask a player in-game to accept a permission?