Commit ad8672d2 authored by Chunchi Che's avatar Chunchi Che

update

parent 90dbb589
Pipeline #18042 passed with stages
in 4 minutes and 42 seconds
...@@ -43,6 +43,5 @@ const cardsSlice = createSlice({ ...@@ -43,6 +43,5 @@ const cardsSlice = createSlice({
}, },
}); });
export const selectCard = (state: RootState, id: number) => export const selectCards = (state: RootState) => state.cards.metas;
state.cards.metas.get(id);
export default cardsSlice.reducer; export default cardsSlice.reducer;
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
* *
* */ * */
export interface Card { export interface Hand {
code: number; // Currently only code code: number; // Currently only code
} }
...@@ -26,7 +26,7 @@ export interface IDuelPlate { ...@@ -26,7 +26,7 @@ export interface IDuelPlate {
// 渲染接口,返回一个React组件 // 渲染接口,返回一个React组件
render(): React.ReactElement; render(): React.ReactElement;
// 注册手牌selector // 注册手牌selector
registerHands(selector: TypeSelector<DuelData.Card[]>): void; registerHands(selector: TypeSelector<DuelData.Hand[]>): void;
} }
export interface TypeSelector<T> { export interface TypeSelector<T> {
......
import { Card } from "../data"; import { Hand } from "../data";
import * as BABYLON from "@babylonjs/core"; import * as BABYLON from "@babylonjs/core";
import * as CONFIG from "./config"; import * as CONFIG from "./config";
import { Card } from "../../../reducers/cardsSlice";
export default (hands: Card[], scene: BABYLON.Scene) => { export default (
hands: Hand[],
cardMetas: Map<number, Card>,
scene: BABYLON.Scene
) => {
const groundShape = CONFIG.GroundShape(); const groundShape = CONFIG.GroundShape();
const handShape = CONFIG.HandShape(); const handShape = CONFIG.HandShape();
const gap = groundShape.width / hands.length; const gap = groundShape.width / hands.length;
...@@ -31,7 +36,9 @@ export default (hands: Card[], scene: BABYLON.Scene) => { ...@@ -31,7 +36,9 @@ export default (hands: Card[], scene: BABYLON.Scene) => {
new BABYLON.ExecuteCodeAction( new BABYLON.ExecuteCodeAction(
BABYLON.ActionManager.OnPickTrigger, BABYLON.ActionManager.OnPickTrigger,
(event) => { (event) => {
console.log(`<Click>hand: ${idx}`, "card:", item, "event:", event); const meta = cardMetas.get(item.code);
console.log(`<Click>hand: ${idx}`, "card:", meta, "event:", event);
} }
) )
); );
......
...@@ -14,15 +14,20 @@ import renderMonsters from "./monsters"; ...@@ -14,15 +14,20 @@ import renderMonsters from "./monsters";
import renderExtraMonsters from "./extraMonsters"; import renderExtraMonsters from "./extraMonsters";
import renderMagics from "./magics"; import renderMagics from "./magics";
import * as CONFIG from "./config"; import * as CONFIG from "./config";
import { fetchCardMetaById } from "../../../reducers/cardsSlice";
import { store } from "../../../store";
import { selectCards } from "../../../reducers/cardsSlice";
// CONFIG // CONFIG
export default class SimpleDuelPlateImpl implements IDuelPlate { export default class SimpleDuelPlateImpl implements IDuelPlate {
handsSelector?: TypeSelector<DuelData.Card[]>; handsSelector?: TypeSelector<DuelData.Hand[]>;
constructor() {} constructor() {}
render(): React.ReactElement { render(): React.ReactElement {
const dispatch = store.dispatch;
// ----- 数据获取 ----- // ----- 数据获取 -----
// 默认的手牌Selector,返回五个code为-1的Card。 // 默认的手牌Selector,返回五个code为-1的Card。
...@@ -31,6 +36,12 @@ export default class SimpleDuelPlateImpl implements IDuelPlate { ...@@ -31,6 +36,12 @@ export default class SimpleDuelPlateImpl implements IDuelPlate {
}; };
const hands = useAppSelector(this.handsSelector || defaultHandsSelector); const hands = useAppSelector(this.handsSelector || defaultHandsSelector);
// TODO: 这里应该思考更合理的处理方式
hands.forEach((item) => {
dispatch(fetchCardMetaById(item.code));
});
const cardMetas = useAppSelector(selectCards);
// ----- WebGL渲染 ----- // ----- WebGL渲染 -----
const canvasRef = useRef<HTMLCanvasElement>(null); const canvasRef = useRef<HTMLCanvasElement>(null);
...@@ -66,7 +77,7 @@ export default class SimpleDuelPlateImpl implements IDuelPlate { ...@@ -66,7 +77,7 @@ export default class SimpleDuelPlateImpl implements IDuelPlate {
renderExtraMonsters(scene); renderExtraMonsters(scene);
// 创建手牌 // 创建手牌
renderHands(hands, scene); renderHands(hands, cardMetas, scene);
// 创建地板 // 创建地板
const ground = BABYLON.MeshBuilder.CreateGround( const ground = BABYLON.MeshBuilder.CreateGround(
...@@ -79,7 +90,7 @@ export default class SimpleDuelPlateImpl implements IDuelPlate { ...@@ -79,7 +90,7 @@ export default class SimpleDuelPlateImpl implements IDuelPlate {
engine.runRenderLoop(() => { engine.runRenderLoop(() => {
scene.render(); scene.render();
}); });
}, [canvasRef, hands]); }, [canvasRef, hands, cardMetas]);
return ( return (
<canvas <canvas
...@@ -90,7 +101,7 @@ export default class SimpleDuelPlateImpl implements IDuelPlate { ...@@ -90,7 +101,7 @@ export default class SimpleDuelPlateImpl implements IDuelPlate {
); );
} }
registerHands(selector: TypeSelector<DuelData.Card[]>): void { registerHands(selector: TypeSelector<DuelData.Hand[]>): void {
this.handsSelector = selector; this.handsSelector = selector;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment