跳转到内容

内置组件

标准框架在 src/components/ 中提供了一系列可复用的 UI 组件。你可以直接使用它们来构建界面,也可以参考其实现来创建自己的组件。

三态图片按钮,支持普通模式和九宫格模式。

import { Button } from '../components/button';
<Button
fileNames={['btn_idle.png', 'btn_hover.png', 'btn_press.png']}
x={100}
y={200}
onClick={() => console.log('clicked')}
/>
属性类型默认值说明
fileNames[string, string, string]三态图片路径:[idle, hover, pressed]
onClick() => void点击回调
textstring按钮文字
fontSizenumber字号
colorstring | [string, string, string]文字颜色,可为三态分别设置
textAlign"left" | "center" | "right""center"文字对齐
nineSlicebooleanfalse启用九宫格模式
bounds[number, number, number, number]九宫格边距
targetWidthnumber九宫格目标宽度
targetHeightnumber九宫格目标高度

其他通用属性(x, y, visible 等)也支持。

<Button
fileNames={['btn_bg.png', 'btn_bg_hover.png', 'btn_bg_press.png']}
text="开始游戏"
fontSize={28}
color={['#CCCCCC', '#FFFFFF', '#AAAAAA']}
shadow={{ color: '#000000', offsetX: 1, offsetY: 1, blur: 2 }}
/>
<Button
fileNames={['btn_9s.png', 'btn_9s.png', 'btn_9s.png']}
nineSlice={true}
bounds={[12, 12, 12, 12]}
targetWidth={200}
targetHeight={60}
text="确认"
/>

水平滑动条,返回 0~1 范围的值。

import { Slider } from '../components/slider';
<Slider
x={100}
y={200}
value={0.5}
onChange={(val) => console.log(val)}
trackImage="ui/slider_track.png"
fillImage="ui/slider_fill.png"
thumbImage="ui/slider_thumb.png"
/>
属性类型说明
valuenumber当前值(0~1)
onChange(value: number) => void值变化回调
trackImagestring轨道背景图
fillImagestring已填充部分的图片
thumbImagestring滑块图片
trackWidthnumber轨道宽度

支持鼠标拖动和轨道点击两种交互方式。


import { Select } from '../components/select';
<Select
x={100}
y={200}
options={[
{ label: '720p', value: '720' },
{ label: '1080p', value: '1080' },
{ label: '全屏', value: 'fullscreen' },
]}
value="720"
onChange={(val) => console.log(val)}
/>
属性类型说明
options{ label: string, value: string }[]选项列表
valuestring当前选中值
onChange(value: string) => void选择变化回调

基于 Button 组件实现的复选框。

import { Checkbox } from '../components/checkbox';
<Checkbox
checked={true}
onChange={(checked) => console.log(checked)}
fileNames={['checkbox_off.png', 'checkbox_on.png']}
/>

模态对话框,支持 alert 和 confirm 两种模式。通常不直接使用,而是通过 uiActions.confirm() 调用。

import { Dialog } from '../components/dialog';
// 确认模式
<Dialog
message="确定要退出吗?"
onConfirm={() => { ... }}
onCancel={() => { ... }}
/>
// 提示模式
<Dialog message="操作成功" />
属性类型说明
messagestring对话框消息
onConfirm() => void确认回调
onCancel() => void取消回调(存在时显示两个按钮)

对话框包含模糊背景效果(<backdrop>)和缩放进出动画。


基于 <shader> / <shader-slot> 封装的转场容器。标准框架内部的场景转场、背景切换和立绘切换都使用它实现。

import { TransitionBoundary } from '../components/transitionBoundary';
<TransitionBoundary
transitionKey={currentSceneKey}
effect={{ type: 'builtin', name: 'wipe', direction: 'left', softness: 0.08 }}
duration={800}
>
{children}
</TransitionBoundary>
属性类型默认值说明
transitionKeystring当前显示内容的键值;变化时会建立一次新的 from/to 边界
retain"static" | "live""static"旧内容保留方式;live 会在真正开始转场前继续保持实时更新
effectobject转场效果对象,结构与 @transPerformeffect 参数一致
durationnumber转场时长(毫秒)
performKeystring | number | nulltransitionKey用于区分同一内容键值下的不同执行轮次;通常无需手动指定
labelstring"Transition Boundary"调试标签
onFinished() => void转场完成时触发

典型场景是:用 transitionKey 标识当前内容版本,用 effectduration 描述这次过渡,而具体的 from/to 画面管理交给组件内部处理。底层 shader 命令与通道模型见着色器 API


全局通知组件,在 Main 组件中已挂载。通过 uiActions.notify() 触发。

import { uiActions } from '../state/ui';
uiActions.notify('保存成功');
uiActions.notify('操作完成', {
duration: 3000, // 显示时长(毫秒)
fadeInDuration: 300, // 淡入时长
fadeOutDuration: 300, // 淡出时长
});

通知会自动堆叠显示并在超时后淡出。


基于精灵表(sprite sheet)的帧动画组件。

import { FrameAnimation } from '../components/frame';
<FrameAnimation
src="effects/explosion.png"
direction="horizontal"
frameCount={8}
interval={100}
loop={true}
loopMode="always"
/>
属性类型默认值说明
srcstring精灵表图片路径
direction"horizontal" | "vertical"帧排列方向
frameCountnumber总帧数
intervalnumber帧间隔(毫秒)
loopboolean | numberfalse是否循环(或循环次数)
loopMode"none" | "always" | "bounce" | "reverse""none"循环模式

循环模式说明:

  • "none" — 不循环,播放一次后停止
  • "always" — 无限循环
  • "bounce" — 来回播放(1→N→1→N…)
  • "reverse" — 反向循环(N→1→N→1…)

@momoyu-ink/kit 内置了 react-spring 动画库。你可以在任何组件中使用它:

import { animated, useSpring, useTransition } from '@momoyu-ink/kit';
// 基础弹簧动画
function FadeInSprite() {
const styles = useSpring({
opacity: 1,
x: 100,
from: { opacity: 0, x: 0 },
});
return <animated.sprite src="image.png" opacity={styles.opacity} x={styles.x} />;
}
// 列表过渡动画
function AnimatedList({ items }: { items: string[] }) {
const transitions = useTransition(items, {
keys: (item) => item,
from: { opacity: 0, y: 50 },
enter: { opacity: 1, y: 0 },
leave: { opacity: 0, y: -50 },
});
return (
<container>
{transitions((style, item) => (
<animated.text text={item} opacity={style.opacity} y={style.y} />
))}
</container>
);
}

支持的 animated 基础元素:animated.container, animated.sprite, animated.text, animated.clip, animated.filter, animated.backdrop, animated.animation