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

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

606604:2014/12/09(火) 11:57:13 ID:v1lfoElo
というわけで質問を少し変更させてもらいます。
どこをタッチしたか判定する際に、ボタンをシンプルな四角とかにして
IF X>50 AND X<90 AND Y>50 AND Y<90 THEN @SUB1
とやるくらいしか自分には思いつかないのですが
もっと複雑な形のボタンとか、移動するスプライトをボタンがわりにするとかのときには
この方法では限界がありそうです。
これに関連する命令とかってないでしょうか。

607名無しさん:2014/12/09(火) 17:14:14 ID:Lb/Jfqu2
プログラムですから、それを実現する方法は様々あり、どれが正解という事はありません。

「複雑な形の当たり判定」を実現するために、座標などいろいろ計算してもよいですが、
当たり判定の形の図形を描いておいて、タッチした位置で GSPOIT し、
読み取った色を元に判断する、という方法もあります。

「移動するスプライトを当たり判定」にするためには、
タッチした位置で SPHITRC する方法が一般的だと思いますが、

スプライトを管理するために座標などの変数を既に用意しているなら
それを使ってもいいし、
SPOFS OUT で座標、SPDEF OUT で縦横の幅、SPSCALE OUT で拡大率を
それぞれ得て計算してもいいです。

608名無しさん:2014/12/14(日) 16:30:51 ID:yBRr2aKo
迷路を作ろうと思ってるのですがBGの壁にスプライトが進めないようにしたいのですがどうしたらいいですか?頑張ってみたのですが全然できませんでした

609名無しさん:2014/12/14(日) 20:18:38 ID:yBRr2aKo
プチコン3号です

610名無しさん:2014/12/14(日) 20:49:09 ID:yBRr2aKo
BGGET命令を見つけました。それで判定はできるんですが真ん中に行かないと反応しませんし右と左のどちらからぶつかったら右側でそれ以上動けないなどにしたいのでまだ未解決です。

611名無しさん:2014/12/14(日) 20:51:51 ID:yBRr2aKo
あっもちろん左からだったら左側で上側からだったら上側で下側からだったら下側でそれ以上進めないというようにしたいです。連コメ及び長文失礼しました。

612名無しさん:2014/12/15(月) 01:48:50 ID:Lb/Jfqu2
キャラクターを実際に進ませる前に
これから進みたい方向の位置に対してBGGETしてみて
壁が無い時だけ進ませる(壁がある時は進む処理をキャンセルする)
ようにすれば良いでしょう。

もっと詳細に具体的に書き方を知りたい場合は、
現在のあなたのプログラムを見せていただければ
どこに何をどう書き加えたりすれば良いかアドバイスできると思います。

613名無しさん:2014/12/15(月) 17:19:41 ID:yBRr2aKo
>>612 回答ありがとうございます。ヘルプとにらめっこして頑張ります。

614名無しさん:2014/12/15(月) 22:27:41 ID:kSVD2mj6
プチコンってSD内の画像を表示したり加工したりできますか?

615614:2014/12/16(火) 17:51:27 ID:IIu/N8N.
解決しました

616名無しさん:2014/12/16(火) 20:52:03 ID:StfxjRhA
3号です。
セレクト、スタートボタンによる強制終了を回避したいのですが…
皆さまのお力をお貸しくだしゃい。
ちなみに用途はログイン失敗のペナルティタイムです。

617名無しさん:2014/12/16(火) 21:45:08 ID:Lb/Jfqu2
スタートボタン・セレクトボタンを
無効化したりすることはできません

618616:2014/12/17(水) 04:20:58 ID:StfxjRhA
なんと…
ありがとうございました。

619616:2014/12/19(金) 19:23:32 ID:StfxjRhA
連投すみません。
20面ダイスをふるプログラムを書こうとしたのですが、
一度走らせると大量の結果が吐き出されます。
FOR〜NEXTを入れてもまるでダメ。
このままだとパラノイアをプレイするのに幸福ではありません!
何卒お力添えをお願いします。
以下プログラムです。
@DICE
B=BUTTON(2)
IF B=16 THEN GOTO @RAMDOM
IF B!=16 THEN GOTO @DICE
@RAMDOM
D=RND(21)
IF D=0 THEN GOTO @RAMDOM
PRINT D
GOTO @DICE

620616:2014/12/19(金) 19:28:07 ID:StfxjRhA
BUTTON=(2)
はAボタンに対応させています。

621名無しさん:2014/12/19(金) 19:51:35 ID:MRvMr2eo
2行目を、こう書き換えてください。
VSYNC:B=BUTTON(2)
(行頭に「VSYNC:」を書き加える)

3行目と7行目、イコール記号を2つ続けて書いてください。

622616:2014/12/19(金) 20:45:31 ID:StfxjRhA
ありがとうございます!
もっと勉強しないとですね…

623名無しさん:2014/12/22(月) 18:29:47 ID:Oa1mEr3s
mkIIからMMLと簡易的なプログラムしか作っていない者なのですが、
BASICについての参考書や一から上達していけるように書かれているサイト等はありますか…?

624名無しさん:2014/12/25(木) 15:15:32 ID:MRvMr2eo
なかなか回答が付かないことが答えになってしまっていますが・・・
ttp://damedamepg3q.web.fc2.com/pet3Sta_sp1.html
このページなんて良いんじゃないでしょうか。

人は1度上達してしまうと、全く完璧に未経験だった頃の事は思い出せなくなるので
(えっ、自分だけ?)
そういう人向けにと最大限心がけても、全然相手に届かない
的外れなことになってしまいがちで、悩みの種です。

なので、あなたが今から挑戦すること、それを通じて理解した事を
全部書き留めて、後で解説にまとめて下されば良質な資料になると思うのですが・・・
「当時の自分は、なんでこんな単純で簡単な事が理解できなかったんだろう
恥ずかしい!」と思って手を加えずにはいられなくて
結局、出来上がった物は相手に届かない物になってしまいがち・・・
ああ!もどかしい!

もしも、それを逆に言うとするなら、最初から
中級者向け以上とかの解説を必死に読み解く方がタメになる、と
言える要素も無くはないのかも知れません、みたいな風にまで考えちゃったりして

625名無しさん:2015/01/05(月) 18:10:42 ID:gHJGyJ/k
プチコン3号になってから、mk2みたいにSPHITSPの使い方が出来なくなりました。

例えば、スプライト1と2の衝突判定を取る場合、どんなプログラムを書き出せばいいのでしょうか?
よろしくお願いします。
具体的に教えて頂けると助かります。

626名無しさん:2015/01/05(月) 21:18:53 ID:fbKmMLdo
>>625
3号のSPHITSP命令も、mk2と同じ書式で使えるよ
ただ、3号の場合、SPCOL命令で明示的に衝突判定用の矩形を設定しないとダメなだけだよ

627名無しさん:2015/01/06(火) 07:07:24 ID:gHJGyJ/k
>>626
できましたありがとうございました。
予め設定する必要があったんですね。

628S:2015/01/06(火) 16:56:23 ID:Yb76.5Bs
SPの辺り判定の付け方を教えてください。

629S:2015/01/06(火) 17:12:05 ID:Yb76.5Bs
訂正 当たり判定の範囲の付け方

630名無しさん:2015/01/07(水) 09:19:39 ID:nmGARjiU
SPCOL 管理番号, 始点X,Y, 幅, 高さ
  始点X,Y  SPHOMEを原点(0,0)とした相対座標

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です。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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