したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が900を超えています。1000を超えると投稿できなくなるよ。

【初心者歓迎】プチコンなんでも相談室【質問専用スレ】

631torui:2015/01/08(木) 17:38:30 ID:U5gGr2mE
初心者です。
数値を割って余りを取得する命令はありますか?

632torui:2015/01/08(木) 17:41:39 ID:U5gGr2mE
因みにプチコン3号です^^;

633名無しさん:2015/01/08(木) 20:08:58 ID:tb/ihDgA
数値 MOD 割る数

634名無しさん:2015/01/10(土) 11:09:44 ID:Olyi/qts
Wikipediaの「DETUNEの音楽ソフトとのリンク」欄を誰か書いて下されると助かるのですが。
KORGシリーズのプチコン3号対応次第ではKORG M01Dを買おうと思っているので。
来週から「新春 コルグ シンセサイザー半額祭り」なのでどうしようかと。

635名無しさん:2015/01/13(火) 04:33:03 ID:nmGARjiU
まだ何も発表されてないです。
予定であって、現時点では未実装ですね。

636 ◆5/xbu3/CgA:2015/01/14(水) 23:27:34 ID:1GsTmC4M
変数配列についての質問です。
ttp://smileboom.com/special/ptcm2/co_konnichiwa/p06.php
↑に書いてある通りに、
0001 CLEAR:DIM APPLE(32)
0002 FOR DAY=1 TO 31
0003 READ APPLE(DAY)
0004 PRINT DAY;”ニチメ リンコ゛”;APPLE(DAY);”コ”
0005 NEXT
0006 DATA 56,32,71,40,64,73,61,10,45,80
0007 DATA 25,71,63,54,98,23,14,66,58,47
0008 DATA 94,36,31,26,45,71,24,76,66,58,46
と打って、RUNしたのですが、どうしてもsyntax error in 0:1と表示されてしまいます。
これは何が原因なのでしょうか?教えてください

637名無しさん:2015/01/15(木) 17:21:44 ID:Vwe1ISgE
>>636
使っているのはプチコンのmk2と3号のどちらですか?
3号であれば、変数配列の指定に『()』は使えなくなったので、『[]』で指定する必要があるよ。
また、『CLEAR』命令もDirectモード専用になったので削除してね。

なので、1行目は『CLEAR:DIM APPLE(32)』は『DIM APPLE[32]』のみとし、
3〜4行目の『APPLE(DAY)』も『APPLE[DAY]』と修正すればいいよ。

638 ◆5/xbu3/CgA:2015/01/15(木) 23:17:27 ID:1GsTmC4M
>>637
その方法で解決することができました。
ありがとうございます。

639名無しさん:2015/01/26(月) 12:05:02 ID:PqHvrS2c
3D梨さんの高圧縮?プログラムの使い方がわかる人教えてください

640名無しさん:2015/01/26(月) 19:43:26 ID:nmGARjiU
http://wiki.hosiken.jp/petc3gou/?Toukou%2F%B9%E2%B0%B5%BD%CC%A1%A9%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0
プチコン3号 公開キー
KA3QF3Q4

L=|L とか 0=1 とか意味不明な記述が含まれていて
まともなプログラムではないので、そもそも正常に動きません。
仮に好意的に考えるとすれば
製作途中の未完成なファイルを間違って公開されてるんじゃないですかね

641名無しさん:2015/01/27(火) 05:49:27 ID:dDnUEEXA
3DS本体のAボタンやB、X、Yボタンなどを押すことで命令を実行できるようにしたいのですが、
どのような命令を使えば、各ボタンを使用できるようになるのでしょうか・・?

また、その命令を入れればINPUT入力時のように、
指定のボタンを押すまでプログラムの進行はストップしてくれるのでしょうか?

642名無しさん:2015/01/27(火) 13:02:05 ID:JARy.T.I
ABXYボタンを扱うには BUTTON() 命令を使います。
詳しくは[?]ボタンのHELP機能など各種説明をどうぞ。
BUTTON命令は、実行された時のボタンの状態を扱い、
即座に次の命令へ移ります。なのでボタン入力待ちをしたければ
その他の命令を組み合わせる必要があります。

よくある考え方としては、
「Aボタンを押していない間は、
 Aボタンを押しているかどうかの判定を無限に繰り返す」
という方式があります。

また、INPUT命令の入力待ちでは、AボタンはENTERキーとしても扱われるので
それを利用してAボタン待ちとして使う事も可能ですし、
DIALOG命令では、OKボタンやはい/いいえ等をボタン操作で
決める事もできるので、それを利用する事もできるでしょう。

643名無しさん:2015/01/28(水) 07:38:59 ID:dDnUEEXA
>>642
教えてくださってありがとうございます。
いろいろ工夫しながらやってみたいと思います。

644名無しさん:2015/02/01(日) 17:37:36 ID:LBJmdGMM
スマイルツールで作ったWAVEのDATファイルをMMLに使用するにはどうすれば良いですか?

645名無しさん:2015/02/02(月) 08:10:56 ID:nmGARjiU

DIM WAV[0]
LOAD "DAT:ファイル名",WAV
WAVSETA 225,127,127,127,127,WAV
BGMPLAY "@225CDEFG"

数値配列を用意し、
スマイルツールで保存した波形データを数値配列に読み込む。
WAVSETA命令で数値配列を楽器の音色として登録し、
登録した音色番号を使用するMMLを鳴らす。

という手順で行います。

646名無しさん:2015/02/02(月) 17:46:40 ID:EV5K.0TM
ありがとうございます

647yuuki:2015/02/04(水) 18:12:18 ID:RT6winTw
僕は、はじめてから、1ヶ月ほどたっているんですけど、まだ SPSET や BGMPLAY ○○ 等しかわかりません。
ゲームを作るにはまだまだなのですが、キャラクター(スプライト)をスライドパッドで動かす方法を教えてください。
STIC OUT まではわかるのですが、そのあとのXとかYとかX=X+1等がわかりません。
教えてください(∵)

648名無しさん:2015/02/04(水) 23:44:37 ID:nmGARjiU
では、1歩ずつ順に考えてみましょうね。

準備として、あなたが既に使い方が分かっているSPSET命令を使って、
スプライトを表示させてみましょう。

ACLS
SPSET 0,27

これだけ書いたプログラムを実行させると、画面左上にラッパが表示されて
すぐプログラムが終わりますね。
さて、『スプライトを動かす』のが目標なわけですが、
「動く」って、どういうことでしょうか?
たぶん『今の位置よりも少し離れた位置に変わる』と言えると思います。
そのために、まずはラッパを「別の位置に変えて」みましょう。
さっきの次の行に

SPOFS 0,100,100

と書き足して実行すると、ラッパの位置が左上から変わります。
『スプライトの位置を扱う命令は、SPOFS』だと分かりましたね。

ここまでを詳しく見てみましょう。
ACLSは、スプライトも含めて画面表示を初期化する命令です。
SPSET に続いて書かれている数字のゼロは、スプライトの管理番号で、
その後の27はラッパの見た目を指す番号です。
「0番のスプライトを、ラッパの見た目にして、使い始めるよ」という命令です。
(*出席番号ゼロ番の友達を呼んで、ラッパのお面をかぶせましょう!)

SPOFS に続く3つの数字の1つ目はスプライトの管理番号で、
残り2つは横の位置と縦の位置を指示しています。
(*出席番号ゼロ番君に、教室のすみっこから横に100センチ、縦に100センチの
場所まで瞬間移動してもらいましょう!)

649名無しさん:2015/02/04(水) 23:45:08 ID:nmGARjiU
ここまでで、とりあえずスプライトの位置を変えることができました。
次に、「今の位置よりも少し離れた位置」の部分を考えてみましょう。
そのためには、最初にラッパの「今の位置」を知らないといけませんよね。

 SPOFS 0 OUT X,Y

このように書きます。さっきと書き方が変わって「OUT」が特徴的ですね。
数字のゼロはスプライトの管理番号です。
そしてSPOFSはスプライトの位置を扱うための命令だったので、
「OUT」があるこの書き方をすると、管理番号ゼロ番のスプライトの
位置を知らせてください、という命令になるのです。
もちろん、この書き方をした時は、スプライトの位置は変わりませんよ。

続いて「X」と「Y」と書いた箇所です。これは『変数』です。
数字の代わりに使える物で、"数"字を"変"えることができる物です。
SPOFS OUT 命令は、XとYという名前の変数の数値を、位置の数値に書き換えます。
(*出席番号ゼロ番君に、XカードとYカードという名前の、2枚のカードを渡して、
Xカードには、今あなたは、教室のすみっこから横に何センチの場所にいますか?
Yカードには、今あなたは、教室のすみっこから縦に何センチの場所にいますか?
を書いてもらいましょう!)

650名無しさん:2015/02/04(水) 23:46:08 ID:nmGARjiU
さて「今の位置」が済んだので、次は「よりも少し離れた」を考えましょう。

 X=X+1

あなたが、知りたいと例に出していたこの書き方です。
「X=」とは、「変数Xの数値を書き換えますよ」という意味です。
数値を、何に書き換えるのかは、それに続く「X+1」の部分です。

スプライト番号0が100,100の位置にいた時、
さっきのSPOFS OUT 命令の効果で、変数Xの数値は100に書き換えられていましたね。
変数Xは、今は100という数値と同じことになっています。
なので、「X+1」は 今は『100+1』と同じ意味になります。100に1を足すと101。
変数Xの数値は、101に書き換えられることになります。

さっきまで100と同じ意味だった変数Xは、今は101という意味になりました。
つまり結果を見ると「X=X+1」という書き方は、『変数Xを1増やす』ということです。
(*書いてもらったXカードの数値に1を足して、Xカードの数を書き換えましょう!)

651名無しさん:2015/02/04(水) 23:46:56 ID:nmGARjiU
変数Xは、スプライトの位置の数値のことでした。
その数値が、ちょっとだけ変わりました。これが「よりも少し離れた」です。
続いて、最後の「位置に変わる」です。もう分かっているかも知れませんね。

 SPOFS 0,X,Y

スプライト0番の位置を、変数Xと変数Yの数値の位置に変えます。
これまでのプログラムの結果、変数Xの数値は101になっていました。
これは、元のスプライト0番の横の位置が100だったので、それより1だけ多い数です。
変数Yは、元のスプライト0番の縦の位置の100になったまま、変化させていません。
つまり、今のこの命令は、
 SPOFS 0,101,100
と同じことで、スプライト0番の位置を、横101、縦100の位置に移動させる命令になるのです。
(*出席番号ゼロ番君に2枚のカードを渡して、書かれてる数字の位置に移動してもらおう!)

652名無しさん:2015/02/04(水) 23:48:18 ID:nmGARjiU
これで『今の位置よりも少し離れた位置に変わる』は出来ましたが、
ここまでのプログラムを実行しても、たった1だけ移動するだけなので、見ても分かりません。
そこで、プログラム全体をこんな風にしてみましょう。

ACLS
SPSET 0,27
SPOFS 0,100,100
@LOOP        '←追加した行
 SPOFS 0 OUT X,Y
 X=X+1
 SPOFS 0,X,Y
 WAIT        '←追加した行
GOTO @LOOP      '←追加した行

追加したうちの「@LOOP」は目印で、読書で言えばしおりです。
「GOTO @LOOP」は、「@LOOPという目印に行け」という意味で、
普通は上から順にしか進めないプログラムを実行する順番を、変える命令です。
そして「WAIT」は、普通は目にも止まらぬ速さで実行されてしまうプログラムを、
人間が目で見て確認しやすいようにゆっくりさせるための命令です。

このプログラムを実行すると、@LOOP と GOTO @LOOP の命令の作用で、
さっき書いた『今の位置よりも少し離れた位置に変わる』プログラムが
何度も何度も繰り返し実行されるので、ラッパが動いて見えます。

プログラムは終わり無く無限に続くので、
スタートボタンを押してプログラムを中断させましょう。

653名無しさん:2015/02/04(水) 23:49:29 ID:nmGARjiU
さてさて、ここまでで『スプライトを動かす』ことは出来ました。
次は『スライドパッドで』動かすという部分ですね。

では、「SPOFS 0 OUT X,Y」と「X=X+1」の間に、次のプログラムを書き加えてください。

 STICK OUT X,Y
 PRINT X

プログラムを実行すると、画面左側に数字のゼロが並びませんか?
そのままスライドパッドをぐりぐり動かしてみましょう。
スライドパッドの動きに合わせて画面の数字が変わりましたよね。

あなたが「分かる」と言った STICK OUT 命令ですね。一応、簡単に説明すると
変数の数値を、スライドパッドを動かした位置を示す数値に書き換える命令です。
「PRINT X」で、変数Xの現在の数値を画面に表示させています。

654名無しさん:2015/02/04(水) 23:51:03 ID:JARy.T.I
ところで、ラッパの位置が画面の左上に変わっていますよね?
なぜだか分かるでしょうか。
「SPOFS 0 OUT X,Y」の命令で変数XとYがスプライトの位置に書き換わるわけですが、
追加した「STICK OUT X,Y」の命令で、同じ変数XとYがまた書き換わってしまったからです。
スプライトの位置とスライドパッドの位置は、それぞれ別の変数を使うようにしましょう。
そのためには、変数の名前を変えます。名前は何でもいいのですが、
ここでは例として、スプライトの位置の変数名はXとYのままで
スライドパッドの位置の変数名は「SX」と「SY」に変えることにします。

 STICK OUT SX,SY

「PRINT X」は消してもいいです。
このあとは、スライドパッドの状態を、変数SXとSYの数値がどうなっているかを
見て判断することで、その判断の結果として、スプライトをどの方向に動かすかを
決める、というプログラムを作っていくことになります。
「判断するプログラム」とは何か。それはズバリ『IF』命令なのですが・・・。

655名無しさん:2015/02/04(水) 23:54:07 ID:nmGARjiU
実は、そんな事をしなくても「X=X+1」の部分を

 X=X+SX

こう書き換えるだけでも、これでスプライトがスライドパッドで動いちゃいました。
これじゃ動かないと思ってたのに。意外だ。
あなたの質問の、「スプライトをスライドパッドで動かす」は、これで解決できちゃいましたね。
なので、とりあえずここまでのプログラム全体を書いて、一区切りとします。

ACLS
SPSET 0,27
SPOFS 0,100,100
@LOOP
 SPOFS 0 OUT X,Y
 STICK OUT SX,SY
 X=X+SX
 SPOFS 0,X,Y
 WAIT
GOTO @LOOP

ここから先は、あなた自身で、「縦(上下)に動かすにはどうするか」や
「名前だけ出てきたIFとは何なのか」について、挑戦してみる事をお勧めします。
どうしても行き詰ったらまた質問してみれば良いのではないでしょうか。
(絶対に必ずお答えします!と約束はできませんが・・・)がんばってください。

656yuuki:2015/02/05(木) 11:25:34 ID:RT6winTw
ありがとうございました。
色々やったらできました。
詳しく説明してもらえて、とても嬉しいです。
僕は、ミーバースもやっていますが、ミーバースだとあまり答えてもらえないので、嬉しかったです。
あと、僕は3Dのシューティングゲームを作りたいのですが、戦闘機などで戦うのでななく、人と人が、銃で戦う感じのを、作りたいのですが、銃のスプライトが無いので、スマイルツールからペイントで、書きたいんですけど、書いたあとに Y ボタンでセーブとかできますけど、そのかいたやつを画面に、表示する方法を教えてください。
お願いします

657名無しさん:2015/02/05(木) 18:39:48 ID:nmGARjiU
イチゴを銃に書き換えた場合
LOAD "GRP4:ファイル名"
SPSET 0,0

658yuuki:2015/02/05(木) 18:47:32 ID:RT6winTw
ありがとうございました。

659名無しさん:2015/02/08(日) 17:33:34 ID:dDnUEEXA
将棋盤のように人間を真上から見下ろしたようなイメージのゲームを作っています。
キャラクターである人間の視野角を設定したいと考えました。
人間として表示させているスプライトの座標を中心に、この範囲は見えてますよ、
という目安になるラインを引きたいのですが、
始めたばかりで下図のようなラインを引くにはどうすれば良いか分からず悩んでいます。

●             ●
 ●           ●
  ●         ●
   ●       ●
    ●     ●
     ●   ●
      ● ●
       ◎←中心(スプライトの画像)

RAD命令辺りで角度を出して、座標を中心にGLINEで引けばいいのか..?
とも考えたのですが...
何か良い方法はあるのでしょうか?

660名無しさん:2015/02/08(日) 19:20:03 ID:nmGARjiU
ACLS
SPSET 0,127+2048
SPOFS 0,200,120
FOR I=1 TO 2
 SPSET I,1194
 SPSCALE I,0.25,100
 SPROT I,(I AND 1)*90
 SPLINK I,0
NEXT
@LOOP
 VSYNC
 IF BUTTON(2)==16 THEN
  SPROT 0 OUT R
  FOR I=0 TO 2
   SPANIM I,"R",-60,R+360+(I AND 1)*90,0
  NEXT
  SPSTART
 ENDIF
 IF BUTTON(0)==0 THEN SPSTOP
GOTO @LOOP

Aボタンを押すと回転します。

661名無しさん:2015/02/09(月) 05:10:17 ID:dDnUEEXA
>>660
ありがとうございます。
ヘルプを見ながら、
この命令で何故こうなっているのかを理解して応用したいと思います。

662名無しさん:2015/02/09(月) 07:10:44 ID:nmGARjiU
バグがあったので、そのまま応用して使うのは止めておいてください。
(角度の数値が累積してエラーになる)

『もちろんグラフィックを使う方法もありますが、
 スプライトのみを使って表現する方法もありますよ』

というだけの意味の返答だった、と考えてください。
最適な方法なんて、ゲーム毎、場面毎、作る人毎によって違いますから。

一時期、ミーバースで、スプライトの諸機能を使って
数学(特にラジアン角度?)を使わずに角度を扱おう!
みたいな挑戦があって。それの影響を受けてます。
確かに360度の角度の考え方だけで済みますね。

スプライト機能の持つ当たり判定各命令を駆使すれば
ここから画面上の点を割り出してGLINE描画に使う、
なんてこともできそうです。

663名無しの厨房:2015/02/09(月) 20:51:59 ID:3XUkIQmg
最近プチコン3号をはじめた者ですが、自分で作ったスプライトを読み込み、
ゲームで使用する方法が分かりません。スマイルツールで読み込む方法ではないです。
どなたか教えて下さいませんでしょうか。

664名無しさん:2015/02/10(火) 00:57:01 ID:JEubZI..
>>663 >>657

665名無しさん:2015/02/10(火) 06:09:58 ID:dDnUEEXA
>>662
了解しました。
私がプチコンというか、プログラムを始めて2カ月のド素人なもので、
教えて頂いたコードを見たときの正直な気持ちが、
「やべ・・・コレわかるかな^^;」でしたw
角度を決めて直線を引くだけでも色々な方法があるのですね。

私の考えているゲームの画面は動画ではなく紙芝居のような場面ごとの静止画なので、
座標から、角度と直線、直線を引く方向で表示できるような
シンプルな命令を入れる方法があれば、そっちも教えて頂きたいです

666名無しの厨房:2015/02/10(火) 19:37:46 ID:3XUkIQmg
見落としてました…orz解決しました。ありがとうございます。

667名無しさん:2015/02/11(水) 04:39:56 ID:MNK4RpLw
>>665
私、角度な数学は苦手でして(^p^)
なので、(この場所で他に回答してくれる人が居ないようなら)
ミーバースに行った方が、よりあなたに合う回答が得られると思います。

668名無しさん:2015/02/11(水) 05:06:02 ID:MNK4RpLw
でも、たとえば・・・

「FOR I=0 TO 360」みたいな書き方/方法を使って、点だけで円を描く方法って、
検索でもいっぱい出てくるじゃないですか。
あれって、中心の座標と、そこから360度の方式の角度での座標が得られるわけだから、
中心から その座標までGLINEを引けばいいってことですよね。

主人公が向いている方角が180度の方角で、見える範囲が左右45度だとしたら、
180-45度と180+45度の角度の座標を得て、それぞれGLINEすればいいんじゃないかな。

・・・たぶん考え方は合ってると思う。

669名無しさん:2015/02/12(木) 19:30:19 ID:Vwe1ISgE
>>665
考え方は >>668
> 主人公が向いている方角が180度の方角で、見える範囲が左右45度だとしたら、
> 180-45度と180+45度の角度の座標を得て、それぞれGLINEすればいいんじゃないかな。
であっているので、プログラムを書きました
アナログスティックで移動、LRボタンで左右回転
あとは、三角関数を勉強してください

ACLS:GPRIO 8
VAR X=200,Y=120 '中心座標
VAR R=0     '見ている角度(上が 0度)
VAR S=45     '視野角
VAR DX1=0,DY1=0,DX2=0,DY2=0
VAR L=60

SPSET 0,0,0,16,16,1
SPHOME 0,8,8
SPOFS 0,X,Y

@LOOP
STICK OUT SX,SY
INC X,SX*4:INC Y,-SY*4

B=BUTTON(0)
IF B AND 256 THEN DEC R,4   'L BUTTON
IF B AND 512 THEN INC R,4   'R BUTTON

DX1=SIN(RAD(180-R+S))*L
DY1=COS(RAD(180-R+S))*L
DX2=SIN(RAD(180-R-S))*L
DY2=COS(RAD(180-R-S))*L

SPOFS 0,X,Y
SPROT 0,R
GCLS
GLINE X,Y,X+DX1,Y+DY1,RGB(255,255,255)
GLINE X,Y,X+DX2,Y+DY2,RGB(255,255,255)

VSYNC 1
GOTO @LOOP

670名無しさん:2015/02/13(金) 05:48:02 ID:dDnUEEXA
>>669
コードまで書いていただいて感謝です。

>>668 の方と同じ方でしょうか?別の方でしょうか?

>>668でのコメントをもとに色々と試行錯誤しているところでした。
今回書いてもらったコードはかなり理想に近い形になっていますので、
勉強して応用したいと思います。

>>668
>>669
本当にありがとうございました!

671名無しさん:2015/02/13(金) 17:58:06 ID:Vwe1ISgE
>>670
>>669だけど、>>668の人とは別人だよ

672らりゆ:2015/02/21(土) 19:46:59 ID:rV43r662
プログラミングのやり方がわからない

673名無しさん:2015/02/21(土) 20:28:48 ID:MNK4RpLw
>>672
お好きなところを読んでどうぞ。
ochameclub.web.fc2.com/petitcom3/lecture/
d.hatena.ne.jp/n_shuyo/20150115/1421292568
plaza.rakuten.co.jp/route21/diary/201501120000/
www.white.umic.jp/pc/2014/12/20-100000.html
damedamepg3q.web.fc2.com/pet3Sta_sp1.html
smileboom.com/special/ptcm3/e-manual/24.php

674名無しさん:2015/02/22(日) 01:48:01 ID:hv5dodh6
smileツールで作ったBG画面(RPGのフィールドマップ等)を実際のプログラムでロードして表示するにはどうすればいいのでしょうか

675名無しさん:2015/02/22(日) 06:08:55 ID:MNK4RpLw
>>674 
https://miiverse.nintendo.net/posts/AYIHAAAEAAAFVHwjp7olng
https://miiverse.nintendo.net/posts/AYIHAAAEAADcU5Qx7Es57Q

676EUROBEAT:2015/02/24(火) 19:31:03 ID:VcNJgNDM
今一画面アクションを作っています。B=BUTTON()を使いました。
プログラムを実行してB=BUTTON()がある所でボタンを押したら
「STACK OVERFROW」のエラーが出ました。
このエラーが起きる原因はなんでしょうか?
また、どのような方法で出ないようにできますか?

677名無しさん:2015/02/24(火) 22:21:49 ID:MNK4RpLw
Stack Overflow(スタックオーバーフロー)
「スタック」とは・・・この場合「戻る場所を覚えておくための容量」
と説明して良いと思います。「オーバーフロー」は「溢れる」と。

GOSUB や DEF を呼び出すと、後で RETURN や END で戻ってくるために
呼び出した場所を覚えておかなければなりません。
その記録のために使う場所がスタックです。

そして、GOSUB を呼び出した時に RETURN する前に別の GOSUB や DEF を
呼び出すことも出来ますよね。そんな時は、スタックに次々と
戻る場所を追加で記録していきます。

ニンテンドー3DSも、どんなコンピューターでも、記録できる容量には
限界があり、「これ以上、スタックには記録できないよ!」となった時に
スタックオーバーフローのエラーを出して、知らせます。

以上が、質問の「このエラーが起きる原因」です。
次の質問の「どのような方法で出ないように」ですが、これは

GOSUB で呼び出された先で、RETURN しないままに GOTO で戻るような
プログラムを書いてしまっていないかを確認すると良いと思います。

次のような例が、
スタックオーバーフローのエラーを出すプログラムのよくある書き方です。
@A
GOSUB @B
@B
GOTO @A

678EUROBEAT:2015/02/25(水) 10:51:33 ID:CYGsPm6I
なるほど。
解決しましたありがとうございます!

679piyo:2015/03/01(日) 12:06:29 ID:/48Jel1A
電子書籍つくりたいんですけど、初心者なので全くわかりません。
だから、本の内容以外誰かプログラムを書いてくれませんか?
わがまま言ってスミマセン、、

680名無しさん:2015/03/02(月) 07:29:34 ID:MNK4RpLw
>>679
『PBR(Petit Book Reader)』
第二回プチコン大喜利、プロ生ちゃん特別賞受賞作品
http://www2.u-netsurf.ne.jp/~ozawa/petitcom/
http://smileboom.com/special/ptcm2/co_contest/2nd.php

681ピット:2015/03/06(金) 00:22:06 ID:cO.em93Q
MMLのミュージックと同期の取り方を知っている方いましたら教えてください。

例えば、
BGMPLAY "ABCDEFG"
と入力したときに、"D"が鳴らされるタイミングで敵が現れる。
等の処理を行いたいと思っています。

682名無しさん:2015/03/06(金) 05:05:25 ID:MNK4RpLw
BGMSET 128,"ABCDEFG"
BGMSET 129,"RRR"
BGMPLAY 0,128
BGMPLAY 1,129
@LOOP
IF BGMCHK(2)==FALSE THEN GOTO @A
GOTO @LOOP
@A
PRINT "てきが あらわれた!"

何も音が鳴らないMMLを同時に再生させて
再生が途切れるタイミングを検出する方法です。

「MML内部変数」という仕組みを使う方法もあり、
そっちの方が柔軟に対応できそうですが、
MML内部変数にはバグがあるとのことで
プチコンが更新されるまでは使わない方が良いと思います。

最初に書いた方法ならプチコンが更新されても
そのまま使い続けられるでしょうし、
バグが修正された後でもMML内部変数を使う前に
ちゃんとプチコンのバージョンを確認するような
プログラムが書けると良いですね。

683名無しさん:2015/03/06(金) 05:06:30 ID:MNK4RpLw
間違えた。「BGMCHK(2)」は
BGMCHK(1) が正しいです。

684ピット:2015/03/06(金) 20:04:36 ID:cO.em93Q
>>682
回答ありがとうございます。

BGMの並列実行なんてできたんですね。
BGMPLAYの説明に「MMLによる再生はトラック0で行われる」
と記載があったのでてっきりできないものかと思っていました。
BGMSET 129,"R"
IF BGMCHK(1)==FALSE THEN
COUNT = COUNT + 1
BGMPLAY 1,129
ENDIF
で、あとはカウント値を参照することでいろいろ応用できそうです。

また、「MML内部変数」のヒント教示も感謝です。
プログラムとしては内部変数を使うのがもっとも簡単そうなので、
ちょっとの間同期は(T.B.Dとして)あきらめておいて、
修正を待ってみたいと思います。

待ちきれなくなったら、>>682さんに紹介いただいた休符使用と、BGM並列実行
考えて見たいと思います。ありがとうございましたす。

685名無しさん:2015/03/07(土) 12:54:51 ID:MNK4RpLw
おそらくBGMCHKは1/60秒の精度でしか判定できません。
そしてBGMPLAYも1/60秒の精度でしか発効されないと思います。
それに対しMMLは、
テンポの値と音の長さによっては、それ以上の精度になります。
さらに、仕様によっては
音色の余韻の減衰にかかる時間などがBGMCHKの判定に影響しそうです。
(この場合は休符だけなので無関係でしょうけど)

684で書かれた例では、演奏の拍数を数えているようですが、
前述の精度の影響で誤差が溜まり
タイミングがズレることになると思います。

演奏開始時のMAINCNTと現在のMAINCNT
そして別途用意したMMLのテンポの値を使って、
自前で現在の拍数を計算する方が良いと思います。

それでも「60フレームが厳密な1秒ではない」仕様が
計算に誤差を生む原因になってしまいそうですが・・・

・・・ま、バグ修正を待った方が簡単確実ですね

686名無しさん:2015/03/07(土) 12:57:35 ID:MNK4RpLw
MICPOSを使えば
MAINCNTの持つ誤差の問題は回避できそうかな?

687名無しさん:2015/03/07(土) 14:25:40 ID:cO.em93Q
>>685
BGMPLAY関数同士でも16ミリ秒も誤差があるんですね。
うーん・・・誤差はあんまり考えて無かったです。
たしかに音が鳴り止んでから再実行するまでに誤差があるはずで、
カウントする方法では無理がありそうですね。

MICPOSをつかって時間指定する場合は"Txxx"や"Lxxx"
への対応が鬼化しそうですね。。。

いずれにしても、「待ち!」が得策ですね

688名無しさん:2015/03/08(日) 02:45:36 ID:8G3rZAdc
今、RPGっぽいゲームを作ろうとしているのですが、スプライトの移動とアニメーションがうまくいきません。

@LOOP
B=BUTTON()
IF (B AND1)==1 THEN
  Y=Y-16
  SPANIM 管理番号,3,データ配列,0
ENDIF
GOTO @LOOP

上への移動を例として、わたしがやりたいことを要約すると

1.上を押している間、アニメーションの最初のコマがループしてアニメーションが止まっているように見えるので、それをなくしたい。
2.移動時に線形補完を入れて、ドラクエ等のような1マス移動時の滑らかさを出したい。

この2つを作るにはどうしたらいいでしょうか。

689名無しさん:2015/03/08(日) 08:26:28 ID:MNK4RpLw
1つ目は、
SPANIM命令を繰り返し実行しているのが原因ですので、
そうならないように工夫します。
この場合だと、BUTTON(1)を使用してボタンを押した時に一度だけ
SPANIM命令が実行されるようにするのはどうですか。

2つ目については、
「ドラクエ風の移動」だとスプライトの移動と言うよりは
BGの移動が主になると思いますので、BGANIM命令を使えばいいでしょう。
使い方はSPANIM命令と似ていますので調べてみてくださいね。
処理の流れとしては、たとえばBGANIMで1マス分スクロールさせて
BGCHK命令を使いスクロールが終わるまでは
次のスクロール処理をさせないようにするのはどうですか。

690名無しさん:2015/03/08(日) 15:20:22 ID:MNK4RpLw
ちょっと試してみたら「完璧に不自然にならないように」
ボタンに応じて足踏みアニメーションさせるのは
BUTTON(2)とSPANIMだけでは難しそう?ですね・・・

取り繕う為に細かなフラグ管理とか書き加えるくらいなら
いっそ自前でMAINCNT見ながら毎フレームSPCHRした方が
気が楽になりそうと言うか。
ファミコン版ドラクエは10フレームに1度しかボタン入力を
受け付けなかったと聞いたけどその気持ちが分かると言うか。(関係無いか)

ま、不自然さが残ってもSPANIMで済ませて
とっとと次に進んだ方が勉強には良さそうですね。

(逆に、それが難しいと感じた自分の方が勉強が足りない可能性

691688:2015/03/09(月) 01:41:08 ID:8G3rZAdc
>>689
>>690
お二方、ご解答ありがとうございます。
おかげさまで解決しました。
四方向移動だけだとスプライトのアニメが斜め入力で少し変になってしまいますが、こちらは自力でなんとかしてみようと思います。
プログラム始めて三日の初心者ですので、まだまだわからない所が出てくると思いますが、そのときはまたよろしくお願いします。

692名無しさん:2015/03/14(土) 01:47:15 ID:iglswvzo
これってどうあがいても9999行にプログラムが入らなかったら諦めるしかない?

693名無しさん:2015/03/14(土) 03:10:31 ID:MNK4RpLw
プチコン3号は99万9999行まで可能で
(電子説明書30ページ、なぜか0行目を含むことになってるけど)
また、その行数を超えても大丈夫だと言うことです。
(ttps://twitter.com/notohoho/status/543366543698968576 )
ただし、行数とは別に全体の文字数制限はあるみたいです。
(4百万文字くらい?1文字2バイトで8メガバイトの制限かも。)
(ちなみにファイルサイズはUTF-8形式なので条件によって数え方が変わるらしい)
そして、それが4スロットあります。

プチコンmkIIでは最大行数は9999で、
1行は100文字までの制限があり、スロットもありません。
さらに、行数と1行の文字数の他に全体での文字数制限もあったと思います。
しかし複数のプログラムファイルをEXECなどで相互に使用し
制限を回避している人もいましたよ。

694名無しさん:2015/03/14(土) 04:23:22 ID:iglswvzo
なるほどね
詳しくありがとう

695名無しさん:2015/03/14(土) 13:08:58 ID:MNK4RpLw
プチコン3号、1スロットあたり
100万文字が限界だったらしいですね。
1文字2バイトが4スロットで8メガバイトか。
メインメモリが8メガあるのにソースコードが
スロット全部合わせてやっとメインメモリと同じというのは、
物足りなく感じますね

696名無しさん:2015/03/15(日) 00:51:01 ID:iglswvzo
ゲームに使うBGMとかドット絵とかを自作したいときはwikiに投稿してあるそれ用のプログラムを使えばいいの?かな?

697名無しさん:2015/03/15(日) 02:14:55 ID:MNK4RpLw
はい、基本的にそれで良いと思います。
作曲用のプログラムは、MMLとして保存する機能があるものを
選んで使うと良いでしょう。
そうでないとゲームのBGMとして使う時に使いにくくなります。

698名無しさん:2015/03/15(日) 02:41:38 ID:KYTo.FJI
またまたありがとう
投稿プログラムとかQR漁ってみる

699名無しさん:2015/03/15(日) 12:29:58 ID:akAEgO3.
下画面で使えるノートpcのタッチパッド見たいなのを作りたいんですがいまいちわかりません。
なので初心者でもわかるように解説してくれませんか?
Miiverseだとあまり詳しく書いてもらえないので・・・

700名無しさん:2015/03/15(日) 15:30:21 ID:MNK4RpLw
タッチパッドの動作の基本的な部分を細かく単純化して文章で書きながら
あらためて考えてみるという所から始めてみるのはいかがですか。
考えがまとまりやすくなって分かりやすくなると思いますよ。

タッチパッドは、指で触り、そのあと触り続けながら移動させると
画面上のマウスカーソルが動く、という動作をするものですよね。

最初に「指で触る」。
→触った瞬間だけはマウスカーソルは動かないということだな。

「触り続けながら移動させる」
→どのくらい移動させたかが重要になりそう。
→そのためには、触り始めた位置を記録しておいて現在位置と比較する必要がありそう?
→触り続けているかどうかの判断も重要そう。

「画面上のマウスカーソルが動く」
→最初に、マウスカーソルを別に用意しておく必要があるよね。
→マウスカーソルがどの場所にあっても、動き始めはその位置からになる。
→触り始めた時にマウスカーソルがある位置が重要になるのかも?
→ついでに、画面外に出ちゃわないようにするのももちろん重要だよね。

こんな風に考えてみました。参考にしてみてください。
これを踏まえて、プログラムにするにはどうするか、考えてみましょう。

701名無しさん:2015/03/15(日) 15:31:11 ID:MNK4RpLw
ACLS '画面初期化
XSCREEN 3 '下画面のキーボードを消す
GPAGE 0,4 'マウスカーソル的な画像を用意ここから
GFILL 0,0,15,15,0
GTRI 0,0,0,12,8,8
GLINE 0,0,7,15 'ここまで
SPSET 0,0 'マウスカーソルをスプライトとして表示

@LOOP
VSYNC
OTX=TX:OTY=TY 'タッチ移動量を知るための比較用に、前にタッチした位置を覚えておく。OldTouchX/Y
TOUCH OUT STTM,TX,TY '現在のタッチ位置を知る
IF STTM==0 THEN GOTO @LOOP 'タッチしてない時は何もしない
IF STTM==1 THEN OTX=TX:OTY=TY 'タッチした瞬間だけは移動させない処理
SPOFS 0 OUT X,Y 'マウスカーソルの現在位置を知る
X=X+TX-OTX 'タッチ移動量分だけ変数X/Yを変化ざる
Y=Y+TY-OTY
IF X<0 THEN X=0 'マウスカーソルが画面外に行きそうなのを矯正する処理ここから
IF X>399 THEN X=399
IF Y<0 THEN Y=0
IF Y>239 THEN Y=239 'ここまで
SPOFS 0,X,Y '結果を元にマウスカーソルの位置を設定する
GOTO @LOOP

考えながら、少しずつ入力しながら、実行してテストしながら
プログラムを作った結果、こうなりました。

その結果、書き出しておいたうちの
「触り始めた位置を記録」と「触り始めた時にマウスカーソルがある位置」は
考えすぎだったり、あるいは不要だったことがわかりました。

702名無しさん:2015/03/15(日) 15:35:12 ID:MNK4RpLw
さて、これで一応マウスカーソルは動くのですが、快適には使えないように感じませんか。
それは、なぜなのでしょうか。考えてみると、
本物のタッチパッドは、指を早く動かすとマウスカーソルはもっと大きく動きませんか。
なるほど!本物はそんな工夫をしていたんだなぁと、改めて気づいた気分です。

今のプログラムは単純にタッチ移動量をそのまま使っているので、
何かしら工夫して、数値をそれっぽく加工してあげると良さそうですよね。
次はそこを、自分で考えてやってみてはどうでしょう。

また、先のプログラムにも、説明のために冗長なところがあったりするので
プログラムの流れを見ながら、もっと無駄がなく効率的に動作させるには
どう書けばいいか、とか頭の体操に考えてみるのもいいかも知れませんね。
書き写しミスあればご容赦ください

703名無しさん:2015/03/15(日) 16:03:23 ID:akAEgO3.
なるほど、そういうことか。
わかりやすいかいせつどうもありがとうございました

704名無しさん:2015/03/19(木) 15:14:22 ID:daMam8RI
ホント初心者的な質問なんですが、
NEXTの使い方が良く分かりません。
誰か教えてくださる方よろしくお願いします。

705名無しさん:2015/03/19(木) 18:18:55 ID:MNK4RpLw
NEXT の意味を日本語で解説すると、
「ここまでを、繰り返してください」という意味だと説明できると思います。

NEXTは、FORの対になる命令です。
このように、何かの対になる命令というのは他にもあって、

IF の対が ENDIF
WHILE の対が WEND
REPEAT の対が UNTIL
などの組み合わせがあります。

これらを日本語で例えるとするならば、
様々なカッコみたいなものと考えるのはいかがでしょうか。
"【"の記号を見たら、次に"】"の記号が出てくるまでは
ひとまとまり、みたいに考えますよね。
その途中に"』"の記号が出てきても、
最初の"【"の対になる記号とは違うから、まだ区切りではないと思いますよね。

ですから、最初に出てくる命令と、その対になる命令がある場合は、
2つをセットで覚えると良いでしょう。

FOR命令は、「FOR」の文字に続いて、どれだけ繰り返すのか、などの
繰り返すための条件を指定して書きます。
そして、繰り返したい命令をいくつでも書いて、
「ここに書いたまでの命令を、繰り返すんですよ」という
目印のように書くのが、NEXTです。

706名無しさん:2015/03/20(金) 12:06:36 ID:xZF8KTkw
>>704が気になったので、試しに
GOTO @JP
FOR I=0 TO 10
@JP
NEXT
て書いてみたらエラーにならなかった

普通はエラーになるんだがなぁ

707706:2015/03/20(金) 12:23:55 ID:xZF8KTkw
更にいろいろ試してみた
GOTO @JP
PRINT "START"
FOR I=0 TO 2
PRINT "FOR";
@JP
PRINT "JP";I
NEXT

結果↓
JP0
FORJP1
FORJP2

GOTO @JP
PRINT "START"
FOR I=0 TO -2 '←ループを殺してみた
PRINT "FOR";
@JP
PRINT "JP";I
NEXT

結果↓
JP0


これバグじゃないか?

708名無しさん:2015/03/20(金) 14:43:45 ID:MNK4RpLw
プチコン3号は、中間コードのような仕組みで動いており、
実行前にソースコードから変換されます。
その過程でFOR命令は IF/INC/GOTO の組み合わせに再構築されているのではないか
と推測している方がいらっしゃいました。
GOTOでFORループ内部へ飛び込んでも、逆に飛び出してもエラーになりません。

709706:2015/03/20(金) 15:46:05 ID:xZF8KTkw
てことは

FOR I=0 TO 10 STEP 2
NEXT



I=0                        'FORの初期化相当
@LOOP                     'NEXTのジャンプ先
IF I<=10 THEN I=I+2 ELSE @LOOPEND 'FORのループ実体
GOTO @LOOP                 'NEXTの本体
@LOOPEND                  'FORの終了先

は等価ということ?インデントが崩れてたらごめんなさい

710709:2015/03/20(金) 16:05:42 ID:xZF8KTkw
ああ、更にごめんなさい
解釈されるかどうかだわ

711名無しの厨房:2015/03/20(金) 19:08:46 ID:3XUkIQmg
XSCREEN4を使わずにスプライトかBGを上画面と下画面に同時に表示させる方法はありますか?

712名無しさん:2015/03/20(金) 20:36:51 ID:daMam8RI
705>>分かり易いご返答ありがとうございました。

713名無しさん:2015/03/21(土) 05:07:55 ID:MNK4RpLw
>>709
そう推測されています。


>>711
XSCREEN 2または3で、上下画面が繋がったような動作をさせるには
そういう風に見えるように工夫してプログラムを作る必要があります。

上下画面共に同じ内容のスプライトやBGを用意するなどが必要になるので
XSCREEN 4よりも使えるスプライト数や重ねられるBG枚数が減ったと
感じることになると思います。

714名無しさん:2015/03/23(月) 08:07:37 ID:K6FrvEHw
BGANIMの"XY"の線形補完を連続使用したときの挙動、おかしくないですか?
バージョンは「プチコン3号 v3.1.0」です。
何かご存知の方いましたら教えてください。

----------------------詳細-----------------------
>>689 さんのコメを参考に
十字キー上下左右でマップ移動できるようなコードを作ったんですが、
何度か移動していると、BGの座標が時々ぶっとぶのです。。。
これといって、こったつくりにはしてないので、
コーディングミスの可能性は低いかなぁとおもっているんですが。。。

サンプルプログラム公開ID(KK34PRP)
該当記述→10行目
BGANIM 1,0,-15,BGX,BGY

715名無しさん:2015/03/23(月) 18:40:09 ID:MNK4RpLw
プチコン3号のバグっぽいですね。
「極めて頻繁にBGANIM命令を発行すると、瞬間的にBGの位置がリセットされる」っぽいです。
公式に報告を出しておきました。

あなたのプログラムの場合、とりあえずこの症状を回避するには、
9行目に「VSYNC」と書いてください。
(もし、それでも解消できなければ、要再調査...)

716名無しさん:2015/03/23(月) 19:29:33 ID:K6FrvEHw
>>715さん
回答ありがとうございます。(いつも回答ご苦労様です。)
いずれ、同期を取るためにVSYNCは使用しようと思っていました。
解決策の提示から、公式への報告までご丁寧にありがとうございます。

717sora_suke:2015/03/24(火) 08:46:59 ID:qw98NVmA
アクションゲームでブロックに乗ったとき、下、横から当たった時の
処理がうまく作れませんちなみにブロックはBGで表示させるタイプです

718名無しさん:2015/03/24(火) 16:33:49 ID:MNK4RpLw
現時点の、処理がうまく作れていない状態のプログラムを示して
(文字で書き写す、写真をどこかに上げてURLを貼る、公開キーを出すなど)
その上で質問してくださった方が回答しやすいですので
どうぞご検討ください。

719名無しさん:2015/03/25(水) 00:08:19 ID:MNK4RpLw
他には、こんな方法もあります。

音声を使ってプチコンからPCへ転送する仕組みが作られて公開されていたはずなので、
それを探して使用し、PCからプログラムのソースコードを投稿する。

パソコンが無く、携帯電話やスマートフォンしかなくても、
プログラムをQRコードに変換してプチコンの画面上に表示するプログラムもあるので、
その方法で転送し、携帯電話機からソースコードを投稿する。

・・・うん、やっぱり初心者向けの方法じゃないな。

720mikan:2015/03/27(金) 15:48:31 ID:fK1UWblk
今三号のサンプルプログラムGAME5VSを触って 攻撃のビープ音のあとに 少し時間差で実際に剣の攻撃が行われるように改造を行いたいのですが 276行目に WAIT 24 という風に付け足すと 目的の音のあとに攻撃が行われるという動作にはなるのですが 画面全体が止まってしまうためカクカクした動きになってしまいます 次に VSNYC 24 としてみたり FOR NEXT で空ループをはさんでみたりしても やはり画面全体が止まってしまってうまく行きません。 スプライトのアニメを表示する行を挟んでみたら そのアニメが終わるまで 攻撃のアニメが動かないかなと試してもみたのですが 実際には 挟んでみたアニメが途中で止まるような感じになり これもうまく行きませんでした。
勉強不足で申し訳ないのですが 画面全体の動きを止めることなく 特定のイベントの動作のタイミングを制御するよい方法があるなら教えていただけると嬉しいです。

721名無しさん:2015/03/27(金) 21:49:16 ID:MNK4RpLw
他の人が作った高度なプログラムを読み解くのは、大変な労力が要るものです。
だからこそ勉強になる面があります。見てみましょう。

まず、あなたが言った276行目の付近は、
(262行)@PUNCH というサブルーチンの中だというのは分かりますか。
(263)最初に変数PCHを見ていますね。ひとまず(270)ENDIFまで読み飛ばす
(272)次にDMGを見ています。
変数名から察するに、ダメージを食らっている動作の最中なのかどうかを
見ているものと思われます。食らいモーション中は攻撃できないようにする処理だろう
(273)変数BTを見ています。変数名と、ANDを使うことと、32という数値の使い方から
ボタン操作を見ていると推測できます。Bボタンを押してなければRETURN
(274)変数PCHを操作しています。最初の条件に出てきた変数ですね。
同じサブルーチン内で判定に使う変数をセットする・・・この変数は重要そうです。
(275)音を鳴らし
(276)スプライトを変える。
この行を無効(コメントアウト)にして実行してみると、人間が腕を振りません。
人間の見た目だけを操作していて、剣の操作はしていないようです。
(261)このルーチンは攻撃に関する処理のはずなのに、剣を操作していない。
これは重要なポイントになりそうですね。

(264)変数PCHで判断されるIFの中身を見てみます。
(265)変数Xを設定しています。ここを無効にすると攻撃の時に
一歩踏み込む動作をしなくなります。同時に攻撃終了時に戻る動作も。なるほど。
(266)スプライトの見た目を変える。無効にしてみると人物が
攻撃モーションのまま戻らなくなります。見た目を戻す処理ですね。
(276)で変えた見た目を、この行で戻すまでがセットのようです。
(267)PCHを減らしています。
(268)PCHの値を整えています。
PCHで判断されるIFの中で、PCHを変更しています。
(269)RETURNですから、この@PUNCHサブルーチン自体を戻らせています。ENDIFを待たずに。
変数PCHで判断したIFの中に入ると、これ以降の他の処理をせずに
@PUNCHサブルーチンが終わるのですね。

722名無しさん:2015/03/27(金) 21:50:30 ID:MNK4RpLw
プチコンでは、0がFALSEで0以外がTRUEの扱いになるのは知っていますか。
PCHは減らされて、ゼロ未満にならないようになっています。
(274)でPCHに設定されていたPCHMAXを虫眼鏡マークのボタンから検索してみると、
(92)数値は9に設定され、他に書き換わることは無いようです。

PCHは9から始まり、(263)のIFをTRUE扱いになり、(267)で1ずつ減り、(269)他の処理はしない。
0になると(263)でIFを通らなくなり、他の処理をする。
こういう動きをしていそうだ、ということが分かってきましたね。

このことから、変数PCHはタイマー的な役割も兼ねたフラグの変数だと分かります。
質問には「よい方法を」とありましたが、これがその答えとなります。

時間を決めて、何かをさせたい場合。この場合は「動作を止める」という動作をさせたいわけですが、

●1、その時間を計るための変数を用意して、
●2、その数値を変化させ、
●3、数値が範囲内にある場合だけ、
●4、特別な処理を行う。(攻撃の処理を行わせずに戻るという処理をさせる、など)

こういう手順で動作させることが、ご質問の「よい方法」だと思います。

723名無しさん:2015/03/27(金) 21:51:23 ID:MNK4RpLw
さて、では実際に考えてみましょう。
(274)を無効にしてみると、剣が前に出ず、攻撃できなくなりました。
変数PCHに値を設定させることが、攻撃が出ることに繋がるのですね。
この動作を遅らせるようなプログラムにしてみましょう。

●1、時間を計るための変数として、「PCHWAIT」を使用することにします。
「PCH=PCHMAX」の替わりに「PCHWAIT=24」をおきます。
●2、変数PCHWAITを変化させるために、
「@PUNCH」の下に処理を書き加えていきます。
変数PCHWAITの数値は、例にならって減らすようにしましょう。「PCHWAIT=PCHWAIT-1」
●3、変数PCHWAITの数値が範囲内にあるかどうかを判断するために、
これまた例にならって、「IF PCHWAIT THEN」とENDIFで囲います。
例にならうなら、ついでに「IF PCHWAIT<0 THEN PCHWAIT=0」も書きます。
このへんはコピー&ペーストを利用して書き換えてもいいですね。
●4、この場合に行う「特別な処理」とは、
『変数PCHに値を設定する』こと、ですね。
「IF PCHWAIT==0 THEN PCH=PCHMAX」

最後に、これまた例にならってRETURNを入れて、出来上がりです。
でも、実際に実行して試してみると、何かおかしいです。
人物が攻撃モーションのまま戻らなかったりもします。
なぜでしょう。分かりますか。

724名無しさん:2015/03/27(金) 21:52:23 ID:nsfMp0Nc
人物の攻撃モーションの見た目を設定する命令は、見てきましたよね。
それをもう一度見てみると、変えるスプライト番号の指定は「変数N」になっています。
変数で指定している理由とは・・・。
このサブルーチンは、実は、人間が操作するキャラクターの制御と、
コンピューターが操作するキャラクターの制御を、同時にやっていたんですね。
さっき用意したPCHWAIT変数は1つしか無いのに、両方のキャラクターの制御の時に
弄くられてしまっていたので、変なことになってしまったのです。

でも、元々あった変数「PCH」の書き方をなるべく手本にして書いたのに、
なぜPCHは大丈夫だったのでしょうか。
「PCH」を検索して変数の行方を探ってみると、180行目付近でSPVAR命令との関連が見えてきます。
スプライトが個別に持っている変数と入れ替えて一時的に受け皿のように使うための
変数だったのです。

またまた例にならって、さっき作ったPCHWAIT変数も、同じような扱いになるように
すれば良さそうですね。
考えてみてください。

725名無しさん:2015/03/27(金) 21:53:26 ID:MNK4RpLw
考え方のヒントを出します。SPVAR命令のヘルプを読むことと、
ここで使われている、先頭の文字がVの変数の役割を、変数名で検索して探って考えてみましょう。

さて、それで上手く動きますが、細かいことで言えば、まだあるかも知れません。
ボタンを押すとすぐに人物が攻撃動作の絵になり、剣の動きだけが遅れる感じですが、
攻撃動作の絵自体も遅らせたいとか。
あるいは、攻撃待ちの間にもジャンプや移動ができるのは、自分が思ってるのと違うとか。

しかし、ここまで出来れば、きっとあとは、大きな苦労はしないでできますよね。
他の人の作ったプログラムを見るのにも、少しは慣れたことでしょうし。

726mikan:2015/03/27(金) 23:39:14 ID:fK1UWblk
お忙しい中、わかりやすく丁寧な解説を本当にありがとうございます!
先生の一行一行の解説が本当に宝の言葉に感じます。これだけの示唆に富むありがたい文章を、わざわざご回答いただき本当に感謝の気持ちで胸がいっぱいになりました。
勉強不足でプチコンで0以外がtrueになることも理解していませんでした。動作の確認を予測するために、わざと行をコメントアウトの状態にしてプログラムを確認する方法があることに、目から鱗がおちる思いがしました。今までは数字を大きくしたり小さくしたり変更して、その数字の役割みたいなものを予想していました。自分で触っていたプログラムはこんな感じになっていました(キーKK8NDZM) どうしてこのように タイミングを変更したプログラムを作りたいと思ったかと申しますと ハドソンさまの作られたゲームのシステムの中で 盾の操作がとても楽しいゲームがあったのです。参考動画https://www.youtube.com/watch?v=JYSxdJYwTy0&amp;feature=youtube_gdata_player
そんな盾の楽しいゲームの防御?を再現できたらと思ってサンプルを触っていたのでした! 今は音のあとに攻撃が遅れて動作するようにして 防御を任意に行えるような形を目指しているのですが 行く行くは 攻撃前にモーションのかわりになんらかのエフェクトを追加して そのタイミングにうまくボタンを押したら 防御ができるような シューティングゲームのボムのプログラムを研究して 少しの瞬間だけ攻撃を防げる盾のような動きをするスプライトを追加できるように 先生に解説していただいた文章を研究して頑張りたいと思います!
本当に本当に丁寧な解説ありがとうございます。

727名無しさん:2015/03/28(土) 00:13:52 ID:K6FrvEHw
だれかオラに知恵をかしてくれ!

[やりたい事]
可読性の高いデコーダーを作りたい

[背景]
プチコン3号ではCASEやSWITCH文に相当する命令が無く、
IF,ELSEで記述する場合、ネストが恐ろしいことになってしまい、
コードの可読性が落ちてしまいます。
バージョン310からELSEIFが使えるようになったので
以下のようにコーディングをしてみましたが、
ELSEIF(?)THENの後は改行を入れなければ
構文解析がうまくいかないようです(カッコの対応付けがおかしい?)。
----------ダメなコード例----------
IF (A==1)THEN ANS=XXX
ELSEIF(A==2)THEN ANS=YYY
ELSEIF(A==3)THEN ANS=ZZZ
ELSE ANS=0
ENDIF
------------------------------

自分の尺度で語って恐縮なんですが、
改行を入れてと1条件のデコードを2行にするのはNGで
1行1条件のデコードを行いたいというのがあります。
また、ELSEIFを使用しないで、IFを使用した以下のようなコードもNGです。
理由は条件分岐の実行回数が増えるため、
プログラムが重くなってしまうからです。。。
----------重いコード例----------
RESULT=0
IF (A==1)THEN RESULT=XXX
IF (A==2)THEN RESULT=YYY
IF (A==3)THEN RESULT=ZZZ
------------------------------

いい案が思いついた方、よろしくお願いします。

728名無しさん:2015/03/28(土) 04:33:21 ID:hbYUR6ZU
>>727
気になって調べた。マニュアルと先達は偉大
-----------------
ON A GOTO @END,@a1,@a2,@a3
@a1 ANS=XXX:GOTO @END
@a2 ANS=YYY:GOTO @END
@a3 ANS=ZZZ:GOTO @END
@END

729名無しさん:2015/03/28(土) 08:31:32 ID:MNK4RpLw
>>726
「ゼロ以外はTRUEになる」のは、厳密に正確ではない部分もあると思いますので、
もし期待と違う動作をした時には疑ってみてください。

一部をコメントアウトにして動作確認してみる方法も、
数字を変えて動作確認してみる方法も、どちらも大切ですね。
たとえば「SPCHR N,略」という命令があったとしたら、
「SPCHR N+100,」と書き換えて試してみるとか、
「N=100:SPCHR N,」とか。色々な書き方で試してみると、
理解が深まることもあると思います。

挙げられていたゲームは知らないので、動画を見ても説明を読んでも
いまいちピンと来なかったのですが、
また何か質問があれば答えられる事もあるかも知れません。
(今回の、ヒントもらったけど分かりませんでした!とかでも)
さらに要素を追加すると、今回の部分が邪魔になってくるかも知れませんし、
SPVERを使う今の方法だと、これ以上の機能の追加は厳しそうなので
他の方法にする必要も出てきそうですね。

・・・他の人が作った高度なプログラムは、読み解くのも大変なら
高度な改造を施すのは、もっと大変な面があります。
「うん、一通りある程度、勉強になったな!」と思ったら、そこで切り上げて
自分で最初から作った方が簡単かも知れませんよ、というのもアドバイスです。

730名無しさん:2015/03/28(土) 08:32:41 ID:MNK4RpLw
>>727
「ELSEIF THENで改行が無いと」とおっしゃっているのは、
プチコン3号の構文解析の仕様のせいだと思います。

「ダメなコード例」を順番に見てみると、
1行目のIF THEN は、THENの後が空白ではなく命令が書かれているので、
ブロック型のIF文の書き方ではないと判断されていると思います。
その次のうちにIF文は終わり、と判断されてしまった後で、
2行目で、IF文が無いのに急にELSEIFが出てきて、ダメだと言われます。
THEN(とELSE)の後に何も書かれないまま改行になるかどうか、が
プチコン3号の構文解析がブロックとみなすかどうかの条件だと思います。

判断に使いたい条件が==(完全一致)だけならば、
>>728 のような方法で良いと思います。
プチコン3号では、ラベルと同じ行に命令を書けるようになったので、
ある程度スッキリ書けますね。

こんな工夫した書き方もあります。
REPEAT IF !CHKLABEL("@CASE_"+STR$(A)) GOTO @DEFAULT ELSE GOTO "@CASE_"+STR$(A)
  @CASE_1:  ANS=XXX  BREAK
  @CASE_2:  '2の場合は3と同じ結果にする例
  @CASE_3:  ANS=ZZZ  BREAK
  @DEFAULT:  ANS=0
UNTIL 1
見た目優先の書き方ですね、処理が軽いかどうかは分かりません。
また、もっと柔軟な条件式を使いたい場合は、
こんなような書き方ではきっと無理だと思います。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板