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

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

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
ありがとうございました。これらを参考に勉強してみます。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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