|
|
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
です。
よろしくお願いします。
|
|
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
です。
よろしくお願いいたします。
|
|
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
が大きすぎるせいかも?
|
|
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
|
|
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
解らないところは、どんどん質問すれば良いと思います。
私は知識量すくない分、教えることができる範囲は狭いですが
ここは知識量豊富で、かつ優しい人多いから、誰かしら教えてもらえると思いますし。
|
|