Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/supermomonga/vivid2d.vim

2D Graphic rendering engine for Vim script
https://github.com/supermomonga/vivid2d.vim

Last synced: 17 days ago
JSON representation

2D Graphic rendering engine for Vim script

Awesome Lists containing this project

README

        

## ViVid2d - 2D Graphic rendering engine for Vim script

This is the graphic rendering engine for Vim script.

Now, you can make well-designed Vim script application easily.

## Example

### Canvas

`vivid2d`では、1つのバッファに対して1つのキャンバスを割り当てる形で描画エリアを作成することができます。
作成したキャンバスのインスタンスを操作することで、自動的にバッファの描画が変更されます。

```vim
" args: name, fps, width, height
canvas1 = vivid2d#canvas#new('canvas1', 30, '100%', '100%')
canvas2 = vivid2d#canvas#new('canvas2', 30, '800px', '600px')
```

### Element

`vivid2d`では、キャンバスが複数のエレメントを持つことで要素を描画します。エレメントは標準で`四角形`、`円`、`三角形`などのシェイプや`画像(ドット絵)`などが用意されています。`vivid2d`のキャンバスでは、バッファにおける半角スペース2つ分を1ドット相当として扱い、エレメントの大きさや表示位置などは基本的にこの仮想的なドットの単位で指定します。

```vim
" args: z-index, x, y, width, height
canvas.elements.elem1 = vivid2d#element#square.new(1, '0', '0', '300', '300')
canvas.elements.elem1.show()
```

キャンバスにエレメントを追加する例です。エレメントは必ず`重なり順`、`表示状態(表示/非表示)`、表示位置x座標`、`表示位置y座標`をプロパティとして持ちます。

```vim
canvas.elements.elem2 = vivid2d#element#circle.new(1, '-0', '-0', '300', '300')
canvas.elements.elem2.show()
```

表示位置のx,y座標は、それぞれキャンバス左辺から、上辺からの相対座標です。ただし、負値を指定した場合はキャンバス右辺から、下辺からの相対座標になります。この例ではキャンバス右下にエレメントが描画されます。

```vim
" set attributes
canvas.elements.elem1.attr('width', '300')
canvas.elements.elem1.attr('height', '300')
canvas.elements.elem1.attr('background_color', '#CCCCCC')
canvas.elements.elem1.attr('color', '#333333')
canvas.elements.elem1.attr('padding', '20px')
canvas.elements.elem1.attr('margin', '20px')
canvas.elements.elem1.attr('text', 'これは四角形です')
canvas.elements.elem1.attr('text-align', 'center')
```

エレメントには`attr()`メソッドを使用することで属性を設定することができます。これらの属性は`draw()`メソッドで使用されます。

`vivid2d`が適用されたバッファでは、定期的にキャンバスの再描画処理が行われます。再描画の感覚はキャンバスによって異なり、キャンバス作成時にFPS(1秒間に何回再描画を行うか)という形で指定されます。

キャンバスの再描画時には、キャンバスが持つ各種hook及び各エレメントの`draw()`メソッドが呼び出されます。

```vim
canvas.hooks.add('pre_draw', 'my_pre_draw_func', function('g:my_pre_draw_func'))
canvas.hooks.add('post_draw', 'my_post_draw_func', function('g:my_post_draw_func'))
```

各エレメントは重なり順(z-index)が小さい順に`draw()`メソッドを呼び出され、順にキャンバスに描画されます。`draw()`メソッドはドット絵の要領で構成された描画情報をhashとして返します。

```vim
let vivid2d#element#sample_vimtext = copy(vivid2d#element#base)
function! vivid2d#element#sample_vimtext.draw()
return {
\ 'dots' : [
\ split('A, , , ,A, , ,B,B,B,B,B, , ,C, , , ,C', ','),
\ split('A, , , ,A, , , , ,B, , , , ,C,C, ,C,C', ','),
\ split(' ,A, ,A, , , , , ,B, , , , ,C, ,C, ,C', ','),
\ split(' ,A, ,A, , , , , ,B, , , , ,C, , , ,C', ','),
\ split(' , ,A, , , , ,B,B,B,B,B, , ,C, , , ,C', ',')
\ ],
\ 'colors' : {
\ 'A' : '#cc0000',
\ 'B' : '#00cc00',
\ 'C' : '#0000cc'
\ }
\ }
endfunction
```

### Timeline/Animation

`vivid2d`はアニメーションやエフェクトの仕組みを持っています。

```vim
" 絶対座標(100,100)に1秒(1000ms)かけて移動
canvas.elements.elem1.move_to('100', '100', 1000)
```

```vim
" 相対座標(+100,-100)に1秒(1000ms)かけて移動
canvas.elements.elem1.move('+100', '-100', 1000)
```

```vim
" 3ドット四方にふるえるエフェクトを1秒間(1000ms)発生させる
canvas.elements.elem1.effect('shake', '3', 1000)
```

## Author

@supermomonga

## Lisense

MIT Lisense