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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0615
ヤマト簡単なエフェクトを作ってるんですが12解決


ヤマト

リンク

2009/6/15(Mon) 09:14:39|NO.25766

左右から1ドットずつ切り替わりながらラインが入り、
徐々に画面が現れるようなエフェクトを作っています。
しかし実際に実行してみると予想とは違った結果になりました。
なぜでしょうか?
一応その部分を抜き出しておくので見てください。
あと、パラメータの数が多すぎますと出ますが、なぜでしょうか?
でたらめな読みにくいソースですが、よろしくお願いします。






#const SCR_WIDTH 544;スクリーンの幅
#const SCR_HEIGHT 416;スクリーンの高さ
#const LINE_SPEED 8;ラインの描画の一回当たりの進行速度
#const FIGHT_BUFFER 2;エフェクト後表示したい画面


screen 0,SCR_WIDTH,SCR_HEIGHT,4
buffer FIGHT_BUFFER,SCR_WIDTH,SCR_HEIGHT,0
pos 0,0
picload "fight.bmp"
gsel 0


;変数
jy2=0
jx2=0
flag2=0

*main
if jx2<=SCR_WIDTH{;描画が画面端に行く時まで処理する
if flag2=0{
mmload "status1.wav";効果音読み込み
mmplay;効果音再生
flag2=1
}
gosub *paint4
if jx2<=SCR_WIDTH{
jx2=jx2+LINE_SPEED
}
await 10
goto *main



;描画関数
*paint4
redraw 0 ;画面の描画を実際のウインドウに反映させない(ちらつき防止)
gsel 0
color 0,0,0
boxf 0,0,SCR_WIDTH,SCR_HEIGHT

jy2=0;初期化

while jy2<=SCR_HEIGHT
if jy2<=SCR_HEIGHT{;左側のラインの処理
pos 0,jy2
gcopy FIGHT_BUFFER,0,jy2,jx2,1
}
jy2=jy2+1
if jy2<=SCR_HEIGHT{;右側のラインの処理
pos SCR_WIDHT-jx2,jy2;たぶんこれ以下二行に問題が・・・?
gcopy FIGHT_BUFFER,SCR_WIDTH-jx2,jy2,jx2,1
}
jy2=jy2+1
wend

redraw 1 ;画面の描画を反映させる(ちらつき防止)
return



この記事に返信する


Hiroaki Software

リンク

2009/6/15(Mon) 09:50:04|NO.25768

只今、そのスクリプトを実行してみたところ
ご指摘エラーを確認できました。
で、ちょっと細工をしたところ正常に実行できました。
そのスクリプトは以下からダウンロードできます。
http://hiroaki2008.ktkr.net/kai.hsp
まずは、両者のスクリプトを比べて、
どこがいけなかったのかを、発見してください。
・・・それでもどこがいけなかったのかがわからないと言うのなら、
教えますが・・・



SYAM

リンク

2009/6/15(Mon) 11:00:26|NO.25770

>ちょっと細工をしたところ正常に実行できました。

エラーだけは消えてますが、まだ異常です。


>予想とは違った結果になりました。

“SCR_WIDHT”になっている箇所があります。
HSPでは変数のスペルミスをしてもエラーにはならず、別な変数(つまり内容は 0 )になっちゃいますから注意してください。



Hiroaki Software

リンク

2009/6/15(Mon) 11:08:04|NO.25771

>SYAM様
ほんとだ・・・
僕はそこに気づきませんでした。
>やまと様
訂正したのを
NO.25768に書いた
http://hiroaki2008.ktkr.net/kai.hsp
に上書きアップロードしました。



ヤマト

リンク

2009/6/15(Mon) 14:59:19|NO.25772

HIROAKISOFTWAREさん、SYAMさんご指摘ありがとうございます。
きちんと動作することができました。
しかしながら新しい疑問が出てきました。
なんでメインループの直後に"} stop" が出てくるんでしょうか?
HIROAKIさんのプログラムだとなぜMAIN〜GOTOのループを抜けることができたんでしょうか?
よくわかりません。よかったら教えてください。



Hiroaki Software

リンク

2009/6/15(Mon) 17:23:40|NO.25775

>なんでメインループの直後に"} stop" が出てくるんでしょうか?
この}なのですがこれがないとif jx2<=SCR_WIDTH{を閉じていないということになります。

つまりNO.25766のメインループを単純に書くと

*main if jx2<=SCR_WIDTH{ goto *main
となります
stopが出てくる訳なのですが、それは
>MAIN〜GOTOのループを抜けることができたんでしょうか?
の質問の答えと関連してきますので説明いたします

if jx2<=SCR_WIDTH{〜}の間にgoto *mainが有ります。
これはjx2の値がSCR_WIDTH以下の時にgoto *mainが実行されるということになります。

もし

if jx2<=SCR_WIDTH{〜}の外にgoto *mainを置くと、
メインループ内をずーーーーと実行する無限ループになってしまいます。
さらにその間 wait(await) がないので、プログラムの応答がなくなります。

ようするに

repeat loop
を実行したのと同じ結果になります。

で、stopが出てくる訳なのですが、
それはですね、メインループが終わったあとに*paint4が実行されてしまうのを防止するためです
試しにこのstopを消すと
63行目のreturnで、

*label1 return
と同じエラーが出ると思います。
これがメインループが終わったあとに*paint4が実行される証拠になります

以上です。
長い説明で申し訳ありませんでした。



レノス

リンク

2009/6/15(Mon) 17:35:11|NO.25776

> Hiroaki Software さん
そのような凝ったことをせずに、メインループを repeat - loop で囲んで、
脱出するときに break した方がいいのでは。
メインに突っ込んだり、メインから脱出したりすることはないようなので。

repeat if ( 条件 ) { /* something */ } else { break } loop stop



Hiroaki Software

リンク

2009/6/15(Mon) 17:41:03|NO.25777

>レノスさん
僕もそれをやりたかったのですが、
スレ主のスクリプト(NO.25766の)を
あまりいじらなくしたので、
凝ったスクリプトになっております。



SYAM

リンク

2009/6/15(Mon) 18:22:35|NO.25778

それぞれ一言で言えば、

  " } " は、 最初の for の { を閉じ忘れているから、適切な位置で閉じた。


 "stop" は、その for のループが終わった後に、そのままその後に書かれている部分を実行してしまわないため。


…ってことですね。どちらもホントに理解できないような難しい話ではないはず。



Hiroaki Software

リンク

2009/6/15(Mon) 18:23:49|NO.25779

>SYAMさん
forではなくifです



SYAM

リンク

2009/6/15(Mon) 18:35:12|NO.25780

おおお。間違えてました。多謝。



Hiroaki Software

リンク

2009/6/15(Mon) 18:57:10|NO.25781

NO.25768とNO.25771で答えた
http://hiroaki2008.ktkr.net/kai.hsp
なのですが別の書き方があります。
そちらは
http://hiroaki2008.ktkr.net/kai2.hspからダウンロードできます。



ヤマト

リンク

2009/6/15(Mon) 19:49:44|NO.25785

すいません}が一つ足りなかったみたいですね、見落としてました。
ありがとうございます。
わかりやすい解説皆さんありがとうございました。



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