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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0412
かたはばgzoomの使い方10解決


かたはば

リンク

2020/4/12(Sun) 18:40:54|NO.90080

数日前にHSPを始めた者です。gzoomの基本的な使い方が分からないので教えていただきたいです…。


  ;画像読み込み
buffer 1
picload "dog.png"
;メインウィンドウ
screen 0
gzoom 32, 32, 1,,, 316, 403

316×403の画像を32×32に縮小して表示したいのですが上手くいかず、p4,p5のコピー元の
左上の座標というのもよく分かりません。いろいろ調べたり思考錯誤したのですが32×32の
白い四角しか表示されずお手上げでした…。
初歩的な質問でごめんなさい!プログラミング超初心者なので噛み砕いて説明していただけると
助かります…。(HSPを学習するにあたってのアドバイスもいただけたら嬉しいです。)
よろしくお願いします。



この記事に返信する


さか

リンク

2020/4/12(Sun) 20:51:32|NO.90082

それで良いように思いますが。
picloadが上手く行ってないのかも知れないですね。

bufferをscreenにしてみたらどうですか。


;buffer 1 screen 1 color 255,0,0: boxf 0, 0, 316, 403 color 0,0,255: boxf 50, 50, 316-50, 403-50 screen 0 gzoom 32, 32, 1,,, 316, 403



あらや

リンク

2020/4/12(Sun) 21:35:43|NO.90085

>p4,p5のコピー元の左上の座標というのもよく分かりません。
ペイントでもGIMPでも構わないのですが、
画像加工ソフトで四角い範囲選択を使ってみて下さい。

選択範囲の中で一番左上の座標がコピー元の座標です。
画像全体をコピーする場合は全選択(Ctrl+A)と同じで
コピー元の一番左上の座標は0,0になります。

>32×32の白い四角しか表示されずお手上げでした…。
ソースに問題があるようには見えないので
picloadの行でエラーが出なかったのならば、
画像ファイル自体になんらかの不具合があるのでは?

もしくは画像のサイズが違うという事も考えられるので
下記のソースを試してみて下さい。

;画像読み込み buffer 1 picload "dog.png" pic_sx = ginfo_sx: pic_sy = ginfo_sy; // 画像サイズを取得 ;メインウィンドウ screen 0 gzoom 32, 32, 1, 0, 0, pic_sx, pic_sy title "画像サイズ="+pic_sx+"×"+pic_sy+"";
これでタイトルバーに読み込んだ画像のサイズが表示されるはずです。



メルクーフ

リンク

2020/4/12(Sun) 22:16:13|NO.90086

 ファイル名だけ手持ちの物に変えて実行してみましたが、普通に表示されました。
 気になったのは32×32の白い四角とのことですが、screen 0としただけなら画面は真っ白になるので32×32の四角が表示されているのかどうかも分からないはずなんですが、Windows上でこのスクリプトだけを実行した結果ですか?

 p4とp5についてですが、画像全体を使用する場合は0, 0で省略しても同じです。おそらく犬の画像と思いますが、例えば犬の顔が座標(50, 60)から(249, 269)までの200×210ピクセル内にあって、その部分だけを使いたい場合はp4〜p7までは50, 60, 200, 210と記述します。



かたはば

リンク

2020/4/13(Mon) 15:48:14|NO.90094

分かりやすい回答ありがとうございます。
みなさんの方法をすべて試してみましたがダメでした…。
元々命令の練習のためにネットに載っているものをいじっていて、質問のスクリプトは
その一部なのですが、画像が上手く表示されないのは他の部分が影響しているのでしょうか?


#define winx 50
#define winy 60 #define mm 8 ;間隔 #define xcls0 color 0, 0, 0 : boxf 0, 0, winx * mm - 1, winy * mm - 1 #define xcls1 color 0, 30, 50 : boxf winx * mm, 0 ;初期設定 ----- ;配列宣言 teki = 1 ;敵機の数 dim tkx, teki : dim tky, teki ;敵機の座標 dim tkdx ,teki : dim tkdy, teki ;敵機の移動量 dim tkb, teki ;敵機の状態 0=あり、-1=なし ;画像読み込み buffer 1 picload "dog.png" ;メインウィンドウ screen 0 gzoom 32, 32, 1,,, 316, 403 xcls1 randomize ;スタート ----- *start ;げーむMain ----- *restart ;ゲーム開始前の設定 tkb(0) = -1 ;敵機状態、なし repeat redraw 0 xcls0 ;敵機の処理 gosub *teki_job ;自機移動 ;キー入力 ;自玉移動 ;自玉と敵機の当たり判定・敵機消去・得点加算表示 ;自機と敵機の当たり判定・自機消去・残機減算表示 redraw 1 await 80 loop ;ゲームオーバー判定 end ;敵機の処理 ----- *teki_job foreach tkx ;敵機の数(配列の個数)だけ繰り返す ;敵機初期位置・移動量設定 if tkb(cnt) = -1 & rnd(5) = 0 { tkx(cnt) = rnd(winx - 4) + 1 ;x座標 tky(cnt) = -4 ;y座標 tkdx(cnt) = 0 ;移動量x tkdy(cnt) = 1 ;移動量y tkb(cnt) = 0 ;敵機状態あり } ;敵機移動 if tkb(cnt) = 0 { ;敵機がありの時だけ移動処理をする pos tkx(cnt) * mm , tky(cnt) * mm gcopy 1, 32, 0 tkx(cnt) = tkx(cnt) + tkdx(cnt) tky(cnt) = tky(cnt) + tkdy(cnt) ;ウィンドウ外 if tky(cnt) >= winy : tkb(cnt) = -1 ;敵機状態なしに設定 } loop return
※引用元→http://masudahp.web.fc2.com/hsp3/game/hspg210.html

サイトではgmodeを使用しているところを、画像を縮小したいので自分なりにgzoomに
かえて打ち込んだものが上のスクリプトです。サイト通りの画像とgmodeでやってみたら
正常に実行されましたが、上記のスクリプトで実行するとやはり白い四角が上から下に
流れてしまいます。ちなみに、元の質問のスクリプトのみで実行した場合は、画像は正常に
表示することができました。原因や間違いに気づいた方がいらっしゃいましたら、
回答よろしくお願い致します…!



あらや

リンク

2020/4/13(Mon) 17:10:56|NO.90096

色々とありますが……
>gcopy 1, 32, 0
これが主な原因ですね。

この場合、gmodeは消すべきではないので下記のように
バッファを増やしてみて下さい。

;画像読み込み buffer 1 picload "dog.png" ;縮小画像バッファ buffer 2, 32, 32, 0 gzoom 32, 32, 1,,, 316, 403 ;メインウィンドウ screen 0 gmode 2, 32, 32 xcls1 randomize


そして、敵機を表示するところを下記のように修正してみてください。

;敵機移動 if tkb(cnt) = 0 { ;敵機がありの時だけ移動処理をする pos tkx(cnt) * mm , tky(cnt) * mm ;gcopy 1, 32, 0 // 下に変更 gcopy 2, 0, 0

これで出来ると思います。

一応全てのソースも書いておきます。

#define winx 50 #define winy 60 #define mm 8 ;間隔 #define xcls0 color 0, 0, 0 : boxf 0, 0, winx * mm - 1, winy * mm - 1 #define xcls1 color 0, 30, 50 : boxf winx * mm, 0 ;初期設定 ----- ;配列宣言 teki = 1 ;敵機の数 dim tkx, teki : dim tky, teki ;敵機の座標 dim tkdx ,teki : dim tkdy, teki ;敵機の移動量 dim tkb, teki ;敵機の状態 0=あり、-1=なし ;画像読み込み buffer 1 picload "dog.png" ;縮小画像バッファ buffer 2, 32, 32, 0 gzoom 32, 32, 1,,, 316, 403 ;メインウィンドウ screen 0 gmode 2, 32, 32 xcls1 randomize ;スタート ----- *start ;げーむMain ----- *restart ;ゲーム開始前の設定 tkb(0) = -1 ;敵機状態、なし repeat redraw 0 xcls0 ;敵機の処理 gosub *teki_job ;自機移動 ;キー入力 ;自玉移動 ;自玉と敵機の当たり判定・敵機消去・得点加算表示 ;自機と敵機の当たり判定・自機消去・残機減算表示 redraw 1 await 80 loop ;ゲームオーバー判定 end ;敵機の処理 ----- *teki_job foreach tkx ;敵機の数(配列の個数)だけ繰り返す ;敵機初期位置・移動量設定 if tkb(cnt) = -1 & rnd(5) = 0 { tkx(cnt) = rnd(winx - 4) + 1 ;x座標 tky(cnt) = -4 ;y座標 tkdx(cnt) = 0 ;移動量x tkdy(cnt) = 1 ;移動量y tkb(cnt) = 0 ;敵機状態あり } ;敵機移動 if tkb(cnt) = 0 { ;敵機がありの時だけ移動処理をする pos tkx(cnt) * mm , tky(cnt) * mm ;gcopy 1, 32, 0 // 下に変更 gcopy 2, 0, 0 tkx(cnt) = tkx(cnt) + tkdx(cnt) tky(cnt) = tky(cnt) + tkdy(cnt) ;ウィンドウ外 if tky(cnt) >= winy : tkb(cnt) = -1 ;敵機状態なしに設定 } loop return



あらや

リンク

2020/4/13(Mon) 17:14:09|NO.90097

追記で、もう1つソースを書いておきます。

こちらはバッファを増やさずに毎回縮小画像を描画するパターンです。

#define winx 50 #define winy 60 #define mm 8 ;間隔 #define xcls0 color 0, 0, 0 : boxf 0, 0, winx * mm - 1, winy * mm - 1 #define xcls1 color 0, 30, 50 : boxf winx * mm, 0 ;初期設定 ----- ;配列宣言 teki = 1 ;敵機の数 dim tkx, teki : dim tky, teki ;敵機の座標 dim tkdx ,teki : dim tkdy, teki ;敵機の移動量 dim tkb, teki ;敵機の状態 0=あり、-1=なし ;画像読み込み buffer 1 picload "dog.png" ;メインウィンドウ screen 0 gmode 2, 32, 32 xcls1 randomize ;スタート ----- *start ;げーむMain ----- *restart ;ゲーム開始前の設定 tkb(0) = -1 ;敵機状態、なし repeat redraw 0 xcls0 ;敵機の処理 gosub *teki_job ;自機移動 ;キー入力 ;自玉移動 ;自玉と敵機の当たり判定・敵機消去・得点加算表示 ;自機と敵機の当たり判定・自機消去・残機減算表示 redraw 1 await 80 loop ;ゲームオーバー判定 end ;敵機の処理 ----- *teki_job foreach tkx ;敵機の数(配列の個数)だけ繰り返す ;敵機初期位置・移動量設定 if tkb(cnt) = -1 & rnd(5) = 0 { tkx(cnt) = rnd(winx - 4) + 1 ;x座標 tky(cnt) = -4 ;y座標 tkdx(cnt) = 0 ;移動量x tkdy(cnt) = 1 ;移動量y tkb(cnt) = 0 ;敵機状態あり } ;敵機移動 if tkb(cnt) = 0 { ;敵機がありの時だけ移動処理をする pos tkx(cnt) * mm , tky(cnt) * mm ;gcopy 1, 32, 0 // 下に変更 gzoom 32, 32, 1,,, 316, 403 tkx(cnt) = tkx(cnt) + tkdx(cnt) tky(cnt) = tky(cnt) + tkdy(cnt) ;ウィンドウ外 if tky(cnt) >= winy : tkb(cnt) = -1 ;敵機状態なしに設定 } loop return

変更点は
>;gcopy 1, 32, 0 // 下に変更
>gzoom 32, 32, 1,,, 316, 403
ここだけです。



メルクーフ

リンク

2020/4/13(Mon) 19:32:44|NO.90098

 gzoomはgmodeの影響を受けないので、あらや氏の1本目のスクリプトの方がいいと思います。

 うまくいかなかった原因なんですが、これはおそらくなんですが、gzoomは本来『拡大縮小コピーそのものを行う命令』なのですが、かたはば氏は『gcopyに対して拡大縮小コピーの設定を行う命令』だとかんちがいをされたのではないでしょうか。



かたはば

リンク

2020/4/13(Mon) 19:49:18|NO.90099

>あらやさん

ありがとうございます!正常に実行できました!!

bufferを増やせばよかったんですね…。よろしければgmodeを消すべきではない理由も
教えていただきたいです。よろしくお願い致します。



あらや

リンク

2020/4/13(Mon) 21:22:22|NO.90100

>よろしければgmodeを消すべきではない理由も教えていただきたいです。
毎回画像を縮小するのは処理速度の問題で
少々遅くなるので(2つめのソースのパターンがこれです)

別のバッファに縮小化済の画像を用意し、
それをコピーするだけで良いようにしたのが最初のソースです。

gmodeが必要なのは、gcopyのコピーする大きさを省略して記述しているからです。

「透過色とかコピーモードとかよくわからないからいらない」という場合は
gmodeを消して『gcopy 2, 0, 0, 32, 32』と書き直しても動くはずです。



かたはば

リンク

2020/4/15(Wed) 17:17:34|NO.90112

>あらやさん

返信遅くなり申し訳ありません。
分かりやすい回答ありがとうございました!メルクーフさんの言う通り命令の意味が
いまいち分かっていませんでしたが、説明を聞いて納得です!!
HSPをはじめてしょっぱなから躓きそうだったのでとても助かりました…。

他の皆さんもありがとうございました。またすぐに質問する機会があると思うのでその時も
どうかよろしくお願いします…!



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