HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0707
@key画像変形?5解決


@key

リンク

2012/7/7(Sat) 17:42:01|NO.47542

知らない人はわからないと思うんですが、
SFCのヨッシーアイランドのビックスライムや壷お化けなどのボスは画像が自由に変形しています(動画などを見てもらえばわかると思います)
HSPで同じようなことは再現できるでしょうか?
大変でもかまいません。
ちなみに、
http://www.spriters-resource.com/gameboy_advance/sma3/sheet/15622
http://www.spriters-resource.com/gameboy_advance/sma3/sheet/15620
のようなROMから抽出された素材サイトを見ると、元の画像は三角形のようです



この記事に返信する


ヂオン

リンク

2012/7/8(Sun) 01:23:04|NO.47545

たぶん gsquare 命令で出来ると思います。



check

リンク

2012/7/8(Sun) 11:20:40|NO.47548

ヨッシーアイランドってスーパーFXチップが積まれているんだな。
(スーパーFXチップについては http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BCFX%E3%83%81%E3%83%83%E3%83%97 )

HSPでもgzoomやgsquareなどの命令を駆使すれば、
標準命令だけでできないことはないだろう。なかなか面倒そうだが。

行列を使って画像の拡大縮小を行える命令があると便利だろうな。
(ないんで今のところは自前で実装するしかないが、これを実装するのはめちゃくそ大変。
アフィン変換あたりでググってみるといいかもしれない。)



@key

リンク

2012/7/10(Tue) 17:10:34|NO.47590

gzoomやgsquareを使うとしてもどうつかえば三角形があんなグラフィックになるのかがさっぱりですw
やはりむずかしそうですね
今のところはあきらめます



暇人

リンク

2012/7/12(Thu) 21:52:30|NO.47638

>gzoomやgsquareを使うとしてもどうつかえば三角形があんなグラフィックになるのかがさっぱりですw
実際の処理はわからんが、それっぽく動かしてみた

screen 1,640,480,0 boxf siz=340 gradf 0,0,siz/4,siz, 0, $30a030, $ffffff gradf siz/4,0,siz/2,siz, 0, $ffffff, $a0f0a0 gradf siz/4+siz/2,0,siz-siz/4-siz/2,siz, 0, $a0f0a0, $5000 tx(0)=0:ty(0)=0 tx(1)=siz:ty(1)=0 tx(2)=siz:ty(2)=siz tx(3)=0:ty(3)=siz x(0)=siz/2 : y(0)=0 x(1)=siz/2 : y(1)=0 x(2)=siz : y(2)=siz x(3)=0 : y(3)=siz screen 3 gsquare 1,x,y,tx,ty screen 0 spl=20//分割数 sysiz=siz/spl sxsiz=siz sx=siz/spl/2 repeat spl//元画像の座標を計算代入 tx(cnt*4 )=sxsiz/2-sx*cnt:ty(cnt*4+0)=sysiz*cnt tx(cnt*4+1)=sxsiz/2+sx*cnt:ty(cnt*4+1)=sysiz*cnt tx(cnt*4+2)=sxsiz/2+sx*(cnt+1):ty(cnt*4+2)=sysiz+sysiz*cnt tx(cnt*4+3)=sxsiz/2-sx*(cnt+1):ty(cnt*4+3)=sysiz+sysiz*cnt loop ddim x,4*spl //コピー先座標用 ddim y,4*spl dim lr,(spl+1)*2,20//分割されたライン分必要だから+1 dim ud,(spl+1)*2,20 r=180.0/(spl+1) lrn=100,110,80,120 udn=100,80,160,80 uddn=100,100,100,80 ssn=30,40,10,30 repeat 2*2//基本の形、伸び縮み(0〜3) rr=0 n=cnt repeat spl+1 if (spl/2)>cnt{//上半分 lr(cnt*2,i)=int(sin(-deg2rad(r*cnt))*(lrn(n)))//左(表示用の座標) lr(cnt*2+1,i)=int(-sin(-deg2rad(r*cnt))*(lrn(n)))//右 ud(cnt*2,i)=-int(cos(deg2rad(r*cnt))*(udn(n)))//上 ud(cnt*2+1,i)=-int(cos(deg2rad(r*cnt))*(udn(n)))//下 }else{//下半分 rr+7 ss=-sin(-deg2rad(rr))*ssn(n) lr(cnt*2,i)=int(sin(-deg2rad(r*cnt))*(lrn(n))) lr(cnt*2+1,i)=int(-sin(-deg2rad(r*cnt))*(lrn(n))) ud(cnt*2,i)=-int(cos(deg2rad(r*cnt))*(uddn(n)-ss)) ud(cnt*2+1,i)=-int(cos(deg2rad(r*cnt))*(uddn(n)-ss)) } loop repeat spl+1//下部が基点になるように一番下の座標を全てから引く ud(cnt*2,i)-ud((spl)*2,i) ud(cnt*2+1,i)-ud((spl)*2+1,i) loop i++ loop repeat 2//左右移動(4〜5) n=(cnt=0)-(cnt=1) repeat spl+1 lr(cnt*2+(n=-1),i)=lr(cnt*2+(n=-1),0)+sin(-deg2rad(8*cnt+40))*80*n lr(cnt*2+(n=1),i)=lr(cnt*2+(n=1),0)+sin(-deg2rad(5*cnt+140))*80*n ud(cnt*2,i)=int(0.6*ud(cnt*2,0)) ud(cnt*2+1,i)=int(0.6*ud(cnt*2+1,0)) loop repeat spl+1 ud(cnt*2,i)-ud((spl)*2,i) ud(cnt*2+1,i)-ud((spl)*2+1,i) loop i++ loop // 0通常 1通常 2伸び 3縮み 4左 5右 anms= 0.1, 0.1, 0.3, 0.25, 0.1, 0.1 //アニメーション速度 abmcnt=25, 25, 1000, 24, 20, 20 //アニメーションコマ数 anmno="01","41-","51-","2-","31-" //アニメーションテーブル(-でテーブル0に戻る) foreach anmno anmp(cnt)=strlen(anmno(cnt)) //アニメーションパターン数 loop b=0 p=0,1,3,2//表示用の座標は左右左右の順に並んでるから左右右左の順位に変更させる要素数 px=200.0 py=400.0 Border=400 repeat gsel 0 stick k,$ff if jf=0{ if k=1 and pno!1{pno=1:b=0:anmcnt=0:pxs=0}//←移動アニメーションセット if k=4 and pno!2{pno=2:b=0:anmcnt=0:pxs=0}//→移動アニメーションセット }else{ if k=1 {px-4}//←移動(ジャンプ中) if k=4 {px+4}//→移動 } if k=2 and pno!3{pno=3:b=0:anmcnt=0:j=5.0:jf=1}//↑ジャンプ if jf { py-j:j-0.1}//ジャンプ処理 if Border<py {jf=0:py=400.0:pno=4:b=0:anmcnt=0}//着地処理 anmcnt+1//アニメーションカウント if (anmcnt\abmcnt(ano))=0 {b=(b+1)\anmp(pno)} ano=peek(anmno(pno),b)-'0'//アニメーションNO取得 if ano<0{ano=0:b=0:pno=0}//アニメーションNOが-なら0を if pno=1{pxs+2:px+=sin(-deg2rad(pxs+90))*5}//←移動アニメーションの時左移動 if pno=2{pxs+2:px-=sin(-deg2rad(pxs+90))*5} m=1.4 //表示倍率 redraw 0 color 64,64,80:boxf 0,0,640,Border color 100,100,100:boxf 0,Border,640,480 color 255 pos 300,0 ss=anms(ano) repeat spl i=cnt*4 dupptr _x,varptr(x(i)),32,3 dupptr _y,varptr(y(i)),32,3 dupptr _tx,varptr(tx(i)),16 dupptr _ty,varptr(ty(i)),16 c=cnt repeat 4 _x(cnt)-=ss*(_x(cnt)-lr(c*2+cnt,ano))//現在から次の形の座標を引いて差分にアニメーション速度を掛けで現在から引く __x(p(cnt))=int(_x(cnt)*m)+px//上で出した座標に表示倍率を掛けてキャラ座標を加える _y(cnt)-=ss*(_y(cnt)-ud(c*2+cnt,ano)) __y(p(cnt))=int(_y(cnt)*m)+py loop gsquare 3,__x,__y,_tx,_ty loop redraw 1 await 15 loop



kanahiron

リンク

2012/7/12(Thu) 23:30:16|NO.47639

す…すげぇ!



ONION software Copyright 1997-2021(c) All rights reserved.