Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics

Cosmo Myzrail Gorynych

A member registered Jul 03, 2016 · View creator page →

Creator of

Recent community posts

(1 edit)

Well, you did return to the game as said earlier ¯\_(ツ)_/¯ At least the issue is now resolved. Good luck with your next recordings! 😄

I use OBS for recordings and it simplifies further editing as I can overlay stuff (e.g. a webcam) in realtime; it may be a good choice to switch to it if you haven’t done it yet 👀

Antony, the video is broken as heck x_x It scared the crap out of me when both the game and you had become glitchy.

(1 edit)

Thanks for playing and sharing your thoughts!

Could you take some time to record and send me this camera issue??

Also, the majority of sprites and tiles are from this tileset; it is free and under CC Attribution license. Other sprites were drawn on office paper sheets with a gel ink pen (I also have a micro pigment/archival inker — similar results and less messy). The grid was printed on an inkjet printer and made with my Papers on Demand (default settings with less intense lines).

Eh, just forget that I said anything.

A neat well-made game. 👍 I wonder how the trajectory line was drawnю

How do I find you, though? There are a couple of tumbleweeds on your creator page…

Congrats on getting a board! Use it with responsibility.

i like games that you can get to the actual game quick, all i could do was walk around and talk to animals who did nothing

Then play these games if you don’t like story-driven interactive experiences ¯_(ツ)_/¯

I think the AI thing was a Portal reference there…

It was 👀

It could not be done without Withering Systems and their free tileset. The tileset is not perfect, but still a marvel!

Some stuff was exaggerated or accentuated. (E.g. I’m not making a game engine for 12345 years. Only for 7. 🤣 😱) I think it made so much contrast in some places that it derailed the overall feel. (It should have been dark.) Or maybe some human issues indeed look stupid if looked at from other’s eyes. But it is good, I think, we learn about ourselves.

I hope you’ve found at least some of these animals relatable (:

(1 edit)

Thank you for sharing your thoughts!

the Barney song at the end kind of killed the mood

Wtf is that thing XD MacLeod’s tracks always remind of some random song. Barney is absent in our culture; the track sounded more like a lullaby for me, not like “I-i-i-i love you-u-u” XD

The writing could definitely use some work

Not everything is that easy to talk about or easy to put into words, at least with English as a second language ¯_(ツ)_/¯ (Tho yea, the tiger could use some more work put into, it is extra one-dimentional and boring)

I made a little story/a place with this tileset:

It was hard to manage signal and noise ratio with these tiles; some of the sprites got cleaned up a bit, others got thicker outlines.

I have two pages of additional sprites for it; one has additional blocks and a couple of mythical creatures, while the other has several UI elements and a reaper figure. I’ll share them once I clean up both of them (:

For looped sounds, use loop property at ct.sound.spawn options:

ct.sound.spawn('Music', {
  loop: true

Also see modules docs in the expandable panel on the right -> Modules’ docs -> ct.sound.howler.

For the ct.capture mod, just call ct.capture.screen() ¯_(ツ)_/¯ Note that ct.capture doesn’t work inside ct.js’ debugger.

Better contribute to

Looks epic; can't wait to come home to test it 🤣

For the record, this was further discussed in our Discord server. Here is an info for future readers:

As I suspect, this is due to folder redirection policy in context of AD domain in a corporate environment.

The issue to add a manual config to workaround these cases is at our repo already: It will be implemented in the nearest versions.

As a temporary solution, you can contact your system administrator:

I suspect this is due to folder redirection policy at Active Directory, or at another LDAP provider. Your system administrator may make an exception for your profile so it doesn't use folder redirection, or at least redirect documents and desktop subfolders only, so the home directory is stored directly on the laptop.
Folder redirection is often used to store users' documents and settings separately from their devices and terminal servers so it can be accessed from multiple points of your enterprise network (so you can login from a random PC at your corporate network and will have all your documents and desktop files there).

Support is provided here and in the Discord server.

There is no way to help you unless you post screenshots with error messages.

Also, right-click ct.js and open the Console; this tab will have more valuable info for devs. Expand the red errors there and take screenshots of them, too.

These were made in Gravit Designer, but I recommend not to use it. I often use Figma now, but any vector image editor will do. is not suitable for platformers (it doesn't allow to slide off platforms and walls); is, though. The newer tutorial versions will have for their movement.

Yup. You can.

(2 edits)

Polygons/Polylines in ct.js, as well as transformed (rotated) rectangles are considered hollow. Ct.js allows concave shapes, but collision checks with filled concave objects are quite computation-heavy :/

I see a couple of workarounds for it, though. They are mostly smoke and mirrors :)

First approach: Make a polygon collision shape that will crosshatch or zigzag the tile, with some margins. Use circular shapes as cursors (mouse, and oftentimes touch events, too, are considered as points). Thus you will get a pretty good approximation of tiles' shape.

v1.4.2 doesn't have tracing functions built-in, except for which is for line tracing only; v1.4.3 will have them, like `` or ``. I just need to write docs and type definitions for them :b

Despite all, here is a line that will work in v1.4.2 and check for a collision between a circle of 16px radius and tiles:

var tile ={
  scale: { x: 1, y: 1 },
  rotation: 0,
  shape: { type: 'circle', r: 16 },
  x: ct.mouse.x,
  y: ct.mouse.y
}, 'Tiles');

Second approach: Make tiles circular and live with it :D After all, people are usually pressing at the center of a tile, and if not, are you sure they didn't misclick?

Do consider picking other game engine if you are unsure; ct.js may be a good tool, but it doesn't fit everyone and every project. At least yet.

There is a PR for android export with cordova:

Or you could manually pack games for mobile on, say, phonegap builder.

> Can i put ads in ct.js games?

Yes; use any applicable html+js ad framework.

> And can ct.js be used for making instant games?

Currently not, unless you manually tweak the exported game's code to work with instant game sdk.

Hey Alix, you can ask support to enable CSS editor:

It is not enabled for default.

I'm glad you've found this asset pack useful, and congratz on your debut!

The logo was hand-drawn, then vectorized. There is no such font ¯\_(ツ)_/¯

Try the Nightly build, we updated the packager recently. Remove the folder C:\Users\GEORGH~1\AppData\Local\Temp\electron-packager\win32-x64\ prior to running the export again.

Oh, I forgot that the platformer tutorial uses copies instead of tiles. Copies' placement is more complicated as their pivot is not set to a standard point. So you position copies by their axis; the robot character has its axis at the bottom of its sprite, so you position it by snapping its bottom center point to the grid; rocks and grass has its axis at the top-left corner so it is positioned relative to that corner. I hope my explanation gives sense :D

What is wrong for you is an expected behavior for ct.js ¯\_(ツ)_/¯ ct.js snaps top-left points of a tile with grid crossings. In your mind, position the top-Ieft corner of a tile, not its center. Anyways, this positioning still worth improving.

Hm, yes, usually writing to the Program Files directory requires admin rights.

I always forget to put a huge banner "YOU HAVEN'T MARKED THIS TEXTURE AS A BACKGROUND" in new versions of ct.js. I will create an issue on Github… 🤣🤣🤣

Open the texture and tick the little box "Use as a background".

A temporary solution: save your project and reopen it. If the problem persists, find this folder in Explorer and delete it manually as an admin.

Permanent solution: use Linux! Seriously tho, I don't know how Windows can shoot in its leg and sometimes lock this folder. There isn't anything spectacular during the export and we don't set any permissions. So it is a known issue that we live with.

So direct assignment for has just been added — it will be live this week with v1.4 🕶

Hey Yondering, see this topic where I tell about using custom fonts in text styles.

Hey Octavia,

So there are a number of “gotchas” here. Some of them require knowledge of CSS properties, and some of them are damn obscure (and will be fixed soon).

  1. Font family is a comma-separated list of quoted fonts. You may leave one-word names as is, but font-family should look like 'first typeface name', 'second typeface name', sans-serif. Ct.js will pick the first available font. See CSS property font-family for more examples. (I actually don’t understand why still time worked for you while being unquoted)
  2. Custom fonts do work in-game but in ct.IDE, they are loaded under a special name so you don’t occasionally load a different locally installed font (and it seems that “Still time” is installed on your system). Okay, so to display custom fonts in the style editor, you should write dpcomic, CTPROJFONTdpcomic, sans-serif. Yes, it is obscure, undocumented, and ugly, but we will get a proper font picker soon.
  3. Pixel fonts will be blurry in Ct.js v1.3 as browsers started displaying poop instead of text about half a year ago. We will have Bitmap Fonts in v1.4 that are faster and solve issues for pixel fonts. Ct.js v1.4 is coming this week, so stay tuned! 📺

Currently with CSS only, though further customization at IDE is on our roadmap.

For CSS styles, use akatemplate built-in module and style this markup:

(3 edits)

I know they have a different update rate


But can I in OnDraw, draw a texture/rectangle/sprite?

No, you can’t, because ct.js’ graphics engine is object-oriented, not an imperative one, and each element that is drawn on the screen should first be created as a ct.js copy or another PIXI.DisplayObject (ct.js’ copies are subclasses of PIXI.AnimatedSprite, which is also a PIXI.DisplayObject). It is about data and object graph, not about drawing instructions like in YoYo Game Maker.

OnDraw is usually used to update these objects and is called in a separate pass. Both OnStep and OnDraw are called at each frame, and firstly all the OnStep events are called, then all the OnDraw ones, so stuff changed in OnDraw always reflects the latest values.

I am trying to have a circle drawn under the player (which is a texture) to define the collision area in my game.

If you want to debug collisions, there is a setting in the module for that.

If you want additional collision masks, that won’t work :D

But strictly about drawing, there is no magical switch to make child nodes be drawn behind their parent. You can either create a copy of that collision area in a room (not inside the player’s pawn) and position it under the pawn (collisions will work in this way too), or make the drawn area the parent of the player’s pawn, or make a type with a transparent texture and with combined collision masks, and have both the drawn area and the pawn as children.


Your computations are screwed up at Math.abs(dir.x + dir.y) > 0, because that’s not how you compute a length of a vector (: Think of dir.x = 5 and dir.y = -10. you could use ct.u.pointDistance, or just compare dir.x and dir.y to zero, separately.

Besides that, I would heavily refactor your movement code: pairs of actions Left and Right, Up and Down are superfluous, and the if clauses are overkill as well.

Firstly, each action has a value parameter from -1 to 1, with 0 meaning no signal or neutral position, or not pressed for buttons with the binary state, as on our keyboards.

So, you could write

dir.x += ct.actions.Right.value;
dir.x -= ct.actions.Left.value;
dir.y += ... you get it

But then remember that values can range from -1 to 1, not just 0 to 1. To use this, you can combine pairs of inputs in one axis to one action, utilizing multipliers (GUI examples), and call them MoveX and MoveY:

ct.inputs.addAction("MoveX", [{
  multiplier: -1
}, {
  multiplier: 1

ct.inputs.addAction("MoveY", [{
  multiplier: -1
}, {
  multiplier: 1

And with ctAction.addMethod and

And so dir.x and dir.y computation gets even smaller:

dir.x = ct.actions.MoveX.value;
dir.y = ct.actions.MoveY.value;

Actually, we don’t need dir object at all:

if (ct.actions.MoveX.down || ct.actions.MoveY.down) {
  let angle = ct.u.pointDirection(0, 0, ct.actions.MoveX.value, ct.actions.MoveY.value);
  this.addSpeed(this.acceleration, angle);


(4 edits)

My ears are bleeding but overall, good job! Enemies could be less squishy; it is much more interesting and challenging when they persist on the screen for longer as you have to dodge more.

The good thing is that the game is simple yet each enemy is distinct enough in its movement speed and attacks. During the boss fight, they complement the boss ship extremely well.

You can disable image smoothing in the settings tab to make the game look sharp and pixelated: