プログラムの改造
version 4.3.0 対応版
穴埋め式プログラムの入力で本格的なジャンプアクションゲームを改造します。

この資料で利用するプロジェクトの公開キー

44JSD3EX3

2020.5.7修正版（フォント：M+ SmileBoom）

1

準備
この資料を使ってプログラムの改造を行う前に以下の準備を終わらせてください。

1. 公開キーでテンプレートをダウンロード

TOPMENU → 作品を見る→ 公開キー → ダウンロード

2. ダウンロードしたプロジェクトを作業プロジェクトに設定

TOPMENU → ファイル操作 →使用するプロジェクトを変更→ DRD を選択

3. BASICを起動
TOPMENU → プログラムを作る
これで準備は完了です！

DRD と表示されていればOKです！

2

テンプレートの読み込み（LOAD）
限られた時間内で作業を行うため、ゼロからすべてを組み込む時間が確保できません。あらかじめゲームのひな型（テンプレート）を用意しておきましたので、最初にこのファイルを読み込みます。
F8キー を押して、コンソール画面から、以下のように入力してください。最後にエンターキーを押してください。

NEW
確認画面が出たら「はい」を選んでください。

LOAD"L00.PRG"

これでプログラムが読み込まれます。
F7キー を押して編集画面を開きプログラムをのぞいて見ましょう。

ここは入力しません

編集画面で見るとプログラムが大量に並んでいます

それなりに遊べる内容のゲームを作るためには、1000行を超えるプログラムになってしまいます。
これを最初から作るのは大変なので、今回のワークショップではキャラクターを動かす部分などの分かりやすい処理を実際に記述してもらう方法としました。
操作説明が複雑にならないよう外付けUSBキーボードを利用する前提で進めていますが、ソフトウェアキーボードを使っても利用可能です。

3

テストプレイ（まだ遊べません）
さきほど読み込んだワークショップ用の参考プログラムを実行してみましょう。
このプログラムは「ドレドくん」を操作して穴に落ちないように右へ進むジャンプアクションゲー
ムです。敵に触ってもダメージを受けるだけで死にません。
F5キー （または＋ボタン）を押すと読み込まれたプログラムを実行できます。

実行結果：マップとキャラクターは表示されますが操作できません

残念ながら、このプログラムはそのままではゲームとして遊ぶことはできません。
少しずつプログラムを追加して「ドレドくん」が動き回れるように改造しましょう。
早速作業に入ります！
まずは、 F5キー を押して、動いているプログラムを止めてください。
プログラムが止まったら、F7キーを押して編集画面を表示させます。

次のページから実際にプログラムを入力します。

4

この資料の進め方（検索＆追加）
追加するプログラムを入力する場所は検索機能で探します。
1）検索機能ボタン F3キー （または）を押して探す文字を入力しENTERを押す

2）見つかった行の下へカーソルを↓矢印キーで移動し資料を見ながらプログラムを入力
3）全部入力出来たら F5キー でプログラムを実行（エラーが出たら修正）

探す文字は、各ページ左上のL01 :のように書かれた Lで始まる番号 です。

文字を探す検索用の文字入力は、 F3キー を押すと画面の下に表示されます。

検索用の入力機能

探したい文字列を入力してENTERキーを押すと見つけた行へジャンプします。検索から抜ける
時は、 ESCキー を押します。
見つからない時は矢印キーの上や下を押してみてください。

5

L01：マップをスクロールさせる
最初に「ドレドくん」が動いた時にマップをスクロールさせるプログラムを追加します。

◎変更する場所を探す

F3キーを押して L01 を入力しEnterキーで検索します。（239行目付近）
見つからない時は矢印キーの↑上や↓下を押してみてください。
＜入力前＞'--- メインループ
ISLOOP=#LP_GAMEMAIN
WHILE ISLOOP==#LP_GAMEMAINVSYNC 1GETBUTTON #CID
CALL SPRITE'--- ↓L01A：マップスクロール
ここに入力'--- ↓L02A：スコア
WEND◎文字を追加する（239行目付近）
検索して発見された '--- ↓L01A：マップスクロール の下の行にある、赤矢印

ここに入力の行に、MAPSCROLL

BGX,BGY と書きます。

＜入力後＞'--- ↓L01A：マップスクロール
MAPSCROLL BGX,BGY

入力が終わった◎テストプレイ F5キー実行はできますが・・
今回の追加ではボタンを押してもマップはスクロールしません。スクロールさせるためのプログラムを追加するという作業を体感してもらいました。あまり気にしないで次に進みます。（プレイヤーが動けばスクロールも始まります）

6◎テキストのポイント
さきほど追加した MAPSCROLL BGX,BGY は、「BGXとBGYの数値だけ、マップをスクロール（MAPSCROLL）させる」という意味です。ですが、プチコン4にMAPSCROLLという命令が用意されているわけではありません。MAPSCROLL は “プログラムを組んで” 作られた命令なのです。
プログラムの先のほう、1479行目から1508行目までを見てください。
DEFという命令を使って、「MAPSCROLLという名前の命令を作ります」という宣言をしています'=======================================' MAP SCROLL'=======================================DEF MAPSCROLL X,Y
VAR L,T=-16'--- Calculate the visible part from given coordinates
IF SPCHK(#SP_BG) THEN RETURN'--X=MAX(-#CHR_W*3,MIN(((MAP_W*#CHR_W)-#SCRN_W),X-(#SCRN_W/2)))
Y=MAX(-#CHR_H*5,MIN((MAP_H*#CHR_H)-#SCRN_H,Y-(#SCRN_H/2)))
IF Y>#MAP_H-#CHR_H THEN Y=#MAP_H-#CHR_H
Y=Y-(#MAP_H-(#CHR_H*2))
PUTMAP X,YSPANIM #SP_BG,"XY",T,-X,-Y,1'###Backgroundisan

independentloop

structure

VAR OX,OY
L=#SCRN_W/4'--- Mountain
SPOFS #SP_MT OUT OX,OYSPANIM #SP_MT ,"XY",T,-(L+X*0.1),OY,1'--- Grass (back)
SPOFS #SP_GR0 OUT OX,OYSPANIM #SP_GR0,"XY",T,-(L+X*0.2),OY,1'--- Waves (back)
SPOFS #SP_GR1 OUT OX,OYSPANIM #SP_GR1,"XY",T,-(L+X*0.3),OY,1END

ここは「MAPSCROLL」という命令の中身になります。
プログラム中、「MAPSCROLL」と書かれていたら、コンピューターは指定されたXとYの値を使ってここに書かれた内容を実行します。

「マップをスクロールさせる」といった処理は何度もプログラムの中で使う可能性があります。そのたびに同じ内容を書いていてはプログラムがどんどん長くなってしまいます。そのため、「
MAPSCROLL」という命令を作って、その命令をプログラムの中で使うようにしているのです。

7

L02 ：スコアを表示する
次にスコアを表示するプログラムの呼び出しを追加します。

L02 を F3キー で検索して検索した '---□↓L02A：スコア

ここに入力の行を入力します。（241行目付近）の下に PUTSCORE を追加します。

＜入力後＞'--- メインループ
ISLOOP=#LP_GAMEMAIN
WHILE ISLOOP==#LP_GAMEMAINVSYNC 1GETBUTTON #CID
CALL SPRITE'--- ↓L01A：マップスクロール
MAPSCROLL BGX,BGY'--- ↓L02A：スコア
PUTSCORE
ここに入力WEND◎テストプレイ F5キー
実行すると上画面にスコアなどが表示されました。少しゲームっぽい画面になりました。

これ以降の作業も同じようにプログラムを追加してテストプレイを繰り返します。
SC

スコアHI

ハイスコア

SCADD

スコアに加算する値8

L03 ：左スティックで左右に歩く
いよいよ「ドレドくん」を移動するプログラムを追加します。

L03

をF3キー で検索してここに入力の行を入力します。（434行目付近）'--- ↓L03A：横向きの壁チェック
ここに入力
IF MAPHIT(DRDPX+DRDVX,DRDPY,DRDSX) THEN'--- ↓L03B：壁にぶつかった
ここに入力
DRDPX=(DRDPX DIV #CHR_W)*#CHR_W'--- ↓L03C：向きで補正するサイズを調整(左右方向で座標補正)
ここに入力
DRDPX=DRDPX+((#CHR_W-1)*(DRDDIR==1))'--- ↓L03D：壁判定ココまで
ここに入力
ELSE
'--- ↓L03E：壁なし(進める)
ここに入力
DRDPX=DRDPX+DRDVX'--- ↓L03F：横向きの判定ココまで
ENDIF
ここに入力

◎テストプレイ F5キー
実行すると、左スティックで「ドレドくん」を左右に移動することができるようになり、端に近づくとスクロールも発生します。

・リンゴは出ていますが取れません
・障害物を超えられない

飛び出した床は、ジャンプがないと超えられないようです。

DRDPX, DRDPY

ドレドくんの座標

DRDVX, DRDVY

ドレドくんの移動量

DRDDIR

ドレドくんの向き（1＝右、-1＝左）

BGSW

1＝マップの右端に到着した

MAPHIT

足元や壁などのマップ状態を調べる

ヒント

DRDPXにDRDVXを足す倍率

9L04 ：Yボタンで加速する
Yボタンを押した時に「ドレドくん」がダッシュするプログラムを追加します。

L04 を F3キーで検索してここに入力の行を入力します。（418行目付近）

検索で見つからなかった場合は、矢印の↑上を押して他の場所を探してください。
'--- ↓L04A：ダッシュボタンが押されているか？
ここに入力
IF BUTTON(0,#B_DUSH) THEN'--- ↓L04B：変化する場合は走るアニメへ
ここに入力
VM=8.0:IF V THEN DRDNM$="RUN"'--- ↓L04C：速度に応じて傾ける
IF STVX THEN SPANIM #SP_DRD,"R",-15,A,1'--- ↓L04D：放されているとき角度を戻す
ELSE
ここに入力
'--- ↓L40E：角度を戻すためのアニメ設定
ここに入力
SPANIM #SP_DRD,"R",-8,0,1'--- ↓L04F：角度を戻すココまで
ENDIF
ここに入力

ここに入力

◎テストプレイ F5キー
Yボタンを押しながらスティック操作で傾きながら「ドレドくん」が走ります。
これで移動は速くなりました。
まだリンゴは取ることができません。

BUTTON

ボタンの取得DRDNM$

ドレドくんのアニメーション名

STVX

スティック左右の変化量（±1.0）#SP_DRD

ドレドくんのスプライト管理番号

SPANIM

スプライトのアニメ設定命令

ヒント

VM、Aの初期値10

L05 ：フルーツを取ってスコアアップ「ドレドくん」がフルーツや敵に触れた時の当たり判定プログラムを追加します。

L05 を F3キー で検索してここに入力の行を入力します。（468行目付近）

ELSE'--- ↓L05A：フルーツを取ったらスコア加算
SCADD=SCADD+SPVAR(H,"SCORE")'--- ↓L05B：フルーツを消して音を出す
SPCLR H:BEEP 7
ここに入力'--- 敵とフルーツの判定ココまで

ここに入力◎テストプレイ F5キー
実行して移動するとリンゴに触った時にリンゴが消えてスコアが加算されます。

DRDDMG

ダメージを受けた時の停止時間

DRDOLD$直前に設定されたドレドくんアニメ名SPHITSP

スプライト同士の当たり判定

SPVAR()

スプライトの内部変数を取得する命令

OBJDEAD

マップから生成した物体の消去

SPCLR

スプライトの消去

BEEP

効果音を鳴らす11

L06 ：Bボタンでジャンプする
Bボタンを押した時に「ドレドくん」がジャンプするプログラムを追加します。

L06

を

F3キー で検索してここに入力の行を入力します。（338行目付近）'--- ↓L06A：ジャンプしてない?
ここに入力
IF DRDJUMP==0 THEN'--- ↓L06B：ジャンプボタンが押されたらここに入力
IF BUTTON(#CID,#B_JUMP,2) THEN'--- ↓L06C：ジャンプ開始
ここに入力
DRDJUMP=1:DRDNM$="JUMP":BEEP 8'--- ↓L06D：押している時間でジャンプ高さ変化用のカウンタ
DRDCNT=26
ここに入力'--- ↓L06E：ジャンプ初速
ここに入力
DRDVY=-8'--- ↓L06F：ジャンプ開始ココまで
ここに入力
ENDIF
'--- ↓L06G：ジャンプ判定ココまで
ENDIF
ここに入力
'--- ↓L06H：ジャンプ中？
IF DRDJUMP==1 THEN
ここに入力'--- ↓L06I：押してる時間ジャンプし続けている？
ここに入力
IF DRDCNT==0 THEN'--- ↓L06J：普通のジャンプ中
ここに入力
DRDVY=DRDVY+0.5'--- ↓L06K：頂点を超えた？
IF DRDVY>0 THEN DRDNM$="FALL"
ここに入力'--- ↓L06L：ジャンプ中じゃない
ELSE
ここに入力
'--- ↓L06M：ジャンプが続くカウンタを減らす
ここに入力
DRDCNT=DRDCNT-1'--- ↓L06N：ジャンプボタンが放されていたら落下へ
IF BUTTON(#CID,#B_JUMP)==0 THEN DRDCNT=0'--- ↓L06O：落下判定ココまで
ここに入力
ENDIF
'--- ↓L06P：ジャンプココまで
ENDIF
ここに入力

ここに入力

◎テストプレイ F5キー
Bボタンでジャンプします。押し続けている時間で高さが変化し、Yボタンで加速しながらジャンプで飛距離が伸びます。
DRDJUMP0=ジャンプ前、１＝ジャンプ中

DRDCNT

押してる時間で高さを調整するカウンタ

DRDSTOP

1＝ドレドくん強制停止

ヒント1

DRDCNT、DRDVYの初期値

ヒント2

DRDVYジャンプ中の加算値

12

L07 ：カニを動かす敵の1つ「カニ」の移動プログラムを追加します。

L07を'---F3キーで検索してここに入力の行を入力します。（723行目付近）↓L07A：足元チェック(床の上?)

C=MAPHIT(X+VX,Y+1,8)
ここに入力'--- ↓L07B：床が無い？
ここに入力
IF C==0 THEN'--- ↓L07C：床が無い時は移動方向反転
ここに入力
VX=-VX'--- ↓L07D：床判定ココまで
ELSE
ここに入力
'--- ↓L07E：横壁チェック
ここに入力
C=MAPHIT(X+VX,Y,24)'--- ↓L07F：壁があるか？
IF C THEN
ここに入力'--- ↓L07G：壁にぶつかった
ここに入力
X=(X DIV #CHR_W)*#CHR_W'--- ↓L07H：移動方向でサイズを調整
X=X+((#CHR_W-1)*(VX==1))
ここに入力'--- ↓L07I：座標補正
ここに入力
X=X-(VX*(24/2))'--- ↓L07J：移動方向反転
VX=-VX
ここに入力'--- ↓L07K：壁判定ココまで
ELSEここに入力'--- ↓L07L：壁なし(進める)
ここに入力
X=X+VX'--- ↓L07M：壁ナシ判定ココまで
ENDIF
ここに入力
'--- ↓L07N：床ナシ判定ココまで
ENDIF
ここに入力
'--- 移動処理ココまで◎テストプレイ（F5キー ）カニが左右に動いているはず・・

カニがいない！！
カニを出したい時は、次のページを見てマップ上にカニを配置してください
X,Y

座標管理

C

マップ情報

VX

横の移動量

13

L08 ：マップパーツにフルーツや敵を配置修正する部分

L08

をF3キー で検索します。

ドレドランドのマップは、縦に細いマップ（これをマップパーツと呼びます）を並べることで長いマップを表現しています。マップパーツはA～Zまで用意することができて、横方向は長めに伸ばせますが、高さは12段分しか持てません。文字や記号の組み合わせで作られているので、地面の形を変えたり、敵やアイテムの配置を調整することができます。
壁記号：（金属板）

敵果物： K（カニ） S（スカンク） ＊（栗）＠（リンゴ）＆（ぶどう）

試しに、以下のようにマップ部品へ記号を追加してみてください。
INSキー を使って上書きモードで入力すると文字列がずれないように入力できます。

@MAP_ADATA ""'0
DATA ""'1
DATA ""'2
DATA ""'3
DATA ""'4
DATA ""'5
DATA ""'6
DATA ""'7
DATA ""'8
DATA "@＠@ "'9
DATA ""'10
DATA ""'11
DATA ""'---

ここを変更してみる※これは参考なので好きなように好きなものを置いてください◎テストプレイ F5キー
実行すると、マップ配置した敵やフルーツが表示されるようになります。マップの最後に「部品Z」を配置して置けば、やる気のなさそうなボスとの戦いも楽しめます。

14

L09 ：マップの長さの変更
修正する部分

L09

をF3キー で検索します。

L08で改造したマップパーツを並べるためのデータがL09以降に並んでいます。ステージごとのマップの長さを調整したいときは、このデータを変更してください。
'=======================================' ステージデータ (↓L09A)'=======================================' DATA BGMPLAY用の曲番号' DATA "マップの順番を並べる文字列"'=======================================@STAGE99_99
DATA 33 'Bright blue(BGM)DATA "GAAF"@STAGE0_0
DATA 46 'WAKUWAKU :D adventure
DATA "GAAAHY"
ここを変更してみる@STAGE0_1
DATA 46 'WAKUWAKU :D adventure
DATA "GAAFGACAADBY"@STAGE0_2
DATA 46 'WAKUWAKU :D adventure
DATA "GAAABACADAAFEGBAAY"@STAGE0_3
DATA 48 'WAKUWAKU ）X adventure
DATA "GAAAZ"◎ステージ1のマップの長さを増やす@STAGE0_0
DATA -1
DATA "GAAAGAAAGAAAGAAAY"

入力が終わった

2822行目の DATA "GAAAHY" がマップパーツを並べている部分です。マップパー
ツは A～Z までの部品を登録できるので、登録されているアルファベットを並べることでマップを長くできます。存在しない文字は入れるとエラーになります。
この内容を、 DATA "GAAAGAAAGAAAGAAAY" とすれば、最初のマップが4倍ぐらい長いマップに変化します。

15

さらに改造するためのヒント！
これでプログラムの入力は一通り終わりました。ここからは他の人とは違うゲームにするためのチューニングに入ります。改造のためのヒントをここにまとめておきます。

◎ボスが絶対に勝つのはバグじゃないか？
どうやったら勝てるのかは、プログラムを調べてみましょう。怪しい部分がないかな？
'--- 6:最終結果
IF MD==6 THEN'--- あとだし
IF DRDNM$=="GOO"
THEN JAN$="PA"IF DRDNM$=="CHOKI" THEN JAN$="GOO"
IF DRDNM$=="PA"
THEN JAN$="CHOKI2"'--- ズルいプログラム
IF ZURU==0 THEN JAN$=JTBL$[RND(3)]'--NX=SPVAR(SP,"PANEL")SPOFS NX OUT U,V
SETANIM NX,"KUMA"+JAN$,U,V,#Z_BOSSPNL
C=0IF DRDNM$=="GOO"&& JAN$=="PA"
THEN C=1
IF DRDNM$=="CHOKI" && JAN$=="GOO"
THEN C=1
IF DRDNM$=="PA"&& JAN$=="CHOKI2" THEN C=1
IF INSTR(JAN$,DRDNM$)>-1 THEN C=1'--- 俺様の勝ち?

◎常識を超えたスーパーマンにしたい
ジャンプの高さ、走る速度、走ってるときの傾き方・・この辺りを変更すると速すぎて落ちまくる
操作難易度の高い主人公も作れます。移動やジャンプのプログラムを書いている時に、色々な数字が見えていたと思います。その辺りの数値を適当に大きくしたり小さくしたりすると・・どうなるかな？

◎効果音やBGMを自分の好きなものに変更したい
効果音は、BEEPという命令で発声してます。音楽は、BGMPLAYという命令で演奏しています。検索を使えばどこで使われているかを探すのは簡単です。
F9キー を押すとプチコンに内蔵されている効果音や音楽の番号を調べるソフトが起動します。
これを使ってよい音を探してみましょう。

16

GAHAKUを使って画像を改造する
クレイジードレドランドを実行中に F10キー を押すとプチコンに内蔵されているお絵描きツール「GAHAKU」が起動します。このツールを使うと現在動いているゲームの中で使われている画像を直接書き替えることができます。（マウスで操作します）

1） NAVIGATORウィンドウのG1とG2のタブで画像を切り替えて絵を描く
2）

絵が描けたらG1かG2もタブを切り替える（切り替えることで画像が更新される）

3）

SAVEボタンでファイル名を変えずに保存（両方描いたらそれぞれをSAVEする）

4）

CTRL+C（または＋ボタン）でGAHAKUを強制終了

4）

ドレドランドに戻る（描き替えた内容が反映されているはず・・）

一度記録するとSAVEされた画像でドレドランドが楽しめます。

この資料は、ここでおしまいです。
どんどん改造して、オリジナリティあふれる面白いゲームを作ってみましょう！

おつかれさまでした！
17