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.
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/src/assets-manager/AssetsManager.context.d.ts +15 -0
- package/dist/src/assets-manager/AssetsManager.context.js +6 -0
- package/dist/src/assets-manager/AssetsManager.d.ts +2 -0
- package/dist/src/assets-manager/AssetsManager.js +43 -0
- package/dist/src/assets-manager/index.d.ts +3 -0
- package/dist/src/assets-manager/index.js +3 -0
- package/dist/src/assets-manager/useAssetManager.d.ts +1 -0
- package/dist/src/assets-manager/useAssetManager.js +5 -0
- package/dist/src/camera/Camera.context.d.ts +13 -0
- package/dist/src/camera/Camera.context.js +2 -0
- package/dist/src/camera/Camera.d.ts +7 -0
- package/dist/src/camera/Camera.js +99 -0
- package/dist/src/camera/index.d.ts +2 -0
- package/dist/src/camera/index.js +2 -0
- package/dist/src/game-context/Game.context.d.ts +39 -0
- package/dist/src/game-context/Game.context.js +85 -0
- package/dist/src/game-context/index.d.ts +1 -0
- package/dist/src/game-context/index.js +1 -0
- package/dist/src/game-objects/GameObjectPhysicalObjectConfig.d.ts +4 -0
- package/dist/src/game-objects/GameObjectPhysicalObjectConfig.js +1 -0
- package/dist/src/game-objects/index.d.ts +2 -0
- package/dist/src/game-objects/index.js +2 -0
- package/dist/src/game-objects/usePhysicalObject.d.ts +7 -0
- package/dist/src/game-objects/usePhysicalObject.js +17 -0
- package/dist/src/game-objects/usePhysicalObjectFromConfig.d.ts +6 -0
- package/dist/src/game-objects/usePhysicalObjectFromConfig.js +13 -0
- package/dist/src/game-objects/useWalls.d.ts +11 -0
- package/dist/src/game-objects/useWalls.js +59 -0
- package/dist/src/hooks/index.d.ts +12 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/useAnimatedSprite.d.ts +10 -0
- package/dist/src/hooks/useAnimatedSprite.js +41 -0
- package/dist/src/hooks/useCamera.d.ts +1 -0
- package/dist/src/hooks/useCamera.js +5 -0
- package/dist/src/hooks/useCollisionDetection.d.ts +9 -0
- package/dist/src/hooks/useCollisionDetection.js +21 -0
- package/dist/src/hooks/useGame.d.ts +1 -0
- package/dist/src/hooks/useGame.js +5 -0
- package/dist/src/hooks/useGlobalEventHandler.d.ts +5 -0
- package/dist/src/hooks/useGlobalEventHandler.js +15 -0
- package/dist/src/hooks/useLayerContext.d.ts +1 -0
- package/dist/src/hooks/useLayerContext.js +5 -0
- package/dist/src/hooks/useObject.d.ts +6 -0
- package/dist/src/hooks/useObject.js +54 -0
- package/dist/src/hooks/useSprite.d.ts +6 -0
- package/dist/src/hooks/useSprite.js +21 -0
- package/dist/src/hooks/useStage.d.ts +1 -0
- package/dist/src/hooks/useStage.js +5 -0
- package/dist/src/hooks/useTexture.d.ts +9 -0
- package/dist/src/hooks/useTexture.js +14 -0
- package/dist/src/hooks/useTickerCallback.d.ts +5 -0
- package/dist/src/hooks/useTickerCallback.js +14 -0
- package/dist/src/hooks/useTilingSprite.d.ts +6 -0
- package/dist/src/hooks/useTilingSprite.js +26 -0
- package/dist/src/hooks/useWorld.d.ts +1 -0
- package/dist/src/hooks/useWorld.js +5 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +10 -0
- package/dist/src/layer/Layer.context.d.ts +6 -0
- package/dist/src/layer/Layer.context.js +2 -0
- package/dist/src/layer/Layer.d.ts +6 -0
- package/dist/src/layer/Layer.js +34 -0
- package/dist/src/layer/index.d.ts +1 -0
- package/dist/src/layer/index.js +1 -0
- package/dist/src/physics/MatterPhysics.context.d.ts +8 -0
- package/dist/src/physics/MatterPhysics.context.js +74 -0
- package/dist/src/physics/index.d.ts +4 -0
- package/dist/src/physics/index.js +4 -0
- package/dist/src/physics/types.d.ts +24 -0
- package/dist/src/physics/types.js +1 -0
- package/dist/src/physics/useCollisionEventHandler.d.ts +7 -0
- package/dist/src/physics/useCollisionEventHandler.js +15 -0
- package/dist/src/physics/usePhysicsEngineEventHandler.d.ts +8 -0
- package/dist/src/physics/usePhysicsEngineEventHandler.js +15 -0
- package/dist/src/physics/usePhysicsTickerCallback.d.ts +7 -0
- package/dist/src/physics/usePhysicsTickerCallback.js +15 -0
- package/dist/src/stage/Stage.context.d.ts +6 -0
- package/dist/src/stage/Stage.context.js +2 -0
- package/dist/src/stage/Stage.d.ts +2 -0
- package/dist/src/stage/Stage.js +29 -0
- package/dist/src/stage/index.d.ts +1 -0
- package/dist/src/stage/index.js +1 -0
- package/dist/src/types.d.ts +7 -0
- package/dist/src/types.js +7 -0
- package/dist/src/world/World.context.d.ts +10 -0
- package/dist/src/world/World.context.js +2 -0
- package/dist/src/world/World.d.ts +11 -0
- package/dist/src/world/World.js +66 -0
- package/dist/src/world/index.d.ts +2 -0
- package/dist/src/world/index.js +2 -0
- package/package.json +52 -0
- package/src/assets-manager/AssetsManager.context.tsx +23 -0
- package/src/assets-manager/AssetsManager.tsx +54 -0
- package/src/assets-manager/index.ts +3 -0
- package/src/assets-manager/useAssetManager.ts +7 -0
- package/src/camera/Camera.context.tsx +17 -0
- package/src/camera/Camera.tsx +153 -0
- package/src/camera/index.ts +2 -0
- package/src/game-context/Game.context.tsx +133 -0
- package/src/game-context/index.ts +1 -0
- package/src/game-objects/GameObjectPhysicalObjectConfig.ts +18 -0
- package/src/game-objects/index.ts +2 -0
- package/src/game-objects/usePhysicalObject.ts +24 -0
- package/src/game-objects/usePhysicalObjectFromConfig.ts +22 -0
- package/src/game-objects/useWalls.ts +93 -0
- package/src/hooks/index.ts +12 -0
- package/src/hooks/useAnimatedSprite.ts +65 -0
- package/src/hooks/useCamera.ts +6 -0
- package/src/hooks/useCollisionDetection.ts +35 -0
- package/src/hooks/useGame.ts +6 -0
- package/src/hooks/useGlobalEventHandler.ts +27 -0
- package/src/hooks/useLayerContext.ts +6 -0
- package/src/hooks/useObject.ts +81 -0
- package/src/hooks/useSprite.ts +33 -0
- package/src/hooks/useStage.ts +7 -0
- package/src/hooks/useTexture.ts +22 -0
- package/src/hooks/useTickerCallback.ts +25 -0
- package/src/hooks/useTilingSprite.ts +39 -0
- package/src/hooks/useWorld.ts +7 -0
- package/src/index.ts +10 -0
- package/src/layer/Layer.context.tsx +9 -0
- package/src/layer/Layer.tsx +57 -0
- package/src/layer/index.ts +1 -0
- package/src/physics/MatterPhysics.context.tsx +100 -0
- package/src/physics/index.ts +4 -0
- package/src/physics/types.ts +27 -0
- package/src/physics/useCollisionEventHandler.ts +26 -0
- package/src/physics/usePhysicsEngineEventHandler.ts +30 -0
- package/src/physics/usePhysicsTickerCallback.ts +25 -0
- package/src/stage/Stage.context.tsx +9 -0
- package/src/stage/Stage.tsx +50 -0
- package/src/stage/index.ts +1 -0
- package/src/types.ts +8 -0
- package/src/world/World.context.tsx +13 -0
- package/src/world/World.tsx +93 -0
- package/src/world/index.ts +2 -0
|
@@ -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,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
|
+
};
|