Archiverse Internet Archive
投稿のみ 投稿と返信
前のページ(最近)
137 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57154
次のページ(過去)
返信[11]
親投稿
おちゃめ ochame_nako
オワたず(^p^)ゝさんへ 仕様変更によって以前できなかったことができるようになるということもありますからね。 今回と同じようなアイデアはプチコン3号が発売して間もない頃に考えたのですが、ファンクションキー表示は一旦画面切り替えをしない限り更新されないのであきらめました。 先日、しんしんさんがファンクションキーで遊んでいるというプレイ日記を見てから「ファンクションキー表示がリアルタイム更新されるようになったのか」と思い即興で以前から思い浮かべていたネタを具現化したわけです。
1そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
GSPOITの値を元に0~255の数字にしたいというだけであればRGBREAD GSPOIT(X,Y) OUT R,G,Bで可能ですがこれだとR、G、Bは8の倍数にしかなりません。 わざわざシフト演算(2進数を使った計算)をしなくても良いように簡単に扱えるRGBREADがあるのでそれを使いましょう。 0、8、16、24、・・・・のような8の倍数値を0~255の連続した値に戻すというのならばそれは無理です。 それはシステム側で細かい部分(8で割ったときには小数になる値)は切り捨てているので元には戻らないためです。 例えば1ドル=115円79銭だとすると現在「銭」という通貨はないため1ドルもらっても115円しか渡せないというのと同じようなものです。
1そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
プチコン3号のGRP正体は「16bit符号無し整数型による2次元配列」だと思います。 実際、自分で二次元配列を宣言してそれに0~65535(16bit)の適当な値を書き込んでDATとして保存してもGRPとして読み出すことが可能です。 3DSはハードウェア的にポリゴンしか扱えないため昔ながらのPCのようなGRP(グラフィック画面)は内部で擬似表現しているのだと思います。(GRPは擬似的に再現しているだけなので速度面では劣るため平面ポリゴンを使っているスプライトの方が高速)
1そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
重要なことを書き漏らしていました。(リンク先には書いているのですが) DEF内でローカル変数とグローバル変数の両方が使えるのですが、グローバル変数ではなくローカル変数として使用する場合に必ずDEF内でVAR(もしくはDIM)を使って宣言してください。 そうでないと上記のように記述した順番でローカル変数になる場合もあればグローバル変数になる場合もあるということで誤動作の要因になるためです。 要するに「グローバル変数を使いたい」という明確な意図があれば宣言せず、DEFより前にその変数を記述する(変数を宣言する)ということをすれば良いのですが、それ以外の場合はDEF内で宣言するということだけなので難しいことは何もありません。 ローカル変数とかよく分からなければとりあえず「DEFの中で宣言しておけば外部に影響を与えず自由に変数が使える」という程度の認識でOKです。
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
他にもDEFではこれ以外に知っておくと良い部分がいくつかありますが、それは以前こちらのトピックスで書いたので参考にしてみてください。 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHjYtPmLxg 引数、戻り値の「型」の問題は知らないと理解不能(不可解な誤動作)になってしまいます。 DEFによる自作関数は慣れたら手放すことができません。 初心者の人もどんどん使ってみましょう。
0そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
DEFによる自作関数は慣れれば難しいことは何もないしこれを使うことでプログラミングがかなり楽になります。 便利で汎用性が高い自作関数を作れば次からはそれを使って作れば良いのでプログラミング効率もどんどん高まります。 ただし、汎用性を高めるとどんどん記述が長くなる場合が多いためやはり使い勝手とのバランスも重要となります。 バランスという面では今回のBUTTON2関数においては3番目のもの(グローバル変数_BUTTON2を使ったもの)がベターだと思いますがいかがでしょうか?
0そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
VAR _BUTTON2 WHILE 1  B=BUTON2()  ?B WEND DEF BUTTON2()  VAR A,B,C  C=_BUTTON2  A=BUTTON()  B=NOT C AND A  _BUTTON2=A RETURN B END これだと_BUTTON2がBUTTON2関数内で使われているグローバル変数と一目瞭然ですね。
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
さて、自作関数でグローバル変数を使用する場合は他のグローバル変数との被りが問題となります。 Aなんて変数名だともろ被りの危険性が高いので個人的には特定プログラム内で使うのが前提ではなく汎用の自作関数として公開する場合には変数名の前に_(アンダースコア)を付けるというのを「自分内ルール」としています。(あくまで変数の命名ルールは個人の自由) しかし、_Aとしてもすでに使用されているグローバル変数との被りが気になります。 そこでほぼ絶対に被らないグローバル変数としては公開する関数と同じ変数名を付けることです。 BUTTON2だと関数名と被って分かりづらいため_を付けてその関数内で使われているグローバル変数ということを明確化しています。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
ただし、注意する点としてはAはグローバル変数であるということです。 プチコン3号ではローカル変数とグローバル変数を使用できますが、ローカル変数はDEF内だけで使い捨てられる変数であるだけではなくグローバル変数と同じ変数名を付けてもグローバル変数に影響を与えないという大きなメリットがあります。 DEF内でグローバル変数を使いたいという場合は「DEF内でVARを使って宣言しなければ良い」というのではなくそのDEF内で使用されている同名の変数よりも前に記述しておく必要があります。(実行順ではなく記述順) つまり、この2番目のBUTTON2関数を使うためにはDEF外においてBUTTON2関数のDEFより前にA=0とかVAR Aとか記述する必要があります。 これによって、「すでにグローバル変数として使われている変数」と認識されてDEF内ではグローバル変数として使用可能になります。
1そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
そこで関数の使い勝手を向上させるために変数Aをグローバル変数として使うことにします。 DEF BUTTON2()  VAR B,C  C=A  A=BUTTON()  B=NOT C AND A RETURN B END これだとこんな感じですっきりとした使用が可能になります。 VAR A WHILE 1  B=BUTON2()  ?B WEND
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
ボタンを押した瞬間を取得するためには上記のように前回押したボタン情報が必要です。 そのため前回のボタン情報を引数に入れてグローバル変数に戻すことでこのBUTTON2関数は「DEF内ではローカル変数のみで動作」するようになっています。 しかし、戻り値として欲しいのは「押した瞬間のボタン情報」であり実際のプログラム内では使用しない前回のボタン情報まで取得するためにBUTTON2 A OUT B,Aと長々と書く必要があるというのは使い勝手があまり良くありません。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
以上のことを元にすると押した瞬間を取得できるBUTTON2関数は引数に「前回押したボタン情報」を入れて、「今回押しているボタン情報」とそれを加味した「押した瞬間のボタン情報」を戻せば良いことが分かります。 BUTTON2 A OUT B,C  C=BUTTON()  B=NOT A AND C END これは下記のプログラムに使用すれば使うことが可能です。 WHILE 1  BUTTON2 A OUT B,A  ?B  VSYNC 3 WEND
0そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
例えば60fpsで動作時以外でも「ボタンを押した瞬間」を取得できるBUTTON2関数を作るにはどうするかというと押した瞬間というのは「前回押してないボタン」かつ「今回押したボタン」が分かればいいのです。 標準のBUTTON関数においてBUTTON(2)とした場合には「前回」ではなく「前フレーム」に押したかどうかしか見てくれないため60fpsを超えているプログラムにおいてはその前フレームの情報が変化しないため1回押しただけで何度も押したことになったり、60fps未満のプログラム(もしくは処理落ちしているプログラム)の場合はその前フレームに押されてなくてBUTTON(2)が動作するフレームにたまたま押していた場合にのみ正常に動作するためボタンを押しても反応したり反応しなかったりするわけです。(上記の場合はVSYNC 3を実行中は押してもそのボタン情報が反映されない)
0そうだね
プレイ済み
プレイ日記
おちゃめ ochame_nako
DEFで自作関数を作る場合の注意点をいくつか書いておきます。 その例としてBUTTON2関数を作ってみます。 ボタンを押した瞬間はBUTTON(2)を使えば簡単に取得できるのですが、実は「60fpsで動作」以外の場合は正しく動作はしません。 そこで、それを改善したBUTTON2関数を作ることにします。
24そうだね
プレイ済み
返信[16]
親投稿
おちゃめ ochame_nako
ちなみに本トピックス内で使用されているSUFFIX関数、SLOT関数はこちらのトピックスをご覧になってください。 SUFFIX関数 https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0fSfxRUkA SLOT関数 https://miiverse.nintendo.net/posts/AYIHAAAEAACHVRTs1c4kFA
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
とりあえず、上記のうち1点のみ訂正しておきます。 「DEF内から外部のラベル(グローバルラベル)にはアクセスできない」 というのは正しくはなく「可能ですが、非推奨」というだけです。 GOTO "0:@A"とすればスロット0のグローバルラベル@Aへとジャンプできます。 指定スロットではなく現在動作中のスロットへのジャンプがしたいのであれば自作関数SLOTを使いGOTO STR$(SLOT())+":@A"とすれば良いです。 ただし、DEF内では必ずENDを実行する必要がありますがDEF外からDEF内へはジャンプは不可能なのでDEF外にジャンプするプログラムを書いてしまうとスタックをどんどん消費していってstack overflowとなります。 GOSUBならばDEF外にジャンプしてもRETURNによってDEF内に戻れるのですが、正しく戻らないと同じくstack overflowとなります
0そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
りゅうまごさんへ ファンクションキーの表示が小さい表示画面として使えるならば用途はいろいろありますよね。 みむ*mimさんへ どうもです。 2時間で作った即興ライブラリですが使える場面はそれなりにありそうですね。 FINPUTは需要を考えると微妙そうなので今回は見送りました。 需要があれば用意したいですね。 うぎゃ~さんへ 35文字1行のコンソール画面とはいえ「PB-100の3台分」と考えれば様々なゲームが作れそうな気にしてくれますね(笑) まぁステップの表示やDEGなどのインジゲーターをフル活用すればPB-100も12桁以上の表示が可能なのですが。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
引数を省略可能な命令を作るのは無理ですが、それっぽいものを作ることは可能です。 EVENT LABEL$,SOUND,SOUNDWAVE,SLOW ではなく EVENT "LABEL$,SOUND,SOUNDWAVE,SLOW" のように記述するわけです。この場合SOUNDWAVEの設定が不要ならば EVENT "LABEL$,SOUND,,SLOW" のように省略してもちゃんと動作するようにできます。 ただし、このような作り方にすると作るのが格段に難しくなるため注意が必要です。 関数内であってもグローバル変数の方がアクセスしやすければグローバル変数で問題ありません。(他のプログラムで再利用する場合は可能な限りグローバル変数を使わない方が良いけど) MIKIさんが口を酸っぱくして言っていますがローカル変数にしたいならばVARで宣言するのを忘れないようにしなくてはなりませんね。
1そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
りゅうまごさんへ 私もそんな覚えがあったので手元にあるver.3.0.0が入った本体で試してみたらやっぱり実行中はキーの表示内容は変わりませんでした。 いつから仕様変更されたんでしょうかね。
1そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
注意しなくてはならないのは色コード自体はRGB各8bit(256階調)ですが、実際の表示色はRGB各5bit(32階調)になるということです。 まぁこれはグラデーション表示をしたりGSPOITを使った判定の時に注意する程度ですが。 これは例えばR、G、Bの値が123、45、67のような場合には120、40、64のように「8の倍数の数値に丸められる」という意味です。
1そうだね
プレイ済み