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


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
0714
hkrHSP3Dish/HGIMGを使用した2Dゲームを作る45解決


hkr

リンク

2025/7/14(Mon) 23:11:37|NO.103663

https://www.hsp.tv/play/pforum.php?mode=all&num=103595
↑スレッドが長くなったので、仕切りなおしてみました。

こちらのスレッドではGPU支援系ライブラリを標準命令の延長として活用できないか
前向きに探っていければなぁと思います。



この記事に返信する


窓月らら

リンク

2025/7/14(Mon) 23:16:33|NO.103664

新スレおめでとうございまーす♪
私もどちらかといえば2D派でHSP3Dishなどを使っていますので
気が向いたらなにかを書こうと思ってます。

とりあえずHSP3Dish/HGIMG4向けに作成した去年のコンテスト受賞作を貼ります。
https://dev.onionsoft.net/seed/info.ax?id=2522
これは将来的には自分でも使ってゲームを開発するために作成したもんです。
いまはドットエディタを開発しています。



hkr

リンク

2025/7/14(Mon) 23:27:54|NO.103665

とりあえず標準命令のみで構成された自作のプログラムをHGIMG4.asに移植させつつ
変換のポイントなんか書いていければいいなぁ。途中で折れるかもしれないけどw

さて早速ですが、HSP3DISHを使うかHGIMG4を使うかの選択肢です。
自分の場合bufferで確保した領域にboxfで矩形を描画(画面塗りつぶし)しているので、
Dishを使用するといきなりエラーが出ましたw
おさらいですが、Dishはbuffer領域はほぼROMと同様の扱いなので、読み込みは出来ても
VRAMの書き換えができません。gselでスクリーン0以外を指定して描画命令を使用したいなら
HGIMG4一択です。

ここまでで実行エラーは解消され、プログラム自体は動作するようになりました。
ただしゲーム画面が表示されずに白画面点滅という状態になっていますorz

次に続く(;´・ω・)



窓月らら

リンク

2025/7/14(Mon) 23:35:33|NO.103666

redraw 0 〜 redraw 1で挟むの必須なのでここは間違えないようにします。
redraw 1 しないと画面に表示されません。



hkr

リンク

2025/7/14(Mon) 23:38:12|NO.103667

>>NO.103664

ありがとうございます。

とりあえず自分が現行使用しているグラフィック系命令は、

screen
buffer
picload
cls
boxf
gcopy
gzoom
grotate
gsquare

これくらいですが、前述の通り画面が白黒点滅していますw

https://www.onionsoft.net/hsp/v36/doclib/support_cmds.txt
※ 全コマンドは互換有り

redraw命令で囲んだりはhspdxfixを使用していたころからの癖でやってるので作法は
合ってるはずですが、何かの命令が標準コマンドと違う動作をしてるんでしょうねぇー



hkr

リンク

2025/7/15(Tue) 21:04:00|NO.103669

テストプログラム書いてみました

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

;#include "HGIMG4.as"
;gpreset

screen 0, 512, 512, screen_fixedsize
buffer 1, 128, 128

gsel 1 : picload "128x128.bmp"

repeat
redraw 0
gsel 0 : pos 0, 0
gzoom 512, 512, 1, 0, 0, 128, 128
redraw 1
await 10
loop

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

128x128のBMPを読み込んで、512x512に拡大表示します。
上の2行のコメントを外すとHGIMG4で動作しますが、
例の画面の点滅が始まります。

コレですねー。
原因わかりませんが、コマンドの仕様変更というよりお作法の問題な気がします。
誰か原因わかります?w



名無し

リンク

2025/7/15(Tue) 21:44:43|NO.103670

HGIMG4では「redraw 0」を入れると画面がクリアされますが(マニュアルに記載あり)、
その後の「gsel 0」の個所で「redraw 1」と同等の処理が入っているようですね。
なので白く点滅してしまうと。

改善するにはrepeat命令内にあるredraw 0とgsel 0の位置を逆にすれば解決しますが、
提示してあるサンプルの場合はループ中にアクティブなウィンドウを変えてないので、
repeatの前にgsel 0を移動するだけで良い気がしますね。
#include "HGIMG4.as"
gpreset screen 0, 512, 512, screen_fixedsize buffer 1, 128, 128 gsel 1 : picload "128x128.bmp" gsel 0;11行目のgselをここに移動 repeat redraw 0 pos 0, 0 gzoom 512, 512, 1, 0, 0, 128, 128 redraw 1 await 10 loop

関係ないのですが、ソースコードは「<pre>」と「</pre>」(<>は半角で)で囲むと良いですよ。



へびぃ

リンク

2025/7/15(Tue) 21:48:08|NO.103671

これ、前に自分も、自分の友達もハマったんですけど(笑)
名無しさんの言うように、redraw 0 の前にgsel 0いれないとちらつきます



hkr

リンク

2025/7/15(Tue) 22:07:36|NO.103672

内部解像度と表示解像度が違うケースを考慮してソースを改変してみました。
一旦バッファに加工した画像を準備しておいて、それをフリップフロップ(厳密には違うが)
して表示する感じにしてみました。
実際今自分が作成しているプログラムは概ねこんな構造です。


;#include "HGIMG4.as" ;gpreset screen 0, 512, 512, screen_fixedsize buffer 1, 128, 128 ;BMP buffer 2, 512, 512 ;FLIP gsel 1 : picload "128x128.bmp" repeat ;表示用の画像をFLIPバッファに作成 gsel 2 : pos 0, 0 : cls gcopy 1, 0, 0, 128, 128 ;画像編集処理 ;表示解像度に拡大 gsel 0 : pos 0, 0 redraw 0 gzoom 512, 512, 2, 0, 0, 128, 128 redraw 1 await 10 loop

gselとredrawの位置も考慮してみましたが、HGIMG4を有効にすると今度は点滅どころか
真っ白になりましたね。なんでやねーん(;´・ω・)



名無し

リンク

2025/7/15(Tue) 22:13:51|NO.103673

真っ白になる理由はバッファ2番へのgcopyが正しく行えていないからですね。
buffer 1に対してはpicloadを行うので画像の読み込みが正しく行えてるわけですが、
基本的にそれ以外のバッファに対する書き込みは
buffer  2,	512, 512,screen_offscreen

のように4つ目のパラメータに「screen_offscreen」を入れてやる必要があるんですよね。 https://www.onionsoft.net/hsp/v36/doclib/hgimg4.html#RENDERBUFFER



hkr

リンク

2025/7/15(Tue) 22:25:39|NO.103674

あーすいません忘れてましたw
これで動作しますね。

ってぇ事は、従来のプログラムをHGIMG4で動作させたい場合、最終的に表示させたい解像度の
bufferをscreen_offscreenオプション込みで準備しておいて、一旦そこにコピーしておいてから


gsel 0 : pos 0, 0 redraw 0 gzoom 512, 512, 2, 0, 0, 128, 128 redraw 1

で表示させれば概ね互換が取れそうな気がしますね。
後程試してみます。



hkr

リンク

2025/7/16(Wed) 22:01:54|NO.103677

はい、ダメでした。
前のスレッドでも書いてますが、picloadでエラーが出ます。

単純にbuffer命令で作成した画面にpicloadする場合は問題ありませんが、
screen_offscreenオプションを使用すると、

「#Error21 --> サポートされない機能を選択しました」

が表示されます。
試しにimgload命令(mod_img.as)を使用してみたら、mod_img内部で同様の
エラーが発生しますので、やはり何らかの仕様変更だと思うのですが…



hkr

リンク

2025/7/16(Wed) 22:18:28|NO.103678

うーん、一旦普通のbufferにpicloadしてからscreen_offscreenにgcopyしてみました。
エラーはでなくなりましたが、うまくいかないですねぇ。
相変わらず白黒画面点滅ですorz



GENKI

リンク

2025/7/16(Wed) 23:07:43|NO.103679

白黒画面点滅が再現できません。実行したのは以下のスクリプト。


;#include "HGIMG4.as" ;gpreset screen 0, 512, 512, screen_fixedsize buffer 1, 128, 128 ;picload buffer 2, 512, 512,screen_offscreen ;FLIP gsel 1 : picload "tamane16.bmp" gmode 0 repeat ;表示用の画像をFLIPバッファに作成 gsel 2 : pos 0, 0; : cls gcopy 1, 0, 0, 128, 128 ;画像編集処理 ;表示解像度に拡大 gsel 0 : pos 0, 0 redraw 0 gzoom 512, 512, 2, 0, 0, 128, 128 redraw 1 await 10 loop
手元で問題が再現できないと解決は難しいかもです。

> picload "tamane16.bmp"
問題解決には、コピペだけで問題が再現できるスクリプトが望ましいです。
ということで、hsptvフォルダの画像です。

> gsel 2 : pos 0, 0; : cls
特にgmodeの指定がないということは、gmode 0 なので画面クリア不要。
clsは過剰な処置で負荷が上がっちゃうので、もしやるとしたら boxf での塗りつぶし。

> 「#Error21 --> サポートされない機能を選択しました」
「gcopy命令でパレットモード時に半透明コピーを実行しようとした場合など、機能としてサポートされない設定が行なわれている場合に表示されます。 」(error.htmより)
エラーが出ている行が何処なのか教えてくれないのでわかりませんがgzoomかな?
提示された「概ね」の中に肝心の原因が含まれていないようです。



hkr

リンク

2025/7/16(Wed) 23:24:20|NO.103680

とりあえずエラー21が出るサンプルがコチラ


#include "HGIMG4.as" gpreset screen 0, 640, 480 buffer 1, 128, 128, screen_offscreen ;BMP gsel 1 : picload "128x128.bmp"

bmpファイルもうpしときます
https://xgf.nu/RS2Eg



hkr

リンク

2025/7/16(Wed) 23:48:53|NO.103681

そして現在画面が白黒しているのはコレが原因ですね。
上2行を外せばちゃんと表示されます。


#include "HGIMG4.as" gpreset screen 0, 640, 480, 0 buffer 1, 640, 480 buffer 2, 640, 480, screen_offscreen repeat gsel 1 : color rnd(255), rnd(255), rnd(255) : boxf gsel 2 : gcopy 1, 0, 0, 640, 480 gsel 0 : pos 0, 0 redraw 0 gcopy 2, 0, 0, 640, 480 redraw 1 await 10 loop

やはり、buffer命令でscreen_offscreenを使用しているものと使用していないもの間の通信
(おそらくメインメモリとGPU上のVRAMとの通信)はサポートされてない感じですかね?
やはり何らかの手段でGPU-VRAM上に直接picload出来ないと先に進まない感じですねー



名無し

リンク

2025/7/17(Thu) 00:27:47|NO.103682

>103680
picloadを行う場合は「screen_offscreen」は不要です。

>103681
boxfやgcopy等を行う場合は「screen_offscreen」が必要です。

それらをまとめて恐らく行いたいのであろう事を実現したのが
103679(GENKIさん)のスクリプトだと思うのですが...

どうでもいいですが、自分の環境(HSP3.6)にはtamane16.bmpがありませんでした。
この辺のファイルを触ったことは無いので、どこかで削除されたのか追加されたんですかね。



hkr

リンク

2025/7/17(Thu) 22:20:20|NO.103685

>>NO.103682

ありがとうございます。
実際のところ、NO.103679のスクリプトとNO.103681のスクリプトは、
やってる内容がほぼ同等だと思うのです。

違う個所は唯一元画像が固定のBMPではなく毎フレームリアルタイム作成だというところですが。
結構この現象のキモの部分だと思うので、このスクリプトのダメなところを指摘頂ければ
一発解決な気がするんですが・・・



熱帯夜

リンク

2025/7/17(Thu) 22:45:03|NO.103686

これで動いたっぽい・・・理屈は不明


#include "HGIMG4.as" gpreset 0 screen 0, 640, 480, 0 buffer 2, 640, 480, screen_offscreen buffer 3, 640, 480, screen_offscreen randomize repeat gsel 2 : color rnd(255), rnd(255), rnd(255) : boxf gsel 3 : gcopy 2, 0, 0, 640, 480 gsel 0 : pos 0, 0 redraw 0 gcopy 3, 0, 0, 640, 480 redraw 1 await 10 loop



hkr

リンク

2025/7/17(Thu) 23:00:13|NO.103687

それは画像のソース(buffer2)をscreen_offscreenで作成したからですねー
それだと後からpicloadに対応出来ないのでダメっすねー(;´・ω・)



GENKI

リンク

2025/7/17(Thu) 23:36:36|NO.103688

>> 名無しさん NO.103682
> どうでもいいですが、自分の環境(HSP3.6)にはtamane16.bmpがありませんでした。
HSP3.7以降のどこかで追加されました。HSP3.6には付属していません。
ごめんなさい普段は3.7ばかり使っているので気が付きませんでした。

>> hkrさん NO.103681
> gsel 1 : color rnd(255), rnd(255), rnd(255) : boxf
実際には描画が行われていません。
HGIMG4を使用する場合、screen_offscreenが設定されていないオフスクリーンへの描画はできません。(HGIMG4プログラミングガイド 39.レンダリングバッファ)
何も描画されていないウィンドウをgcopyするので白い画面が表示されるわけです。
NO.103679のスクリプトの場合、ID1に画像が読み込めているのでやっていることは同じではありません。

>> hkrさん NO.103680
ありがとうございます。エラーが確認できました。
screen_offscreenを指定したウィンドウへはpicloadが使用できないようですね。なんでだろう。
マニュアル探してみましたが、使用できないという説明は見当たりませんでした。
その代わり、celloadならscreen_offscreenが指定されていても使用できるようです。こんな感じで書き換えるといいようです。

gsel 1 : picload "128x128.bmp" ↓ celload "128x128.bmp", 1
HGIMG4ではcelloadを積極的に使ってねということなんでしょうかね。

>> 熱帯夜さん NO.103686
boxfでの描画先をscreen_offscreenのウィンドウにしたのでちゃんと書き込みができるようになっています。



hkr

リンク

2025/7/17(Thu) 23:51:18|NO.103689

おぉ、ありがとうございます!celloadなんて命令初めて知りましたw
picloadとの違いは、バッファを明示的に指定しての画像読み込みなんですね。
後程試してみるです〜



hkr

リンク

2025/7/17(Thu) 23:54:25|NO.103690

あ、すいません、追記です。

>>screen_offscreenを指定したウィンドウへはpicloadが使用できないようですね。なんでだろう。

Dishのコマンドリファレンスを見るとpicload命令は非対応になってるんで、
もしかしてその仕様を引き摺っている可能性も…?



GENKI

リンク

2025/7/18(Fri) 00:09:32|NO.103691

Dishのコマンドリファレンス…そういえばそういうのもあったんでした。忘れてた。
support_cmds.txtのこの記述かな。picloadもcelloadも記述がありますね。

> HSP3Dish非互換コマンド
> (これらの命令はデバイスにより異なる仕様が含まれています)
> picload ,sys|func
> celload ,sys|func

「HGIMG4プログラミングガイド 13. 初期化と描画の方法」には次のような記述があります。
> これらのルールは、HSP3Dishと同様です。 2D描画に使用可能な描画命令と仕様についても、基本的にHSP3Dishと同じになっています。

ということで、HGIMG4有無で挙動が変わるのは、ご指摘通りHSP3Dishの仕様の影響なんでしょうね。



窓月らら

リンク

2025/7/18(Fri) 03:17:34|NO.103692

基本的なことですが
HSP3Dish/HGIMG4 を使用する場合は原則最新β版をお試しください。
ほとんどこれの更新なんで・・・
うちのところでは 3.6 はもはや使い物になりません。



hkr

リンク

2025/7/18(Fri) 08:25:35|NO.103693

とりあえず3.7β入れてきましたよっと。

んでcelloadでテストプログラムあっさり動きましたw
今から実プログラムで検証してみるっすー



hkr

リンク

2025/7/18(Fri) 08:51:56|NO.103694

うーむ、とりあえず白画面が黒画面に変化はしたが、何も表示されない…

現行プログラムは

buffer間の画像加工処理

redraw 0
メインスクリーンにgcopy
redraw 1

await

という流れなのですが、もしかして

redraw 0

buffer間の画像加工処理

メインスクリーンにgcopy
redraw 1

await

じゃないと正常動作しないんですかね?
今から試してみますけど…



hkr

リンク

2025/7/18(Fri) 09:03:17|NO.103695

ダメでした。変わりありませんでした。
まーだ何処か標準命令と違う挙動をするコマンドが隠れてそうですねーorz

・・・ってここまで書いて気が付いたのですが、たしかredraw 0の前に
メインスクリーンのgselとpos 0, 0をやってからgcopy→redraw 1がお作法でしたよね?
って事は流れ的に↑のチャートは上で正解って事になる・・・のかな?



hkr

リンク

2025/7/18(Fri) 10:03:15|NO.103696

なんとなく白黒点滅の原因が見つかりました・・・


#include "HGIMG4.as" gpreset 0 screen 0, 640, 480, 0 for i, 1, 16 buffer i, 640, 480, screen_offscreen gsel i color 0, 0, 0 : boxf ;??? next randomize repeat gsel 2 : color rnd(255), rnd(255), rnd(255) : boxf gsel 3 : gcopy 2, 0, 0, 640, 480 gsel 0 : pos 0, 0 redraw 0 gcopy 3, 0, 0, 640, 480 redraw 1 await 10 loop

8行目、バッファを黒塗り初期化しているのですが、これをやると画面が点滅を始めます。
ちなみにこの行をclsに変更すると点滅は収まります。
boxfはDishでもサポートされてるコマンドなんですが…これは…まだ何かお作法が?



hkr

リンク

2025/7/18(Fri) 16:17:23|NO.103697

あともう一つ、まだサンプルソースは作っていませんが、
gmode2の透過色コピーが正常動作していないですねー。

調べたらDishでgmodeは非互換指定されているのですが、
HGIMG4では代わりにどうやるんですかね?透過色付きコピー。



窓月らら

リンク

2025/7/18(Fri) 16:46:07|NO.103698

透過については素材画像のpngの段階でアルファチャンネルで指定します。
そのまま反映されます。gmode 2 でも中間値の透明がそのまま反映です。



hkr

リンク

2025/7/18(Fri) 17:59:09|NO.103699

という事は、従来gmode2の透過色指定(RGBすべて0)は使用できない、
画像素材は全部作り直しという事ですかね?(;´・ω・)

手元のプログラムで確認したのは、画像データではなくcls 4で初期化したうえで
boxfで市松模様を描いたものなのですが、本来透過するはずの部分が
灰色(?)で埋められてますね。

もしかしたら、↑で書いたboxf問題(screen_offscreen宣言したbufferに
boxfで描画するとバッファが死ぬ)の影響かもしれませんが。



窓月らら

リンク

2025/7/18(Fri) 19:29:03|NO.103700

> 画像素材は全部作り直しという事ですかね?(;´・ω・)
そうです。
逆に1px単位で半透明もできるんで自由度maxになると思いますが・・・



hkr

リンク

2025/7/18(Fri) 20:35:56|NO.103701

とりあえず実験セットを作ってみましたw
ダウンロードはこちら→ https://xgf.nu/1acf6

ってなわけで、確かにスプライトをpngで作ると抜けますねぇ。



hkr

リンク

2025/7/18(Fri) 20:47:37|NO.103702

さて、問題はこのケース


#define SCR_MAIN 0 #define SCR_MIX 1 #define SCR_BG 2 #define SCR_SPR 3 #define SCR_SUB 4 #define FALSE 0 #define TRUE 1 #include "HGIMG4.as" gpreset 0 screen SCR_MAIN, 480, 240, screen_fixedsize buffer SCR_MIX, 240, 120, screen_offscreen buffer SCR_BG, 240, 120, screen_offscreen buffer SCR_SPR, 288, 240, screen_offscreen buffer SCR_SUB, 288, 240, screen_offscreen ;BG読み込み switch 0 ;0:BMP 1:PNG case 0 : celload strf("%s\\BG.bmp", dir_cur), SCR_BG : swbreak case 1 : celload strf("%s\\BG.png", dir_cur), SCR_BG : swbreak swend ;SPRITE読み込み switch 1 ;0:BMP 1:PNG case 0 : celload strf("%s\\SPRITE.bmp", dir_cur), SCR_SPR : swbreak case 1 : celload strf("%s\\SPRITE.png", dir_cur), SCR_SPR : swbreak swend ;MIX作成 gsel SCR_SUB : cls 4 gmode 2 : pos 0, 0 : gcopy SCR_SPR, 000, 000, 135, 096 ;SPR gmode 2 : pos 64, 8 : gcopy SCR_SPR, 151, 000, 279, 096 ;SPR gsel SCR_MIX gmode 0 : pos 0, 0 : gcopy SCR_BG, 0, 0, 240, 120 ;BG gmode 2 : pos 0, 0 : gcopy SCR_SUB, 0, 0, 240, 120 ;SUB ;VIEW gsel SCR_MAIN : pos 0, 0 redraw FALSE gzoom 480, 240, SCR_MIX, 0, 0, 240, 120 redraw TRUE await 10 dialog "STOP" end

一旦別画面にスプライト同士を合成しておいて、最終的にBGと重ねると
透過が抜けませんねぇ。
bufferをclsやらboxf以外の手段で、何らかの透過属性を持った状態に初期化しないと
どうにもならないような気がしますねぇ・・・



hkr

リンク

2025/7/18(Fri) 20:57:27|NO.103703

早速ですが、全面透過色のblank画像を作成してSCR_SUBに読み込んでみました。
これならbufferが何らかの透過属性を持つか・・・?

celload strf("%s\\BLANK.png", dir_cur), SCR_SUB

結果ですが、SCR_SUBがROM化してしまいスプライトが重ねられなくなりましたw
なんかもうこの辺はDishの挙動ですねー。



熱帯夜

リンク

2025/7/18(Fri) 21:28:13|NO.103704

話題はさかのぼりますが・・・こんなんスか

bufferまでredrowかます必要があるとは・・・


#include "HGIMG4.as" gpreset 0 setcls 0 :;おまじない screen 0, 640, 480, 0 repeat 16,1 buffer cnt, 640, 480, screen_offscreen redraw 0 color cnt, cnt, cnt boxf 0,0,640,480 :;??? redraw 1 ;await 50 loop randomize repeat setcls 0 gsel 2 color rnd(255), rnd(255), rnd(255) boxf gsel 3 gcopy 2, 0, 0, 640, 480 gsel 0 : pos 0, 0 redraw 0 gcopy 3, 0, 0, 640, 480 redraw 1 await 20 loop



hkr

リンク

2025/7/18(Fri) 21:59:03|NO.103705

うぉ!
↑見て慌てて3DTESTもredraw増やしたりしてみましたw
とりあえずbuffer確保時はredrawで描画停止した方が良いことは確認できました!

さらに試しにgcopy命令1個づつredrawで丁寧に囲んだり、全体一括で括ったりしてみましたが、
透過の問題は解決出来ませんでした。
でも、redrawで囲む位置で色々と挙動が変わりますねーこれ危ないねー

自分のいじった感じですが、最初は表示screenに干渉する場合のみredraw停めれば
良いかと思ったのですが、やはりbuffer同士の作業でも描画停めた方が良さげですねー



hkr

リンク

2025/7/18(Fri) 22:11:51|NO.103707

うおー!!ついにbuffer同士の透過合成に成功しました!!!
やはりbufferを予め透過色で埋める必要がありました。


#define SCR_MAIN 0 #define SCR_MIX 1 #define SCR_BG 2 #define SCR_SPR 3 #define SCR_SUB 4 #define FALSE 0 #define TRUE 1 #include "HGIMG4.as" gpreset 0 setcls 1 ; redraw FALSE screen SCR_MAIN, 480, 240, screen_fixedsize buffer SCR_MIX, 240, 120, screen_offscreen buffer SCR_BG, 240, 120, screen_offscreen buffer SCR_SPR, 288, 240, screen_offscreen buffer SCR_SUB, 240, 120, screen_offscreen ;BG読み込み switch 0 ;0:BMP 1:PNG case 0 : celload strf("%s\\BG.bmp", dir_cur), SCR_BG : swbreak case 1 : celload strf("%s\\BG.png", dir_cur), SCR_BG : swbreak swend ;SPRITE読み込み switch 1 ;0:BMP 1:PNG case 0 : celload strf("%s\\SPRITE.bmp", dir_cur), SCR_SPR : swbreak case 1 : celload strf("%s\\SPRITE.png", dir_cur), SCR_SPR : swbreak swend ; redraw TRUE ;MIX作成 redraw FALSE gsel SCR_SUB : cls 4 gmode 0 : pos 0, 0 : gzoom 240, 120, SCR_SPR, 0, 0, 1, 1 ;ここがキモ!!! gmode 2 : pos 0, 0 : gcopy SCR_SPR, 000, 000, 135, 096 ;SPR gmode 2 : pos 64, 8 : gcopy SCR_SPR, 151, 000, 279, 096 ;SPR gsel SCR_MIX gmode 0 : pos 0, 0 : gcopy SCR_BG, 0, 0, 240, 120 ;BG gmode 2 : pos 0, 0 : gcopy SCR_SUB, 0, 0, 240, 120 ;SUB redraw TRUE await 0 ;VIEW gsel SCR_MAIN : pos 0, 0 redraw FALSE gzoom 480, 240, SCR_MIX, 0, 0, 240, 120 redraw TRUE await 10 dialog "STOP" end

キモはソース内に書いておきましたw
PNGで読み込んだスプライトデータの透明な部分だけを取り出して、
gmode0&gzoomで合成用バッファ全体に拡大コピーしておけば、
そこが透過属性を持つみたいで以降そこにスプライトを重ねても
ちゃんと動作するみたいです。

・・・なんか裏技っぽいので、本当はbuffer初期化時に透過属性を持たせる
何らかの初期化方法が存在してもおかしくないと思うんですけど・・・



hkr

リンク

2025/7/18(Fri) 22:27:32|NO.103708

「HSP標準命令で作成した2DゲームをHDIMG4を使ってGPUに対応させる際の、現時点でのまとめ」

1)buffer命令には「screen_offscreen」オプションを付ける
2)その際、buffer命令をredraw 0 〜 redraw1で囲む(boxf命令エラー対策)
3)画像データの読み込みはpicloadからcelload命令に変更する
4)透過コピーさせたい画像データは全てPNG形式で保存する
5)その際、グラフィックツール等で従来RGB0:0:0の透過色指定部分を
  透明属性に変換する必要がある
6)画像合成につかうbufferは、予め透過属性を持ったデータで初期化する必要がある
  現時点では、スプライトデータの透過属性の部分をgmode 0→gzoom命令で
  合成用バッファ全体に拡大コピーすれば初期化可能

こんな感じですかね?



hkr

リンク

2025/7/19(Sat) 19:59:04|NO.103722

うーむ、今↑を元にいろいろ試してますが、全然うまくいきません。
テスト環境ではうまくいっていたのですが、やはりboxf命令を使うと、
何かの拍子にgsel中のbufferを超えて関係ないbufferまで内容を破壊するみたいですね。
もうboxfはダメかなー。

・・・これはもう一旦標準bufferでboxf描いたのをalSaveFileでpngで保存して、
改めてscreen_offscreenに読み込んでからgsquareで台形転送するくらいしか
対処法が思い浮かばないんですが・・・orz
いっそのことHGIMG4の3D系の命令でプリミティブなポリゴン描画する命令とか
無いですかね?w



hkr

リンク

2025/7/19(Sat) 20:39:06|NO.103723

今気が付いたのですが、


gsel 1 : gmode 0 gcopy xxxx    〜 gsel 1 : gmode 1 gcopy xxxx

png読み込み(ROM化)していない同じバッファに対して、途中でgmodeを切り替えると
見事に内容が破壊されるっぽいですね。全然気が付かなかったorz
内臓機能ではこんな挙動しないんで、これも仕様変更っぽいですねー



hkr

リンク

2025/7/19(Sat) 22:25:32|NO.103726

うーん、今度はgsquare命令がマトモに動作しませんねー。
もうテクスチャがガッタガタで使い物になりません・・・

なんかもう折れましたorz

結論から言うと、標準命令のみで作ったゲームをHSPDISH/HGIMG4に移植するのは困難。
ぶっちゃけ頭から作り直した方が速い、くらいの謎仕様のオンパレード。
特にbuffer間の透過コピーが超難関で、様々なきっかけで簡単にbuffer内部が破壊される
のには参りました。

昔はVBよりもHSPの方がDirectX系の描画が楽ちんでこっちに引っ越してきたのに、
HSPDXからHGIMG4に移行したらこんな酷い仕様だとは、
これならさっさとCに変換して脱出したほうが楽そうだなぁorz

Fin.



GENKI

リンク

2025/7/20(Sun) 22:36:31|NO.103730

素直に celload で読み込んで、celdivでサイズ指定して、celputで描画ではダメなんでしょうか。
celput なら拡大と回転の機能を標準で持っているので、これまでのようにgzoomとgsquareを駆使する必要はありません。
celputは、HGIMG4を使うと回転時もきれいに描画されます。



test

リンク

2025/7/20(Sun) 23:04:45|NO.103731


// redrawの処理 redraw 0 //---描画系処理全般 await 0 //これが無いとredraw 0とredraw 1の間にエスケープ出来ない redraw 1 //これで描画 await 10 //ここでFPSらしきものを挟む

こうじゃ無いと、描画の間中バッテンボタンが利かない仕組みに
なってしまいます。await 0はひたすら挟んで下さい。小まめに。



hkr

リンク

2025/7/21(Mon) 00:11:10|NO.103733

〉NO.103730

gsquareを使いたい理由ですが、スペースハリアーの地面の描画ですね
現在市松模様を台形転送して再現してるのですが、スプライト機能で再現できますかね?

あとgzoomを使ってる理由は前スレを参照いただけると(´・ω・`)
このスレッドの目的は標準命令でつくったゲームの高速化ですから、
スプライト機能の使用はスレ違いですねー



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.103663への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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