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

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

558ゆうあし:2014/07/05(土) 12:45:50 ID:OfrUzm2g
memはMEM$に文字を読み書きするリソースです。
GRPはグラフィック面からGSPOITにより色の番号を得てそれを文字番号に使う方法もあるリソースです。
http://wiki.hosiken.jp/petc/?Toukou%2FGRP%A5%EA%A5%BD%A1%BC%A5%B9%A4%F2%BB%C8%A4%C3%A4%BF%CA%B8%BB%FA%A4%CE%B5%AD%CF%BF

559名無しさん:2014/07/07(月) 20:32:36 ID:ZdyfBh.g
>>557
このサイトが参考になると思う
ochameclub.web.fc2.com/petitcom/tips/save.htm

560名無しさん:2014/08/26(火) 09:42:17 ID:/kTuIkLY
5個の数字の入った変数(桁は不規則)をMEM$に保存しようと思っているのですが数値を文字にして保存出来ましたがそれを取り出す方法はわかりません。誰か教えてください。

561名無しさん:2014/08/26(火) 13:55:01 ID:K17I3QVw
まず、その、5つの数字をMEM$に保存する部分のプログラムを見せてくださいね。
取り出す方も、「こんなプログラムを書いてみたが失敗した」があれば、なお良いです。

562名無しさん:2014/08/26(火) 19:54:14 ID:/kTuIkLY
>>561
セーブは
(変数内の数字は仮です。)
A=1
B=10
C=100
D=1000
E=10000
A$=STR$(A)
B$=STR$(B)
C$=STR$(C)
D$=STR$(D)
E$=STR$(E)
MEM$=A$+"/"+B$+"/"+C$+"/"+D$+"/"+E$+"/"
です。
ロードはMID$を使おうとしましたが数値が不規則なのでどう取り出せばいいかわからなくて無理でした。

563名無しさん:2014/08/26(火) 22:05:44 ID:K17I3QVw
このページの「区切りを入れて記録する方法」の箇所を参照してください。
ttp://ochameclub.web.fc2.com/petitcom/tips/save.htm
簡単に解説すると、
INSTR命令で数値の区切りに使った文字の位置を得て、
それを元にMID$()命令に与える範囲を決定すれば良いです。
参照先では配列変数を使っていますが、A-Eの変数名を使うなら
変数ごとに5回、そういう処理を書けば良いです。

564名無しさん:2014/08/26(火) 23:30:13 ID:/kTuIkLY
>>563
ありがとうございます。
INSTR命令ってのがあったんですね。
がんばってみます。

565@0918nobita:2014/11/08(土) 16:44:54 ID:hIK.sEuE
指定した範囲に直角三角形/2等辺三角形/ひし形/円/楕円/文字を
追加したり、透明度を指定して塗りつぶしができるGRPリソース編集ソフトを
開発中ですが、フリーハンドの線の描画に手間取ってます。ほかの画像編集ソフトでは
可能ですが、しくみがよくわからりません。途切れ途切れではなく、滑らかな途切れのない線を
書けるようにしたいです。

566名無しさん:2014/11/08(土) 22:01:39 ID:Lb/Jfqu2
直前のタッチ位置と現在のタッチ位置の間に線を描くだけじゃないの?
@LOOP
OLDX=TCHX
OLDY=TCHY
VSYNC 1
GLINE OLDX,OLDY,TCHX,TCHY,2
GOTO @LOOP
みたいな。

567天郷思音 ◆vCvQmsUz9g:2014/11/09(日) 11:18:06 ID:i0TzrNEk
>>566
VSYNCのかわりに「1回離してもう1回タッチされるのを待つ」処理にしたほうがいいのかな。

568名無しさん:2014/11/19(水) 19:42:18 ID:uBbCCfzU
本体のカメラで撮った写真を表示して色々と遊んでみたいのですが、
どうすれば写真のフォルダーを指定したり、読み込んで表示できるんでしょうか?
立体で撮った写真を表示することってできるんでしょうか?

569名無しさん:2014/11/19(水) 21:27:23 ID:gHJGyJ/k
プチコン3号の質問です。
MAPエディタで作成したら "DAT:ファイル名"と出たのですが、ここからどうしたら
作成したMAPを画面に表示できますか? マニュアルには 配列に読み込ませる とありますが具体的
どのような命令文を使えばよいのでしょうか? MK-2では"LOAD"SCU0:ファイル名"で簡単だったので
プチコン3号では思うようにできず戸惑っています。
どうかよろしくお願いします。

570名無しさん:2014/11/20(木) 00:52:42 ID:gHJGyJ/k
自己解決しました。失礼しました。

571ゆきゆき:2014/11/22(土) 09:46:44 ID:m/tLE69E
スプリットとスプリット当たり判定ができないんだよね
どうやったらできるんだろ?

572名無しさん:2014/11/22(土) 13:27:31 ID:Lb/Jfqu2
「スプライト」な。
SPCOLを指定してやらんといかんのじゃないか

mk2はデフォルトの「グループ」が255だったのに対し
3号は「マスク」のデフォルト値が0に変わった
そんな印象なんだが、どうか

573名無しさん:2014/11/22(土) 17:54:11 ID:c9Aplhbo
プチコン3号からプログラムを始めた初心者です。
公式サイトの初心者講座にある
CLEAR:DIM APPLE(1)
APPLE(0)=56
PRINT "リンゴ";APPLE(0);"コ"
が何回やってもsyntax errorになります。ひととおり初心者講座を読んでBASIC解説サイトをいくつか見てみたのですが、エラーの原因が全くわかりません。
なんかもう心が折れそうなので誰か解決方法教えてくださいお願いします

574名無しさん:2014/11/22(土) 18:24:57 ID:6lBTFLAY
3号からDIMは( )じゃなくて[ ]になった

575名無しさん:2014/11/22(土) 18:54:16 ID:FSFNYj0Q
>>574
なん...だと...。まさかそんなに単純な原因だったなんて...orz

ありがとうございました。本当に助かりました。

576名無しさん:2014/11/22(土) 23:51:14 ID:zu43iMb.
>>569私も同じことで苦戦しているのですが、どうすればいいのですか?

577名無しさん:2014/11/23(日) 06:06:27 ID:Lb/Jfqu2
>>576,569
https://twitter.com/notohoho/status/535086519308926976

578名無しさん:2014/11/23(日) 11:20:18 ID:zu43iMb.
>>577ありがとうございます

579名無しさん:2014/11/23(日) 13:57:22 ID:zu43iMb.
>>577やったか!?と思ったけどできませんでした。
LOADSUB というのでシンタックスエラーが出てしまいます。
どうやったらできますか?

580名無しさん:2014/11/23(日) 16:16:47 ID:CL0nFoyE
プログラムを覚えるにはどこのサイトをみたらいいでしょうか

581僕もプログラムのサイト教えてください:2014/11/23(日) 18:31:46 ID:peouqp2Q
p

582名無しさん:2014/11/24(月) 00:14:28 ID:m30W0Za2
PAINTのとこにあるG0とG1っていうのは
「ここにオリジナルの素材とか描いてくれよな!」
って領域なんですか?
真実を知るまで怖くて手が出せません・・・

583名無しさん:2014/11/24(月) 06:45:41 ID:Lb/Jfqu2
>>579
https://miiverse.nintendo.net/posts/AYIHAAAEAADcU5Qx7Es57Q

>>582
その認識でも、だいたい合っています。
厳密な事は、後でもっとプチコン3号を
深く理解できるようになってからで構わないでしょう。

584名無しさん:2014/11/24(月) 11:53:31 ID:m30W0Za2
>>583

ありがとうございます!

585名無しさん:2014/11/24(月) 17:51:27 ID:zu43iMb.
ありがとうございます

586名無しさん:2014/11/25(火) 09:11:40 ID:CL0nFoyE
BASICっていろいろ種類がありますが
どれを覚えたらプチコンでゲームを作れますか?
SmallBASICでもいいんでしょうか

587天郷思音 ◆vCvQmsUz9g:2014/11/25(火) 11:29:59 ID:AZewKph.
>>586
やはりプチコンを買うのがベター。
VBAじゃないBASICならある程度通じるところがあるけど、やっぱりそれぞれでクセ(差異)があるから、別のBASICからはじめるのはおすすめではない。

588名無しさん:2014/11/25(火) 12:59:17 ID:CL0nFoyE
なるほど、わかりました。
ありがとうございます。

589名無しさん:2014/11/25(火) 23:28:10 ID:lA1Ywyl6
プチコン3号に内蔵してある電子取扱説明書の場所(起動する場所)がわからないのですがどこにあるのですか?
教えてください

590名無しさん:2014/11/25(火) 23:32:10 ID:zu43iMb.
自己解決しました。すみませんでした

591名無しさん:2014/11/27(木) 22:48:24 ID:DWKD9vFc
自分が作った画像を使ったゲームを他人に公開したいときって、
フォルダを新しく作って、そのフォルダの中だけでGRPを保存したりプログラムを組んだりして、
最終的にフォルダごとアップロードして公開って感じですか?

592名無しさん:2014/11/28(金) 20:13:40 ID:peouqp2Q
マイクラみたいなゲーム誰か作ってくれませんか
そしたらgtavそっくりのゲームの公開キーをその人だけに教えます
Facebookで友達になって公開キーを教えてください
僕も公開キーを教えます♪( ´▽`)お互い得していいと思いませんか?
誰か返事ください!!待ってます

593名無しさん:2014/12/04(木) 07:49:03 ID:DwncXLFw
スマイルツール内のMAPでつくったBGデータのロードの仕方がわかりません。

DIM A%[65796]
LOAD"DAT:MAP1",A%
BGLOAD 0,0,0,50,50,A%

MAPのソースを参考にしたこれでうまくいかないのですが、考え方として正しくないのでしょうか、、、。

594名無しさん:2014/12/04(木) 22:30:56 ID:Lb/Jfqu2
>>593
>>583

595593:2014/12/04(木) 23:43:45 ID:9YUCYSvE
>594
ありがとうございます。
既に話題に出てたのですね。
BGで検索かけたため、見逃してしまってました・・・。

596名無しさん:2014/12/05(金) 16:06:49 ID:6.OZwkjY
PUTCENTER(13,-256,"もじ")
DEF PUTCENTER(Y,Z,S$)
LOCATE (50-LEN(S$))/2,Y,Z
PRINT S$;
END

これで1行目にSyntax errorが出ました。
なぜですか?

597名無しさん:2014/12/05(金) 17:42:16 ID:Lb/Jfqu2
DEFの時に()を使うタイプのユーザー関数の作り方は、
必ず戻り値がなくてはいけないことになっています。

一行目で、
ユーザー関数PUTCENTERは戻り値を返すはずなのに、
その戻り値を活用したり受け取る方法が指示されてないのでエラーになります。

一行目を解決しても、ユーザー関数PUTCENTERは実際には
必要な戻り値を返す行為をしないので別のエラーになります。

戻り値が無いユーザー関数を作りたい場合は
()を使わないDEFの書き方をしてください。
ちなみに、その場合はユーザー関数とは呼ばず
「ユーザー命令」と呼び方が変わるようです。混同しても通じると思いますけど。

598名無しさん:2014/12/05(金) 18:11:39 ID:6.OZwkjY
>>597
PUTCENTER 13,-256,"もじ"
DEF PUTCENTER Y,Z,S$
LOCATE (50-LEN(S$))/2,Y,Z
PRINT S$;
END

()を外したら実行出来ました!
ありがとうございました!

599名無しさん:2014/12/07(日) 00:25:33 ID:3MmUzRb6
GCIRCLEの開始角終了角を使って円をだんだん描いていくっていうのをmk2でしていたのですが、
今回それがなくなったみたいで…代用する方法何かないでしょうか?
GCIRCLEで描画したものにぴったり合わさり、
かつ、だんだん円が描画されるように描画していきたいです。
GPSETをサインコサインで描いていく方法ではGCIRCLEにぴったり合わさらなかったので…。

600名無しさん:2014/12/07(日) 01:12:14 ID:Lb/Jfqu2
とりあえず、
自前で GCIRCLEで描画したものにぴったり合わさる 円を描く方法は
ttp://fussy.web.fc2.com/algo/algo2-1.htm
このページで紹介されている方法(最下部)でできましたよ

すぐ上には、少しの工夫で円弧も描ける、と説明されているので
その工夫ができればなんとかなるかな・・・?

あとは、ご自身で工夫なさるか、他の方のアドバイスを待つか、
GCIRCLEを使うのを諦めて全て自前で円を描くようにするか、でしょうか。

601名無しさん:2014/12/07(日) 02:03:48 ID:3MmUzRb6
>>600
回答ありがとうございます!
す、すごい…
これを改良して使っていきたいと思います!

602hill x2:2014/12/07(日) 09:00:16 ID:3PdlWGXc
え〜と、1~20と1~6のルーレットを同時に使えるようしてほしいです。ちなみに、クトゥルフTRPGに使おうと思っています。

603名無しさん:2014/12/07(日) 13:07:19 ID:Lb/Jfqu2
現状の、「どちらか1つしか同時に使えていない」状態の
ルーレットのソースコードを見せてください。
改善点がアドバイスしやすくなります。

604名無しさん:2014/12/09(火) 11:27:57 ID:v1lfoElo
下画面に四角いボタンをいくつか表示して
そこをタッチすると何か動作する(音が出るとか色が変わるとか)
というプログラムを作ってるんだけど
@MAIN
TOUCH OUT T,X,Y
IF X<50 AND X>90 AND Y<50 AND Y>90 THEN @SUB1
GOTO @MAIN
@SUB1
(他の命令)
GOTO @MAIN

あほな自分なりに考えてこのようにしたけど
タッチしても何も起こらない(エラーもでない)。
なにか考え方間違ってますか?
もっと巧みなやり方もあるんだろうけど
とりあえずこのやり方の間違いを教えてもらえるとうれしいです。

605604:2014/12/09(火) 11:41:47 ID:v1lfoElo
604の書き込みは不等号の向きがぜんぶ逆でした。

で、いま確認のためにRUNしたら普通に動きました。
昨夜,半徹夜でやってたのでぼけてたのかもしれません。
すみませんでした。

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

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
見た目優先の書き方ですね、処理が軽いかどうかは分かりません。
また、もっと柔軟な条件式を使いたい場合は、
こんなような書き方ではきっと無理だと思います。

731名無しさん:2015/03/28(土) 09:00:13 ID:MNK4RpLw
確かプチコンmkIIの時は、ラベル名をいっぱい書き連ねたON GOTOよりも
GOTO "@"+STR$() の方が早かったと思います。
ただし3号では中間言語化されてる方式にと、条件が大きく変わってますよね。
速度を比べてみるのもいいかも知れません。

732名無しさん:2015/03/28(土) 10:49:30 ID:K6FrvEHw
>>728
まずはありがとうございます。確かに格段に見やすく、且つ処理が軽そうです。
ただ・・・気になるのは、ラベル(センシティビティリスト相当)を2回書くというところですね。
ラベル列挙の場合その行が長くなってしまって後々ラベルが
100個 200個・・・って多くなったときにコーディングミスしてしまいそうです。

>>730
かなり最適解に近づいたと思います。
「REPEAT BREAK UNTIL文」を「GOTO @END」にしても動きそうですね。
また、自分がBASIC言語あんまり触ってなくてビックリしてるだけかもしれませんが、
ラベルってこんなにふんだんに使うものなんでしょうか。。?

>>731
mk2つかった事なかったんですが、インタプリタだったんですね。

他にもこんな風に描くともっとスッキリしてて、且つ処理も軽そう!
っていうのがあったらヨロシクおねがします。

733名無しさん:2015/03/28(土) 11:53:51 ID:MNK4RpLw
ラベルをふんだんに使うと言うか、
プチコン3号でswitch的な書き方をする時に、ラベルを多く使う以外に適当な方法が無い
ってのが正しいんじゃないかなーと。
(と言うかC言語でもcaseはラベル扱いだった気が)

プチコン3号でも呼び名だけは「インタプリタ」となってますね。
ま、細かい事はどうでもいいんでしょう、普通は無理に区別する必要が無いことですし。

そんなわけで、「様々な書き方を試してみた結果
 IF文を泥臭く書いた方が早かった!」ということもあり得るので、
本当に速さを気にするなら、つど速度比較のテストをお勧めします。

734名無しさん:2015/03/28(土) 14:01:18 ID:K6FrvEHw
>>733
やっぱそういう言語仕様なんですね。。
私がソフトウェアに疎い人間なんでカルチャーショックだっただけかも。。。
(本職ではverilogやVHDL,といったHDLという言語を使ってます。
verilogのCASE文では直値が列挙される形になっているので違和感を覚えてました。)

735名無しさん:2015/03/29(日) 00:24:00 ID:hbYUR6ZU
100万ループしてみたので報告
--------------------
テスト内容
ループごとに乱数に対応した文字を追加していくプログラム。乱数は0-3と150-153の2種類で試した。
ループ回数は100万回
対象はON(0-3)、IF(0-3)(150-153)、CHKLABEL(0-3)(150-153)、ON+DEF(IF)(150-153)の6パターン
ON(150-153)は現実的じゃないので、代わりにON+DEF手法で調べた
ON+DEFとは外部関数CHKNUMでONで調べる乱数を0-3に修正する方法

処理時間はMAINCNTの差で計測
MAINCNTは実行からのフレーム数を数えるシステム変数(fromマニュアル)
環境は旧3DS、テスト回数は1。
--------------------
結果
処理抜きループ:389
ON:746(0-3)
IF:1055(0-3)1128(150-153)
ON+DEF(IF):2139(150-153)
>>730CHKLABELそのまま:4646
>>730CHKLABEL修正:3397(0-3)
>>730CHKLABEL修正:3784(150-153)
------------------------
単純なONは高速。IFの半分程度の時間で終わった。文字列検索は時間がかかるようだ
しかし任意の数を想定した(150-153)の場合IFが最も速度が早くなった
ON+DEFを使った変換はスタックが増えるせいか6倍程度時間が掛かった
一時文字列(>>730の"@"+STR$)をあらかじめ文字列変数に代入するよう修正すると早くなった
その場合処理時間はONの9倍程度掛かり、文字列が増えると時間も伸びた

ONは条件さえ整えれば高速に動作する。任意の条件だと速度が落ちる
IFは汎用性が高く処理速度も良好。しかし保守は大変
CHKLABELは保守が楽だが相応に処理速度は遅い(IFの5倍)ラベルの文字列が長くなるとより遅くなる

736名無しさん:2015/03/29(日) 00:24:42 ID:hbYUR6ZU
使用したコード
--------------------
@START
RTIME=MAINCNT
TIME=0
TEXT$=""
WHILE TIME<1000000
INC TIME
処理
WEND
PRINT MAINCNT-RTIME
---------------------
処理内容(ON〜GOTOの場合)
I=RND(4,4)
ON I GOTO @0,@1,@2,@3
@0:INC TEXT$+"X":GOTO @END
@1:INC TEXT$+"Y":GOTO @END
@2:INC TEXT$+"A":GOTO @END
@3:INC TEXT$+"B":GOTO @END
@END
----------------------
ON+DEFに使用した外部関数CHKNUM
DEF CHKNUM(NUM)
IF NUM==150 THEN RETURN 0
IF NUM==151 THEN RETURN 1
IF NUM==152 THEN RETURN 2
IF NUM==153 THEN RETURN 3
END

737名無しさん:2015/03/30(月) 00:40:17 ID:MNK4RpLw
「デコーダーを作りたい」という部分がピンと来ていないままなのですが、
仮に、例にあるような、「特定の数値(A)が別の特定の数値(ANS)に対応する」
というだけだとしたら、配列を使うのが、多分これが一番早いと思います。

DIM TBL[ length ]
TBL[1]=XXX
TBL[2]=YYY
TBL[3]=ZZZ
IF A<LEN(TBL) THEN ANS=TBL[A] ELSE ANS=0
配列へのセットは、DATAで書いてREADで行ってもいいし。

でも、こんな単純なデータ置換じゃないからこそ、
switch文をという事だったんでしょうけど。とにかく思いついたので言ってみました。

テストの結果だと、文字列演算がネックの1つになっている印象ですかね。
プチコン3号では文字列の扱いは、内部では配列の管理と共通する部分が
あるような感じだったので、そのあたりを意識すると何か改善のヒントに繋がるかも?
そんな意味では「INC TEXT$+"ほげ"」を連発するようなプログラムの、
流れとか構造自体を何か変えることができれば良いかも知れないですけどね。

738:2015/03/30(月) 17:47:00 ID:TpJ2jeE.
すみません。なぜかセーブが出来なくなってしまいました。セーブ方法は、
save"[名前].txt"です。昨日はこれでできたんですが・・・。
エラーはIllegal function call(SAVE)です。「関数の呼び方が間違っている」です。
これであってるんでしょうか?違ったら返信してください。

739:2015/03/30(月) 17:55:14 ID:TpJ2jeE.
あ、文字数少なくしたらできました。

740名無しさん:2015/03/30(月) 20:51:36 ID:K6FrvEHw
>>735->>736
CHKNUMの使いどころが微妙にわかっていないのでアレですが、
ON+DEFの場合、CHKNUMの中でIFの実行が乱発されるので重くなってるとかないですか?
ON+GOTOは普通に早そうです。。。

>>737
それですわ!ついに解にたどり着いた感。
なるほど。配列の引数をそのまま使って、
それぞれの引数に応じた値を格納しておけばよかったんですねー。
これでIFを連呼する必要なくなりました!

741名無しさん:2015/03/30(月) 21:19:53 ID:K6FrvEHw
>>738
SAVEでエラーでると、すごいこまりますよね。
データ保存したいのにエラーで最初から実行しなおし・・・。
コード汚いですが、以下のようなプログラムでエラー回避しています。

INPUT "ファイルメイ:",FILENAME$
UNKNOWN_STR=0
FOR I=0 TO LEN(FILENAME$)-1
CHKSTR$=MID$(FILENAME$,I,1) '1文字だけ取り出して
SCODE = ASC(CHKSTR$) 'アスキーコードに変換して
IF( (SCODE==45) OR
(SCODE==46) OR
(SCODE>=48 AND SCODE<=57 ) OR
(SCODE>=64 AND SCODE<=90 ) OR
(SCODE==95) OR
(SCODE>=97 AND SCODE<=122) )THEN
'OKの場合の処理(必要なし?)
 ELSE
'NGの場合の処理
PRINT "NG →" + CHKSTR$
UNKNOWN_STR=1
ENDIF
NEXT

IF(LEN(FILENAME$)==0 OR LEN(FILENAME$)>14 OR UNKNOWN_STR==1)THEN
'ファイル名が不正な場合の処理
ELSE
SAVE "TXT:"+FILENAME$, TXTDATA$
ENDIF

742名無しさん:2015/03/31(火) 04:52:46 ID:MNK4RpLw
>>740
なんと本当に数値の対応(だけ)だったのですか。
まさかとは思ったが念のため言ってよかった。。。
「CHKNUMの中でIFの実行が乱発」と言うか、そのCHKNUMの使い方だったら
単純に150を引き算すればいいだけでは・・・と思ってしまうので、
後は、テストコードではなく実際に目的の動作をするプログラムと
実際に扱いたいデータを使って、動作テストや速度テストをやるといいと思います。
これ以上の細かいアドバイスをする場合は、
こっちも、それらを知らないと答えにくいと思います。

743名無しさん:2015/03/31(火) 08:15:57 ID:Iv/KyL5Y
>>740
問題解決したようでよかったです。
なのであとは蛇足になりますが
CHKNUMは処理内部のONに
ON CHKNUM(I) GOTO @0,@1,@2,@3
といった感じで使用しました。
質問については
確かに重くはなりますが、適合すればすぐRETURNしているのでIFで総当たりするよりは処理時間は若干短くなると思います。ELSEIFを使うようなものです。
IFの2倍以上時間が掛かったのはIFとONで実質2回比較しているのに加えて、DEF関数を呼び出す時間のせいですね。
DEFは100万回呼び出して定数値返すだけで750フレーム掛かったので
今回のテストの条件ではDEFの影響の方が大きかったと思います。

744名無しさん:2015/04/02(木) 21:50:55 ID:K6FrvEHw
[ローカル通信での同期について]
リアルタイムにPVPをするようなプログラムの場合、
親機と子機で格納されるデータが異なってしまいます。
おそらく、ローカル通信による情報の取りこぼし結果
ではないかとおもっていますが、うまく同期をとる方法、
ご存知の方いましたらよろしくおねがいします。
-----------------------------
[バージョン] プチコン3号v3.1.0
[サンプル公開ID] VK23QJ4P
-----------------------------
余談ですが、「みんなで守ってナイト」という市販のゲームでも
同様の現象が起きてしまうのを思い出しました。
プチコンうんぬんというより、3DSの仕様なのかも。と思っています。

745名無しさん:2015/04/03(金) 03:38:03 ID:VcJS5JHY
試してみましたが、動きにズレなど特に起こりませんでしたよ。
確実に症状が出る条件や操作方法などありませんか?

746名無しさん:2015/04/03(金) 18:05:04 ID:K6FrvEHw
>>745
確実に症状が出る条件を突き止めるのは難しいですが、
ふたりで1〜2戦しているとほぼ確実に出てしまいます。
上下左右に十字キーをおしつつYボタン操作、Bボタン操作。
等と、常に何かのボタンを絶えず押し続けているような状態。
が一番近いかと思います。

症状として最もわかりやすいシチュエーションとして、
片方は勝利し、ゲーム終了しているのに
もう片方は、まだゲーム終了していない状態になってしまう
ということが挙げられます。
(座標のズレやHPの表示ではわずかの差であるため、
なかなかわかりにくいです。)

747名無しさん:2015/04/03(金) 22:54:17 ID:jOwmrvXY
なるほど手元でも発症しました。
こんな検証コードを書いてみました。

ACLS
BGFILL 0,0,0,24,1,1
SPSET 0,0
MPSTART 2,"HOGE"
@LOOP
VSYNC
B=BUTTON(0,0)
IF B AND 4 THEN DEC X,20
IF B AND 8 THEN INC X,20
SPOFS 0,X,0
GOTO @LOOP

十字ボタン左右でイチゴを左右に動かすだけですが、
位置がズレたり、また位置が合ったり。
注目点は、毎フレームSPOFSを、変数Xの値に基づいて行っているので、
イチゴの位置のズレは、変数の値がズレている事を指すという点です。

これ自体は、プチコン上でのプログラムからでは、
どうしようもない事なのでしょうが、
機械語で動いている、プチコンのシステム側では、
これ以上の工夫はできないのでしょうか。難しい事だろうとは想像できますが、
バグだらけの有様見てると、これもバグかも知れないし。
公式サイトから意見を送ってみても良いと思います。

748名無しさん:2015/04/03(金) 22:56:27 ID:jOwmrvXY
次に、送信側に「MPSET 0,X」を書き加えて、
受信側はBUTTONとINC/DECを無効にした上で「X=MPGET(0,0)」としてみました。
これは、当然ながら、イチゴの位置は一致しました。
そして、受信側のイチゴの動きがカクカクになったのも想定内ですが、
送信側のイチゴの動きも少し鈍くなったように感じました。気のせい?

そこで、これらの問題点を解決する試みとして、
送信側は「B=BUTTON()」としました。
通信上のボタン情報ではなくて、直に手元側のボタン情報を取得することで、
送信側のイチゴの動きの鈍さが改善されたような気がします。

受信側では、「B=BUTTON(0,0)」とINC/DECをそのまま復活させ、
ボタン情報を受け取るようにした上で、
「IF B==0 THEN X=MPGET(0,0)」と書き加えました。
ボタン情報を参照することで、動き出しの素早さや、動き途中のなめらかさを
確保した上で、ボタンを離している時はMPGETで正確な値を得る、
両方の方式の良いところを得ようという作戦です。

これによって、目標だった、動きのなめらかさと変数の値の正確性の点は成功しました。
新たに、受信側のイチゴがときたま一瞬だけ瞬間移動してしまう問題が出ましたが、
この解決方法は・・・どうしたもんでしょう。分かりません。

749名無しさん:2015/04/03(金) 22:59:05 ID:jOwmrvXY
ともかく、通信では、ボタンやスティックといった入力の情報は
全面的には信用せず、参考程度に留めておいて、
重要な判断は、きちんと数値でやりとりして決めた方が良いでしょうね。
さらに、その数値のやりとりも、遅延というのが問題になりそうですね。

たとえば、ほとんど全部の処理を親機だけがやる、とか。
親機は、各子機のボタン状態を取得して、キャラを動かし、当たり判定をして、
子機に結果を通知する。
子機は、通知された結果を元に、キャラを指示通りの位置に表示させるなど
画面を作る。子機はローカルのボタン情報を、キャラの動き出しの反応など
補助の目的だけに使い、当たり判定には口を出さない。など。

・・・なんだか難しいプログラムになっちゃいそうな予感がします!
「ラグ 軽減 プログラムテクニック」とか、それっぽいキーワードで検索して
出てきたページには、『美しくごまかす』と書かれていましたが
(ttp://www.accessgames.co.jp/news/nws_cedec2011_2.html )
その美しいごまかし方を教えて欲しい・・・。
もう少し色んなキーワードで検索してみてもいいかも知れませんね。

サンプルには通信対戦のプログラムは入ってませんでしたっけ。
過去に、ゲームショウだかで展示された対戦格闘ゲームのサンプルを写した動画では
動きがカクカクでした。きっとMPSETだけで確実性を重視していたのでしょうね。
 → youtu.be/wyJyUSDn04E
「子機はローカルのボタン情報を補助の目的に使って、美しくごまかす」
の部分を省くと、きっとこんな風な見た目のゲームになるんだと思います。

750名無しさん:2015/04/03(金) 23:12:36 ID:jOwmrvXY
MPSET/MPGETは整数値のみで、小数点のある数値はダメとのことなので、
注意してくださいね。

751名無しさん:2015/04/03(金) 23:36:39 ID:K6FrvEHw
>>747さんのサンプルコードを併記して公式に報告おくっておきました。

ズレるものはズレるということで・・・しかたないとして。
MPGETという便利そうな関数があるようなので、
ちょっとこの辺使って、親機からデータ引っ張ってこれないか検討してみます。

752名無しさん:2015/04/04(土) 00:00:05 ID:K6FrvEHw
と・・・更新してみたら大量のレスが、読んでから対応考えまふ

753名無しさん:2015/04/04(土) 00:57:31 ID:K6FrvEHw
なるほど。。。参考になります。

とりあえず以下の処理で乗り越えて見ようと思います。
・各自の端末が処理をする。
・ずれは一定かんかくで親機からMPSET,MPGETでとってくる。

MPSET,MPGETは9個までしか変数をもてない点から
変数を送る手立ては何か工夫が必要ですね。

754ヨッキ:2015/04/09(木) 19:06:45 ID:XGIK/ZTk
437のヨッキです。
お礼するの忘れていました。
申し訳ございませんでした。
そして、ありがとうございました。

755名無しさん:2015/04/20(月) 18:33:29 ID:StfxjRhA
3号を使ってシューティングゲームを組みたいと思っていますが、組んでみたところ、
・スケートもびっくりの止まらなさ。
・自機が安地どころか画面外。
・て言うか弾撃たないとシューティングゲームじゃない。
と、問題山積。
プログラムを乗せますので、すごいプログラマの皆様に問題点を指摘、改善策をご指南頂きたいです。

@PLAYING
B=BUTTON(1)
IF B==1 THEN
PCY=PCY-0.5
SPANIM 0,0,-180,PCX,PCY,1
SPSWOW 0
ENDIF
IF B==2 THENPCY=PCY+0.5
SPANIM 0,0,-180,PCX,PCY,1
SPSWOW 0
ENDIF
IF B==4 THEN
PCX=PCX-0.5
SPANIM 0,0,-180,PCX,PCY,1
SPSWOW 0
ENDIF
IF B==8 THEN
PCX=PCX+0.5
SPANIM 0,0,-180,PCX,PCY,1
SPSWOW 0
ENDIF
IF B==256 THEN
SPSWOW 1
SPOFS 0 OUT PCX,PCY
WT=PCY-479
SPANIM 1,0,-30,PCX,WT,3
SPSTART 1
ENDIF
GOTO @PLAYING

0は自機、1は弾です。
PCXとPCYは自機の座標です。
PCYに-479しているのはXSCREEN 4を使って弾が直進するようにするためです。

是非、よろしくお願いいたします。

756名無しさん:2015/04/20(月) 20:22:35 ID:zEjBTUmw
とりあえず「SPSWOW」ではないです。

●なぜ移動が止まらないのか。
3秒間、移動し続けるようにプログラムされているからです。
「SPANIM 0,0,-180,PCX,PCY,1」
の「-180」の意味は、「移動に180フレームかける」という意味になります。
1秒は60フレームなので、180フレームは3秒間です。
▼止まるようにするには
止めるための条件を、例えば「ボタンを離した時」とした場合、
ボタンを離したことを検知して、移動を止めるプログラムを書き加えたり、
現在の「ボタンを押した瞬間、3秒間の移動を開始する」という仕様を止めて
「ボタンを押している間だけ移動させる」というプログラムに
大幅に書き換える。などが考えられます。

●なぜ画面外に移動するのか。
画面外に行かないようにするプログラムが作られていないからです。
何でもかんでも、面倒を見てやるプログラムを作る必要があるんです。
▼画面外に行かないようにするには
まず、スプライト番号0番の自機の位置を知ることから始まります。
たとえば「SPOFS 0 OUT X,Y」と書いたとして、
変数XとYの中身が、自機の位置を指す数値になります。
XSCREEN 4の場合、画面の範囲は、横が0〜319、縦が0〜479です。
変数Xは自機の横の位置、変数Yは縦の位置になっているので、
この数値を0や319の数値と比較するなどして、
「画面外に出て行ってしまっているのか、あるいは出て行ってしまいそうな状況か」
を判断します。そして必要に応じて、「画面の範囲内に押し戻す」ようにすると、
結果として自機は画面の範囲外に行かなくなります。

●なぜ弾が撃てないのか。
発射を「開始する位置」を指定していないからです。
発射ボタンを押すと、弾は現在の位置から移動するようになっています。
▼弾の発射が自機から開始するようするには
弾のスプライトに対して移動させる命令を出す前に、
SPOFS命令を使い、弾の位置を自機と同じ位置や近くの位置に移動させましょう。
あるいは、SPANIM命令自体に、移動する先の位置だけでなく
移動が始まる位置も設定する方法もあります。

757味たむ:2015/05/01(金) 11:59:43 ID:AWRgwqv6
はじめまして、プチコン初心者なんですが、プログラムを学ぶのにおすすめの本やサイトはありませんか?
mkⅡの初心者講座を見てみたのですが、3号には無い命令なども出てきて頭がこんがらがってしまいまして…(^_^;)

758名無しさん:2015/05/02(土) 23:00:07 ID:OcC0RsXo
もともと入っていたマップを作るプログラムのマップ保存と読み込みの
仕組みを教えてください。

759名無しさん:2015/05/02(土) 23:03:14 ID:OcC0RsXo
マークIIのようにマップ用のリソースはないのでしょうか

760名無しさん:2015/05/03(日) 03:32:29 ID:2Y9uFsiU
>>757
そうですね。違うプログラム言語、あるいは 違いがあるプログラム言語の
情報を参考にするには、前提として、何が違うポイントなのかを理解していたり
プログラムの知識全般をある程度知っていたりする必要があると思います。
なので、そうではない場合は、『プチコン3号を解説している』ものを
選んで探したり読むようにすると良いと思います。

その場合で言いますと、
質問の「おすすめの本」は、プチコン3号の公式ガイドブックが
最初に挙げられると思います。この掲示板の下に広告が出ているので
そこをクリックしても良いのではないでしょうか。
↓こちらでためし読みができるようです。
ttp://smileboom.com/special/ptcm3/nindori/2015/03/post.php

それ以外の書籍では、ゲーム情報雑誌「ニンテンドードリーム」や、
プログラム雑誌「日経ソフトウェア」の中で、
プチコン3号の情報やプログラム講座が載っているそうです。
プチコン3号公式サイトのトップページ最下部に、
まとまって紹介されているようですよ。
紙媒体だと、これくらいでしょうか。

次の質問の「おすすめのサイト」は、
公式サイトで、2つの初心者講座を見ることができます。
ttp://smileboom.com/special/ptcm3/beginner/
ttp://smileboom.com/special/ptcm3/nindori/lecturer/
どちらも、今はまだ内容がスカスカですが、のんびり待っても良ければ、
それでもいいかも知れません。

2番目のアドレスの方は、毎週更新する予定だそうですよ。
内容は前述の公式ガイドブックの内容と同じになるみたいです。
本を買わなくても済むかも?
↓こちらも合わせて読むと良いかもしれません
ttp://smileboom.com/special/ptcm3/nindori/2015/03/20151.php

公式が行っている以外のサイトについては、
「プチコン3号 講座」などのキーワードで検索すると良いと思います。
また、この掲示板では過去にあった同様の質問への回答として
>>673  などが寄せられているようですので、参考にしてみてはいかがでしょう。

761名無しさん:2015/05/03(日) 03:37:13 ID:2Y9uFsiU
>>758,759
プチコン3号のファイルは、テキストファイルとバイナリファイルの
2種類しか無いことになっています。画像を保存したファイルも
BGを保存したファイルも、バイナリファイルだという点では同じです。

SYS/SBMAP のプログラムでは、2種類の形式で、作ったマップを
保存することができるようになっていて、
読み込みは、そのうち1種類の形式だけでできるようです。

このプログラムで作られるマップは、

●レイヤー0からレイヤー3までの、4枚のマップを重ねて
作るようになっていますので、4つ分のデータがあることになります。

●さらに、マップ部品の種類毎に、当たり判定などの用途に
応用して使えるような情報を、レイヤー毎に持っています。

それらをふまえて、

保存する形式の1種類目は、
これらのデータを1つのファイルにまとめた形式です。
読み込みができるのは、この形式ですね。
あらかじめ決められた順番でデータが並んでいます。
それについて詳しく知りたい場合は、SYS/SBMAP のプログラムの
中身を読み解いて調べたり、あるいはネット検索で
誰かがどこかで解説したのを見つけられるかもしれません。
(ミーバースで見かけたような?)

もう1つの形式は、
マップ部品の並び順だけを、レイヤー毎に別のファイルにして記録したものです。
ですから、ファイルが4つで1組になっており、
「当たり判定などに使える情報」は含まれていません。
質問にあった「マークIIのようなマップ用のリソース」に近いものと言えます。
この形式のファイルの使い方は、次のようにします。

BGSCREEN 0,64,64  ’BGの広さを調整します
DIM D[64*64]  ’ファイルを読み込む用の配列変数を用意します
LOAD "DAT:MAP_????_L0",D  ’配列変数にファイルを読み込みます
BGLOAD 0,D  ’配列変数の内容をBGにセットします

762味たむ:2015/05/05(火) 12:29:27 ID:AWRgwqv6
>>760
ありがとうございました。これらを参考に勉強してみます。

763名無しさん:2015/05/10(日) 09:50:28 ID:OcC0RsXo
760さんありがとうございます!!
てっきりマップの画像のまま保存するかと思っていました
BGASVEでちがうものに変えてからそれをセーブするのですね

764素人:2015/05/30(土) 13:33:06 ID:CbHczVgk
こんにちは、初心者です!
公式プログラム集のMAZER byこあ/co.aさんのプログラムの最初の6行の
迷路を作っている部分の解釈ですが、横(X)、縦(Y)で30:23でブロック
をおいて迷路ができてますが、数式が複雑で、よくわかりません!
 最初の縦(Y)0行目は、横(X)に一つ目のLOCATEでブロックを一つとばしで
置いて、二つ目のLOCATEで横(X)、縦(Y)で数式で1つとばしで空いてある場所に
ブロックを置いてあるのは、わかりました。
次の縦(Y)からのブロック置いていくプログラム(数式)がよくわかりません!
できれば、わかりやすく、教えてください!

765名無しさん:2015/05/30(土) 19:37:38 ID:Xfsjq2nQ
初代プチコン用のwebページの物ですね?
http://smileboom.com/special/petitcom/pochette-mazer.html

「ブロック置いていくプログラム(数式)」を教えて欲しいという質問ですね。
このプログラムの中でブロックを置く部分と言えば、
  LOCATE X+P%2,Y-(P-1)%2
の部分ですね。
変数Pの値が重要そうなのが、見て分かりますね。
では、変数Pに値を設定している、「P=」な式を見てみると、
  P=I%176<15
  P=P+R*(P<1)
この2つがありますね。これがご質問の要になるに違いありません。

上の式の意味を見てみましょう。
0から190まで1ずつ増える値のIを、176で割った余りの値が、
15未満ならば1、そうでなければ0。という意味ですね。
この式では、変数Pは、0か1の値になります。

この式で決め打ちされている、176と15という数値の意味が気になりますよね。
試しに(プチコン3号で)、
  FOR I=0 TO 190:?I MOD 176<15;:NEXT
を実行してみると、最初と最後が1の連続になり、間に0の連続がある並びになりました。
このことから、この式の意味は、
『迷路の最上段または最下段を作る時は、変数Pの値は1』だろうと読み解きました。

最上段と最下段は、ただの壁で、通路が作られてはいけないという特徴があります。
これは、変数Pの値が1の時は迷路の生成が起こらないように
作られていると考えられますね。

766名無しさん:2015/05/30(土) 19:39:16 ID:Xfsjq2nQ
次に、下の式を見てみましょう。
この式には、変数Rが登場するので、Rに値を設定する式から見たいですが、

その前に、「(P<1)」という部分が気になります。
Pの値は0か1の2種類だけでした。そのPの値が1未満、つまり0かどうかを見ています。
Pの値が0ならば式が成り立ち1に、Pの値が1ならば0になりますね。
つまりこの部分は、『Pの値を反転させている』と解釈できます。
初代プチコンには、論理反転演算子「!」が無かったのですね。

そして、それをRと掛け算しています。
0を掛け算すると、Rの値が何であろうが0になり、
1の場合はRの値がそのまま適用される。すなわちここまでの意味は、
『Pの値が1ならば、Rの値は無効にする。0ならば、Rはそのまま有効にする。』
という意味になりますね。ちょうどIFの条件判断のような動作をさせているのです。
Rはその変数名からランダムつまり迷路生成のキモなのでしょうし、
さっき言った、変数Pの値によって迷路の生成が起こらないようにしている
という動作の部分がここなのでしょうね。

さて では その 有効と無効を切り替えられるRの値について見ましょう。
  R=(RND(2+(Y<3)+L)-L)*(X%30>0)
新たに変数Lが登場しました。これは
  L=X<3
とされていて、Xの値が3未満、つまり0か1か2の時だけ1になります。
Xの値が小さい時だけ・・・? これって、左端の壁かどうかを判別するのと
関係があるのでしょうか。よく見ると、「(X%30>0)」という部分もあり、
迷路全体の広さは横30ブロックですから、これは右端の壁の判別なのかも。
そうなると、「(Y<3)」の部分も気になりますね。

767名無しさん:2015/05/30(土) 19:40:04 ID:Xfsjq2nQ
ここまで書いて力尽きました。ごめんなさい。気力が続きませんでした・・・
ほんのわずかでも参考になれば幸いです。
後日にでも続きが書け・・・ればいいんですけど

768素人:2015/05/31(日) 22:58:23 ID:m0n609bE
765(名無し)さん、わかりやすい解説ありがとうございました。
もう一度、今回の解説を参考にして、プログラムを調べたいと
思いました!大変参考になりました!

769名無しさん:2015/06/03(水) 09:46:28 ID:AWRgwqv6
セーブ時の保存先は必ずデフォルトのフォルダになるのですか?
SAVE命令を使ってセーブするとき、デフォルトで設定してある標準のプロジェクト以外の別のプロジェクトへ保存させることはできませんか?

770名無しさん:2015/06/03(水) 11:21:24 ID:9ITdlX1M
SAVE命令時に、現在のプロジェクトとは別の
ファイル保存先のプロジェクトを指定することが可能なのは
プログラムがスマイルツールとして実行されている時だけだと思います。

PROJECT命令のヘルプの2ページ目も参考にしてみてください。
とても分かり難いですけど・・・。

要するにプログラムが実行されている時の「現在のプロジェクト」だけを
意識すればいいってことだと思います。
「作品を見る」からだと自動的に切り替えてから実行してるよ、とか。

後は、とりあえずファイルは保存しておいて、後でコピーと削除するとか、
ファンクションキーにPROJECT命令を含む一連の操作の命令を登録して
手間を減らすとか。
ちなみに直接ファイルを複製するのは、プチコン3号のメニューから
手動でのみ許されている操作です。
プログラムで行うには、変数やグラフィックページを介して
間接的に行うしかないでしょう。

771アルカリでんちマン:2015/06/07(日) 19:58:10 ID:hTBb9xQA
三角関数について、猿でも分かるくらいで教えてください。

772アルカリでんちマン:2015/06/09(火) 21:40:01 ID:hTBb9xQA
『SIN=COS+4 としたら、COSを9にすると勝手にSINに13が入る』って予想で正しいでしょうか?

773名無しさん:2015/06/10(水) 15:54:11 ID:AWRgwqv6
>>770さん
ありがとうございました。

774素人:2015/06/12(金) 16:42:26 ID:m0n609bE
768の続きになりますが、宜しくお願いします!

プチコン、プログラムリスト集のMAZER byこあ/co.aさんのプログラムで、
6行目のFOR I=0 TO 2 から 13行目、I=X/57+Y/42:NEXTの解釈なんですが、

最初、I=0 で始まり、X=29の座標になりX/57=0.5087と同じくYの値が、Y=21
にY/42=0.5になり合わさる(足し算)でI=1.009になりNEXTで6行目のFORに
戻り繰り返し(たぶん整数でI=1が代入される)考えでいいと思うんですが、
また、その後、13行目に進み、I=X/57+Y/42:NEXTですが、FOR I=1 と
ここの計算式、この場合I=1.009が合わさり、I=2.009になるのでしょうか?
実際、プログラムI=X/57+Y/42:NEXT:PRINT Iで2.009と表示されプログラム
終了していますが、I=1 か I=2 でFOR文が繰り返しされ13行目のNEXTの前
のI=X+57/+Y/42:NEXTでまた、I=1.009 FOR I=1 か I=2 に戻され13行目の
NEXTの一歩前でまた、I=1.009にな戻されると自分は、解釈してしまうんですが
どうでしょうか?また、プログラム FOR I=O TO 2を3にすると、プログラム
終了しないんですが説明できる方宜しくお願いします!

775名無しさん:2015/06/14(日) 05:41:47 ID:JVIZrV9Y
初代プチコンでは、数値は「32ビット固定小数」でした。
ですから、『たぶん整数でI=1が代入される』ということが
間違っているのですね。小数点以下の値も有効なのです。

おっしゃる通り、『X=29の座標になりX/57=0.5087と
同じくYの値が、Y=21にY/42=0.5になり
合わさる(足し算)でI=1.009に』なります。

そして、NEXTによりFORに戻ると、
省略されたSTEPにより、変数Iに1が加算されます。
その結果が「I=2.009」になります。

TOで指定された数値2よりも0.009だけ大きくなったので、
FORはループの継続をやめ、NEXTの次へ実行が移ります。

776素人:2015/06/15(月) 13:00:09 ID:m0n609bE
774、素人です!775、名無しさん!
大変、ありがたい解説ありがとうございました!

FOR〜NEXT文の使い方、と理屈がこのプログラムでよくわかりました!

自分なりに確認してみました!

1 CLS
2 FOR I=1 TO 10 STEP 2
3 PRINT I
4 NEXT:'PRINT I

そのままRUNと4行目PRINT文実行で目視確認できました!

777ひかり:2015/06/29(月) 18:27:19 ID:/48Jel1A
プチコン3号で電子書籍的なもの(第三回プチコン大喜利の社長賞の「P6姉さんと読書」的なのの、もっと
簡単バージョン。)が作りたいんです!
全くわからんのですが…
ヒントをください!

778名無しさん:2015/07/02(木) 17:03:38 ID:kpdlEBG2
プチコン3号で電子書籍リーダーを作って公開なさっている方が
いらっしゃいますので紹介しておきます。
http://d.hatena.ne.jp/gust_notch/20150326

もし「そうじゃない!」と思われたなら、どこが どう そうじゃないと感じたのか、
もう少し詳しく質問を書いてくだされば答えやすくなると思います。

779名無しさん:2015/07/17(金) 10:57:30 ID:/h8R2fJM
自作したプログラムを使うにはどうすればいいですか?

780名無しさん:2015/07/19(日) 02:02:56 ID:7aHZ34uE
「使う」とは、どういうことを指していますか?
トップメニューの「作品を見る」からプログラムは実行できます。

781名無しさん:2015/07/21(火) 21:40:42 ID:WcMZkQlI
アクションゲームで地面やブロックのBGの当たり判定ってどうやるんですか??
具体的に教えてください

782名無しさん:2015/07/22(水) 12:37:49 ID:7aHZ34uE
もしかして、あなたが質問したいのは、
当たり判定の事だけではなくてアクションゲームの基礎全般のプログラム手法
ではありませんか?

↓このページに丁寧に解説してくださっている方がいらっしゃいます。
https://miiverse.nintendo.net/posts/AYIHAAAEAAA5VHwZFPOzCA

さて、質問の「BGの当たり判定」の事だけで言うと、

プチコン3号では、BGGET命令を使う方法がよく使われます。
BGGET命令は、座標を指定して、特定の位置のBGの状態を取得する命令です。
ピクセル単位の画面上の座標値をそのまま使うこともできるので、
例えばスプライトで表示した主人公の足元のBG、なども簡単に取得できます。

サンプルゲームのジャンプくん(SYS/GAME3JUMP)でも使われている方法では、
BGレイヤーを1枚、当たり判定専用に使用し、
見た目に関係なくゼロ番以外のBGキャラクターがあるかどうかという
簡単な判断で当たり判定ができるようにしています。

もちろん、ゼロかどうかだけではなくて
特定のキャラクター番号であるかどうかを判別すれば、
壊せるブロックかどうかを判断するような事もできるでしょう。

783キジトラ:2015/08/19(水) 11:27:17 ID:pgalHUr6
今横スクロールシューティングを作っているのですが、横スクロールと弾を射つコマンドや方法が分かりません。
どうすれば出来ますか?

784名無しさん:2015/08/20(木) 03:58:33 ID:fq./BWcc
横スクロールシューティングで横スクロールするのは、
背景ですよね。
背景をBGでつくり、BGANIM命令を与えるのが良いと思います。
弾を射つには、
1.ボタンが押されるのを待ち構えるプログラムを作る。
2.弾のスプライトを用意する。
3.弾のスプライトを、自機と同じ位置に移動させる。
4.弾のスプライトにSPANIM命令を与える。
のようにするのが良いと思います。
以下に、ごく基本的なサンプルプログラムを書きます。
ACLS
BGSCREEN 0,1092,15
FOR I=0 TO 200
 BGPUT 0,RND(1092),RND(15),754  ←BGで星空の背景
NEXT
BGANIM 0,"XY",-9000,17472,0  ←背景をゆっくり横移動
SPSET 0,3481  ←自機のスプライトを用意
SPOFS 0,50,100
@LOOP
 B=BUTTON(2)
 IF B AND #A THEN  ←Aボタンが押された事を検出したら
  SPSET 1,1344  ←弾のスプライトを用意
  SPROT 1,90
  SPOFS 0 OUT X,Y  ←自機の位置を得る
  SPOFS 1,X,Y  ←弾の位置を、自機と同じ位置に
  SPANIM 1,"XY",-70,X+500,Y  ←弾をゆっくり横移動
  BEEP 67
 ENDIF
 VSYNC
GOTO @LOOP
書き写しミスあれば許して。
各命令の細かい意味や書き方は「?」で調べてください。
どうしても分からなければまた質問してください。

785名無しさん:2015/08/25(火) 18:17:47 ID:/h8R2fJM
圧縮ツールの作る手順、作り方を教えてください

786名無しさん:2015/08/27(木) 15:13:22 ID:fq./BWcc
ファイル容量を圧縮するなら、プチコンが扱うファイルと、その中身の形式について
調査と理解をすることが、最初の手順ですね。
圧縮したいデータの種類と、それらに適した圧縮方法を考えたり探したりするのが
次の手順だと思います。
自分で考える場合でも、考え方のヒントなどにするために、
インターネットで検索したり図書館で調べたり
データ圧縮の基本的な考え方やプログラム例などを見て理解しておいた方がいいでしょう。
そこまでできれば、あとはプチコンのプログラムとして、それを作り上げます。
このような手順で作ればよいと思います。

787名無しさん:2015/09/03(木) 20:35:31 ID:U4uCfM12
敵を5匹、1匹ずつランダムで動かして自機が触ったら消える用にしたいの
ですがうまくいきません、関係ない敵が止まってしまいます。
どうしたらよろしいのでしょうか?
ACLS
SPSET 100,496
SPCOL 100
DIM X[5]
DIM Y[5]
DIM ED[5]
FOR I=0 TO 4
X[I]=192
Y[I]=112
ED[I]=0
SPSET 0+I,1060
SPOFS 0+I,192,112
SPCOL 0+I
NEXT
@LOOP
GOSUB @MY
GOSUB @TEKI
VSYNC 1
GOTO @LOOP
@MY
B=BUTTON( )
IF B AND 1 THEN PY=PY-1
IF B AND 2 THEN PY=PY+1
IF B AND 4 THEN PX=PX-1
IF B AND 8 THEN PX=PX+1
SPOFS 100,PX,PY
RETURN
@TEKI
FOR I=0 TO 4
IF ED[I]==-1 THEN RETURN
R=RND(4)
IF R==0 THEN VX=0:VY=-4
IF R==1 THEN VX=0:VY=4
IF R==2 THEN VX=-4VY=0
IF R==3 THEN VX=4:VY=0
X[I]=X[I]+VX:Y[I]=Y[I]+VY
SPANIM 0+I,"XY",-16,X[I],Y[I]
IF SPHITSP(100,0+I) THEN GOSUB @ED
NEXT
RETURN
@ED
BEEP 12
ED[I]=-1
SPCLR 0+I
RETURN
GOTO @LOOP

788名無しさん:2015/09/06(日) 12:28:09 ID:fq./BWcc
●原因の箇所
 30行目、「IF ED[I]==-1 THEN RETURN」の行がマズイです。
●結論/解決方法
 RETURN を「CONTINUE」に書き換えましょう。

●解説
この付近のプログラムの動作を、順に見ていきましょう。
「GOSUB @TEKI」の命令で、ラベル@TEKIの行から実行されます。

「FOR I=0 TO 4」で、変数Iの値が、ゼロから始まり4まで1づつ増加しながら
次の行以降のプログラムが繰り返し実行されます。

「IF ED[I]==-1」では、順に
ED[0]の内容が-1なのかどうか、
ED[1]の内容が-1なのかどうか、
ED[2]の内容が-1なのかどうか、・・・を判断されます。

変数Iがゼロの時、つまりED[0]が-1だった場合を考えてみます。
「THEN RETURN」の命令によって、
GOSUBで呼ばれた位置に実行が戻ります。

その先では、「GOTO @LOOP」でループされ、「GOSUB @TEKI」で
再び変数Iがゼロから順に、ED[0]1の内容が-1なので戻り・・・。

変数Iの値がゼロよりも増えないままのループになってしまいました。
「RETURN」命令によって、サブルーチンごと戻ってしまうのが問題です。

「CONTINUE」命令を使うと、それ以降の、FORでループさせる予定の命令を
1度スキップさせることができます。
そして変数Iの値が増えて、FORループが続けられます。

789めがちゃ:2015/09/06(日) 13:59:08 ID:ho3fE5pQ
全くの初心者です。
書籍「プチコン公式活用テクニック」で、
プログラム4-02 スプライトを拡大縮小・回転させるのを、
三角関数を使って、回転軸が中心に変ったように見せかけるテクニックがわかりません。

GCLS
GCIRCLE 128,96,20,15
PNLTYPE "OFF"
SPPAGE 0
SPCLR
X=128:Y=100:PAT=68:PAL=2
SPSET 0,PAT,PAL,0,0,0
SPANIM 0,4,30
@MAIN
D=TCHX
S=TCHY
CLS
①A=RAD((D+225))%360)
②R=8*S/100*SQR(2)
X1=COS(A)*R
Y1=SIN(A)*R
SPANGELE 0,D
SPSCALE 0,S
SPOFS 0,X+X1,Y+Y1
VSYNC 1
GOTO @MAIN

①と②の計算式の意味がわかりません。
①計算処理をする事で、円内からはみだす事なく、
スプライトが回転する事はわかりました。この計算式をしないで、
A=RAD(D)とすると、はみだしてしまいます。
回転角度が135度の時、0度としてXの移動量を計算しているようですが、
なぜ135度なのか意味がわかりません。
スプライトの中心のX座標は135である事が関係しているのかと思い、
表示座標位置を変え、①の式も、変更した位置にあわせたものに修正しましたが、
やはり、スプライトの表示位置に関係なく
この計算式の((D+225))%360)が必要でした。
また、②の計算ですが、
タッチ画面の中央を押した時のYの100座標が拡大率100%としているのは
わかるんですが、8×ルート2の意味がわかりません。
スプライトの長さが16ドットなので、8がでてきたんでしょうか?
すいません、ながながと。わかる方教えてください。

790名無しさん:2015/09/06(日) 16:05:31 ID:U4uCfM12
>>788さん、うまく動きました!ありがとうございます!助かりました!

791名無しさん:2015/09/07(月) 12:57:26 ID:fq./BWcc
>>789
その本は、初代プチコンについて書かれています。
現在は初代プチコンを入手することはできません。
プチコンmkIIが近いですが、プチコンmkIIには
スプライトの回転軸を変えられる命令「SPHOME」が
用意されるようになりましたので、
そのテクニックを使う必要はありません。

さて質問について、私は三角関数は分からないので正しく答えられないと思いますが、

スプライト画像の中心の位置は、
スプライトの左上にある原点から見て、右斜め下45度にあたりますよね。
初代プチコンはスプライトのサイズは必ず16*16ドットでしたから、
縦横比が違う場合などを考慮する必要はありませんし。

そして、三角関数を使って円を描くよくあるプログラムの動作を見てみた時に、
三角関数の角度は通常の(?)角度と90度ズレているのは、なんとなく思っていまして。

その2つの角度を足して、90度+45度=135度だと思うんですけど、
・・・どうですかね? A(^^;

スプライトの大きさが16ドットだから8という数値が出てくるのか、
という部分については、それで正しいと思います。・・・きっとたぶん。

792めがちゃ:2015/09/07(月) 13:52:38 ID:ho3fE5pQ
>>791さん
135度については、なんとなくわかったような気がします。
ありがとうございます。
プチコンのスプライトの座標位置は、左上隅で、その位置辺りを
円の中心座標にし、角度、拡大率に応じて、x、y座標を修正し、あたかも、
スプライトが、スプライトの左隅座標 128,100に常に表示されるよう修正する為に、
①と②のプログラムが必要だったんですね。
確かに、「SPHOME 0,8,8」文を加えると、簡単にスプライトの中心で回転して、
x、y座標のめんどくさい修正が必要なくなりました!ありがとうございます。
ただ、円の中心座標が128,96なので、
スプライトの表示座標も128,100ではなく、128,96にした方が、
円内の調度中心でスプライトが回転するんですが、
これも、初代プチコンの仕様の関係上なんでしょうか・・・
これは、独り言です。

793めがちゃ:2015/09/07(月) 13:57:11 ID:ho3fE5pQ
>>792
スプライトが、スプライトの左隅座標 128,100に常に表示されるよう
↑間違い、
スプライトの中心がスプライトの左隅座標 128,100に常に表示されるよう
です。

794名無しさん:2015/09/08(火) 18:59:59 ID:fq./BWcc
三角関数が分からないなりに自分勝手に考えを続けてみています。
FOR I=0 TO 360
 X=100+COS(RAD(I))*50
 Y=100+SIN(RAD(I))*50
NEXT
↑これは、よくある三角関数を使って円を描くプログラムで、
変数Iの値が、われわれ人間が普段よく使う角度の値として、
ゼロ度から360度まで1度毎に点を打つ、というものですが、

普通、人間がゼロ度から1周、円を描こうと思ったら、
アナログ時計の12時の位置から描き始めますよね。
人間の感覚では「角度がゼロ イコール 12時」ですが、

このプログラムにWAITを入れて観察すると、
描き始められるのは3時の方向からです。
三角関数で角度を扱う時、90度ズレている印象の理由は、これです。
12時から描き始めるようにするには、
「FOR I=0-90 TO 360-90」と、90度ズラしてやることになります。

3時の方向がゼロ度になっていて、時計回りに角度の値が増える。
この事を踏まえて、>>789でいくつか出た数値を当てはめて考えてみると、

「225度」という数値は、スプライトの中心から見て、
左上にある原点の方角、ということに気づきました。
さっきのプログラムで225度を描かせてみると、左上の方角を指します。

SPANGLE命令でゼロ度、つまり傾き無しを指定したい時に、
225度、つまり左上の方角に対しての計算をして欲しいようにするために、
225という数値を決め打ちしていたんだと思います。

795名無しさん:2015/09/08(火) 19:04:13 ID:fq./BWcc
8という数値は、16ドットの半分、8ドットのことで、
「SQR(2)」は、正方形の対角線の長さを計算することに関係があるのだと
google先生が示してくれたので、8*8ドット分の斜めの距離に関することなのでしょう。
これを合わせると、

『中心から見て、原点(角度ゼロの場合は左上)への、角度と距離』を
求める計算式だと言える。
こう結論付けて良いと思います。・・・どうでしょうかね? A(^^;;;

そして「描いた円とスプライトの中心が微妙にズレているのは何故か?」
という疑問ですが、

(1)、とくに理由は無い。あくまでサンプルだから、だいたいで良いだろう。
(2)、人物の足元が円周に触れるようにした。
このあたりを考えてみました。
しかし、このプログラムは「回転軸を中心にする」のが目的なので、
2の理由は無理があります。やはり1か、あるいは
別の目的で作ったプログラムを流用した結果ゴミが残ったとか、
typoや校正ミス/印刷ミスの類なんじゃないでしょうか。
『だって、プチコンの書籍だし。』
↑これで通ってしまう状況・・・。編集者は反省が足りない。

このプログラムの意図を考えると、変数XとYで指定した位置に、
スプライトの中心が来るようにしているはずなので、
「左隅座標に表示される」というのは、ちょっと違うように感じますよ。
でも、使う言葉のチョイスが違っただけで、意図や言いたいことは
違ってないと思うので、問題ないですよね。

796名無しさん:2015/09/08(火) 19:15:18 ID:fq./BWcc
ぎゃあ最初のプログラムでGPSET忘れた

797名無しさん:2015/09/12(土) 23:03:00 ID:OcC0RsXo
初心者です。
アクションゲームを作りたいのですが、BGのデザインをこだわりたくてマリオのはてなブロックみたいに定義番号を変えるアニメーションは実現可能ですか?
可能ならやり方を教えていただけると幸いです。

798名無しさん:2015/09/17(木) 12:49:34 ID:kD3qX4NU
実現可能です。
最もよく使われるであろう方法は、
「グラフィックページ側を書き換える」方法です。
この方法の利点は2つあり、
画面上にはてなブロックがいくつ存在していようとも
1つの処理だけでアニメーションできることと、
当たり判定としてBGタイルの番号を利用している時に
それがコロコロ変わらないのということです。

以下は、特定のBGタイルが
アニメーションパターンとして「ABC」を表示する例を挙げます。

BGPUT 0,9,9,1 'BGタイル定義番号1番を表示
A=1 'アニメーションパターン位置の変数
@LOOP
 GPAGE 0,5 'BGタイル用グラフィックページを操作
 GCOPY A*16,32,A*16+15,47,16,0,1 'BGタイル定義番号1番の画像を書き換える
 INC A
 IF A>3 THEN A=1
 WAIT 15
GOTO @LOOP

799名無しさん:2015/09/17(木) 15:17:44 ID:OcC0RsXo
http://jbbs.shitaraba.net/bbs/lite/read.cgi/computer/43199/1345877567/798ぬおーー!!!
ありがとうございます!
2ヶ月文の悩みを解決しました。
僕が考えていたことはそのブロックをおいた座標を記録してそこにいちいちBGputすることだったのでそんな簡単なやり方があるだなんて感動しました!
ありがとうございます!

800名無しさん:2015/09/17(木) 15:18:30 ID:OcC0RsXo
http://jbbs.shitaraba.net/bbs/lite/read.cgi/computer/43199/1345877567/798ぬおーー!!!
ありがとうございます!
2ヶ月文の悩みを解決しました。
僕が考えていたことはそのブロックをおいた座標を記録してそこにいちいちBGputすることだったのでそんな簡単なやり方があるだなんて感動しました!
ありがとうございます!

801名無しさん:2015/09/22(火) 00:46:19 ID:kAQHhSO2
武器を振って攻撃するアクションゲームを作っています。
武器のスプライトの中心を柄の方にして、SPANIMで回転させて振っているように見せています。
当たりをつける段になって、SPCOLの設定が回転についてこないことを知り、途方にくれています。
どなたか、SPCOLが回転についてくるようになる方法、または当たりのつけ方の参考になるものを教えてください。
よろしくお願いします。

802名無しさん:2015/09/22(火) 20:52:26 ID:dJGoKMHI
https://miiverse.nintendo.net/posts/AYIHAAAEAADHVHhljo9Opw
↑これが参考になると思います。

・・・と言うか、私の考えでは、
当たり判定が厳密に剣の軌跡に沿って発生する必要は無いと思います。
剣が移動する円弧の見た目よりも広い範囲の
四角形型の当たり判定でいいじゃん、て。
当たり判定がスプライトの回転の影響を受け ない ことを
逆に利用したテクニックと言えなくもない? かも。

当然、「それこそが、このゲームのキモなんだよ!」と言う場合もあるでしょうけどね。
↓こんな動作サンプルも作ってみました。

SPSET 0,2244 '武器のスプライト
SPSCALE 0,4,4
SPOFS 0,50,99

FOR I=1 TO 3
 SPSET I,2347 '武器の当たり判定用スプライト。32番など透明の画像で使う。
 SPCOL I
 SPLINK I,0
 SPOFS I,0,-I*4
NEXT

SPSET 5,0 '試し切りスプライト
SPCOL 5
SPOFS 5,80,80

@LOOP
 VSYNC
 IF BUTTON(2)==#A && !SPCHK(0) THEN
  SPANIM 0,"R",-10,90,-10,0
 ENDIF
 IF SPHITSP(5)!=-1 THEN BEEP
GOTO @LOOP

803名無しさん:2015/09/22(火) 22:45:27 ID:kAQHhSO2
>>802
おおお、サンプルを使わせてもらえば解決しそうです。
これで先に進めます。
どうもありがとうございました!

804名無しさん:2015/09/23(水) 14:01:13 ID:OcC0RsXo
BGSCREEN命令でレイヤー2や3を指定したときに
out of range(範囲外の数値を指定した
が出ます。しかし、他のプログラムでBGSCREEN命令でレイヤー2や3を指定したら、errorは起こりませんでした。
BGのレイヤー2や3を指定すると範囲外の数値になる条件を教えて下さい。

805名無しさん:2015/09/24(木) 00:14:15 ID:dJGoKMHI
XSCREEN で上画面と下画面にあるBGレイヤーの数を変更しているからでしょう。
下画面のBGレイヤー番号もゼロ番から始まるのですが、
上下画面 関係なく0から3までの通し番号だと勘違いしている人を見かけます。

XSCREEN 2,c,2
DISPLAY 0
BGSCREEN 0,w,h
BGSCREEN 1,w,h
DISPLAY 1
BGSCREEN 2,w,h
BGSCREEN 3,w,h

↑勘違いの例
最後の2行はそれぞれレイヤー0番と1番を指定しないといけません。

(BGSCREENで幅や高さゼロ指定できないんだ、知らなかった)

806名無しさん:2015/09/24(木) 07:01:55 ID:OcC0RsXo
ありがとうございます!
解決しました!
番号を0から3まで上下共通と勘違いしていました。

807YUUKI:2015/09/28(月) 17:52:01 ID:XQK4O8Co
上から見た視点の運転シュミレーションゲームを作ってますが。

前後移動は出来ましたが、右折、左折が出来ません。
どなたか、教えてください。

808名無しさん:2015/09/28(月) 18:28:21 ID:dJGoKMHI
BGを回転させるということですか?
説明が短すぎて、目標がイメージしづらいですね。

より適切なアドバイスをするために、
前後移動まで出来ている、いまのプログラムを見せてもらえれば
良いと思うのですが、いかがですか。

809YUUKI:2015/09/28(月) 18:49:01 ID:XQK4O8Co
プログラムを写すのはちょっと、長くって、大変なので、出来るだけ説明します。

車(スプライト)を操作するんですが、Aボタンが押されたら、変数Yの値を引いて
Bボタンが押されたら変数Yの値を足して

SPOFS 1,x,y

という感じです。

それとも、公開キーをのせた方が良いですか?

810名無しさん:2015/09/28(月) 20:23:52 ID:dJGoKMHI
「運転シミュレーション」と言うからには、
右折や左折と言っても
90度カクッと曲がるようなものではないと思います。
その場合は、車の動きを、

「速度と角度」という考え方をすると良いと思います。

アクセルを踏むと速度が増え、
ハンドルを回すと角度が変わる。

作るプログラムとしては、例えば、
Aボタンを押している間だけ、速度の変数が増加して(上限あり)
速度がゼロより多い場合だけ、
角度の変数が、スライドパッドの左右に応じて変化する。
そして、角度に従った方向に、速度に従った分だけ移動する、
というような手順になると思います。

「角度と速度」と言うと・・・、
三角関数を使うことを最初に思い浮かべます。
三角関数を使ってみてはいかがですか。

参考になるかどうか、
http://dam edam epg3q.web.fc2.com/pettitcom3_1g.html
↑タイトル画面ではBGを回転させずスプライトを回転させる、
ゲーム本編ではBGを回転させてスプライトは回転させない、という
2種類の表現方法がどちらも含まれて居ます。

811名無しさん:2015/09/28(月) 20:24:51 ID:dJGoKMHI
NGワードが含まれていると言われてしまったので、
URLは修正してください。

812YUUKI:2015/09/28(月) 21:03:40 ID:XQK4O8Co
すいません。

三角関数はよくわかりません。

もう少し分かりやすくお願いします。

何度もすいません

813名無しさん:2015/09/28(月) 21:25:08 ID:dJGoKMHI
BGは動かないままスプライトだけが動くもの、っぽかったので、
最適なサンプルとして、

100円ショップにも売ってるような、
有線のラジコンおもちゃを再現した
プチコン3号のプログラムがあったので

紹介しようと思って探し回ったが、どうしても見つからない。
仕方が無いので次点として、
https://miiverse.nintendo.net/posts/AYIHAAAEAAASVZKbJYEz9A
↑これを紹介しておきます。
これもちゃんと参考になりますので。

814未来人A(\⌒∀⌒/):2015/10/03(土) 15:43:05 ID:z5FNY/nU
今、パチンコゲームを作ってるのですが、玉の動きを再現するのが難しいです。

玉が釘に当たったときに、どんな風に玉を動かせばいいと思いますか?

815YUUKI:2015/10/03(土) 15:44:58 ID:z5FNY/nU
皆さん、ありがとうございました。

無事、動かすことが出来ました

816名無しさん:2015/10/04(日) 05:12:43 ID:VtMwAtH2
>>814
プチコンmkIIでパチンコを作った方がいらっしゃいますので、
それを参考になさってみてはいかがでしょう。
http://wiki.hosiken.jp/petc/?Toukou%2FPACHICOM!

もしプチコンmkIIを持っていなくてもPCがあるなら
http://micutil.com/ptcutilities/top.html
このソフトを使用してQRコードからソースコードを見れます。

817YUUKI:2015/10/04(日) 15:14:54 ID:z5FNY/nU
すいません。

PCもmkllも持っていません。

818名無しさん:2015/10/05(月) 17:48:49 ID:VtMwAtH2
「CHRED on Android」というアプリで
QRコードからソースコードが読めるらしいですよ。

>>815で解決済みだったようですから、いまさらですね

819きりん:2015/10/10(土) 02:13:55 ID:D1UGPntE
hspをやっていたので、基本はだいたいおさえているとおもいます。
プチコンにきょうみをもち、
いまこうして制作しているわけですが、フラッピーバードみたいなのを作ってみようとおもい、ジャンプのシステムや、スプライト、bg、スクロールなどと、ヘルプや説明書をたよりにして、だいぶ形になってはきたのですが、
さて、そろそろ敵作るかと思ったときつまずきました。
ステージごとに敵の情報読み込んだら楽だなと思ったんですが、どうすればいいのでしょう?
サブルーチン使ってそれからどうすれば?
移動はしないつもりなので、二次元配列使おうと思ったのですが、代入のしかたがよくわかりませんし、もし、それよりもよい方法があるなら、教えてください。
あと、スプライトのアニメもよくわかりません。

820名無しさん:2015/10/10(土) 12:25:15 ID:VtMwAtH2
「フラッピーバード」とやらを知らない人でも回答しやすいように、
もう少し質問の内容を分かりやすく書いて欲しいと思っています。

具体的に、敵の何について、つまづいているのですか?

821きりん:2015/10/10(土) 22:03:11 ID:D1UGPntE
今のところ、『かわさなければいけない迫ってくる壁』は、一列に配置するとき、乱数でどこかに穴を開けているのですが、

■←みたいな状態。




でも、難易度があがってきたら、

□■□□□□□
■□□□■□■
□□□■□□□
■■■□□□■

これだけじゃ、まったくどんな感じかわからないと思うので、一応見せられるようにはなったものを投稿しておきます。

みたいな感じにしたいんですが、
皆さんは、こういう敵の情報(位置、たまの発射間隔とか)はどのように扱っているかが知りたいのです。

822名無しさん:2015/10/11(日) 00:03:07 ID:VtMwAtH2
「投稿しておきます。」が、どこに投稿されたのか分からなかったので
質問の要点を想像で補って答えます。違うと思えば追加で質問してください。

■強制スクロールゲームで、敵の出現する位置の管理方法。
最初から入っているサンプルゲームの GAME4SHOOTER では、
プログラムの末尾に DATA として、
文字列化した地形データと共に、敵の出現位置も混ぜて記載しています。
また、GAME3JUMP では、BGの地形データを記録した DAT ファイルの中で、
やはり地形データに混ぜて、敵の出現位置を記録しています。

■敵の種類毎に、放つ弾の種類を変えるなどの個性を付ける方法。
GAME4SHOOTER では、400行目以降あたりで、
それぞれの敵や敵の放った弾の、動き方や行動をプログラムで書いています。
これを呼び出すのは、368行目でスプライトの内部変数から取得した数値を元に
375行目でJMPTBL$[]にあらかじめ用意しておいたラベル名でGOSUBしています。
つまり、敵やミサイルのスプライトを作成する時に、スプライトの内部変数に
敵の個性ごとに付けた番号を記録しておき、あとでその数値を利用して
それぞれの個性を表現するためのプログラムを、呼び出し分けています。

823きりん:2015/10/12(月) 21:13:23 ID:D1UGPntE
そうなんですね。
でも、そうなると大変になってなかなかrpgやシューティングにはてがでません。
あ、ちなみに投稿プログラムのぺーじのjumpbirdって言うやつです。
mapがいるとなると、急にめんどくさくなり、挫折しちゃうんですが、それだけの熱意がないなら作るな!っていうことなんですね。
勉強になりました。
今度は作ってるときにあらためて質問させてもらうかもしれませんが、
その時はお願いします。

824名無しさん:2015/10/13(火) 00:51:28 ID:VtMwAtH2
もしかして、狭い洞窟を進むみたいな感じにしたかったのかな。
だんだん道幅が狭くなっていく自動車ゲームとか よくあるけど、
それを応用すれば、
プログラムで自動生成する方式でも出来そうですけどね。
ま、それはまた質問された時ですね。

825名無しさん:2015/10/13(火) 23:36:02 ID:OcC0RsXo
似たような質問があったのですが僕にはそしゃくが不可能でした。
アクションゲームでbgをスクロールさせて特定の位置に来たら敵が現れるみたいなの作りたいです。
長めのステージにしたいので文字列であまりやりたくないのですが、よい方法を教えて下さい。

826名無しさん:2015/10/14(水) 23:56:28 ID:VtMwAtH2
最初から入っているサンプルの GAME3JUMP のプログラムでは、
文字列ではなくBGデータの中に、敵の情報を埋め込んでいるので、
それを利用して、敵の出現する位置と敵の種類を決めています。

681行目から、BGを全マス検査して、
684行目で、敵を示す特定のデータかどうか判別して
685行目で敵の出現用変数に登録しています。
BGをスクロールさせる時に、370行目からの処理で、
その変数を確認し、敵を出現させています。
(このプログラム、敵のスプライトの消去はしてないんだな・・・)

要点は、BGのスクロールの位置と、敵が出現するための位置の
2つを、敵を出現させる条件に使うということですね。

その他の方法としては、
強制スクロールなら、経過時間を使ってもいいですね。
でも大抵の場合、BGもスクロールさせているでしょうから
それを使っても同じですけど。

827名無しさん:2015/10/15(木) 21:15:21 ID:OcC0RsXo
ありがとうございます
横着してbgのスクリーンのマスをすべてチェックするという発想はありませんでした

828匿名:2015/10/19(月) 11:35:35 ID:g8GEB.wg
パチンコゲームを作ってるのですが、玉を50個とか、たくさんつかいたいです。

SPCOLやSPHITSPなど50こ分もやると大変です。

何かいい方法はありませんか?


いい方法はありませんか?

829名無しさん:2015/10/22(木) 12:27:36 ID:VtMwAtH2
「大変」が何を指しているのかにもよると思います。

SPCOLはSPSET直後に各1回やるだけだと思うのですが、
毎フレーム、角度ごとにSPCOLして当たり判定、とかしているのでしょうか。

処理が重いことを言っているのなら、
ソースコードを晒して、習熟者から改善案が来ることを期待する、とかかな。

830プチコン歴1年なのに初心者:2015/10/24(土) 00:33:33 ID:UGEbzZw2
シューティング作ってますが、常にスプライトが動くようにアニメーションの設定がしたいのですが分かりません…

831名無しさん:2015/10/24(土) 02:54:14 ID:VtMwAtH2
とりあえずSPANIMの最後に,0を書けば動かし続けられますが。
SPSET 0,0
SPANIM 0,"XY",-99,99,99,-99,0,0,0
それではできない動きをさせたいのですか。

832名無しさん:2015/10/26(月) 19:58:33 ID:OcC0RsXo
MMLで楽譜の始まりにあるキーとか調とか言うものの定めかたを詳しく教えて下さい

833あまさとしおん ◆vCvQmsUz9g:2015/10/26(月) 20:57:53 ID:m6Uo1s2g
>>832
定める必要はないのではないなぁ
すでに打ち込んだものを高くしたり低くしたい、という意味なら@Dで±200セント程度まで動かせるよ

834あまさとしおん ◆vCvQmsUz9g:2015/10/26(月) 21:01:41 ID:m6Uo1s2g
楽譜の最初に「ミ」のところにシャープがついてたとすると、

こんな感じ
CE#DFE#DDE#

それぞれの「ミ」にシャープを付ければいいだけ

さっきの書き込み、誤って最初の文が2重否定になってるけど「定める必要はないのでは」っていう意味です。

835名無しさん:2015/10/27(火) 17:52:31 ID:OcC0RsXo
ありがとうございます
では#が2つ最初についていたら@Dを何にすればいいですか?

836プチ:2015/10/27(火) 18:31:22 ID:g8GEB.wg
プチコンでメダルゲームを作っています。(メダルを投入してメダルを落とすゲーム)

上から見た感じの視点なのですが、メダルにメダルが当たったときや、メダルに壁が当たったときの動きはどのようにすれば良いですか?

837名無しさん:2015/10/28(水) 13:47:28 ID:VtMwAtH2
そういうメダルゲームの性格上、四角形しか設定できないSPCOLでやるのは
ゲームとして我慢できないほど不自然になるだろうと思うので、
https://miiverse.nintendo.net/posts/AYIHAAAEAADHVHhljo9Opw
↑これを使うなどして、円形の当たり判定を自前で行うようにするのが第一歩だと思います。

当たり判定の問題は解決済みだよ、質問中の「動き」に当たり判定は含まれていないよ、
という場合は、そのあたりの説明を書き加えて質問を続けてくださると良いと思います。

838名無しさん:2015/10/29(木) 18:19:13 ID:OcC0RsXo
MMLについてです
ありがとうございます解決しました

839名無しさん:2015/11/01(日) 15:49:47 ID:OcC0RsXo
疑似3Dゲームを作るに当たって視点からの距離と見える大きさは反比例するのですが、円を表現する際には楕円形のようになります。では、正確な計算をするにはどうやればよいですか?

840名無しさん:2015/11/01(日) 21:51:05 ID:0rZ7/vJU
>>839
正方形(見た目は台形)に内接する円(見た目は楕円)を描けばいいだけでは?
つまり、パースがついた正方形が描ければパースのついた円は描けるってこと。

841名無しさん:2015/11/02(月) 19:41:14 ID:OcC0RsXo
ありがとうございます。しかし、横長の楕円を横線で区切ったとするとその区切られてできた2つは対称になるとは思えないのですが…

842名無しさん:2015/11/02(月) 20:13:55 ID:0rZ7/vJU
>>841
なぜ、対象になるように分割してしまうの?

ちゃんと正方形(見た目は台形)に内接する円(見た目は楕円)を描いてみて。
そしてそれに区切り線を実際に入れてみれば言っている意味が分かると思う。

843名無しさん:2015/11/02(月) 21:57:07 ID:OcC0RsXo
ありがとうございます。
やってみます

844名無しさん:2015/11/02(月) 21:59:16 ID:OcC0RsXo
今頃すみません
文が間違っていました
×対称になるとは思えないですが
○対称になってしまうと思いますが

845名無しさん:2015/11/10(火) 20:38:42 ID:tabn7mZk
http://www.geocities.jp/obono_kun/storage/petitcom_util/ptcm3_qpsk.html の使い方が全く分かりません。
txtファイル(UTF-8,UTF-16)でやってもpngファイルでやってもプチコンの方で内容が表示されません。
誰か助けてください。

846名無しさん:2015/11/18(水) 23:23:49 ID:tZdnOVW6
サウンドに関する質問です。
現在シューティングゲームを作っているのですが、
mmlで作成した効果音と、同様にmmlで作ったbgmを一緒に鳴らすにはどうしたら良いのでしょう?

847名無しさん:2015/11/20(金) 07:37:15 ID:FRQ2BnCA
>>845
そのツールの使用はあきらめて、同種の別のツールを使うと良いと思います。
絶対にそのツールを使わなければならない理由があれば別ですが・・・無いですよね

>>846
BGMPLAY命令で「トラック番号」に別の数値を指定すれば良いと思います。

@ONGAKU
DATA "音楽のMML"
DATA 0
@KOUKAON
DATA "効果音のMML"
DATA 0
BGMSETD 128,@ONGAKU
BGMSETD 200,@KOUKAON
BGMPLAY 1,128 '音楽を鳴らす
BGMPLAY 2,200 '効果音も鳴らす

848名無しさん:2015/11/20(金) 20:58:55 ID:twvYpPAQ
>>847
すみません。
分かると思いますが、当然あるんです。

849名無しさん:2015/11/21(土) 11:58:45 ID:pJsFjZ1Y
w

850nacla:2015/11/28(土) 16:37:03 ID:bU3HEYbI
すみません。衝突判定について質問です。
変数=SPHITSP(管理番号,相手管理番号)で変数には何が入るですか?

851名無しさん:2015/11/28(土) 17:55:15 ID:FRQ2BnCA
>>848
ふーむ、全く想像つかないです。

>>850
「戻り FALSE=衝突なし、TRUE=衝突」
と書かれていますよ。

852nacla:2015/11/28(土) 19:01:58 ID:bU3HEYbI
あざす!

853名無しさん:2015/11/29(日) 14:13:20 ID:bU3HEYbI
SPCOLの範囲指定で、幅と高さとは何ですか?

854名無しさん:2015/11/30(月) 07:22:34 ID:twvYpPAQ
http://myu314.org/studyroom/product/pisend2/ は再生できないし

855名無しさん:2015/12/01(火) 20:32:14 ID:FRQ2BnCA
>>853
「判定領域の幅と高さ」と説明されています。
□□□□□□□□
□□□□□□□□
□□□■■■■□
□□□■■■■□
□□□■■■■□
□□□□□□□□
全体の大きさが8x6ピクセルのスプライトがあったとして、
その画像のうちの、やや右下の一部分だけを(上図■の部分)
スプライトの当たり判定命令に反応させたい場合は、
SPCOL i,3,2,4,3
のように書きます。
後ろの2つの数字が、■の部分が、横に4つ、縦に3つの大きさの範囲だ
ということを指しています。
(※書式では省略できないとなっている引数も省略できるみたいです?)
逆に、幅と高さの数値を大きくすると
見た目の表示よりもずっと広い範囲に当たり判定の領域がある
スプライトなんてのも作れます。

もしかして、このような質問が出るのは、
範囲の「左上と右下の位置を指定する」タイプの命令と、
範囲の「左上の位置と幅と高さを指定する」タイプの命令があって
統一されていないと感じて混乱してしまうのかもしれませんね。


>>854
そのページ内で紹介されている、別のツールを使ってみてはいかがですか。

そもそも、音を使ってデータを転送するツール類は、基本的に
「分かる人だけ使ってくれ。分からない人は諦めろ。」という性質があります。
超簡単にできるようになると、任天堂から潰されるかも、と心配するからです。

自分には、公開されているツールがどれも使えなかった、という場合には、
あるいは、自分でツールを作ってしまった方が早いかも知れませんね。
そうすれば確実に、自分が使いこなせるツールが出来上がりますよ。

856名無しさん:2015/12/27(日) 18:52:32 ID:OcC0RsXo
立方体の疑似3Dのようなものを描きたいのですが奥行きの長さの計算方法を誰かお願いします

857名無しさん:2016/01/06(水) 18:12:09 ID:7hKCAkBE
これから、PCでやってて、面白かったけど、PCが古くてガクガクになって出来ないゲームをプチコンに移植したいのですが、わからないことがあるたんびに質問すると、思うので、返事をしていただけると、嬉しいです。

858名無しさん:2016/01/10(日) 12:35:23 ID:qoVZ2tUo
プチコン&プログラム初心者です(^^;)

簡単なテキスト型対戦ゲームを作りたくて、各キャラクターの攻撃力、防御力というイメージの変数を設定しようとしているんですが、

キャラクター1
KOUGEKI=100
BOUGYO=80

キャラクター2
KOUGEKI=90
BOUGYO=70

KEKKA=KOUGEKI-BOUGYO


…あれ?これじゃキャラクター1とキャラクター2のKOUGEKIとBOUGYOの変数の名前がかぶっちゃってる…

キャラクター1
KOUGEKI1=100
BOUGYO1=90

キャラクター2
KOUGEKI2=90
BOUGYO2=70

みたいにしなくちゃ、変数の差別化がはかれないのか…


でもこれじゃキャラクターの数が増えると

キャラクター211
KOUGEKI211=89
BOUGYO211=76


キャラクター1とキャラクター211の対戦
KOUGEKI1-BOUGYO211

キャラクター53とキャラクター572の対戦
KOUGEKI53-BOUGYO572

とか、めんどくさいことになってきそう。


どれだけキャラクターが増えても、キャラクターごとの変数を記録して、対戦させるたびに記録を呼び出して、どの計算も

KOUGEKI-BOUGYO

でまとめられないかな…


と、思ったんですが…そういう方法ってありますか?

うまく伝わるかなぁ…

859名無しさん:2016/01/10(日) 23:17:17 ID:KU4.qz9Y
今すぐヤレる出会い系ランキング
http://urx.mobi/qgJu

860名無しさん:2016/01/13(水) 01:21:53 ID:gW1Zusqo
夜分に失礼します。
BGを用いたラスター処理は可能なのでしょか。
可能ならどのようなフローチャートになりますか。

861名無しさん:2016/01/13(水) 01:26:52 ID:gW1Zusqo
>>858
配列変数を使用してみてはいかがでしょうか。
配列変数を用いればfor文等を駆使することである程度変数をコントロールできるので便利です。

862858:2016/01/13(水) 07:44:51 ID:qoVZ2tUo
>>861

回答ありがとうございます。

回答がもらえるまでの間に自分なりに調べて配列変数のDIMやVARといった命令が、突破口になるかもしれないというところには行き着いたのですが、

現状は『その使い方はどうするんだろう?』というところで止まっています
( ̄〜 ̄;)

配列変数を宣言…?

KOUGEKI1=90
KOUGEKI2=80

のように指定するには…?


命令があることがわかっても使い方がわからないとダメですね(^^;)


使い方の例などを教えてもらえるとうれしいです。

863Extra:2016/01/23(土) 09:01:04 ID:jRYQHqCo
画面内のスプライトが1つだけになったらゲーム終了見たいなことはできますか?

864だれかさん:2016/02/01(月) 18:11:58 ID:18DaNJiM
あの…プチコンでAI…つまり人工知能は作れるのでしょうか…出来ればプログラム教えて下さい

865名無しさん:2016/02/14(日) 18:02:28 ID:F9m7NQ5.
人工知能?
あなたが思ってる定義によりますね。
やれと言われたことに対して、何かやるとプログラムさせたのは、人工知能か?と言われれば。かんけいないとはいいがたいし

学習するプログラムなんて、将棋ですらスーパーコンピューター使ってんのに、ロボットにのせるとなると、何年後の話ってなるし…
そういうことです。プチコンで作った人工知能をどうしたいのかによる。
シリてきなおしゃべりプログラムを作るとか。

人工知能っていう言葉はとても幅広いので、そこらへんはwikiでみて!みたいな感じです。

不可能はないと思いますよ

866名無しさん:2016/02/14(日) 18:11:02 ID:F9m7NQ5.
ドラクエみたいなマップの表示についてです。(RPGの背景です。)
マップ作成ツールなどは、標準でもついておりますが、それを読み込んだとして、
山のチップが前にあるから前には進めない
みたいな判断は出来ないと思っていますが、あってますか?

その場合は、どうすれば良いのでしょうか?
また別に配列変数に0や1いれて、0は行ける場所だから進める。みたいなことを

867名無しさん:2016/02/14(日) 18:13:29 ID:F9m7NQ5.
ドラクエみたいなマップの表示についてです。(RPGの背景です。)
マップ作成ツールなどは、標準でもついておりますが、それを読み込んだとして、
山のチップが前にあるから前には進めない
みたいな判断は出来ないと思っていますが、あってますか?

その場合は、どうすれば良いのでしょうか?
また別に配列変数に0や1いれて、0は行ける場所だから進める。みたいなことをやっていくのでしょうか?
それとも、自分でマップエディターから作らなければいけないのでしょうか?
(置いたチップを判断して、配列変数に組み込むみたいな)
いい方法があれば教えてください!

868名無しさん:2016/03/12(土) 12:25:18 ID:1O7z83/.
ナンプレの解答プログラムについて

別サイトで紹介されている公開キーでダウンロードしてみましたが起動されませんでした。
ファイル名:FKN_NUMPLE
容量:33072(本体)+1828(セーブデータ)=34900
公開キー:WKDYN334
中身を見てもどこが原因かわかりません。
どなたかわかる方いらっしゃいますか?

869名無しさん:2016/03/12(土) 22:32:01 ID:NTLsHFLw
GLINEの命令をGPSETで再現しようと思ったのですがどうにも一致しません
どなたかどこが間違っているのか教えてください

SX=10:SY=50
GX=380:GY=200

A=(GY-SY)/(GX-SX)
B=SY-A*SX

FOR X=SX TO GX
Y=A*X+B
GPSET X,Y,#WHITE
NEXT

GLINE SX,SY,GX,GY,#RED

870名無しさん:2016/03/12(土) 22:44:13 ID:NTLsHFLw
>>867
BGGET命令なら指定した座標に設置されているBGの番号がわかるので
番号が山のものなら進めない、道のものなら
進めるみたいにすればいいんじゃないでしょうか

871名無しさん:2016/03/14(月) 19:19:07 ID:UmB/XXIw
ナンプレの件
1121行目をSPCHRじゃなくSPSETにして次の行に
SPOFS SUBX+SUBY*9,TCH_PXY(SUBX)+5,TCH_PXY(SUBY)+5 を追加でどうでしょう?

872名無しさん:2016/03/15(火) 00:13:58 ID:qo4LuNY6
>>871
起動しました!
本当にありがとうございます。見ておられる方がいらっしゃらないと思ってたのでとても助かりました。

873名無しさん:2016/03/15(火) 05:06:55 ID:hsej5goA
社畜嫌いなワイが、仕事効率化して定時帰り実践した結果wwwwwwwww
http://bit.ly/1R5Aroe

874名無しさん:2016/03/18(金) 14:13:50 ID:7B2H3Ggc
今RPGを作っていますがBGとスプライトの当たり判定が上手くいきません。
スプライトが中心で背景を動かすパターンです。
今は
CX=FLOOR((スプライトのX座標+BGのX座標)/16)
CY=FLOOR((スプライトのY座標+BGのY座標)/16)
CH=BGGET(0,CX,CY)

みたいな感じでやっていますが上手くいきません。上に当たって上の移動量が0の時,横方向に移動出来ない等です。
分かる方教えてください。

875名無しさん:2016/03/18(金) 14:15:16 ID:7B2H3Ggc
今RPGを作っていますがBGとスプライトの当たり判定が上手くいきません。
スプライトが中心で背景を動かすパターンです。
今は
CX=FLOOR((スプライトのX座標+BGのX座標)/16)
CY=FLOOR((スプライトのY座標+BGのY座標)/16)
CH=BGGET(0,CX,CY)

みたいな感じでやっていますが上手くいきません。上に当たって上の移動量が0の時,横方向に移動出来ない等です。
分かる方教えてください。

876名無しさん:2016/03/18(金) 22:42:24 ID:UmB/XXIw
情報が少ないのでなんとも言えないですが進行方向の数値が入らないからなのでは?

877名無しさん:2016/03/20(日) 13:40:43 ID:zNDP5G8c
【画像あり】カキ(生食用)をフライにして食った結果wwww
http://bit.ly/1R5Abpa

878名無しさん:2016/03/21(月) 16:55:57 ID:hw6fYFhM
アクションゲームを作りたいんですが
プレイヤー(SP)とブロック(BG)の衝突がうまくいきません

毎ループ、プレイヤーの四隅の座標でBGGETを
使ってプレイヤーとブロックが重なっているかどうか調べているんですが
そのあとにどうプレイヤーの座標を
ブロックと接触する位置に移動させればいいか
わかりません
どうすればいいんでしょうか

879名無しさん:2016/03/21(月) 20:02:10 ID:UmB/XXIw
SPの位置+移動量でBGGETして障害物があれば移動量を0にすればいいのではないかと思います

880名無しさん:2016/03/21(月) 20:32:07 ID:hw6fYFhM
>>879
それだと移動量が1を越えるとプレイヤーとブロックの間に
入り込めない隙間が発生してしまうんです

プレイヤーとブロックが重なったときに
プレイヤーを押し出してブロックと密着
させられるようにしたいです

881名無しさん:2016/03/24(木) 18:40:23 ID:UmB/XXIw
繰り返し処理でやってみるとか
ちょっとサンプル作ってみました。SPJ3ND

882名無しさん:2016/03/25(金) 11:25:59 ID:Dct/03r.
RPGを作っているのですが自分のキャラが他のキャラにあたった時どうしても重なってしまいます
ドラクエやポケモンのように4方向どこからでもキャラクター同士が重なり合わないようにするにはどうすればよいでしょうか?

現時点では自分のキャラが他のキャラに当たる→そのまますり抜けるといったところです

883名無しさん:2016/03/25(金) 17:37:45 ID:UmB/XXIw
詳しい内容が分からないので思いつくことを書きます。

SPHITSPで衝突時に移動量をマイナスする。
全キャラの座標が自分の移動先にいるかを調べる。
キャラのいる場所に画像ないBGなどを配置してBGGETで調べる。

いま思いつくのはこれくらいです。

884名無しさん:2016/03/25(金) 18:06:57 ID:Dct/03r.
>>883
うまくいきました!SPHITSPでうまくいきました!

885名無しさん:2016/03/25(金) 18:11:44 ID:Dct/03r.
すみませんうまく行ったと思ったのですが上方向以外から進むと挙動がおかしくなります
全キャラの座標が自分の移動先にいるかを調べる。
キャラのいる場所に画像ないBGなどを配置してBGGETで調べる。
この2つだとどちらのほうが簡単でしょうか?

886名無しさん:2016/03/25(金) 18:35:26 ID:UmB/XXIw
実際に打ったわけではないので予想ですが

移動が1ドット単位ならキャラの座標を調べる
移動が16ドット単位ならBGの配置

が良いのではないでしょうか

887名無しさん:2016/03/25(金) 18:59:07 ID:Dct/03r.
多分1ドットのほうになります。キャラ座標を調べて移動しないようにするには
どう打てばよいでしょうか

888名無しさん:2016/03/25(金) 22:01:59 ID:UmB/XXIw
ちょっと粗いですがサンプル作りました。
DXXP34D

889名無しさん:2016/03/25(金) 22:21:20 ID:Dct/03r.
サンプルまで作ってくださりありがとうございます!

890名無しさん:2016/03/26(土) 01:27:26 ID:qBTpAIys
ワイ、友達に借りたPCをwin10にしてしまう
http://bit.ly/1R5AhgJ

891名無しさん:2016/03/26(土) 07:54:31 ID:Dct/03r.
スプライトで描画したキャラクターにAで話しかけるにはどうしたら良いでしょうか?

892名無しさん:2016/03/26(土) 08:23:15 ID:UmB/XXIw
移動時の判定を応用して、向いている方向の指定範囲内に居る場合に反応させればいいのではないでしょうか

893名無しさん:2016/03/26(土) 09:50:23 ID:Dct/03r.
ちとやってみます!

894名無しさん:2016/03/26(土) 10:29:07 ID:Dct/03r.
うーんやってみましたがうまく行きません...

895名無しさん:2016/03/26(土) 12:21:12 ID:UmB/XXIw
前回のサンプルに追加しました。
7328EXZF

896名無しさん:2016/03/26(土) 12:23:27 ID:Dct/03r.
わざわざ作ってくださったのですか!
感謝です!

897名無しさん:2016/03/27(日) 14:44:53 ID:Dct/03r.
BGに当たり判定をつけるにはどうすればいいでしょうか?
BGGETなどを使うのですか?よくわかんないです....。

898名無しさん:2016/03/27(日) 21:46:46 ID:UmB/XXIw
SPJ3ND
上のほうでも出しましたが、スプライト移動時のBGとの衝突サンプルです

899名無しさん:2016/03/28(月) 07:43:11 ID:Dct/03r.
BGの当たり判定までありがとうございます...!

900名無しさん:2016/03/29(火) 07:00:06 ID:Dct/03r.
特定の障害物にだけ当たると場所移動させるには、どうすればいいですか?

901名無しさん:2016/03/30(水) 18:58:45 ID:UmB/XXIw
スプライト表示の岩とかを押すっていう意味かな?

それともワープして自分が場所移動ってことかな?

905143 ◆aKB.iGjaO.:2016/04/16(土) 20:41:49 ID:dHZTaD76
質問です。プチコンの電子書籍って需要ありますか?返答お願いします。

906名無しさん:2016/04/16(土) 23:32:25 ID:UmB/XXIw
電子書籍は見たこと無いけど完成したら一度見てみようかな?

907ゆうき:2016/05/18(水) 17:59:19 ID:3NlfpdHg
助けてください。

久しぶりに起動してメダルプッシャーゲームを作ろうと思い、とりあえずスロットは出来たんですが、肝心の台が動いてコインを投入するとコインが押し出されてコインが落ちるという仕組みが出来ません。

出来れば、斜め上から見た視点にしたいのですがどうすれば良いのでしょうか?

教えてくださいませ

910143 ◆aKB.iGjaO.:2016/05/21(土) 18:23:34 ID:7htxd/bk
906>>すいません。挫折しましたorz

911さとき:2016/05/22(日) 06:57:44 ID:dl9tGZV6
すいませんが、コメントが打てないらしいです。626mhtが

912PGN:2016/05/24(火) 06:35:19 ID:dl9tGZV6
いつもありがとうございます。管理人さん。

頑張ってください。

913PGN:2016/05/24(火) 06:36:01 ID:dl9tGZV6
管理人っていつも何してる?

914Kensew:2016/10/23(日) 17:55:48 ID:F2vZrwKU
...

921Kensew:2016/11/06(日) 20:47:52 ID:QsADVqxc
3Dゲームってつくれますか?つくりたいんですが...

922名無しさん:2017/01/28(土) 15:59:13 ID:C2dvjbhE
IF B AND 16 THEN GOTO @����

@����
IF B AND 16 THEN GOTO @������
というプログラムを書くと、Aを押した時に@����ではなく@������に飛びます。
Aの入力が重複してるとミーバースで指摘されたのですが、治し方がわかりません
どうすればいいでしょうか

ミーバースで言われたのは、REPET:VSYNC:UNTIL !BUTTON()と書けと言われましたができませんでした

923名無しさん:2017/02/13(月) 19:28:19 ID:YsIyzpRA
IF B AND 16 THEN GOTO @������の
16の所を、Aボタン以外の数字に対応させれば良いかと。

924侍大将:2017/03/13(月) 08:30:20 ID:qthoZhYI
信オン(オンライン予定ではない。)見たいなゲームを作りたいのですが、プログラムの作り方が解らず仕舞いです。(大体の流れはイメージ出来てますが、プログラムに置き換えられず……)
(作りたいのは、RPGです。)

925侍大将:2017/03/14(火) 18:31:50 ID:qthoZhYI
>>1
プログラミング方法が分からないってだけで、貴方達は無視するんですね。
このソフトも、コーエーやソニーと一緒で見下す社員しか居ないんですね。

926名無しさん:2017/04/27(木) 07:19:05 ID:imEFnajc
>>925 一日程度返信来ないだけで文句言うな。

927iz猫:2017/05/19(金) 21:09:04 ID:/9Cq4e4I
rpgを作っているんですがセレクト画面を表示する方法が分かりません(泣)

928名無しさん:2017/06/22(木) 22:03:41 ID:OcC0RsXo
プチコン3号、bigについての質問です。
mmlについて、楽譜の一番左の#が4つあるホ長調などは、一つ一つの音に#をつけるしかないですか?それとも1つの命令によって表現できますか?

929名無しさん:2017/07/17(月) 23:27:40 ID:fh2glfWY
プチコン3号の「公開キーのプログラム」の中にあった「readme.txt」を読むにはどうしたらよいのでしょうか。

930名無しさん:2017/07/17(月) 23:31:44 ID:fh2glfWY
プチコン3号の公開キーでダウンロードしたファイルの中の「readme.txt」は、どうすれば読めるようになるのか教えてください。
プログラムの実行だと、smilebasicでsyntax errorになってしまいます。

931名無しさん:2017/07/18(火) 14:51:05 ID:oEkWuiBY
どのプログラムだろう?

932名無しさん:2017/08/19(土) 10:21:27 ID:uKq69sMw
>>930 エディタで見ればいいんじゃね?

933名無しさん:2017/08/24(木) 17:01:26 ID:uKq69sMw
>>928
”おんつく”を使えばいちいち変調を直打ちしなくて済むよ。
MMLのインポートも変調もできるよ。

934名無しさん:2017/08/25(金) 13:44:34 ID:sIpgb/iM
今格闘ゲームを作ろうとしてるんですがhpのゲージの表示がうまくできません どなたか教えてください

935名無しさん:2017/08/25(金) 13:45:10 ID:sIpgb/iM
今格闘ゲームを作ろうとしてるんですがhpのゲージの表示がうまくできません どなたか教えてください

936名無しさん:2017/08/25(金) 22:07:05 ID:uKq69sMw
>>934-935
gfillかspriteをつかってゲージ的にするのが簡単だと思うよ。hpで色なり幅なりを変えて。

937名無しさん:2017/12/09(土) 09:12:08 ID:O4dcAEOw
ループ前に、spのアニメーションを設定したんですけど、ループの中で、spchrを使って、定義番号を変えてまた命令を使ったら元の番号に戻したときspanim
が適用されません。改善方法ってありますか。

938名無しさん:2018/07/16(月) 16:09:07 ID:j0aNFNEA
http://pr4.work/g/kiyo

939名無しさん:2021/01/29(金) 20:57:07 ID:iS/TkkzA
ステージデータを別ファイルにしたいのですが、
1. 配列の中身をDATファイルとして保存する方法
2. テキストデータをPRGで読み込んでパースする方法
3. その他
どれが一般的なんでしょうか


新着レスの表示


名前: E-mail(省略可)

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

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

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

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