I am currently working on Stipple Effect, a pixel art editor with animation capabilities and a rich scripting ecosystem.
You can download my published games and software here.
The best way to get in touch with me is via email :)
Stipple Effect is a pixel art editor that supports animation and scripting (available on Windows, macOS and Linux)
Home Page: https://flinkerflitzer.itch.io/stipple-effect
License: Other
I am currently working on Stipple Effect, a pixel art editor with animation capabilities and a rich scripting ecosystem.
You can download my published games and software here.
The best way to get in touch with me is via email :)
Add a second snap mode to the MoverTool
implementations (MoveSelection
and PickUpSelection
) where the top left of the selection area is snapped to the top left of the pixel grid cell that is occupied. This will exist alongside the existing snap mode, which moves the selection area by the nearest multiple of its own dimensions.
MoverTool
to toggle between potential snap modesBoxSelect
snap implementation to ensure consistencyPrerequisites:
Tasks:
class TextTool
and tool behaviour
hasToolContentPreview()
and getToolContentPreview(final ProjectState state)
SECursor
Tool options bar elements with dynamic labels followed by UI elements have abstract spacing that looks awkward. Redesign this to be more compact overall and consistent with the spacing conventions used by options with static text labels.
Brush
ShadeBrush
Eraser
GradientTool
Line
BrushSelect
TextTool
Pencil
Brush
Fill
Wand
Settle on a license and a distribution strategy for Stipple Effect.
Provide exhaustive and comprehensive documentation for the scripting language,
Description:
Tool settings:
Adjust layer/frame count limits and the size of the state manager state stack dynamically based on project attributes like canvas dimensions and present layer and frame counts, performance considerations, and unassigned heap memory available to the JVM.
Layout
and DialogAssembly
helpersDialogs without sub-tasks generally only require formatting/layout redesigns and code refactoring
pixelGridX
or pixelGridY
setting values are changed by the assignmentAdd a polygon select tool that uses rudimentary pixel raycasting to determine whether pixels in rectangular bound area are in- or outside the defined polygon.
Tasks:
class PolygonSelect
and tool behaviour
hasToolContentPreview()
and getToolContentPreview(final ProjectState state)
SECursor
Extend class GradientTool
to...
boolean wholeCanvas
to an enum Scope
with literals WHOLE_CANVAS, START_TO_END, WHOLE_CANVAS_MASKED, START_TO_END_MASKED
...MASKED
enum constantsGeometry.calculateAngleInRad
to get started with the getC
function for new enum constant SPIRAL
in enum Shape
Separate "Upcoming" section of __changelog
to __roadmap
and separate info page tab
Tasks:
SELayer
needs refactor to make static layer loadable from a single deserialized GameImage
ParserSerializer
Tasks:
Send more status updates to increase feedback to the user and user's confidence in functionality, especially when relevant menu panels are hidden from view.
Status updates for...
ColorMenuMode
is set to PALETTE
Objectives:
Description:
Use Unicode Private Use Area in BMP (U+E000 to U+F8FF) to extend Delta Time font character set for composed Yoruba letters (subdot + tonal mark)
Tasks:
'\uE000'
)Change the single checkerboard size setting into two - one for X and one for Y - making each dimension independent
Tasks:
SEContext.redrawCheckerboard
to account for changesclass Settings
Add a shade brush tool (dedicated tool separate from brush tool) that replaces the previous color that was drawn over with the adjacent color in the palette's present color order iff the color that was drawn over was in the palette and has an adjacent color in the relevant direction. Left click shifts the replacement color to the left in the palette; right click to the right.
Preconditions for implementation:
Tasks:
class ShadeBrush
and tool behaviourUse and track threads as fields inside Tool classes. Delegate tasks currently performed directly inside update(SEContext context, Coord2D mousePosition)
to these threads and kill ongoing threads that are no longer relevant.
For example, if the target pixel of a move selection operation has changed before the thread completed the operation pre-processing, kill the thread executing the task and reassign the thread field to a new thread with the updated conditions for the operation. However, if the target pixel is still the same as the ongoing thread operation, and no other metadata is relevant, allow the thread to continue executing.
Onion skin mode (implemented as ThinkingMenuElement
) and layer settings buttons do not scroll with other layer menu elements.
All layer buttons should scroll alongside SelectableListItemButton
, LayerVisibilityButton
, and frame linked button
Enclose the preview image menu element in a custom implementation of AbstractBidirectionalScrollBox
from Delta Time.
ScrollBox
in Delta Time to pass a blank GameImage
of same bounds as canvas
to render()
function of the elements enclosed in its box. Draw the section of this GameImage
bounded by the bounds
of the ScrollBox
to canvas
at the getRenderPosition()
of the ScrollBox
MAX_CANVAS_W + SLIDER_OFF_DIM
x MAX_CANVAS_H + SLIDER_OFF_DIM
Tasks:
Motivation:
ToolWithBreadth
currently extends ToolThatDraws
, but there are planned tools like the line tool that have a breadth property but are not drawing tools
Setting pixel grid and checkerboard increments via shortcut (Ctrl + B) is resetting window size and theme
Setting the pixel grid and checkerboard increments should not affect other settings
Change Stipple Effect's internal versioning system to match what Delta Time does.
Version
classAdd a flag for including or excluding invisible layers to palette action dialogs (on - true
- by default)
Instances of ScrollableMenuElement
are being rendered when they have been displaced outside of the bounds of the ScrollingMenuElement
that contains them. This bug was observed in a devbuild for v0.3.0 and I could not replicate it in 0.2.0.1.
Do not render (or process) child ScrollableMenuElement
instances when they have been displaced outside of the bounds of their container.
ScrollingMenuElement
and its parent class MenuElementContainer
ScrollableMenuElement
Investigate and fix this bug
Reimplement field DitherStage ditherStage
in ToolThatDraws
as a field double tendency
that ranges from 0d
to 1d
. This tendency describes how much each color sampling mode (DITHER
, BLEND
and NOISE
) will tend towards the primary color vs the secondary color.
tendency
by 100 and casting it to int
before describing it as a percentageDITHER
: get the dither stage from the nearest fraction just like how GradientTool
does itBLEND
int
after addition(int) ((primary.getRed() * tendency) + (secondary.getRed() * (1d - tendency)))
NOISE
: Figure out if a tendency application for noise mode makes sense and what the maths would entailAdd a pixel grid that can optionally be displayed starting at a zoom threshold of 400%
Tasks:
Explicit map initialization:
final {string:int} codeMap = { "here" : 1, "there" : 2 };
Color hex code literals:
color a = #e0f33f;
- #e0f33f
color b = #308030bb
- #308030
with opacity of 187
Absolute function:
argType
is int
or float
abs(argType)
Min/max functions:
argType
is int
or float
colType
is array - []
, list - <>
or set - {}
min(argType a, argType b)
or min(colType of argType)
max(argType a, argType b)
or max(colType of argType)
Clamp function:
argType
is int
or float
clamp(argType min, argType val, argType max)
RNG functions:
rand()
- produces a random float between 0 and 1prob(float p)
- produces a bool
based on a probability argument (0 <= p <= 1)
flip_coin()
- equivalent to prob(0.5)
Functions and function calls:
func
to general function nodeSymbolTable
to know where head function isFunctionCallExpression
parser rule that takes ident LPAREN (expr (COMMA expr)*)? RPAREN
FunctionCallExpression
parser rule must come after all native call expression rulesrand()
prob(float p)
flip_coin()
FunctionCallNode
Script
and beyond AST - what is the root node of script if not HeadFuncNode
?For each feature, do the following if it applies:
Update the project dependencies based on infrastructural changes during 0.4.0 development and update metadata documents (changelog and roadmap).
.txt
.md
.txt
.md
This should enable easy assembly and disassembly of sprite sheets. If a project has a single frame, it can be split. If a project has multiple frames, it can be stitched together.
For stitch
and split
functions:
final ProjectState result
definition; this will be a getState()
call appended with mutator-returnerssplit
and stitch
functions
stitch
, auto-lock all layerssplit
, auto-unlock all layersFrames to redraw:
Extend process(InputEventLogger)
in StippleEffect
to check presses of Keys 1-9 and trigger context switches iff there are enough contexts in scope for each key press.
Holding Shift while moving the selection with either mover tool (move selection or pick up selection), whether with the arrow keys or click and drag, should snap to multiples of the selection's dimensions.
With arrow keys: instead of incrementing position by +/- 1 on either x or y, incrment by the selection's relevant dimension (width or height)
With click and drag: snap delta position to nearest multiple of selection's dimensions
Tasks:
MoverTool
Add a gradient brush tool that remembers the pixels it has painted over separately for every target pixel change. That way, ...
Preconditions for implementation:
Tasks:
class GradientBrush
and tool behaviour
hasToolContentPreview()
and getToolContentPreview(final ProjectState state)
Tasks:
Unify the error types into fewer enum entries with more flexible arguments.
Reassign size operator #col
to #|col
for some list, set, . This is to resolve a parser conflict with the color literals planned in #64 .
Add dialogs for HSV shifting and brightness/contrast adjustment for a variety of scopes.
Tasks:
Coord2D
) by 0, Layout.BUTTON_INC
final Map<Color, Boolean> inclusionMap
field to Palette
class - propagate changes to colorSequence
contents to inclusionMap
Tasks:
This will have the same bounds as the canvas when non-trivial and will be drawn after the selection contents on the editing layer in ProjectState.draw()
.
Tasks:
return GameImage.dummy();
ProjectState.draw()
that accounts for whether to draw tool content previewAdd toggleable x- and y-axis symmetry tool that, when enabled, reflects edits along the moveable mirror plane. Some tools - like fill - are intentionally outside of the scope of the symmetry tool.
MonoSE should be minimally stylized and prioritize readability with clean, narrow lines.
Bruch should be somewhat medieval looking; inspired by Fraktur.
MonoSE tasks:
#00ff00
(? - reference Delta Time documentation to confirm color) evenly spaced monospacing borders
SEFonts
Settings
Bruch tasks:
SEFonts
Add a line tool. Click and drag to draw a line, unclick to place it. Holding Shift will snap line to the nearest 15-degree angle. Holding Ctrl will make the line a gradient ranging from the primary to the secondary color.
Preconditions for implementation:
Tasks:
class Line
and tool behaviour
hasToolContentPreview()
and getToolContentPreview(final ProjectState state)
Pressing Enter when a dialog with an ApproveDialogTextButton
is displayed should execute on the on click behaviour iff the precondition is passing.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.