コンテンツにスキップ

内置组件

このコンテンツはまだ日本語訳がありません。

标准框架在 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>)和缩放进出动画。


全局通知组件,在 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