pixi-fusion 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/dist/src/assets-manager/AssetsManager.context.d.ts +15 -0
  4. package/dist/src/assets-manager/AssetsManager.context.js +6 -0
  5. package/dist/src/assets-manager/AssetsManager.d.ts +2 -0
  6. package/dist/src/assets-manager/AssetsManager.js +43 -0
  7. package/dist/src/assets-manager/index.d.ts +3 -0
  8. package/dist/src/assets-manager/index.js +3 -0
  9. package/dist/src/assets-manager/useAssetManager.d.ts +1 -0
  10. package/dist/src/assets-manager/useAssetManager.js +5 -0
  11. package/dist/src/camera/Camera.context.d.ts +13 -0
  12. package/dist/src/camera/Camera.context.js +2 -0
  13. package/dist/src/camera/Camera.d.ts +7 -0
  14. package/dist/src/camera/Camera.js +99 -0
  15. package/dist/src/camera/index.d.ts +2 -0
  16. package/dist/src/camera/index.js +2 -0
  17. package/dist/src/game-context/Game.context.d.ts +39 -0
  18. package/dist/src/game-context/Game.context.js +85 -0
  19. package/dist/src/game-context/index.d.ts +1 -0
  20. package/dist/src/game-context/index.js +1 -0
  21. package/dist/src/game-objects/GameObjectPhysicalObjectConfig.d.ts +4 -0
  22. package/dist/src/game-objects/GameObjectPhysicalObjectConfig.js +1 -0
  23. package/dist/src/game-objects/index.d.ts +2 -0
  24. package/dist/src/game-objects/index.js +2 -0
  25. package/dist/src/game-objects/usePhysicalObject.d.ts +7 -0
  26. package/dist/src/game-objects/usePhysicalObject.js +17 -0
  27. package/dist/src/game-objects/usePhysicalObjectFromConfig.d.ts +6 -0
  28. package/dist/src/game-objects/usePhysicalObjectFromConfig.js +13 -0
  29. package/dist/src/game-objects/useWalls.d.ts +11 -0
  30. package/dist/src/game-objects/useWalls.js +59 -0
  31. package/dist/src/hooks/index.d.ts +12 -0
  32. package/dist/src/hooks/index.js +12 -0
  33. package/dist/src/hooks/useAnimatedSprite.d.ts +10 -0
  34. package/dist/src/hooks/useAnimatedSprite.js +41 -0
  35. package/dist/src/hooks/useCamera.d.ts +1 -0
  36. package/dist/src/hooks/useCamera.js +5 -0
  37. package/dist/src/hooks/useCollisionDetection.d.ts +9 -0
  38. package/dist/src/hooks/useCollisionDetection.js +21 -0
  39. package/dist/src/hooks/useGame.d.ts +1 -0
  40. package/dist/src/hooks/useGame.js +5 -0
  41. package/dist/src/hooks/useGlobalEventHandler.d.ts +5 -0
  42. package/dist/src/hooks/useGlobalEventHandler.js +15 -0
  43. package/dist/src/hooks/useLayerContext.d.ts +1 -0
  44. package/dist/src/hooks/useLayerContext.js +5 -0
  45. package/dist/src/hooks/useObject.d.ts +6 -0
  46. package/dist/src/hooks/useObject.js +54 -0
  47. package/dist/src/hooks/useSprite.d.ts +6 -0
  48. package/dist/src/hooks/useSprite.js +21 -0
  49. package/dist/src/hooks/useStage.d.ts +1 -0
  50. package/dist/src/hooks/useStage.js +5 -0
  51. package/dist/src/hooks/useTexture.d.ts +9 -0
  52. package/dist/src/hooks/useTexture.js +14 -0
  53. package/dist/src/hooks/useTickerCallback.d.ts +5 -0
  54. package/dist/src/hooks/useTickerCallback.js +14 -0
  55. package/dist/src/hooks/useTilingSprite.d.ts +6 -0
  56. package/dist/src/hooks/useTilingSprite.js +26 -0
  57. package/dist/src/hooks/useWorld.d.ts +1 -0
  58. package/dist/src/hooks/useWorld.js +5 -0
  59. package/dist/src/index.d.ts +10 -0
  60. package/dist/src/index.js +10 -0
  61. package/dist/src/layer/Layer.context.d.ts +6 -0
  62. package/dist/src/layer/Layer.context.js +2 -0
  63. package/dist/src/layer/Layer.d.ts +6 -0
  64. package/dist/src/layer/Layer.js +34 -0
  65. package/dist/src/layer/index.d.ts +1 -0
  66. package/dist/src/layer/index.js +1 -0
  67. package/dist/src/physics/MatterPhysics.context.d.ts +8 -0
  68. package/dist/src/physics/MatterPhysics.context.js +74 -0
  69. package/dist/src/physics/index.d.ts +4 -0
  70. package/dist/src/physics/index.js +4 -0
  71. package/dist/src/physics/types.d.ts +24 -0
  72. package/dist/src/physics/types.js +1 -0
  73. package/dist/src/physics/useCollisionEventHandler.d.ts +7 -0
  74. package/dist/src/physics/useCollisionEventHandler.js +15 -0
  75. package/dist/src/physics/usePhysicsEngineEventHandler.d.ts +8 -0
  76. package/dist/src/physics/usePhysicsEngineEventHandler.js +15 -0
  77. package/dist/src/physics/usePhysicsTickerCallback.d.ts +7 -0
  78. package/dist/src/physics/usePhysicsTickerCallback.js +15 -0
  79. package/dist/src/stage/Stage.context.d.ts +6 -0
  80. package/dist/src/stage/Stage.context.js +2 -0
  81. package/dist/src/stage/Stage.d.ts +2 -0
  82. package/dist/src/stage/Stage.js +29 -0
  83. package/dist/src/stage/index.d.ts +1 -0
  84. package/dist/src/stage/index.js +1 -0
  85. package/dist/src/types.d.ts +7 -0
  86. package/dist/src/types.js +7 -0
  87. package/dist/src/world/World.context.d.ts +10 -0
  88. package/dist/src/world/World.context.js +2 -0
  89. package/dist/src/world/World.d.ts +11 -0
  90. package/dist/src/world/World.js +66 -0
  91. package/dist/src/world/index.d.ts +2 -0
  92. package/dist/src/world/index.js +2 -0
  93. package/package.json +52 -0
  94. package/src/assets-manager/AssetsManager.context.tsx +23 -0
  95. package/src/assets-manager/AssetsManager.tsx +54 -0
  96. package/src/assets-manager/index.ts +3 -0
  97. package/src/assets-manager/useAssetManager.ts +7 -0
  98. package/src/camera/Camera.context.tsx +17 -0
  99. package/src/camera/Camera.tsx +153 -0
  100. package/src/camera/index.ts +2 -0
  101. package/src/game-context/Game.context.tsx +133 -0
  102. package/src/game-context/index.ts +1 -0
  103. package/src/game-objects/GameObjectPhysicalObjectConfig.ts +18 -0
  104. package/src/game-objects/index.ts +2 -0
  105. package/src/game-objects/usePhysicalObject.ts +24 -0
  106. package/src/game-objects/usePhysicalObjectFromConfig.ts +22 -0
  107. package/src/game-objects/useWalls.ts +93 -0
  108. package/src/hooks/index.ts +12 -0
  109. package/src/hooks/useAnimatedSprite.ts +65 -0
  110. package/src/hooks/useCamera.ts +6 -0
  111. package/src/hooks/useCollisionDetection.ts +35 -0
  112. package/src/hooks/useGame.ts +6 -0
  113. package/src/hooks/useGlobalEventHandler.ts +27 -0
  114. package/src/hooks/useLayerContext.ts +6 -0
  115. package/src/hooks/useObject.ts +81 -0
  116. package/src/hooks/useSprite.ts +33 -0
  117. package/src/hooks/useStage.ts +7 -0
  118. package/src/hooks/useTexture.ts +22 -0
  119. package/src/hooks/useTickerCallback.ts +25 -0
  120. package/src/hooks/useTilingSprite.ts +39 -0
  121. package/src/hooks/useWorld.ts +7 -0
  122. package/src/index.ts +10 -0
  123. package/src/layer/Layer.context.tsx +9 -0
  124. package/src/layer/Layer.tsx +57 -0
  125. package/src/layer/index.ts +1 -0
  126. package/src/physics/MatterPhysics.context.tsx +100 -0
  127. package/src/physics/index.ts +4 -0
  128. package/src/physics/types.ts +27 -0
  129. package/src/physics/useCollisionEventHandler.ts +26 -0
  130. package/src/physics/usePhysicsEngineEventHandler.ts +30 -0
  131. package/src/physics/usePhysicsTickerCallback.ts +25 -0
  132. package/src/stage/Stage.context.tsx +9 -0
  133. package/src/stage/Stage.tsx +50 -0
  134. package/src/stage/index.ts +1 -0
  135. package/src/types.ts +8 -0
  136. package/src/world/World.context.tsx +13 -0
  137. package/src/world/World.tsx +93 -0
  138. package/src/world/index.ts +2 -0
@@ -0,0 +1,4 @@
1
+ export * from "./MatterPhysics.context";
2
+ export * from "./useCollisionEventHandler";
3
+ export * from "./usePhysicsTickerCallback";
4
+ export * from "./usePhysicsEngineEventHandler";
@@ -0,0 +1,27 @@
1
+ import Matter from "matter-js";
2
+
3
+ export type MatterPhysicsDebugConvexHullConfig = {
4
+ strokeColor?: string;
5
+ strokeWidth?: number;
6
+ };
7
+
8
+ export type MatterPhysicsConfig = {
9
+ world: {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ debug?: {
14
+ convexHull?: MatterPhysicsDebugConvexHullConfig;
15
+ showConvexHull?: boolean;
16
+ };
17
+ };
18
+
19
+ export type MatterPhysics = {
20
+ readonly config: MatterPhysicsConfig;
21
+ readonly runner: Matter.Runner;
22
+ readonly engine: Matter.Engine;
23
+ run: () => void;
24
+ stop: () => void;
25
+ addBody: (body: Matter.Body | Matter.Composite) => void;
26
+ removeBody: (body: Matter.Body | Matter.Composite) => void;
27
+ };
@@ -0,0 +1,26 @@
1
+ import { useEffect, useContext } from "react";
2
+
3
+ import { Engine, Events, ICollisionCallback, IEvent } from "matter-js";
4
+ import { MatterPhysicsContext } from "./MatterPhysics.context";
5
+
6
+ export type UseCollisionEventHandlerOptions = {
7
+ isEnabled?: boolean;
8
+ event: "collisionActive" | "collisionEnd" | "collisionStart";
9
+ callback: ICollisionCallback;
10
+ };
11
+
12
+ export const useCollisionEventHandler = ({ isEnabled = true, event, callback }: UseCollisionEventHandlerOptions) => {
13
+ const { engine } = useContext(MatterPhysicsContext);
14
+
15
+ useEffect(() => {
16
+ if (!isEnabled) {
17
+ return () => {};
18
+ }
19
+
20
+ Events.on(engine, event, callback as unknown as (e: IEvent<Engine>) => void);
21
+
22
+ return () => {
23
+ Events.off(engine, event, callback);
24
+ };
25
+ }, [isEnabled, callback, event]);
26
+ };
@@ -0,0 +1,30 @@
1
+ import { useEffect, useContext } from "react";
2
+
3
+ import { Events, IEngineCallback, IEvent, Engine } from "matter-js";
4
+ import { MatterPhysicsContext } from "./MatterPhysics.context";
5
+
6
+ type UsePhysicsEngineEventHandlerOptions = {
7
+ isEnabled?: boolean;
8
+ event: "beforeUpdate" | "afterUpdate";
9
+ callback: IEngineCallback;
10
+ };
11
+
12
+ export const usePhysicsEngineEventHandler = ({
13
+ isEnabled = true,
14
+ event,
15
+ callback
16
+ }: UsePhysicsEngineEventHandlerOptions) => {
17
+ const { engine } = useContext(MatterPhysicsContext);
18
+
19
+ useEffect(() => {
20
+ if (!isEnabled) {
21
+ return () => {};
22
+ }
23
+
24
+ Events.on(engine, event, callback as unknown as (e: IEvent<Engine>) => void);
25
+
26
+ return () => {
27
+ Events.off(engine, event, callback);
28
+ };
29
+ }, [isEnabled, event, callback]);
30
+ };
@@ -0,0 +1,25 @@
1
+ import { useEffect, useContext } from "react";
2
+
3
+ import { Events, IRunnerCallback, IEvent, Runner } from "matter-js";
4
+ import { MatterPhysicsContext } from "./MatterPhysics.context";
5
+
6
+ type UsePhysicsTickerCallbackOptions = {
7
+ isEnabled?: boolean;
8
+ callback: IRunnerCallback;
9
+ };
10
+
11
+ export const usePhysicsTickerCallback = ({ isEnabled = true, callback }: UsePhysicsTickerCallbackOptions) => {
12
+ const { runner } = useContext(MatterPhysicsContext);
13
+
14
+ useEffect(() => {
15
+ if (!isEnabled) {
16
+ return () => {};
17
+ }
18
+
19
+ Events.on(runner, "tick", callback as unknown as (e: IEvent<Runner>) => void);
20
+
21
+ return () => {
22
+ Events.off(runner, "tick", callback);
23
+ };
24
+ }, [isEnabled, callback]);
25
+ };
@@ -0,0 +1,9 @@
1
+ import { createContext } from "react";
2
+ import { Container } from "pixi.js";
3
+
4
+ export type StageContextValue = {
5
+ addObject: (body: Container) => void;
6
+ removeObject: (body: Container) => void;
7
+ };
8
+
9
+ export const StageContext = createContext<StageContextValue>({} as unknown as StageContextValue);
@@ -0,0 +1,50 @@
1
+ import React, { PropsWithChildren, useCallback, useEffect, useMemo, useState } from "react";
2
+ import { Container } from "pixi.js";
3
+ import { StageContext, StageContextValue } from "./Stage.context";
4
+ import { useWorld } from "../hooks";
5
+ import { Layer } from "../layer";
6
+
7
+ export const Stage: React.FC<PropsWithChildren> = ({ children }) => {
8
+ const { application, isInitialized } = useWorld();
9
+ const [things, setThings] = useState<Container[]>([]);
10
+
11
+ const addObject = useCallback(
12
+ (thing: Container) => {
13
+ setThings((oldThings) => [...oldThings, thing]);
14
+ },
15
+ [things]
16
+ );
17
+
18
+ const removeObject = useCallback(
19
+ (thing: Container) => {
20
+ setThings((oldThings) => oldThings.filter(({ uid }) => uid === thing.uid));
21
+ },
22
+ [application]
23
+ );
24
+
25
+ const conextValue = useMemo<StageContextValue>(
26
+ () => ({
27
+ addObject,
28
+ removeObject
29
+ }),
30
+ [addObject, removeObject]
31
+ );
32
+
33
+ useEffect(() => {
34
+ if (!isInitialized) {
35
+ return;
36
+ }
37
+
38
+ application.stage.addChild(...things);
39
+
40
+ return () => {
41
+ application.stage.removeChild(...things);
42
+ };
43
+ }, [things, isInitialized]);
44
+
45
+ return (
46
+ <StageContext.Provider value={conextValue}>
47
+ <Layer>{children}</Layer>
48
+ </StageContext.Provider>
49
+ );
50
+ };
@@ -0,0 +1 @@
1
+ export * from "./Stage";
package/src/types.ts ADDED
@@ -0,0 +1,8 @@
1
+ export enum GameStatus {
2
+ READY = 0,
3
+ IN_PROGRESS = 1,
4
+ TIMEDOUT = 2,
5
+ COMPLETED = 3
6
+ }
7
+
8
+ export type Nullable<T> = T | null;
@@ -0,0 +1,13 @@
1
+ import { createContext } from "react";
2
+ import { Application } from "pixi.js";
3
+
4
+ export type WorldContextValue = {
5
+ readonly size: {
6
+ width: number;
7
+ height: number;
8
+ };
9
+ readonly application: Application;
10
+ readonly isInitialized: boolean;
11
+ };
12
+
13
+ export const WorldContext = createContext<WorldContextValue>({} as unknown as WorldContextValue);
@@ -0,0 +1,93 @@
1
+ import React, { PropsWithChildren, createRef, useEffect, useMemo, useRef, useState } from "react";
2
+ import { Application, EventMode } from "pixi.js";
3
+ import { WorldContextValue, WorldContext } from "./World.context";
4
+ import { Stage } from "../stage";
5
+ import { AssetsManager } from "../assets-manager";
6
+
7
+ type WorldProps = {
8
+ eventMode?: EventMode;
9
+ size?: {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ };
14
+
15
+ export const World: React.FC<PropsWithChildren & WorldProps> = ({ children, eventMode, size }) => {
16
+ const [isInitialized, setIsInitialized] = useState(false);
17
+ const canvasRef = createRef<HTMLDivElement>();
18
+
19
+ const application = useRef(new Application());
20
+
21
+ const worldSize = useMemo(() => {
22
+ if (size) {
23
+ return { ...size };
24
+ }
25
+
26
+ if (canvasRef?.current) {
27
+ const { width, height } = canvasRef.current.getBoundingClientRect();
28
+ return {
29
+ width,
30
+ height
31
+ };
32
+ }
33
+
34
+ if (!isInitialized) {
35
+ return {
36
+ width: 0,
37
+ height: 0
38
+ };
39
+ }
40
+ return {
41
+ width: application.current.screen.width,
42
+ height: application.current.screen.height
43
+ };
44
+ }, [size, canvasRef, isInitialized]);
45
+
46
+ useEffect(() => {
47
+ if (canvasRef.current && !isInitialized) {
48
+ application.current
49
+ .init({
50
+ resizeTo: canvasRef.current
51
+ })
52
+ .then(() => {
53
+ setIsInitialized(true);
54
+ });
55
+ }
56
+ }, [canvasRef.current, isInitialized]);
57
+
58
+ const conextValue = useMemo<WorldContextValue>(
59
+ () => ({
60
+ application: application.current,
61
+ size: worldSize,
62
+ isInitialized
63
+ }),
64
+ [isInitialized, worldSize]
65
+ );
66
+
67
+ useEffect(() => {
68
+ if (!isInitialized) {
69
+ return;
70
+ }
71
+
72
+ canvasRef.current?.appendChild(application.current.canvas);
73
+
74
+ return () => {
75
+ canvasRef.current?.removeChild(application.current.canvas);
76
+ };
77
+ }, [canvasRef.current, isInitialized]);
78
+
79
+ useEffect(() => {
80
+ if (application.current) {
81
+ application.current.stage.eventMode = eventMode;
82
+ }
83
+ }, [eventMode, application.current, isInitialized]);
84
+
85
+ return (
86
+ <WorldContext.Provider value={conextValue}>
87
+ <AssetsManager>
88
+ <Stage>{children}</Stage>
89
+ <div style={{ width: "100%", height: "100%" }} ref={canvasRef} />
90
+ </AssetsManager>
91
+ </WorldContext.Provider>
92
+ );
93
+ };
@@ -0,0 +1,2 @@
1
+ export * from "./World.context";
2
+ export * from "./World";