Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Idea - integrate Piskel/other pixel art editor in newIDE #470

Closed
4 tasks done
blurymind opened this issue Apr 17, 2018 · 55 comments
Closed
4 tasks done

Idea - integrate Piskel/other pixel art editor in newIDE #470

blurymind opened this issue Apr 17, 2018 · 55 comments

Comments

@blurymind
Copy link
Contributor

blurymind commented Apr 17, 2018

The ability to create and edit sprites - right inside gdevelop would be absolutely awesome to have - especially for game jam events

There already is a number of excellent open source html5 pixel editors that gdevelop could take advantage of.
I personally like https://www.piskelapp.com/ for its simplicity and power.
Here is their github - using the apache license
https://github.com/piskelapp/piskel
there is a nodejs prebuilt desktop version too - so it can be done:
https://github.com/piskelapp/piskel/wiki/Desktop-applications

I wonder how dificult it would be to integrate it with gdevelop's animation frames editor - to open/create frames with piskel, while also keeping piskel in it's own standalone folder that can be kept updated independently

I also posted at their tracker to gather feedback
piskelapp/piskel#805

Basically I want it to be able to:

  • Open an existing animation clip in piskel, be able to edit frames, insert new frames, etc - somehow keeping any shapeeditor data intact
  • Save changes back to gdevelop
  • Create a new animation clip via piskel (no need to load any images, you can create them straight in gdevelop via piskel)
  • Ideally have piskel customized to look like its a part of gdevelop - color scheme,etc.

Try to keep piskel's code as vanilla as possible in its own folder, so we can update it with their branch.
Try to to do it in the least intrusive way to gdevelop's newIde

@blurymind
Copy link
Contributor Author

blurymind commented Apr 18, 2018

I need to learn how gdevelop stores it's animation frames first i guess

One thing that could be useful is that piskel can save the animation as a pixi.js movie file
captfure

The json metadata can be used somehow

@blurymind
Copy link
Contributor Author

@4ian would you be ok with the idea? I can give it a try in the weekend if there is time. This might be a little over my head, but it's definitely going to improve the workflow - especially for rapid prototyping

They have an example on how to embed piskel in a website
https://github.com/piskelapp/piskel-embed

@4ian
Copy link
Owner

4ian commented Apr 25, 2018

Let's give it a try!

@blurymind
Copy link
Contributor Author

Awesome 😃
I am going to try to add an option to open an entire animation clip in
https://github.com/4ian/GD/tree/9884965595911bb326c0f2885c9a73ae0c78d790/newIDE/app/src/ObjectEditor/Editors/SpriteEditor
with Piskel

I am still planning on how to do it in the least intrusive way with keeping piskel sepparated in its own folder and not disturbing the current functionality in gdevelop's spriteeditor.

@4ian
Copy link
Owner

4ian commented Apr 25, 2018

I am still planning on how to do it in the least intrusive way with keeping piskel sepparated in its own folder and not disturbing the current functionality in gdevelop's spriteeditor.

Yes that's a challenge indeed.

For a first version, I guess opening Piskel in a separate window/frame would be perfect and easier.
Go for what is the easiest and the more simple.

@blurymind
Copy link
Contributor Author

blurymind commented Apr 27, 2018

I made some progress today - adding a button and a function to it
wip-piskel
Decided to use https://material.io/icons/#ic_create as its the closest symbol to drawing

Perhaps even going with https://material.io/icons/#ic_brush instead, as the pencil can be seen as 'edit' more than draw
brushicon

Also cloned and built the newest version of piskel with gradle - replacing the three year old version their embedding example is using

@4ian where should I place piskel editor's folder within the newIDE/src?
Since it is external html5 project, it can be seen as an optional dependency... but the same time the idea really is to customize it to look like part of the newIde further down the line.

My idea is to keep it vanilla with their releases- so we can easily update our copy when they update theirs. Whats great about it is that it can be loaded modularily without messing with any of the src. Its great! Really beautiful design

For file opening, the embedding example directly loads images from base64 png strings. One thing I can try is get a list of the animation clip images - get them as an array of base64 png strings and load them into piskel- but thats jumping a little bit too ahead. You can see it here btw
https://github.com/piskelapp/piskel-embed/blob/master/script.js#L3

all I need to do is to construct an array for the frames

@4ian
Copy link
Owner

4ian commented Apr 27, 2018

Looks like a good start :)

  • The brush looks even better than the pencil - which is indeed too much associated to the idea of editing.

  • You can put Piskel in src/External/Piskel (create a new folder External).
    If for some reason you cannot put it here and load it, put in in public/External/Piskel.
    The difference is that files in src are part of the source code that is "compiled", it works with import .... Files in public are bundled as it, without changes, and it can be a better choice if the source of Piskel are too large. Files in public must be imported through a <script> tag in index.html

Try both and see if it works. public/External/Piskel might be easier to start with and it won't interfere with the newIDE codebase.

My idea is to keep it vanilla with their releases

Yes good idea :) Please don't do any changes for now to Piskel, updating it should ideally be as simple as copy/pasting the sources of a new version.

@blurymind
Copy link
Contributor Author

blurymind commented Apr 27, 2018

Thank you. Hopefully src would work. :)
Tomorrow I will try to launch piskel embedded from within gdevelop!

Btw since Piskel uses middle click navigation too - it will be consistent with my previous commits and gdevelop's navigation design

In terms of file size- piskel's latest version will add 2 mb

@blurymind
Copy link
Contributor Author

blurymind commented Apr 28, 2018

Ok I am trying to call piskel's index.js to pop up in another window from spriteList.js, looking at how this seems to be done for the add a new resource window:

onAddSprite = () => {
   const {
     resourceSources,
     onChooseResource,
     project,
     direction,
   } = this.props;
   if (!resourceSources) return;

   const sources = resourceSources.filter(source => source.kind === 'image');
   if (!sources.length) return;

   onChooseResource(sources[0].name).then(resources => {
     resources.forEach(resource => {
       project.getResourcesManager().addResource(resource);

       const sprite = new gd.Sprite();
       sprite.setImageName(resource.getName());
       direction.addSprite(sprite);
     });

     this.forceUpdate();
   });
 };

I am scratching my head as to how exactly that works 😖
What is causing the window to pop up on top? Where is that example code I am looking for xD

As a side note I made a simple index.js for piskel

@blurymind
Copy link
Contributor Author

Here is my progress btw:
https://github.com/blurymind/GD

I added piskel to its own external folder and also made a button and function to open it. Trying to open it in a new window fails though- it just opens a new session of gdevelop editor instead.
I am kind of stuck there.

Piskel works when loaded independently though. You can try it by dragging and dropping the index.html file into your web browser

@4ian
Copy link
Owner

4ian commented Apr 29, 2018 via email

@blurymind
Copy link
Contributor Author

blurymind commented Apr 29, 2018

@4ian I got it to open, just as you say- by moving it to public/external/Piskel
Seems to make more sense too- as its outside src that way

:D
I am just using window.open() btw- still need to pass to it a list of images to open

I learned about arrow functions and a bit more about reactjs today

One thing that worries me a bit is the user updating the order of frames in gdevelop, while they have them opened for editing in piskel- ideally when piskel opens an animation, it should also lock it for editing in gdevelop. I guess its not a big deal actually- as piskel should overwrite whatever changes they make in gdevelop upon saving

I need to pass to piskel a list of image paths of the frames in the animation clip now

@blurymind
Copy link
Contributor Author

blurymind commented Apr 29, 2018

Ok Now It also passes some test animation data straight to piskel once opened

This is the format atm:
{"modelVersion":2,"piskel":{"name":"Megaman moving","description":"","fps":2,"height":28,"width":31,"layers":["{\"name\":\"Layer 1\",\"frameCount\":3,\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAAAcCAYAAAADdbMKAAACi0lEQVRoQ+2Yu3HDMAyG6SoaI2XmSJE5MoY7253HyBwpMkdKj8FUzvEBCgTfEgn5EqnyWRR+8gMIAjyI/WEncGBX3AXFGuh3xG+NnSVu2Eq7i+4SWE748mV+nl61mSW2WoFvpd1VtxXUXRzlDOo6CUbwW2l3122B7osD+utEo7XFZm2kb6U9RLcFUHICLto/f4QwTmixWwN+K+0hurVw7grsSUGNPRDtKvX0h76V9jDdEnTvAAHo8v0sxPPZ4Z/sT3kWYpq6RXpaGzl++jDiak7Ty7XHLhu+5hR0LYwPSYh0DNwCFvL7qBcspewBPa+dSUYrobOtOQZdbyv66LLwKHVEQZRXQqfGcrurqG3BuumBwxM9Q612UbfnmikAfXBc3p7y0NVblF7EzTri5rb4/D0pMTMNVb12ItqpQ2h5m3QM85qj0GFyCr6KcK8Wt9Geizg6HjsR7EUaKq9SYNRm181C15WIrUgwSLWl6aOcQNMSpCRvLLJJSsugCWHSZteN5nS3LQGQohZ2nx7L3DngBvqN1CNpz+AZ1pyuXnAuJtBjKdWmC/pK2a89zODbsCFBDh+ozaabrSRwxMciGQAMuPDyIo9Rm0W3rjmyUZ+savq3/cqfZofwaw/XLUE3i6epBu/x/m0/tr6V9lDdEvTs/QOUdQMuuLSzc/c9A7WH61Z3h/Syi9bencF7HSKjNotutnqhORwqFHywOSD90ky0M2XQZtMNmyN0eKmfAJ5UKNHyamW0ewfYX9YG6MGCgy7Sr1DCLm7+oHRO0FL732mb5qWtOmkdn7ie0n+32mod/5DasY4xNlEcveG9b/hFbbS32modn4eee2veDVl3LZzy9PYR1QR26NWo+g38BXXvWDvG9IC5AAAAAElFTkSuQmCC\"}"]}}

The sprite data is a string...

The png base64 part translates to this:
decoded
https://www.base64decode.org/
So we must first put all frames in a horizontal strip, then turn that into a base64 png string

A better route to take of course is to re-write the function to simply load the frame files into piskel frames
piskelapp/piskel#620
If it can be done via drag and drop, I could try to pass the files to the filedropperservice - it will save stitching and converting frames
Perhaps using
pskl.utils.FrameUtils.addImageToFrame(currentFrame, importedImage, x, y);
in a for loop

Will investigate alternative ways to load it into piskel, but first need to figure out how to get a list of the images of the animation being edited.

It loads sonic atm, but I want to get it to load whatever animation frames are in the animation edited

@blurymind
Copy link
Contributor Author

blurymind commented Apr 30, 2018

Ok, I now figured out how to get some stuff from gdevelop's animation clip (direction):

  • does it have sprites
  • does it loop
  • number of frames
  • individual frame file names (but not full paths)
    now how do I get the full image paths to pass on to piskel?

When adding a new frame to gdevelop animation clip, the image retains its original path - it seems.
Its not copied to the project's folder

@4ian
Copy link
Owner

4ian commented Apr 30, 2018

Use getResourceFullUrl from ResourcesLoader.

Note that the images contained in the sprites are name of resources. (which are by default set to the filename of the file, but it could be anything). That's why you need to use ResourcesLoader, which helps you, given a Project and a resource name, to get the full filename to display/load :)

You can see it being used in ImagePreview: https://github.com/4ian/GD/blob/master/newIDE/app/src/ResourcesList/ResourcePreview/ImagePreview.js#L78

or to get the thumbnail of a Sprite object: https://github.com/4ian/GD/blob/master/newIDE/app/src/ObjectsRendering/Renderers/RenderedSpriteInstance.js#L72

@blurymind
Copy link
Contributor Author

blurymind commented Apr 30, 2018

Ah thank you ! I just figured it out and then you confirmed it.
I think that we are getting very very warm to actually opening the resources now! Might be able to do the commit later today 👍

What would then be left is to write a function that writes the files back when saving in piskel

@4ian
Copy link
Owner

4ian commented Apr 30, 2018

Cool!! :)
Not sure where the saving can go but I guess that if Piksel cannot directly save files, you want to get back the base64 images and save them/overwrite the existing files.
You might need to use some Node.js API to write base64 to files :)

@4ian
Copy link
Owner

4ian commented Apr 30, 2018

A bit more information in case you need to use Node.js API to write file:

You'll want to use the fs module. Here is an example on how it's used to write the project file:
https://github.com/4ian/GD/blob/master/newIDE/app/src/ProjectsStorage/LocalProjectWriter.js

Note the use of const fs = optionalRequire('fs'); to import fs. optionalRequire is used to get module from Node.js or npm but only with Electron (it will return null for the webapp).

Apart from projects, GD5 currently do not write any other files on disk if I'm not mistaken. You might want to create a similar file (Local in the name implies that this works only for the desktop app, not the webapp) to save images on disk.

To save a base64 file, this Stack Overflow response looks good: https://stackoverflow.com/questions/6926016/nodejs-saving-a-base64-encoded-image-to-disk

@blurymind
Copy link
Contributor Author

Ah thank @4ian , I will need more time to get this loading the images.
One thing I forgot to consider is that the web app is getting the images from other domains, which would lead to piskel crying out about cross domain security when trying to load them from there

@blurymind
Copy link
Contributor Author

blurymind commented Apr 30, 2018

to add to the frustration, this code breaks in electron version

   var piskelWindow = window.open("External/Piskel/index.html", "_blank");
    piskelWindow.addEventListener('load',() =>{
}

but works in web version

@4ian
Copy link
Owner

4ian commented Apr 30, 2018

To debug, you have to be more precise about "this code breaks":

  • What is the error message, if any?
  • What are you expecting?
  • What differs?
  • Is there still something working or some results?

For now you should concentrate on the electron version, because for the webapp adding external resources is not yet supported, so I doubt we'll be able to do this with Piskel.

I know it's frustrating but don't be discouraged: this is a hard task that you're making because you're making interactions between windows and this is something that is especially hard (or even impossible on the web) (hence the need for Electron) for security reasons.
You can try to use Electron BrowserWindow API instead of window.open but it's hard to be more precise for now without more details.

@blurymind
Copy link
Contributor Author

blurymind commented Apr 30, 2018

I get
TypeError: piskelWindow.addEventListener is not a function

I think the browserwindow api is the way to go. Will investigate tomorrow :)
Today at least I got my image array ready and figured out the loading function in piskel

I wonder if I somehow stitch the pictures and turn them into a base64 string, that would somehow get us around the cross domain security issue

It seems to be the easiest way to load stuff into piskel anyway. Image array can also be used- but took ages to figure out how to do it and its still stuck at cross domain security bump

Can a new electron browser window object be created from within any js file in src? There seems to be a limitation on that

@4ian
Copy link
Owner

4ian commented Apr 30, 2018

Have you try logging the value of piskelWindow? It is probably null or undefined - a null value can be returned by window.open, see https://developer.mozilla.org/en-US/docs/Web/API/Window/open

But yeah, for now let's forget about window.open and go with BrowserWindow.
It's used for launching previews, see an example here: https://github.com/4ian/GD/blob/master/newIDE/app/src/Export/LocalExporters/LocalPreviewLauncher/index.js#L15

@blurymind
Copy link
Contributor Author

blurymind commented Apr 30, 2018

Ah sweet! I will try this tomorrow. I was importing it wrong before, thats why it didnt work

Logging it works in web app, but probably undefined in electron app, even though piskel gets successfully opened in both

@4ian
Copy link
Owner

4ian commented May 1, 2018

If you look at main.js, here is how it's done for index.html:
https://github.com/4ian/GD/blob/master/newIDE/electron-app/app/main.js#L84

In particular, look at the options of BrowserWindow:

  const options = {
    webPreferences: {
      webSecurity: false, // Allow to access to local files
    },
}

// ...

mainWindow = new BrowserWindow(options);

//...

if (isDev) {
    // Development (server hosted by npm run start)
    mainWindow.loadURL('http://localhost:3000');
    mainWindow.openDevTools();
  } else {
    // Production (with npm run build)
    mainWindow.loadURL('file://' + __dirname + '/www/index.html');
    if (devTools) mainWindow.openDevTools();
  }

Can you try something like http://localhost:3000/External/src/Piskel AND change the options passed to BrowserWindow to set webPreferences:

    webPreferences: {
      webSecurity: false, // Allow to access to local files
    },

In all case, root folder is public. During development it is served at localhost:3000. When bundled, it is available at 'file://' + __dirname + '/www/`.

@blurymind
Copy link
Contributor Author

Ah thanks. This is all very new to me.
I will try this

@4ian
Copy link
Owner

4ian commented May 1, 2018

Did you delete a message? I can't see your previous one.
Anyway, yes give it a try and if does not work let me know the error messages and what you were trying.

And/or send me the link to the branch and I see what I can do. :)

@blurymind
Copy link
Contributor Author

blurymind commented May 1, 2018

@4ian yeah, I thought that it wasnt right and wanted to avoid misleading the cause of the issue.

Still, even with
webSecurity: false,
I still get
index.js:2428 Fetch API cannot load file:///D:/stuff/GD/newIDE/electron-app/node_modules/electron/dist/resources/electron.asar/renderer/api/remote.js. URL scheme must be "http" or "https" for CORS request.
when trying to access the Dom in piskel's window

I was wondering is using this would help
https://github.com/electron/electron/blob/master/docs/api/window-open.md

@4ian
Copy link
Owner

4ian commented May 1, 2018

Why is it trying to load remote.js?? 😕Looking at your code now.

@blurymind
Copy link
Contributor Author

blurymind commented May 1, 2018

Thats it!
The syntax is different when interacting with dom in electron.
I realized that I cant just pass dom instructions on an another electron window so easily.

Still not sure how to pass the images with WebContents.executeJavaScript though - since that only takes a string

I need to read more on this at home
https://ourcodeworld.com/articles/read/536/how-to-send-information-from-one-window-to-another-in-electron-framework

@blurymind
Copy link
Contributor Author

blurymind commented May 1, 2018

Progress report:
I rewrote it so now it gets properly loaded via the main.js electron function, following the overall design of gdevelop.
Its nicely preloaded. Closing its window hides it. All of that works cleanly.
I can also send the images to main.js, but doing any dom on piskel remotely would be tricky.
I think I need to properly send the images through ipcrenderer signal, straight to Piskel's index file!

In order to be able to send signals to it though, I need to import electron and ipcrenderer in its index file . Can I do that without moving it into src?

Trying it with

  const electron = require('electron');
  const ipcRenderer = electron ? electron.ipcRenderer : null;

    ipcRenderer.on('piskelOpenAnimation',(event,imageFrames) => {
      log.info("yay");
    });

Doesnt seem to do anything- it doesnt get called when in the index file

Electron seems to have a function to go outside the folder
electron-userland/electron-builder#2693
but not sure if we need it or if its a good idea

@4ian
Copy link
Owner

4ian commented May 2, 2018

You should be able to use require('electron') in public/* BUT no files is transpiled so you don't have things like import ....

Doesnt seem to do anything- it doesnt get called when in the index file

Have you add a console.log to double check that the require is working?
Are you sure you properly send the event from main.js?

@blurymind
Copy link
Contributor Author

I got it to send the signal now! The error was initially that I should have been sending it via webcontents.
Getting closer now :)

@4ian
Copy link
Owner

4ian commented May 2, 2018

Ok great! Indeed it should be sent using webContents :)
So now you can think about a nice interface to send images and see what is the best way with Piskel to get them in and out.
You'll want to save them at some point I guess too, in this case look for my comments above concerning fs and such (#470 (comment)).

@blurymind
Copy link
Contributor Author

blurymind commented May 3, 2018

Progress report: The original Piskel author started helping me out with the file format for piskel.
I am now coverting the images to base64 strings, but piskel is still refusing to load them becauseof some missing argument.

I made a commit to my fork

My guess is that I need to append something to the base64 string that I give to piskel
Its getting warmer now, as piskel is at least accepting the image format, but its now complaining about missing argument.

After we manage to get it loading the images, I will of course write a function save them back to their original paths or gdevelop's project :)

@4ian
Copy link
Owner

4ian commented May 3, 2018

Yes you iterating on the images and creating Image with onload but it's asynchronous so you should use something like async (require('async') should work) to iterate.

@blurymind
Copy link
Contributor Author

Thank you @4ian

Progress report, Piskel is now loading gdevelop animation clips:
gd-piskel-working

@4ian
Copy link
Owner

4ian commented May 7, 2018

Looks super great! 🤩 🤩 🤩

@blurymind
Copy link
Contributor Author

Ah Thank you =)
I am now looking into how to programmatically get the animation's unique Id from gdevelop and also be able to add new resources to an animation via the same ID. I noticed that there is an 'id' in the spriteEditor/index.js

@4ian
Copy link
Owner

4ian commented May 7, 2018

id for an animation is just the index of the animation in the list of animations of the sprite :)

@blurymind
Copy link
Contributor Author

blurymind commented May 7, 2018

I wonder what the best way to do this is.
What if the user reorders the list,while having opened an animation in piskel, then saves changes in piskel- the sprites will not get loaded into the animation clip that was originally opened in piskel

@4ian
Copy link
Owner

4ian commented May 7, 2018

For now we might want to consider that GDevelop is disabled when Piskel is opened, so no changes to the animations can be made by the user?
We could display an overlay on the whole GDevelop window telling that Piskel is open.

Because I don't see how we can track which animation has been opened.

@blurymind
Copy link
Contributor Author

blurymind commented May 9, 2018

New update:
Piskel is now writing and overwriting files back to gdevelop
piskel-gdevelop-writingfiles
Will commit later today.
All thats left now is have gdevelop reload the animation frames- so any frame reorder or new frames get loaded.

This is now getting almost ready for review and cleanup

@4ian
Copy link
Owner

4ian commented May 9, 2018

Awesome! Great job again :)

For reloading the animation frame, you may want to call this.forceUpdate on the SpritesList that was used to open Piskel, like done here:
https://github.com/4ian/GD/blob/master/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js#L130

@blurymind
Copy link
Contributor Author

blurymind commented May 9, 2018

@4ian thank you :)
I learned quite a few new things while doing this.

Btw I think this will need clearing the frame list of the edited animation and loading the new file paths into it from piskel - to accomodate for any new frames created in piskel - or frame reorders in piskel.

I have the ipcrenderer signal ready with updated filepaths array for that :}

But I will need to find out how to determine which animation index is being edited in piskel and also find out how to clear it and load the frames from the new list

commit here https://github.com/blurymind/GD/commit/fe261af9abebdcc5a33bfe54bc60b358191bf92b

@blurymind
Copy link
Contributor Author

blurymind commented May 10, 2018

Small Update today:

  • Fixed piskel initiation on animation clips that have no frames added in gdevelop
  • hid the 'create new piskel' button from piskel editor's header, in its place there is now a save to gdevelop and cancel buttons
  • Cleaned up code that was messy, so the piskel side of the code is ready

Will do commit later

Plan now:
Piskel is sending a signal with an array of file paths of the frames it created or overwrote when saving- I need to use that to update the animation clip that was opened in piskel

  • 1 Clear all animation frames on the clip (will need to first get the animation clip ID first)
  • 2 Load in their place the ones from the piskel signal's file path array - will need to add any new ones as resource. The frame order is decided by the order in the array of course - so if frames were reordered in piskel - that should get applied back in gdevelop

@blurymind
Copy link
Contributor Author

blurymind commented May 10, 2018

@4ian
Copy link
Owner

4ian commented May 10, 2018

You can open a Pull Request so that all your commits are grouped together and can be reviewed and merged later when they are ready :)

@4ian
Copy link
Owner

4ian commented May 10, 2018

Also try to run prettier on the files that you've done so that they are automatically formated (huge time saver and this unify the code style).
See https://github.com/4ian/GD/blob/master/newIDE/README.md#recommended-tools-for-development for Visual Studio Code. If you're using another text editor, you should be able to find a plugin.

In any case, thanks for your huge work on this and the time passed! I'll review it and for the changes, I can either comment or do the changes by myself if it's too hard to explain maybe.

@blurymind
Copy link
Contributor Author

blurymind commented May 10, 2018

did some more cleanups
https://github.com/blurymind/GD/commit/bfaf54b20c3a5bb050aeee6fa55730a57462b4b4

Will also do prettier
I am now trying to see if I can crash it or get it to do something unwanted (bug hunting)

@4ian the master branch is ahead of my branch. I need to merge changes from you as well

@4ian
Copy link
Owner

4ian commented May 10, 2018

No, no need to merge the changes before creating your PR :)

Great! Bug hunting is always a good idea, because I think we can find edge cases.

@blurymind
Copy link
Contributor Author

blurymind commented May 10, 2018

Will do some testing tomorrow and some more cleanups. Then do the commit in the weekend - just in case.
:)
I left some notes- hope it makes sense
Now that functionality is there, we have to make sure it is always predictable.

@blurymind
Copy link
Contributor Author

I made a pull request here:
#493
Please wait up a little before merging, i need to fix a small bug and do some other cosmetic things

@4ian
Copy link
Owner

4ian commented May 11, 2018

Sure thanks for the PR! 👍

@blurymind
Copy link
Contributor Author

blurymind commented May 21, 2018

Piskel is now a part of gdevelop!
Many thanks to both piskel and gdevelop's original authors- @4ian and @juliandescottes for the collaborative effort !

With the pull request merged now - I can close this issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants