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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0603
リトルリンダアクションゲームのジャンプ処理について13解決


リトルリンダ

リンク

2024/6/3(Mon) 13:34:15|NO.101769


#define CHARA_MAX 10 goto *main #deffunc CAL_JUMP local x y a ;*jump //ジャンプ演算 repeat CHARA_MAX _cnt=cnt if jamp._cnt.JT=0 : continue if jamp._cnt.JT=1 { //y=a*x^2を処理しジャンプ中の座標を代入↓ jamp._cnt.JX=y jamp._cnt.JY=x } loop return *main

上記の様な処理を考えたのですが、エラーが出ます。
ローカル変数は2つまでしか使えないのでしょうか。
3つにするとエラーが出ます。

かといってa,x,yをグローバルに保持するのは嫌なのです。
モジュール変数にしたらモジュール内からグローバル変数にアクセスする事になるのでそれも嫌なのです。

一体どうしたらいいでしょうか。
ローカル変数をあまり使わないので困っています。。。



この記事に返信する


Ve

リンク

2024/6/3(Mon) 15:54:57|NO.101770

ローカル変数3つ限定だったら、何も作れないです。
どこかでスタックしてます。



buhio

リンク

2024/6/3(Mon) 16:26:05|NO.101771

こんちわ

#deffunc CAL_JUMP local x,local y ,local a;←localはそれぞれ必要じゃないですかね

ただ、具体的にどう言う処理がしたかったのかわかりにくかったのですが。。
配列もエラーになりそうですね。

アクションゲームのジャンプとは、こういうものはまた違うものですか?

screen 0,256,256 ;変数を用意 vel=0 ;速度 grav=1;重力 x=125 ;初期位置x y=125 ;初期位置y *main redraw 0 color 0,0,0 boxf stick keys,1+4 if keys&1{x-=1};←移動 if keys&4{x+=1};→移動 if keys&16{ ;SPACEジャンプボタン if jump=0{ ;ジャンプ可能なら jump=1 ;ジャンプフラグをオン vel=-20;初速度を設定(マイナスが上方向) } } ;速度と重力の更新 vel+=grav ;速度が重力で減衰 y +=vel ;yに上記の速度を加算 ;着地 if y>=230{;yはプラス方向が下向き y=230 jump=0;着地したのでジャンフラグをオフ } color 255,255,255 pos x,y mes "★" pos 0,0 mes "[←][→][SPACE]" redraw 1 await 1000/60 goto *main



buhio

リンク

2024/6/3(Mon) 16:57:27|NO.101772

楽しくなってしまって、、
モジュール変数版(複数キャラを目指して)


;===starモジュール=== #module mod_star m_x,m_y,m_vel,m_grav,m_jump #modinit int _grav m_x=rnd(100);初期位置はランダム m_y=rnd(100) m_grav=_grav;重力は初期化時に指定 return #modfunc update int _keys if _keys&1{m_x-=1};←移動 if _keys&4{m_x+=1};→移動 if _keys&16{ ;SPACEジャンプボタン if m_jump=0{ ;ジャンプ可能なら m_jump=1 ;ジャンプフラグをオン m_vel=-20;初速度を設定(マイナスが上方向) } } ;速度と重力の更新 m_vel+=m_grav ;速度が重力で減衰 m_y +=m_vel ;yに上記の速度を加算 ;着地 if m_y>=230{;yはプラス方向が下向き m_y=230 m_jump=0;着地したのでジャンフラグをオフ } color 255,255,255 pos m_x,m_y mes "★"+m_grav return #global ;===メインプログラム=== screen 0,256,256 randomize ;starモジュールを3つ作成 newmod stars,mod_star,1 newmod stars,mod_star,2 newmod stars,mod_star,3 *main redraw 0 color 0,0,0 boxf stick keys,1+4 foreach stars update stars(cnt),keys;starモジュールのupdate命令 loop pos 0,0 mes "[←][→][SPACE]" redraw 1 await 1000/60 goto *main



窓月らら

リンク

2024/6/3(Mon) 21:51:09|NO.101773

ご質問の趣向と違いますがなんかできたので貼ります。参考程度に。
(ちなみに処理効率的にはもうちっと考えたほうがよさそう?)

#define CHARA_MAX 50 dim x,CHARA_MAX dim y,CHARA_MAX dim back_y,CHARA_MAX randomize repeat CHARA_MAX x(cnt)=rnd(640) y(cnt)=rnd(480) loop *main redraw 0 color: boxf color 255,255,0 CAL_JUMP x,y,rnd(CHARA_MAX) repeat CHARA_MAX pos x(cnt),y(cnt): mes "★" loop redraw 1 await 16 goto *main ;----------------------------------------- #deffunc CAL_JUMP array _x, array _y, int _id repeat CHARA_MAX if cnt=_id { if back_y(cnt)=0 { back_y(cnt)=_y(cnt) spy(cnt)=-2-rnd(15) spx(cnt)=3-rnd(7) } } if back_y(cnt) { _x(cnt)+=spx(cnt): _y(cnt)+=spy(cnt): spy(cnt)++ if _y(cnt)>back_y(cnt) { _y(cnt)=back_y(cnt): back_y(cnt)=0 } _x(cnt)=limit(_x(cnt),0,625) _y(cnt)=limit(_y(cnt),0,460) } loop



buhio

リンク

2024/6/4(Tue) 10:43:32|NO.101774

>>ららさん
おもしろいっすね〜
配列の管理は苦手です。。が何とか理解できました。

最後のreturnが抜けてますよぉ。
コピペする人は最後に「return」を追加しましょう〜★



窓月らら

リンク

2024/6/4(Tue) 13:00:40|NO.101775

あらま、コピペをミスってたのだ。ボケてたのだ。
では少し追加して再掲載するのだ。local の使い方も書いておいたのだ。
ちなみに個人的には local はあまり使わないのだ。
それと独自関数や命令は上のほうに書かないといけないという決まりはないんで
下のほうに書くことで、最初の goto *main が不要にできる。

このサンプルの過程でゲームアイデアがひとつ浮かんだのだ♪

#define CHARA_MAX 50 dim x,CHARA_MAX dim y,CHARA_MAX dim back_y,CHARA_MAX randomize repeat CHARA_MAX x(cnt)=rnd(626) y(cnt)=rnd(466) loop *main // 動き計算 // 第3パラメータはジャンプフラグ(ID) CAL_JUMP x,y,rnd(CHARA_MAX) test_local c: val=stat // 描画 redraw 0 color: boxf color 255,255,0 repeat CHARA_MAX pos x(cnt),y(cnt): mes "★" loop color 0,255,255 pos 10,10: mes val if val<30 { mes "TEST DEMO" } redraw 1 await 16 c++ goto *main ;-------------------------------------------- #deffunc CAL_JUMP array _x, array _y, int _id repeat CHARA_MAX if cnt=_id { if back_y(cnt)=0 { back_y(cnt)=_y(cnt)+2-rnd(5) // 着地地点 spy(cnt)=-2-rnd(15) spx(cnt)=3-rnd(7) } } if back_y(cnt) { _x(cnt)+=spx(cnt): _y(cnt)+=spy(cnt): spy(cnt)++ if _y(cnt)>back_y(cnt) { _y(cnt)=back_y(cnt): back_y(cnt)=0 } _x(cnt)=limit(_x(cnt),0,625) _y(cnt)=limit(_y(cnt),0,465) } loop return // ローカル変数のテスト(処理内容に深い意味はない) // local は後ろに記述する #deffunc test_local int _p, local _x, local _y _x=_p _y=_x\60 // 0-59を繰り返す return _y // 上記のような内容なら本来はこれだけでいい(&関数のが適切) ;#deffunc test_local int _p ; return _p\60



buhio

リンク

2024/6/4(Tue) 13:45:16|NO.101776

質問者の方以外で何度もレスして申し訳ないですが、

local変数というのは、変数ではなく、指定した変数を、命令が呼ばれるたびに初期化するという指定と理解しています。
(プログラミングマニュアル(hspprog.htm)のモジュール項目)

使用法としては
〆撞関数を作成する場合に関数ごとに値を保持する場合
∨莢麒竸瑤鮟藉化して命令を呼び出す必要がある場合
ぐらいしか思いつきません。

ワタクシはモジュール変数推進派ですが、一般的には配列を使うのがセオリーというところでしょうか。



窓月らら

リンク

2024/6/4(Tue) 15:39:56|NO.101777

ここのローカル変数の項目を読んでみてほしいのだ。
http://www.onionsoft.net/hsp/v33/doclib/hspprog.htm#MODULE

ループ処理から頻繁に呼び出すと、確保と解放を繰り返す分オーバーヘッドが増える。
最近の環境では問題になるほどのことは無いとは思うが、わざわざ効率悪化させる必要もないと思うのだ。
実行時の内部処理も考えて書くことが望ましい。



リトルリンダ

リンク

2024/6/5(Wed) 17:42:35|NO.101779

buhioさん

local変数の使い方ですが、ご指摘の通りで解決できました。

アクションゲームの知識が全くなく色々考えた結果、中学生の時にならった数学の放物線のグラフを参考にしていましたが、
こんなにスマートなプログラムで簡単解決できるとは思いませんでした。

本当にありがとうございます!



リトルリンダ

リンク

2024/6/5(Wed) 17:50:20|NO.101780

buhioさん(追記を)

モジュール変数を一時期学んでいて、非常に便利で記述が楽で思い通りに作りやすいと思ったのですが、処理速度的に配列変数より劣るという事と将来的にdishでは未対応というご教示をこちらで頂いたので、配列で作るようしていました。
しかし、規模が大きいプログラムの場合はこちらの方がよいのでしょうか。
まだ初心者だったころに配列で5万行くらいプログラムを打ち込んだあたりでバグを解決できなくなって詰んでしまった経験があります(:_;)
変数の管理が難しかったのでなるべく変数を減らした方がいいのかな?とは思っているのですが。

それにしてもこうしてプログラムをご提示いただいて勉強するのってとっても楽しいですね。



リトルリンダ

リンク

2024/6/5(Wed) 18:02:04|NO.101781

Veさん

ローカル変数を3つに限定する意図はないのですが、スタックしているとはどういう事でしょうか?
初歩的な質問ですみません。



リトルリンダ

リンク

2024/6/5(Wed) 18:44:39|NO.101782


vel+=grav ;速度が重力で減衰 y +=vel ;yに上記の速度を加算

たったこの2行で放物線を描けるとは…自分が愚かに思えてきました。



リトルリンダ

リンク

2024/6/5(Wed) 19:15:59|NO.101784

窓月ららさんもご教示頂きありがとうございます。
いつもお世話になっております。

local変数の使い方お教え頂きありがとうございます。
また、独自関数や命令を上の方書く決まりはないとの事で勉強になりました。
解決に導いてくださりありがとうございます!

local変数はあまり使われないとの事ですが、私は計算用の一時的な変数にデバッグ画面を占有されたくないとの思いのみで安易にlocal変数に手を出してしまいました。。
頂いたソースをみると窓月ららさんのやりかたで_xや_yが隠されているのでぜひとも参考にさせて頂きます。

あとはreturn _yがstatに代入できるというのは初めて知りました。
defcfuncのみだた思っていたのでこちらも早速活用したいと思います!

まるで生きている様な動きに感嘆するばかりのプログラムですが、この動きがどの様に変数が機能してなされているのか、すぐに理解するのは難しそうです。
質問を重ねるのはいささか恐縮するところでもありますので、自身の学習のためにも理解できるまで分析と熟読を重ね学習課題とさせて頂きます。(..)

ゲームアイデアがひとつ浮かんだのだとの事でいつもお世話になってばかりですが、何かの足しになれたのであればとても嬉しいです。

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



記事削除

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

NO.101769への返信

マスコット

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

名前

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

削除用パスワード

解決したら質問者本人がここをチェックしてください。

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

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