|
|
2013/9/6(Fri) 02:04:36|NO.56913
入力された文章を綺麗に斜めに表示しようとしているのですが、上手くいきません
過去に似たような質問が有るのですが、フォントを直接傾けているっぽいので
一文字ずつ斜めになってしまう上に、一定以上傾けると文字が欠けてしまいます。
色々試した結果、gsquare命令でコピーすれば良い事は解りました。
この命令だと反転表示もできて嬉しいんですが、
あと一歩目的の結果と違いまして、文章が平行四辺形になってしまいます。
一応組んだスクリプトは・・・
#include "hspdef.as"
gsel 0,-1
a=22
screen 60,300,300,0,200,200:font "MS Pゴシック",a,0:title "元"
screen 61,300,300,0,510,200:font "MS Pゴシック",a,1:title "先"
gsel 60:pos 120,120:mes "サンプル"
b=ginfo_mesx
c=ginfo_mesy
line (120+b),120,120,120
line 120+b,120+a,120,120+a
color 255,0,0
mx=100,200,200,100
my=150,50,150,250
sx=200,100,100,200
sy=100,100,200,200
gsel 61
gsquare 60,mx,my,sx,sy
stop
そうじゃなくて、形状は長方形を保ったままで斜め表示したいのです、
で、三角関数で計算すれば何とかなると思うんですが、バカなので解りません。
色々考えたら、結構な知識が必要な気がしてきて、軽く絶望しています
どなたかお助け下さい。
|
|
2013/9/6(Fri) 02:29:57|NO.56916
/*ご参考(こう言う事?)*/
#uselib "kernel32.dll"
#func global lstrlenW "lstrlenW" wptr
ss ="サンプル"
cnvstow ss,ss :lstrlenW varptr(ss) :ii = stat
sdim nn,,ii:repeat ii :wpoke nn(cnt),0,wpeek(ss,cnt*2) :loop
xx = 200
yy = 100
aa = deg2rad(45)
bb = 32
font msmincho,bb
foreach nn
pos cos(aa)*bb*cnt+xx,sin(aa)*bb*cnt+yy
mes cnvwtos(nn(cnt))
loop
|
|
2013/9/6(Fri) 03:45:55|NO.56920
Artlet2Dを利用した例
#include "a2d.hsp"
screen 0,300,300,0,200,200
alCreateImage 0, 640, 480
alSelectImage 0
alFont "MS Pゴシック", 22, 0
alTransModeRotateAt 45, 150, 150
alDrawText "サンプル", 0, 0, 300 ,300, 1, 1
alCopyImageToScreen 0, 0
redraw 1
|
|
2013/9/6(Fri) 13:44:31|NO.56928
ちなみに、gsquareでの回転コピーは
精度が高くないので綺麗にコピーできません。
以下は参考用のgsquareでの回転コピーサンプルです。
(モジュールは過去に実験で作った物なので適当です)
起動させると回転角度によって画像が乱れるのを確認できると思います。
#module
;---------------------------------------------------------------;
; gturn p1, p2, p3, p4 ;
; posで指定した座標を中心にgsquareで画像をコピーします ;
; ;
; p1 = コピー元のウィンドウID ;
; p2 = コピー元のX座標が入った配列変数(gsquareと同じ扱い) ;
; p3 = コピー元のY座標が入った配列変数(gsquareと同じ扱い) ;
; p4 = 回転角度(ラジアン) ;
;---------------------------------------------------------------;
#deffunc gturn int SrcID, array SrcX, array SrcY, double Θ
; 4つの座標から擬似的な中心点を求める
xc = ((SrcX(1)+SrcX(2))-(SrcX(0)+SrcX(3))) / 4 + (SrcX(0)+SrcX(3)) / 2
yc = ((SrcY(2)+SrcY(3))-(SrcY(0)+SrcY(1))) / 4 + (SrcY(0)+SrcY(1)) / 2
repeat 4
; 0で除算を避ける為に実数に変換する
x2(cnt) = double(SrcX(cnt))-xc
y2(cnt) = double(SrcY(cnt))-yc
; 角度と半径を求める
rot(cnt) = atan(x2(cnt), y2(cnt))
; 0除算回避
sin_k = sin(rot(cnt))
if sin_k = 0.0 {
rad(cnt) = x2(cnt)
} else {
rad(cnt) = x2(cnt)/sin_k
}
loop
; 変数の型が違いますを避ける為に整数に変換する
repeat 4
DestX(cnt) = int(sin(rot(cnt)+Θ) * rad(cnt)) + ginfo_cx
DestY(cnt) = int(cos(rot(cnt)+Θ) * rad(cnt)) + ginfo_cy
loop
gsquare SrcID, DestX, DestY, SrcX, SrcY
return
#global
;gsel 0,-1
a=22
screen 60,300,300,0,200,200:font "MS Pゴシック",a,0:title "元"
screen 61,300,300,0,510,200:font "MS Pゴシック",a,1:title "先"
gsel 60:pos 110,138:mes "サンプル"
b=ginfo_mesx
c=ginfo_mesy
line (110+b),138,110,138
line 110+b,138+a,110,138+a
color 255,0,0
sx=0,300,300,0
sy=0,0,300,300
gsel 61
t= 0.0
repeat
redraw 0
color 255, 255, 255 : boxf
gmode 4, , , 255
color 255, 255, 255
pos 150, 150
gturn 60, sx, sy, t
t+0.01
redraw 1
wait 20
loop
stop
| |
|
2013/9/6(Fri) 14:28:59|NO.56929
/*勘違いだったかも(じゃー無理やり)*/
#uselib "gdi32.dll"
#func global CreateFontIndirectA "CreateFontIndirectA" sptr
#func global SelectObject "SelectObject" sptr,sptr
#func global DeleteObject "DeleteObject" sptr
: aa = 450
dim nn,16 : nn(0) = 32,0,aa,0,400
poke nn(5),0,0 :poke nn(5),1,0
poke nn(5),2,0 :poke nn(5),3,128
poke nn(6),0,0 :poke nn(6),1,0
poke nn(6),2,2 :poke nn(6),3,49
: ff = "MS Pゴシック"
memcpy nn(7),ff,32 :CreateFontIndirectA varptr(nn) :_hFnt = stat
SelectObject hdc,_hFnt
pos 100,100 :mes "サンプル"
font ff,32 :mes "サンプル"
redraw :DeleteObject _hFnt
|
|
2013/9/6(Fri) 23:42:22|NO.56948
お二人とも凄い
ありさんの「Artlet2Dを利用した例」と、
fortunehillさんの「ムリヤリ」が、求めてたものです。
両方とも読み込んで勉強させてもらいます。
なんとか完読して、組み込んでみたいと思います。
その他の二つも参考になります。
大変助かりました。有り難うございました。
|
|
2013/9/7(Sat) 10:13:10|NO.56954
追伸
一晩たっての感想
ありさんの「Artlet2Dを利用した例」は理解出来たけど、
fortunehillさんの「ムリヤリ」は、全然理解できないw
poke命令とかポケコンの時は使ってたけど、HSPで使った事無いし
#func global もヘルプ読んでも理解不能でした。
今作ってるのが完成したら、この二つを勉強します。
お二人とも、有り難うございました。
|
|