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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0410
ミントポ−ズを押してゲームを止める → 解除した後、現状維持23解決


ミント

リンク

2010/4/10(Sat) 17:38:46|NO.31888

どうもお久しぶりです。そうでない方は始めまして。
STG作りも順調だったのですが、ポーズを作ることに頭を悩ませております。


最初はSTOPで止めていましたが、それだとゲーム再開は無理なのです。

そこで色々考えた結果、敵や自機を擬似的に全て止めてみようかと思いましたが、
これでよいか不安でございます(x+1とかなら、x-1にするとか)

なので、何かよい方法があったら教えてください。
よろしくお願いします。



--------やりたいこと--------
1:ポ−ズを押してゲームを止める。
2:ポーズを解除した後、現状維持。

例:マリオとかで、スタートボタンを押せば止まる。
  その後ポーズを解除すると、敵とか動く。
--------------------------


本プログラムは長いので、サンプルプログラム作ってみました。
 -----------プログラム---------------------

repeat ;繰り返しの始め redraw 2 ;ココから下は仮想画面に描く color 0,0,0:boxf ;黒で画面を塗りつぶす color 255,255,255 ;文字の色を白に x = x + 1 pos x,y mes "→" ;ポーズ getkey ESC,27 ;エスケープ if (ESC)&(STO=0) : STO=1 if STO=1 : x -= 1 pos 50,50 mes "STOカウンター" + STO ;再開 getkey EN,13 ;エンター if (EN)&(STO=1) : STP=1 if STP=1 : STO=0 pos 50,80 mes "STPカウンター" + STP redraw 1 ;今まで仮想画面に描かれていたものをウインドウ0に描画 wait 1 ;待つ loop ;repeatに戻る
---------------------------------------------------
でも、これ一回ESC押して → エンター押して再開できるのはいいんだけど、
2回目以降ESC押す場合、ずっとESC押してないと反応しないんですよね( ̄▽ ̄;



この記事に返信する


AudioVisual

リンク

2010/4/10(Sat) 17:48:34|NO.31889

ループの先端にエスケープキーで
取得した数値が1だったら空ループするようにすればいいんです。
以下の命令は押している間だけ数値が増加し続けて、
離すとリセtットされるgetkeyです。

#module dim keycode,121 #deffunc getkey2 var keypush,int tokey//キーコード、押されてるか getkey key,tokey if key == 1:keycode(tokey)++:else:keycode(tokey) = 0 keypush = keycode(tokey) return #global getkey2 ESC,27 ;エスケープ if ESC == 1{ repeat getkey2 ESC,27 if ESC == 1:break loop }



hatter

リンク

2010/4/10(Sat) 17:58:13|NO.31890


repeat ; ポーズ処理開始 getkey ESC,27:if ESC{ repeat getkey EN,13:if EN:break await 10 loop } ; ポーズ処理終了 ; 以下に通常通りゲーム redraw 2 color 0,0,0:boxf:color 255,255,255 pos x,y:x++ mes "→" redraw 1 wait 1 loop
こんな感じでどうでしょう?
これなら既に作ったスクリプトにポーズ処理を書き加えるだけでできてifを使わないので
楽ですし、
> 2回目以降ESC押す場合、ずっとESC押してないと反応しないんですよね( ̄▽ ̄;
の問題も生じませんし、変数もSTOとSTPを使わなくいいです。



ミント

リンク

2010/4/10(Sat) 19:39:42|NO.31893

>>AudioVisualさん
な・・・なるほど。
ですが、私にとってちょいと難しいですね( ̄▽ ̄;

ソースプログラムありがとうございます。



AudioVisual

リンク

2010/4/10(Sat) 19:43:21|NO.31894

メインループの先頭に

getkey2 ESC,27 ;エスケープ if ESC == 1{ repeat getkey2 ESC,27 if ESC == 1:break loop }
をつければいいだけですよ。
ご期待の動作になりませんか?



hatter

リンク

2010/4/10(Sat) 19:50:06|NO.31895

僕の解答がよく無視されるのは大抵、若干遅く解答していて
他の解答が既にあるからだろうか...
さらには、このレスでの話ではないがほとんど同じ解答を、
書き込みの更新が見えてないなんて事が起こらないぐらいのタイムラグでする人がいるのはなぜだろう。
僕は空気として目に見えない存在として扱われているのか?
う〜ん、それとも僕の文章は意味不明で伝わらなかったのだろうか...。

今回も希望通りのスクリプトを提示したつもりだったのだが。



ミント

リンク

2010/4/10(Sat) 19:57:25|NO.31896

>>hatterさん
おお、簡単な上に見やすい。
ソースプログラムありがとうございます。



しかしこれでも間違いではないけど、本プログラムでこれをやる場合
すごい量になりそうだな・・・
この案以上の効率的な方法な無いのかなぁ〜・・・



ミント

リンク

2010/4/10(Sat) 20:06:07|NO.31897

>>AudioVisualさん
>>メインループの先頭に

 〜省略〜

>>をつければいいだけですよ。
>>ご期待の動作になりませんか?
あれ?うまく動かないです(´・ω・`)



hatter

リンク

2010/4/10(Sat) 20:10:43|NO.31898

> しかしこれでも間違いではないけど、本プログラムでこれをやる場合
> すごい量になりそうだな・・・
へ?
このポーズ処理はループが1つであればその中でどれだけ長い処理がかかれてようと、
さっきのスクリプトをrepeatの直後に挿入するだけだから。
まさか、多種多様なループが存在するのかな?
それで、それぞれに挿入する必要性があるとか?
ならば、#defcfuncでまとめれば良いんじゃないかな?見た目はだいぶすっきりしますよ。
例えば以下のようなループが2つ存在する場合のように。

#module #deffunc PAUSE getkey ESC,27:if ESC{ repeat getkey EN,13:if EN:break await 10 loop } return #global font "MS明朝",40,1:x=-40 repeat repeat PAUSE ; 以下に通常通りゲーム redraw 2 color 0,0,0:boxf:color 255,255,255 pos x,y:x++:if x>640:break mes "→" redraw 1 wait 1 loop repeat PAUSE ; 以下に通常通りゲーム redraw 2 color 255,0,0:boxf:color 0,255,255 pos x,y:x--:if x<-40:break mes "←" redraw 1 wait 1 loop loop



ミント

リンク

2010/4/10(Sat) 20:12:25|NO.31899

>>hatterさん
>>僕の解答がよく無視されるのは大抵、若干遅く解答していて
無視っていうより、動作確認しておりました( ̄▽ ̄;


>>う〜ん、それとも僕の文章は意味不明で伝わらなかったのだろうか...。
そんなことはございません。わかりやすかったです。



GENKI

リンク

2010/4/10(Sat) 20:12:28|NO.31900

> すごい量になりそうだな・・・
> この案以上の効率的な方法な無いのかなぁ〜・・・

回答にある方法で、「すごい量」になるようならスクリプトの全体構造を見直したほうがいいかもしれません。


> あれ?うまく動かないです(´・ω・`)

どんな風に上手くいかないのですか?
ミントさんが作成されているスクリプトは、NO.31890のような構造になっていますか?



hatter

リンク

2010/4/10(Sat) 20:19:26|NO.31901

> AudioVisualさん
間違えではないけど、たぶんHSPでは==ではなくて=が普通だと思ったんですが?
(これはちょっと自信ないし、特に挙動を狂わせる物ではないですが)
あと、なんでわざわざgetkey2を使う必要性があるんですか?
普通にgetkeyのままで私の書いたようなやり方ではなにかまずいんですか?
あと、最初に提示したスクリプトの問題点を2つ
1.getkey key,tokeyはkeyではなくkeypushでは?
2これ,二回目以降反応しないですよね?



ミント

リンク

2010/4/10(Sat) 20:22:21|NO.31902

>>hatterさん
>>それで、それぞれに挿入する必要性があるとか?
そのとおりですね。

>>ならば、#defcfuncでまとめれば良いんじゃないかな?見た目はだいぶすっきりしますよ。
な・・・なるほど!
こちらに関してはしばしお時間をいただきたい。


>>GENKIさん
>>スクリプトの全体構造を見直したほうがいいかもしれません。
そうですねぇ・・・んー。

>>ミントさんが作成されているスクリプトは、NO.31890のような構造になっていますか?
再確認しましたら、ちゃんと動作しました。
お世話がせしました。



hatter

リンク

2010/4/10(Sat) 20:25:38|NO.31903

>1.getkey key,tokeyはkeyではなくkeypushでは?
あ、正常でした。勘違いです。すみません。特に問題ありません。



ミント

リンク

2010/4/10(Sat) 22:09:34|NO.31905

>>ならば、#defcfuncでまとめれば良いんじゃないかな?見た目はだいぶすっきりしますよ。

>>ミント
>>こちらに関してはしばしお時間をいただきたい。

う・・・色々調べたら見たことがない宣言ばかり。
ヘルプを見ながら、覚えようと思います。

なので、理解まで相当時間がかかりそうなのです・・・
まだまだ初心者だけどがんばりたいと思っております。
皆様ありがとうございました!



hatter

リンク

2010/4/10(Sat) 22:36:09|NO.31906

> う・・・色々調べたら見たことがない宣言ばかり。
> ヘルプを見ながら、覚えようと思います。
う〜ん。そうですね。
#moduleと#globalが特にやっかいかも知れません。とりあえずは、この区間の間で
PAUSEという新たな命令を定義しているってそれだけの話です。別に#moduleと#globalは
使う必要がないんですけどね。
これらについては僕は[HSPマニュアル]の[プログラミングマニュアル・基本仕様ガイド]の[拡張文法]の所を
よんで勉強しました。かなり参考になると思います。一気に読むのはたぶん無理です。
(少なくとも自分はそうでした、ちょっと読んで定着化を図って、
またふと思い立ったときに読んでって感じで何ヶ月もかけて読みました)



りゅん

リンク

2010/4/10(Sat) 23:03:27|NO.31907

すでに解決済みですけど、ちょっと困惑してるみたいなので。


x = 0 flg = 0 ; 一時停止中フラグ ( 1 の時に入力・移動処理をしない ) ; メインループ repeat stick key ; スペースキーが押された場合、flg を反転 if key & 16 : flg = ( flg == 0 ) ; 一時停止中ではない場合、*update へ飛ぶ if flg = 0 : gosub *update gosub *draw wait 1 loop ; 移動処理 *update x = x + 1 return ; 描画処理 *draw redraw 0 ; 画面塗りつぶし color 255, 255, 255 : boxf color 0, 0, 0 ; 矢印描画 pos x, 0 mes "→" ; 一時停止中の場合は文字を表示 if flg == 1 { pos 32, 32 mes "一時停止中!" } redraw 1 return

stick 命令はご存じですか? この命令を使うと「押した瞬間だけ」を調べることができます。

あと、キャラクターの座標を変化させる部分と描画部分を別々のラベルで管理しています。
一時停止中は座標を一切いじらないで、描画のみを行なっています。

ゲームを作る時はこんな感じの構造にしておくと、
規模が大きくなったときに調整が楽になりますヨ。


すでにあるていど制作が進んでいるようなので、
組み込むのが難しいようでしたら流して下さい。><



AudioVisual

リンク

2010/4/10(Sat) 23:14:56|NO.31908

>>間違えではないけど、たぶんHSPでは==ではなくて=が普通だと思ったんですが?
シープラプラの癖でこう書いてしまいました。すいません。
>>あと、なんでわざわざgetkey2を使う必要性があるんですか?
>>普通にgetkeyのままで私の書いたようなやり方ではなにかまずいんですか?
あなたのスクリプトの後に私のgetkey2を出したなら、
あなたのスクリプトを私が否定したように受け取ってしまわれかねないですね。

しかし、私のほうが先に投稿したのに後から投稿したあなたが
私のスクリプトをえらえらしく、否定されるのは止めて欲しいです。
>>2これ,二回目以降反応しないですよね?
これは押した瞬間のみ反応するしくみになってます。



M

リンク

2010/4/11(Sun) 01:30:29|NO.31911

単純に、F10押すのはだめ?



ANTARES

リンク

2010/4/11(Sun) 02:40:43|NO.31914

誤:if STP=1 : STO=0
正:if STP=1 : STO=0 : STP=0

 スクリプト中では何もしないでも、
Altキーでポーズと解除ができます。

 F10で止まるのはなぜ?
と思ったらAltと同じか。



ミント

リンク

2010/4/11(Sun) 07:30:30|NO.31919

>>hatterさん
>>#moduleと#globalが特にやっかいかも知れません。とりあえずは、この区間の間で
>>PAUSEという新たな命令を定義しているってそれだけの話です。
新しい定義ってことだけは、ヘルプ見てわかりました。
けどそのうちそれ以上のパーフォーマンスが必要になるでしょう・・・
ちまちま覚えていこうと思います。

>>これらについては僕は[HSPマニュアル]の[プログラミングマニュアル・基本仕様ガイド]の[拡張文法]の所を
>>よんで勉強しました。かなり参考になると思います。一気に読むのはたぶん無理です。
なるほど、参考になりそうですね。



ミント

リンク

2010/4/11(Sun) 07:43:05|NO.31920

>>りゅんさん
>>stick 命令はご存じですか? この命令を使うと「押した瞬間だけ」を調べることができます。
はい。ご存知です。最初の頃よく使っておりました。


>>ゲームを作る時はこんな感じの構造にしておくと、
>>規模が大きくなったときに調整が楽になりますヨ。
そうですね。まさかこんな大規模なプログラムになるとは思っておりませんでした。
現在元となりそうな物の時点で、560行ですね(無駄な行あり、ってか必要)


>>すでにあるていど制作が進んでいるようなので、
>>組み込むのが難しいようでしたら流して下さい。><
確かに組み込むのは難かしそうです・・・
迷子になったときに試してみたりしようかと思いますw

ソースプログラムありがとうございます。



ミント

リンク

2010/4/11(Sun) 08:38:06|NO.31921

>>Mさん
>>単純に、F10押すのはだめ?
こ・・・こんな機能があったのか。
ですが、他人にプレイしてもらうため「ゲーム中のポーズ」は必須です。



hatter

リンク

2010/4/11(Sun) 10:41:23|NO.31922

> しかし、私のほうが先に投稿したのに後から投稿したあなたが
> 私のスクリプトをえらえらしく、否定されるのは止めて欲しいです。

否定したつもりは無かったんですが、読み方によっては若干そういう風に
思われるかも知れません。まったくそういう意図は無かったんですが、
不用意に人の事を考えず投稿してしまって不愉快な思いにさせて、すいません



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