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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
1230
おぼシューティングゲームで質問です。21解決


おぼ

リンク

2017/12/30(Sat) 16:13:04|NO.82107

こんにちわ。おぼです。

シューティングゲームの勉強をしていて、自機の表示と移動のスクリプトが書けたので、Android用にビルドしてどうなるのか検証してみました。

すると、困ったことにタッチを検出していないのか、自機が動きませんでした。

さらに、画面のscreenで設定した、200x320の部分しか表示されていない風でした。320x480に書き換えてもダメでした。どこを書き換えればいいのかわかりませんでした。

以上2点基礎的なことを質問しているような気もしますが、私にとっては大きなことだったので、よろしくご教授願います。

書いたスクリプトを掲載します。


#include "hsp3dish.as" screen 0,200,320,0 xmax=11:ymax=19:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove redraw 1 await 100 goto *mainlp *memove ;key input stick key,15,1 if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax color 0,128,0 pos mx*xstep,my*ystep mes "A" ;redraw 1 return

です。

よろしくお願いします。



この記事に返信する


ZAP

リンク

2017/12/30(Sat) 16:54:29|NO.82108

HSPのヘルプにある、
HSP3Dish android(NDK)版プログラミングガイドによると

android版の注意事項、制限
入力可能な情報
タップした座標がmousex,mouseyに反映されるほか、stick命令により、クリック(タップ)のON/OFFを取得可能です。 また、mtlist、mtinfo命令により高度なタッチ情報(マルチタッチなど)を取得することができます。 複数ポイントのタッチ情報(マルチタッチ)は、デバイスがサポートしている場合のみ取得可能です。 Androidデバイスによっては、ハードウェアがマルチタッチをサポートしていない場合がありますので、注意してください。

とあります。
AndroidではStickの上下左右は取得できないのではないでしょうか?



ぜーっと!

リンク

2017/12/30(Sat) 19:28:26|NO.82112

プログラミングマニュアル・基本仕様ガイド
http://www.onionsoft.net/hsp/v35/doclib/hsp3dish_prog.htm
android(NDK)版プログラミングガイド
http://www.onionsoft.net/hsp/v35/doclib/hsp3dish_ndk.htm

標準使用と違い、制限や未対応の命令も多いので、hsp3dishを使用されるのであれば
まずはマニュアルは熟読した方が良いです。

ZAPさんが説明されているように、stickで取得できる内容が違います。
windowsで実行するならば問題ないのですが、android実機で実行する場合
画面のタッチはマウスの左クリックとして取得できますが、上下左右の取得はできません。
タッチされた場所はmousex,mouseyで取得できます。
これを利用して、タッチされたところに自機をプログラム側で移動させる、もしくは
十字キーやボタンの画像を置いて、その画像範囲がタッチされたらその方向に動くという方法があります。

screenに関しても、dishでは無視されます。screen使用して画面サイズは指定できません。
プログラムソースのあるフォルダ内に、ビルド時にはhspフォルダの中にhsp3dish.iniという
テキストファイルを作って、その中に例として以下
wx=800
wy=600 autoscale=0
などと解像度を指定する必要があります。wyが広い場合は縦画面に、wxが広い場合は横画面になるようです。
プログラミングマニュアル・基本仕様ガイドのNo15に同様の記載があります。



おぼ

リンク

2017/12/30(Sat) 21:25:14|NO.82114

おぼです。

回答くださりありがとうございます。

>>ZAPさん
>>ぜーっと!さん

ご指示くださった内容をもとに、スクリプトを書き直しました。

すると、マウスのアクションは取れているのか反応はあるのですが、挙動が意図していないように自機が動きます。スクリプトでおかしなところがあればご指摘願います。


#include "hsp3dish.as" screen 0,320,480,0 xmax=19:ymax=28:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove color 0,128,0 pos mx*xstep,my*ystep mes "A" redraw 1 await 100 goto *mainlp *memove ;key input stick key,15 if key & 256 : goto *me_mouse if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ goto *me_check *me_mouse x=mousex-8:y=mousey-8 px = x - mx if px>2 : px=2 if px<-2 : px=-2 mx = mx + px py = y - my if py>2 : py=2 if py<-2 : py=-2 my = my + py *me_check ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax return

です。

よろしくお願いいたします。



ZAP

リンク

2017/12/30(Sat) 22:36:29|NO.82115

自機の座標とマウスの座標を比較しているところがおかしい。
自機の座標はあとで16倍する仕様として管理しているのに、
マウスの座標は画面内の座標そのものだから、そのままじゃ比較できない。

自機の座標を画面内の座標に戻してから比較しないと。



おぼ

リンク

2017/12/31(Sun) 01:52:56|NO.82116

おぼです。ご指摘ありがとうございます。

>>ZAPさん

自分なりに、*me_mouseの中身をいろいろ変更させてみたのですが、私の理解ができていないのか、F5で起動させて、マウスの左クリックを押下すると自機が左上に飛んで行ってしまいます。

自分で修正してみてダメだったスクリプトを掲載します。

多分、*me_mouseの中に問題があるのだと思うのですが、自力ではここまでのように感じています。よろしくご指導願います。


#include "hsp3dish.as" screen 0,320,480,0 xmax=19:ymax=29:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove color 0,128,0 pos mx*xstep,my*ystep mes "A" redraw 1 await 100 goto *mainlp *memove ;key input stick key,15 if key & 256 : goto *me_mouse if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ goto *me_check *me_mouse x=mousex-124:y=mousey-124 px = x - mx*16 if px>32 : px=32 if px<-32 : px=-32 mx*16 = mx*16 + px py = y - my*16 if py>32 : py=32 if py<-32 : py=-32 my*16 = my*16 + py *me_check ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax return
です。

よろしくお願いします。



ぜーっと!

リンク

2017/12/31(Sun) 10:51:31|NO.82119

とりあえずは、実機で動かすのは後回しにして、まずは
キャラクタを動かす練習をするのが先決かもしれませんね。

*me_mouseの計算式がごちゃごちゃしていて、何をしようとしてるのかが分かりにくいですね。

あと計算式で間違いがあります。
mx*16 = mx*16 + px
↑左辺には計算式を書くことはできません。

代入する変数 = 計算式

そのうえで、中で何が起こっているのか変数の見える化をしてみると分かると思います。
(ちなみに、おぼさんの元のリストに見える化しただけで、間違いは何も修正してません)

#include "hsp3dish.as" screen 0,320,480,0 xmax=19:ymax=29:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove color 0,128,0 pos mx*xstep,my*ystep mes "A" pos 0,0 color 255,255,255 mes "winSize:"+ ginfo_winx +","+ ginfo_winy //画面のサイズ mes "mouse:"+ mousex +","+ mousey //マウスの位置 mes "xy:"+ x +","+ y //*memouseで計算されたxy mes "pxpy:"+ px +","+ py //上記同様 mes "mxmy:"+ mx +","+ my //上記同様 mes "pos xy:"+ (mx*xstep) +","+ (my*ystep) //自機"A"を表示している位置xy redraw 1 await 100 goto *mainlp *memove ;key input stick key,15 if key & 256 : goto *me_mouse if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ goto *me_check *me_mouse x=mousex-124:y=mousey-124 px = x - mx*16 if px>32 : px=32 if px<-32 : px=-32 mx*16 = mx*16 + px py = y - my*16 if py>32 : py=32 if py<-32 : py=-32 my*16 = my*16 + py *me_check ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax return
変数表示の”pos xy”が自機Aの表示される実際の位置になります。
実際にクリックしてみると”pos xy”が 0,0 になると思います。
これは、計算式の書き方のミスが影響していると思います。

計算式をはじめからたくさん書くより、一番単純な状態から、ひとつずつ計算式を
追加していくようにした方がよいと思います。



おぼ

リンク

2017/12/31(Sun) 10:52:02|NO.82120

おはようございます。おぼです。

さらに試したのですがわかりませんでした。

*me_mouseがおかしいのだけはあってると思いますがどういう風に修正すればよいのかわかりませんでした。

スクリプトを掲載します。

どなたかご教授願います。


#include "hsp3dish.as" screen 0,320,480,0 xmax=19:ymax=29:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove color 0,128,0 pos mx*xstep,my*ystep mes "A" redraw 1 await 100 goto *mainlp *memove ;key input stick key,15 if key & 256 : goto *me_mouse if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ goto *me_check *me_mouse x=mousex-8:y=mousey-8 px = x - mx*16 if px>2 : px=2 if px<-2 : px=-2 mx*16 = mx*16 + px py = y - my*16 if py>2 : py=2 if py<-2 : py=-2 my*16 = my*16 + py *me_check ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax return
です。

よろしくお願いします。



おぼ

リンク

2017/12/31(Sun) 11:27:13|NO.82123

おぼです。

>>ぜーっと!さん

スクリプトありがとうございます


よくよく考えたのですが、滑らかにマウスカーソルは動きませんでした。飛び飛びでなんか変です。


*me_mouse x=mousex-128:y=mousey-128 px = x - mx*16 if px>32 : px=32 if px<-32 : px=-32 mmx = mx*16 + px mx = mmx/16 py = y - my*16 if py>32 : py=32 if py<-32 : py=-32 mmy = my*16 + py my = mmy/16

ここまでしかわからなかったです。

どうすればよかったのか、ご教授願います。

よろしくお願いいたします。



あまら

リンク

2017/12/31(Sun) 12:23:44|NO.82126

根本的な所を聞きますが、マウスクリックしたときに何がしたいのでしょうか?

マウスカーソルに近づいていくという形にしたいのかと思いましたが、
妙な計算が多いように見受けられます。


動きが滑らかでないのは
> stick key, 15
が原因では?
これでは十字カーソルキーは押しっぱなしでも動き続けますが、
クリックは連打しないといけないことになります。

もしくは
> await 100
が大きすぎるせいかも?



ZAP

リンク

2017/12/31(Sun) 14:19:00|NO.82132

他の人も書いていますが、STGの基本形を作るうえでの疑問と
Dish独特の仕様により生じる疑問が一度に生じているみたいなので
一度きちんと整理すべきではないかと思います。

お見受けするところ、Dishの仕様うんぬん以前のところで
つまずいているようなので、まずはDish(Androidでの動作)にこだわらずに、
Windows上で動くSTGの基本形をきちんと完成させることをめざすのが、
問題点がごちゃごちゃにならなくてよいんじゃないかと思います。

とりあえず気になったのは、あまらさんも書いていますが

await 100 ですね。

1秒間に10回しかメインループの処理をしないことになるので、
ものすごく動きがガタガタになります。

ここはゲーム全体のスピードに影響しますので、先にきちんと決めておくべき部分です。
コンシューマなどの通常のSTGだと秒間60フレームなので、
1ループあたりのawaitの値は
1000(ミリ秒)÷60(フレーム)=16.6666(≒17)
でループを回しているものが多いです。

秒間60フレームは絶対的なルールではないので、厳密にこれにこだわる必要はありませんが、
フレーム数を減らすとその分動きはぎこちなくなりますので、低くても秒間30フレームが限度かと。



おぼ

リンク

2017/12/31(Sun) 14:29:53|NO.82133

おぼです。

>>あまらさん

ご指摘ありがとうございます。

>マウスカーソルに近づいていくという形にしたいのかと思いましたが

まったくその通りです。

>動きが滑らかでないのは
> stick key, 15
>が原因では?
>これでは十字カーソルキーは押しっぱなしでも動き続けますが、
>クリックは連打しないといけないことになります

stick key, 271, 1
にしたところ、動きは予想外ですが、滑らかになりました。カーソルから逃げて行ってしまうので困っています。

またスクリプトを掲載しますので、皆さん助けてください。お願いします。


#include "hsp3dish.as" screen 0,320,480,0 xmax=19:ymax=29:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove color 0,128,0 pos mx*xstep,my*ystep mes "A" redraw 1 await 50 goto *mainlp *memove ;key input stick key,271,1 if key & 256 : goto *me_mouse if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ goto *me_check *me_mouse x=mousex-128:y=mousey-128 px = x - mx*16 if px>32 : px=32 if px<-32 : px=-32 mmx = mx*16 + px mx = mmx/16 py = y - my*16 if py>32 : py=32 if py<-32 : py=-32 mmy = my*16 + py my = mmy/16 *me_check ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax return
です。

よろしくご教授お願いいたします。



おぼ

リンク

2017/12/31(Sun) 14:40:54|NO.82135

おぼです。

>>ZAPさん

await 50

await 30

と変化させると、速度は速くなりましたが、滑らかさは変わりませんでした。

滑らかになったのは、stick key, 271, 1 と指定してからでした。

またご指摘くださると助かります。ありがとうございます。



あまら

リンク

2017/12/31(Sun) 15:13:28|NO.82136

色々と指摘したい所はありますが、
一番気になる所として

> x=mousex-128:y=mousey-128

これですね。
これは何の減算なのか……、これではマウスに近寄れないでしょう。

色々な場所でクリックしてみるとわかりますが、これのせいで必ずマウスの左上
(おそらくマウス座標x-128,y-128の位置)に自機が移動します。

そのせいで場合によっては逃げるように見えるのかと。

単純に
x=mousex:y=mousey
とするだけで寄ってくるようになります。

こうなると変数xとyが不要になります。
何度もマウス座標を計算に使用するとなると1文字の変数の方が楽ということもありますが、
見た所一度しか使っていないようなので、わざわざ変数に代入する必要もなさそうですね。



おぼ

リンク

2017/12/31(Sun) 15:46:58|NO.82138

おぼです。

>>あまらさん。

ご指摘のところを修正すると、マウスカーソルに予想した動きをするようになりました。

ありがとうございました。

mousex-128の128を設定したのは、いろんなところのソーススクリプトを見合わせて見様見真似で書いたのですが、私が思っていたのと意味が違っていたことがわかりました。これに気付くのに頭がこんがらがってしまってました。

皆様ありがとうございました。

結論としてできたスクリプトを掲載しておきます。


#include "hsp3dish.as" screen 0,320,480,0 xmax=19:ymax=29:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove color 0,128,0 pos mx*xstep,my*ystep mes "A" redraw 1 await 30 goto *mainlp *memove ;key input stick key,271,1 if key & 256 : goto *me_mouse if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ goto *me_check *me_mouse x=mousex:y=mousey px = x - mx*16 ;if px>32 : px=32 ;if px<-32 : px=-32 mmx = mx*16 + px mx = mmx/16 py = y - my*16 ;if py>32 : py=32 ;if py<-32 : py=-32 mmy = my*16 + py my = mmy/16 *me_check ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax return
です。

ありがとうございました。



ぜーっと!

リンク

2017/12/31(Sun) 18:48:05|NO.82139

まずは、一つ一つが何を意味している処理、計算なのかを考えないと、
はじめを理解していないと、これから先、さらによくわからない状況に
なりかねないので注意が必要です。

単にプログラムの羅列だけでなく、自身への覚書の意味も含め、各行に注釈を置くと良いです。
時間がたつと、自分の組んだプログラムさえも分からなくなります。

あとは、クリック後の処理ですが、
もともとgosub で *memove に飛んできているところですから return までは goto を使用して
複雑にラベルを飛び回らないほうが読みやすいです。

(以下は、goto を無くして、再配置しただけでそれ以外は変更してません)
#include "hsp3dish.as"
screen 0,320,480,0 xmax=19:ymax=29:mx=7:my=7 xstep=16:ystep=16 *mainlp redraw 0 color 0,0,0:boxf gosub *memove color 0,128,0 pos mx*xstep,my*ystep mes "A" redraw 1 await 30 goto *mainlp *memove ;key input stick key,271,1 if key & 256 { x=mousex:y=mousey px = x - mx*16 ;if px>32 : px=32 ;if px<-32 : px=-32 mmx = mx*16 + px mx = mmx/16 py = y - my*16 ;if py>32 : py=32 ;if py<-32 : py=-32 mmy = my*16 + py my = mmy/16 } if key & 1 :mx-- if key & 2 :my-- if key & 4 :mx++ if key & 8 :my++ ;max min check if mx < 0:mx = 0 if mx > xmax :mx = xmax if my < 0:my = 0 if my > ymax :my=ymax return
こうすると *memove以降、goto は必要なく、まったく同じ動作になります。
returnまで一貫していて、見やすく分かりやすいと思います。



おぼ

リンク

2018/1/1(Mon) 16:00:53|NO.82147

あけましておめでとうございます。おぼです。

>>ぜーっと!さん

分かりやすいスクリプトをありがとうございます。

皆さんへ

ちょっと疑問が増えたのでこの場を借りて質問です。

皆さんの様子を見ていて思ったのですが、シューティングゲームの書き方として頭に入れているのではなく、HSPの一般文法が頭に入ったうえでのご指導が多いように感じました。

HSPの底時からを身に着けるには、何を勉強すればよいのでしょうか?オフィシャルブックでしょうか?それとも別の書籍でしょうか?あるいは学習できるサイトでしょうか?もっと別なものでしょうか?私にはわかりません。

体験談でもいいのでお勧めの学習法を教えてください。

よろしくお願いいたします。



科学太郎

リンク

2018/1/1(Mon) 16:13:28|NO.82148

下記に紹介するリンクは「C言語何でも質問掲示板」です。
しかし、HSPも同じでしょうから紹介します。

・ゲームプログラミングのアルゴリズムの学び方
http://dixq.net/forum/viewtopic.php?f=3&t=10257&sid=54801efa9987f7cf8f5952bea5f685c9

ここの私のコメントなどを参考にどうぞ。

http://dixq.net/forum/viewtopic.php?f=3&t=10257#p82819

これ私。

・HSPの広場 - トップページ
http://blog.goo.ne.jp/masaki_goo_2006/e/9ecfc591667de53d7e3ee6145a4f85b3

私のブログですが、次の項目をどうぞ。
「じゃんけんゲームの製作講座」とか、
「シューティング・ゲームのミニ講座」など。



あまら

リンク

2018/1/1(Mon) 16:38:55|NO.82149

HSPの一般文法というよりも、プログラミングを行なう時の姿勢のような話になりますが

私は大体独学ですが他言語でプログラミングした経験があったり、
〇〇をしたいと思った時には、やり方を調べ
サンプルなどに目を通し、その際にはソースをそのまま流用する訳ではなく
これが何の為にあって、どういう意味があるのか更に調べ……みたいに
単純に覚えるよりも、流れを追う形を取っていますね。

例えるなら、数学の公式なんかをそのまま覚えたり使ったりするよりも
その公式の証明を理解し流れを覚えるような感じでしょうか。



あとは効率を追求していくのが大事というのは皆さん共通していると思います。

私がプログラムを始めたばかりの頃に作ったソースなんて
同じような処理を何度も繰り返していたりとか
今なら変数3つくらいでできるのに、当時は倍くらいの変数使ってるようなソースとか
今見ると恥ずかしくてしかたない物ばかりですね。

そういう黒歴史的な物を量産しているうちに少しずつ
処理速度を効率化していったり、一つの物を他に流用できないか考えたり
その繰り返しでなんとなく辿り着いた所がほかの方々に近い所に至った感じです。



ぜーっと!

リンク

2018/1/1(Mon) 21:22:30|NO.82153

学習法ですかー。皆さんが言うてることと同じになってしまいますが、
いちおう、HSPに限らず基礎といわれる部分はしっかり学ぶに越したことはないです。
プログラムの基礎は他の言語でも大体同じなので、他言語を学習する時にも役立ちます。

今はネット環境が強力だから、分からなかったら、ここの過去ログ検索やググってみれば
山のようにアルゴリズム、組み方、考え方、ヒントがいくらでも見つかります。
お金に余裕があるのであれば、最新の本を1〜2冊持っていても良いかもしれません。

ネット環境が著しく弱かった時代は、書籍と身近にいたプログラムに詳しい友人、先輩に
聞くしか無かったんです。(-ω-)シミジミ(しかし聞いたうちの9割は理解できてなかったけどw)

ただ、検索結果については、古い内容だったり自分の求める答えそのものは見つかりにくいので
結果から得た情報を組み合わせて、理想に近いものを創ればいいと思います。
他の人のプログラムを見る(読む)ことは勉強にもなります。しかし個人的には安易なコピペはアカンかなと。
コピペは便利だけど、理解せずにコピペしてると、不具合が出た時に対処が難しくなります。

趣味プログラムは、ひとりで作成することが多いので最初から大作、多機能を狙うと、挫折しやすいです。
今でも自分はそうですが、とにかく、小さなプログラムを作って、実験していくことが大事です。
とくに新しい機能などをアプリに取り入れたいという場合も、まずは実験プログラムを作っては崩すの繰り返しです。
理想通りの結果が出る出ないは関係なく、トライ&エラーがの経験が、のちのち役立ちます。

たまに副産物も生まれます。(←結構重要

で、使えそうなものをパズルのように組み合わせ、化粧板を貼ってアプリや、ゲームができると言っても過言ではないでしょう。



おぼ

リンク

2018/1/2(Tue) 13:01:33|NO.82154

おぼです。

皆さん、貴重なお話をありがとうございます。

意味も分からずにコピペしてスクリプトを作ろうとしていた部分があったので耳が痛いです。

形は違えども、コツコツ地道にやっていくしかないことがわかりました。

時間があまりとれないので、焦るあまり手を抜いてしまっていたようにも感じます。それがかえって逆効果だったんだなと感じています。

それでも、サンプルソースの意味が分からない場合は、また皆さんにお世話になるかもしれません。

ありがとうございました。



ぜーっと!

リンク

2018/1/3(Wed) 15:36:10|NO.82155

解らないところは、どんどん質問すれば良いと思います。
私は知識量すくない分、教えることができる範囲は狭いですが
ここは知識量豊富で、かつ優しい人多いから、誰かしら教えてもらえると思いますし。



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