【HSP】太さのある線を引く【モジュール】

【HSP】太さのある線を引く【モジュール】

※2015/03/24 「BMSCR」が「BMPSCR」だとカンチガイしていたので修正 (^^; 
文字列を間違えてただけなので、プログラムには問題ないですけど。。。
HSP 内部で扱われているペンやブラシが終了時に自動的に削除されるのを利用することで、かなり使いやすくなったと思います。たぶん (^^;
独自で増やした命令は pen 命令のみ!しかも太さを指定するだけ!
あとは line 命令の内部をすこし弄っていますが、使い方には変更がありませんし、
pen 命令なしに、通常通り使うことも可能です。
実行速度は少し落ちるかもですが (^^;
HSP の描画命令は元々遅いし、そんなに頻繁に実行されることもないでしょう (^^;
モジュール
※2015/03/23 18:37 修正

#include "gdi32.as"

// 
// 描画モジュール
// 
#module Draw

#undef color
#undef line

#define global color(%1=0, %2=0, %3=0) color@hsp %1, %2, %3 : _pen@Draw -1, %1, %2, %3
#define global pen(%1=1) _pen@Draw %1, ginfo_r, ginfo_g, ginfo_b
#define global line(%1=0, %2=0, %3=ginfo_cx, %4=ginfo_cy) _line@Draw %1, %2, %3, %4

// 
// init 命令
// 
#deffunc local _init

nWidth = 1

return

// 
// pen 命令
// 
#deffunc local _pen int _nWidth, int _nRed, int _nGreen, int _nBlue

// BMSCR 構造体取得
mref bmscr, 67

// ペンの太さがすぐわかるように保存
// 無効な値だったら保存しない仕様に
if (_nWidth > 0) {
nWidth = _nWidth
}

// ペンを作成・設定。前のペン削除
CreatePen 0, nWidth, _nRed | (_nGreen << 8) | (_nBlue << 16) // PS_SOLID
bmscr.37 = stat
SelectObject hdc, bmscr.37
DeleteObject stat

return

// 
// line 命令 (拡張版)
// 
#deffunc local _line int _nXEnd, int _nYEnd, int _nXBegin, int _nYBegin

// BMSCR 構造体取得
mref bmscr, 67

// 描画
line@hsp _nXEnd, _nYEnd, _nXBegin, _nYBegin

// 再描画
/* 描画モード (redraw で指定された値) 取得 */
fl_udraw = bmscr.19 >> 16 & 0xFFFF

if (fl_udraw) {
// まずは線の太さを無視してサイズ算出
r_nX      = _nXBegin
r_nY      = _nYBegin
r_nWidth  = _nXEnd - _nXBegin
r_nHeight = _nYEnd - _nYBegin

// 幅に線の太さを考慮
if (r_nWidth >= 0) {
r_nX     -= nWidth / 2
r_nWidth += nWidth
} else {
r_nX     += nWidth / 2
r_nWidth -= nWidth
}

// 高さに線の太さを考慮
if (r_nHeight >= 0) {
r_nY      -= nWidth / 2
r_nHeight += nWidth
} else {
r_nY      += nWidth / 2
r_nHeight -= nWidth
}

// 幅か高さが 0 の時に redraw すると、全画面が再描画されて
// しまうので、このような if にする
// 大きさがマイナスの場合もちゃんと処理されるので、
// わざわざ位置を小さい方にしたり、大きさを絶対値にする必要はない
if ((r_nWidth != 0) && (r_nHeight != 0)) {
redraw fl_udraw, r_nX, r_nY, r_nWidth, r_nHeight
}
}

return

#global

_init@Draw

ついでに上の画像のサンプル。
pen 命令で太さ指定して、color でいつも通り色指定して、line 命令でいつも通り描画するだけなんですけどね (^^;

// 
// メイン
// 

; redraw 0

color 0x00, 0xFF, 0xFF
boxf

color 0xFF, 0xFF, 0xFF
pen 40
line 600, 40, 600, 440
line 40, 40
line 40, 440
line 600, 440

color 0x00, 0x00, 0xFF
pen 18 : line 260, 260, 280, 300
pen 19 : line 305, 235
pen 20 : line 350, 285
pen 21 : line 325, 340
pen 22 : line 260, 355
pen 23 : line 200, 260
pen 24 : line 300, 170
pen 25 : line 405, 240
pen 26 : line 415, 300
pen 27 : line 375, 370

pen 24
line 190, 150, 215, 175
line 260, 100, 270, 130
line 360, 110, 350, 140
line 445, 140, 420, 175

; redraw

最初、redraw で最後に画面更新すればいいや!と思ってたんですけど、せっかく標準命令の line 命令に置き換えるのだから、描画した範囲だけ画面更新するのもやってみました!
redraw に指定された描画モードは、BMSCR 構造体から持って来れます。
参考: 「BMSCR 構造体(HSP3)
描画モードに関しては あまり触れられてませんけど (^^;
ただ、わざわざ画面を更新する領域のサイズを算出するのにイロイロ計算してますので、やはり redraw 0 にしてから、一括で画面更新したほうが良いです。(redraw 0 の時はサイズ算出を行わないようにしています。)
まあ、redraw 0 を使わないとすれば、ちょこっと何かを動かしたい時とかですかね?
に、このモジュール使えると思います。
(ちょこっと動かすのにわざわざモジュール使うこと無いような… (^^;
今回はこのへんで~。
ノシ~
↓ブログランキング投票 (クリック) お願いします~

「【HSP】太さのある線を引く【モジュール】」への1件のフィードバック

  1. > チャコさん
    ありがとうございます (^^
    「ノシ」ぐらい使っちゃっても大丈夫だと思いますよ (^^

コメントは受け付けていません。