visual
موتور رسم دوبعدی به سبک PixiJS. از شکلها یک گراف صحنه بساز و آن را با یکی از سه پشتوانه (Canvas2D، WebGL یا WebGPU) که در زمان اجرا برگزیده میشود رسم کن.
موتور لایهلایه است: Application (چرخهٔ عمر و حلقهٔ رسم)، زیر آن Renderer (همان پشتوانه)، و سپس گراف صحنهای که از Container (یک گروه) تا Graphics (چیزی که رسم میشود) ادامه دارد. تو گرهها را به app.stage میافزایی و رسمگر آنها را میکشد.
فقط مرورگر.
ranuts/visualبه یکHTMLCanvasElementواقعی و به بافتار GPU یا Canvas نیاز دارد. در Node اجرا نمیشود.
وارد کردن
import { Application, Graphics, Container } from 'ranuts/visual';آغاز سریع
یک برنامه بساز، مستطیلی با پُرکن و خط دور و یک دایره بکش، و حلقهٔ رسم را به راه بینداز.
import { Application, Graphics, RENDERER_TYPE } from 'ranuts/visual';
const view = document.querySelector('canvas');
// Application.create ناهمگام است: پشتوانهٔ WebGPU دستگاهش را ناهمگام
// آماده میکند و این کار باید پیش از نخستین رسم تمام شود.
const app = await Application.create({
view,
prefer: RENDERER_TYPE.CANVAS, // CANVAS | WEB_GL | WEB_GPU
backgroundColor: '#1e1e1e',
});
// یک مستطیل: پُرکن قرمز و خط دورِ آبی ۴ پیکسلی.
const rect = new Graphics();
rect.beginFill('#ff0000');
rect.lineStyle(4, '#0000ff');
rect.drawRect(20, 20, 160, 100);
rect.endFill();
// یک دایره.
const circle = new Graphics();
circle.beginFill('#00cc88', 0.8);
circle.drawCircle(300, 120, 60);
circle.endFill();
// چیزهای رسمشدنی را به stage بیفزا؛ نیای هرچه که رسم میشود.
app.stage.addChild(rect);
app.stage.addChild(circle);
// حلقهٔ requestAnimationFrame را به راه بینداز (یا برای یک فریم تنها app.render() را صدا بزن).
app.start();API
Application
نقطهٔ ورود موتور. بوم، رسمگر و ریشهٔ گراف صحنه (stage) از آنِ اوست.
بهجای new Application(...) همان کارخانهٔ ناهمگام Application.create(...) را بردار: پشتوانهٔ WebGPU دستگاهش را ناهمگام آماده میکند و این باید پیش از نخستین رسم تمام شود. Canvas و WebGL بیدرنگ برآورده میشوند، پس این کارخانه برای هر سه پشتوانه امن و یکدست است.
Application.create(options)
static async است. یک Application میسازد و منتظر آمادهسازی ناهمگام رسمگر میماند.
پارامترها
| پارامتر | توضیح | نوع | پیشفرض |
|---|---|---|---|
options | گزینههای پیکربندی برنامه | IApplicationOptions | الزامی |
مقدار بازگشتی
| مقدار | توضیح | نوع |
|---|---|---|
Promise<Application> | برنامهای که آماده شده است | Promise<Application> |
Properties
| ویژگی | توضیح | نوع |
|---|---|---|
stage | ریشهٔ گراف صحنه. هر گرهای را که میخواهی رسم شود همینجا بیفزا. | Container |
view | همان عنصر canvas که رسم در آن انجام میشود. | HTMLCanvasElement |
eventSystem | توزیع اشارهگر و رویداد، بسته به canvas و stage. | EventSystem |
Methods
| متد | توضیح | مقدار بازگشتی |
|---|---|---|
render() | یک فریم تنها از stage را میکشد. | void |
start() | حلقهٔ رسم requestAnimationFrame را آغاز میکند. | void |
stop() | حلقهٔ رسمی را که start() آغاز کرده بود متوقف میکند. | void |
IApplicationOptions
| میدان | توضیح | نوع | پیشفرض |
|---|---|---|---|
prefer | اینکه کدام پشتوانه به کار رود. اگر نیاید، به Canvas برمیگردد. | RENDERER_TYPE | RENDERER_TYPE.CANVAS |
view | بوم مقصد. اگر نیاید، یک <canvas> جدا ساخته میشود. | HTMLCanvasElement | یک بوم تازه |
backgroundColor | پسزمینهٔ بوم. هر رشتهٔ رنگ CSS را میپذیرد. | string | — |
backgroundAlpha | کدری پسزمینه، از 0 تا 1. | number | — |
debug | پشتوانهٔ رسمِ برگزیده را در کنسول مینویسد. | boolean | false |
Container
گرهای برای گروهبندی؛ همان مفهوم «گروه» در گراف صحنه. فرزندان و وضعیت دگرگونی را نگه میدارد اما خودش چیزی نمیکشد؛ چیزهای رسمشدنی مانند Graphics از آن ارث میبرند. وقتی میخواهی زیردرختی بسازی که با هم جابهجا و بزرگ و چرخانده شود، یک Container بیفزا.
Methods
| متد | توضیح | مقدار بازگشتی |
|---|---|---|
addChild(child) | فرزندی (Container) را به انتها میافزاید. اگر پیشتر پدری داشته، پدرش عوض میشود. | void |
removeChild(child) | فرزندی را از children برمیدارد. | void |
sortChildren() | children را بر پایهٔ zIndex از نو مرتب میکند (فقط وقتی لازم باشد). | void |
containsPoint(p) | وارسی میکند که آیا یک Point درون hitArea این گره میافتد یا نه. | boolean |
ویژگیهای دگرگونی و نمایش
اینها بر گرهٔ پایهٔ مشترک (Vertex) نشستهاند و روی هر Container و Graphics در دسترساند.
| ویژگی | توضیح | نوع |
|---|---|---|
children | گرههای فرزند (آرایهای فقطخواندنی). | Container[] |
parent | گرهٔ پدر، اگر پیوسته باشد. | Container | undefined |
x / y | جای گره، در دستگاه مختصات پدر. | number |
position | نقطهٔ جایگیری ({ x, y }). | ObservablePoint |
scale | نقطهٔ مقیاس ({ x, y }). | ObservablePoint |
pivot | نقطهٔ لولا برای چرخش و مقیاس. | ObservablePoint |
skew | نقطهٔ کجشدگی. | ObservablePoint |
rotation | چرخش بر حسب رادیان. | number |
angle | چرخش بر حسب درجه (پابهپای rotation). | number |
alpha | کدری گره، از 0 تا 1 (پایینرونده در درخت ضرب میشود). | number |
visible | با false، از گره و زیردرختش رد میشود. | boolean |
zIndex | ترتیب رسم در میان همنیاها. | number |
hitArea | شکلی اختیاری برای وارسی برخورد. | Shape | null |
cursor | شکل نشانگر وقتی روی گره است. | Cursor |
structureVersion | شمارهٔ نسخهٔ ساختار صحنه (فقط در ریشه)؛ ردگیری تغییرها را پیش میبرد. | number |
Graphics
چیزی رسمشدنی که Container را گسترش میدهد. پُرکن یا سبک خط یا هر دو را تعیین کن و سپس یکی از متدهای شکل را صدا بزن. بیشتر متدها this برمیگردانند، پس فراخوانها زنجیر میشوند.
سبک
| متد | توضیح | مقدار بازگشتی |
|---|---|---|
beginFill(color?, alpha?) | پُر کردن را با color (رشتهٔ CSS، پیشفرض '#000000') و alpha (پیشفرض 1) آغاز میکند. | Graphics |
endFill() | پُر کردن را پایان میدهد. | Graphics |
lineStyle(width, color?, alpha?) | خط دور را تعیین میکند: width پیکسل، color (پیشفرض '#000000')، alpha (پیشفرض 1). | Graphics |
lineStyle(options) | خط دور را از روی یک شیء ILineStyleOptions تعیین میکند. | Graphics |
resetLineStyle() | خط دور کنونی را به مقدارهای پیشفرض بازمیگرداند. | void |
شکلها
| متد | توضیح | مقدار بازگشتی |
|---|---|---|
drawRect(x, y, width, height) | مستطیل. | Graphics |
drawRoundedRect(x, y, width, height, radius) | مستطیل با گوشههای گرد. | Graphics |
drawCircle(x, y, radius) | دایرهای به مرکز (x, y). | Graphics |
drawEllipse(x, y, radiusX, radiusY) | بیضیای به مرکز (x, y). | Graphics |
drawPolygon(points) | چندضلعی بسته از روی آرایهٔ تخت [x0, y0, x1, y1, …]. | Graphics |
مسیرها
| متد | توضیح | مقدار بازگشتی |
|---|---|---|
moveTo(x, y) | زیرمسیری تازه از (x, y) آغاز میکند. | Graphics |
lineTo(x, y) | خط راست تا (x, y). | Graphics |
quadraticCurveTo(cpX, cpY, toX, toY) | منحنی بزیه درجهدو (به پارهخطهای ریز شکسته میشود). | Graphics |
bezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY) | منحنی بزیه درجهسه (به پارهخطهای ریز شکسته میشود). | Graphics |
arc(cx, cy, radius, startAngle, endAngle, anticlockwise?) | کمان دایره. | Graphics |
arcTo(x1, y1, x2, y2, radius) | کمانی مماس بر دو خطی که از نقاط کنترل میگذرند. | Graphics |
closePath() | زیرمسیر کنونی را میبندد. | Graphics |
clear() | همهٔ هندسه را برمیدارد و سبکها را از نو تنظیم میکند. | Graphics |
containsPoint(p) | وارسی میکند که آیا یک Point درون هندسهٔ کشیدهشده میافتد یا نه. | boolean |
IFillStyleOptions
| میدان | توضیح | نوع | پیشفرض |
|---|---|---|---|
color | رنگ پُرکن (هر رنگ CSS). | string | '#ffffff' |
alpha | کدری پُرکن، از 0 تا 1. | number | 1 |
visible | اینکه پُرکن کشیده میشود یا نه. | boolean | false |
ILineStyleOptions
IFillStyleOptions را گسترش میدهد و اینها را میافزاید:
| میدان | توضیح | نوع | پیشفرض |
|---|---|---|---|
width | ضخامت خط دور بر حسب پیکسل. | number | 0 |
cap | شکل سرِ خط. | LINE_CAP | LINE_CAP.BUTT |
join | شکل پیوند میان خطها. | LINE_JOIN | LINE_JOIN.MITER |
شمارشیها
RENDERER_TYPE
پشتوانهٔ رسم را از راه IApplicationOptions.prefer برمیگزیند.
| عضو | مقدار | توضیح |
|---|---|---|
CANVAS | 'canvas' | پشتوانهٔ Canvas2D (پیشفرض). |
WEB_GL | 'webgl' | پشتوانهٔ WebGL. |
WEB_GPU | 'webgpu' | پشتوانهٔ WebGPU. |
SHAPE_TYPE
گونههای شکلی که متدهای رسم Graphics پدید میآورند.
| عضو | مقدار |
|---|---|
RECTANGLE | 'rectangle' |
POLYGON | 'polygon' |
CIRCLE | 'circle' |
ELLIPSE | 'ellipse' |
ROUNDED_RECTANGLE | 'rounded rectangle' |
LINE_CAP
| عضو | مقدار |
|---|---|
BUTT | 'butt' |
ROUND | 'round' |
SQUARE | 'square' |
LINE_JOIN
| عضو | مقدار |
|---|---|
MITER | 'miter' |
BEVEL | 'bevel' |
ROUND | 'round' |
ثابتها
| ثابت | مقدار | توضیح |
|---|---|---|
MAX_VERTEX_COUNT | 65536 | بیشترین شمار رأسی که هر بافر دستهای برمیتابد. |
BYTES_PER_VERTEX | 12 | بایت به ازای هر رأس (دو Float32 برای جایگیری و چهار Uint8 برای رنگ). |
پشتوانهها
پشتوانه با IApplicationOptions.prefer (از نوع RENDERER_TYPE) برگزیده میشود؛ اگر نیاید، Canvas به کار میرود.
CANVASیکراست با API همان Canvas2D میکشد (fillRect،arc،ctx.stroke()و…).WEB_GLوWEB_GPUیک خط لولهٔBatchRendererرا با هم شریکاند: شکلها به مثلث خرد میشوند، در یک بافر رأس درهمبافته جای میگیرند و با یک فراخوان کشیده میشوند.
هر سه پشتوانه هر رنگ CSS را میپذیرند: شانزدهشانزدهی (#rgb یا #rrggbb)، رنگهای نامدار، rgb() و hsl() همه یکسان تفسیر میشوند.
هندسهٔ خط دور بسته به پشتوانه فرق میکند، و این عمدی است. در پشتوانهٔ Canvas، سرها و پیوندهای خط را همان
ctx.stroke()بومی مرورگر میکشد، اما در WebGL و WebGPU یک مثلثبندی دستساز. این دو پیکسلبهپیکسل یکسان نیستند.