備忘録(追記)

投稿者:   mini ___ 投稿日:2011/04/30 02:20

 
割と忘れっぽいので書きだしておくことにします。


ノベル→アクション
x固定 背景変動
y方向常に加算
yが一定以上なら一定値固定
ステージ一杯ならステージ固定x変動
a[0],a[1],a[2]を構造体aとみれば、構造体配列はa[0][0],a[1][0],a[2][0],a[0][1]…
ただようマリオ臭
キー入力ループで、必要なキーの入力を全て得る
キー入力で押したフラグon、離したら押したフラグoff、擬似的に「押されている」判定
キー入力でメニュー画面に移行。イメージはミルキィとかラチェクラとか
メニュー時、メニュー関数内のループに入るため後ろは不動
メニューに複数キャラ、選択でアクション
高い位置にジャンプ、前方ダッシュ、後ろにステップ、空中ジャンプなどなど
背景、足元は等速、後ろは低速だとそれっぽく見えるとか
敵あり?なし?当たり判定メンドクサイ
移動速度s=0、→でs++、←でs--、→離しでs--、←離しでs++ とか?
イベントめんどい
巨大な穴を作る?
マップデータの読み込みはできないから埋め込みか…
汎用関数群を作って、マップ/シーンごとにマップデータ変数をいじくればいいのか
ノベルだから難所前でセーブとか無意味に。やったえちゃん
ってなんでですかー


最初はノベルで将棋とか考えていたのですが、
(ノベルで作った将棋、ではなく、将棋を題材にしたノベル)
場合分けとかそれこそ可能性は無限大な訳で。
難なく諦めることに成功しました。やったね。

しかし、読ませるノベルってのは題材がなきゃ作れるもんでもないので、
それっぽい話考えるのも辛いもんですね。書き師さん凄い。


とりあえず今度はアクションゲームでも考えてみます。
 
***

さて、どうもエディタを開くつもりになれない疲れているようなので、
こっちにガシガシ分解して書いていくことにします。
エディタに突っ込んだ時にエラー吐いたら、そこを修正すればいいだけですし。
# 分解

ゲーム開始、関数読み込み、マップへ(最初からなら最初のマップ、ロードなら途中のマップ)
各マップで、冒頭マップデータの読み込み。
マップデータはどうしよう。後回し
ゲーム メインループに入る。これはもう関数化していいかも
ループ内で描写、キー入力判定、移動処理などなど
キー入力判定、各種キーの押されているフラグのオンオフ。
移動処理、常に下方向に荷重をかける 慣性あり?
描写処理
メインがループ形状になっているのなら、制限時間も付けられそう
自機は性能低く? これだけ縛りでもクリアできるような構成とか素敵。
メニュー画面で複数キャラのカットイン メニューループに入る
カットインはF_MovePict()を複数並列処理にすればいいのか いい気がする 大丈夫であってくれ
クリックスルーでキー入力のみで支援キャラ選択か
ゴールしたらスコアに反映でもさせるか?めんどうだなー
開始スクリプトでキャプター移動させる
移動先チャプターはマップ選択画面。これならスコアも行ける気がする

# code部

# マップ選択画面
cur = 1  #stage1 2 3 4 
         #     5 6 7 8  という並びをイメージする
flag = true
pos = createArray()
num_stage = createArray()
 num_stage[1] = 123456
 num_stage[2] = 234567
 # ...ry

while(flag)  # マップ選択ループ
  startInput()
  while(hasInput())  # 取り出しループ
    takeInput()  # 入力の取り出し
    if(isKeyDown("UP"))
      if(cur > 4)
        cur = cur-4
      end
    elsif(isKeyDown("DOWN"))
      if(cur < 5)
        cur = cur+4
      end
    elsif(isKeyDown("RIGHT"))
      if(cur%4 != 0)
        cur = cur+1
      end
    elsif(isKeyDown("LEFT"))
      if(cur%4 != 1)
        cur = cur-1
      end
    elsif(isMouseMove())
      pos = getMousePosition()
      # x,y座標よりcur位置を計算する 暫定的に画面いっぱいに8等分されているとする
      cur = 1+(pos[0]/200)+(pos[1]/300)*4 
    elsif(isMouseDown() | isKeyDown("Z") | isKeyDown("ENTER"))
      flag = false  # ループ脱出
    end  # ifここまで
  end  # 取り出しここまで
  endInput()
  # ここで描写
  # curの位置に選択カーソル表示 背景にマップ的な物?ただのメニューのような?
end  # 選択ループここまで
changeChapter(num_stage[cur])  # マップ移動


# *******
# *******


# マップ読み込み処理 マップの形を決めてないので後回し
flag = true
fl_key_Ri = false
fl_key_Le = false
player_y = 600-32  # まあとりあえずこのあたり
Accel_y = 0
map_x = 0

while(flag)  # ゲームメインループ
  startInput()
  # map,playerの描写

  while(hasInput())
    takeInput()
    if(isKeyDown("UP") | isKeyDown("X"))
      F_Menu()  # メニュー呼び出し
    elsif(isKeyDown("RIGHT"))
      fl_key_Ri = true   # 右押しっぱオン
    elsif(isKeyUp("RIGHT"))
      lf_key_Ri = false  # 右押しっぱオフ
    elsif(isKeyDown("LEFT"))
      fl_Key_Le = true   # 左押しっぱオン
    elsif(isKeyUp("LEFT"))
      fl_key_Le = false  # 左押しっぱオフ
    elsif(isKeyDown("Z"))
      if(Accel_y == 0)  # 大地に立ってる者のみが
        Accel_y = -10   # 大地を蹴ることが許される
      end
    end  # ifここまで
  end  # 入力ループここまで
  endInput()

  if(fl_key_Ri)  キー状態を検出したら描写のための計算開始
    map_x = map_x+5
  end
  if(fi_key_Le)
    map_x = map_x-5
  end
  player_y += accel_y
  if(player_y >= 600-32)
    player_y = 600-32
    accel_y = 0
  end
  accel_y = accel_y-3  # 重力加速度3とかそのあたり
  # 当然関数化したほうが見ててキレイ

  waitTime(30)  # 基本的にfps:30前後→1000/30=33.3
end  # メインループここまで


def F_Menu()
  # F_MovePictを複数同時に動かす
  # 支援キャラの数にもよるけど、とりあえず4人とする
  # whileでまとめたいので、同名の配列として考える
  # 一人当たりスプライト番号、現在の座標xy、移動経路xy


  s = 10  # s*30(ms)で処理を終了させる
  while (s > 0)
    cnt = 0
    while(cnt < 4)
      getVariable("cutin")[1][cnt] = getVariable("cutin")[1][cnt]+getVariable("cutin")[3][cnt]
      getVariable("cutin")[2][cnt] = getVariable("cutin")[2][cnt]+getVariable("cutin")[4][cnt]
      # スプライトをセット
    end
    F_SetPosPict(a , xx , yy , 0)
    s = s-1
    drawCanvas()
    waitTime(30)
  end  # ここまでwhile  カットインとカットアウトは真逆の処理なので関数化できそう

  flag = true
  ret = 0
  while(flag)  # 入力待ちメニューループ
    startInput()
    while(hasInput())
      takeInput()
      if(isKeyDown("A"))
        if(ret == 0)
          ret = 1
        end
        flag = false
      elsif(isKeyDown("S"))
        if(ret == 0)
          ret = 2
        end
        flag = false
      elsif(isKeyDown("D"))
        if(ret == 0)
          ret = 3
        end
        flag = false
      elsif(isKeyDown("F"))
        if(ret == 0)
          ret = 4
        end
        flag = false
      elsif(isKeyDown("G"))
        if(ret == 0)
          ret = 5
        end
        flag = false
      elsif(isKeyDown("H"))
        if(ret == 0)
          ret = 6
        end
        flag = false
      elsif(isKeyDown("X"))
        ret = 0
        flag = false
      end  # ifここまで
    end  # 入力ループここまで
    endInput()
  end  # メニューループここまで

  return ret  # 自機の状態変化戻り値
end





画像もマウス入力もキー入力も、簡単に扱えるからこそ、
そこら辺のゲームのような綺麗な表現をやってみたくなる。

金輪際コンソールで作るゲームとはおさらばだぜフゥーハハハー。


とりあえず確認順として
 自機が動くことを確認する
 メニュー画面に移行することを確認する
 メニューからの戻り値でアクションを起こすことを確認する
 平坦なマップをクリアできることを確認する
 作られたマップをクリアすることを確認する
 マップ選択画面のカーソルの動きを確認する
 ステージ1に移動することを確認する
 他のステージを作成し、選択できることを確認する
とかそんな感じですかね。
やること大杉わろた
 

コメントする

コメントするには、ログインする必要があります。

コメント一覧

   mini ___(投稿日:2011/05/03 13:39, 履歴)
>>rurun9さん
 やはり二次元配列ですかー。 それしか無いとは思いつつも、はてしなく面倒ですねぇ。
 とりあえずお絵かきしながら考えることにします。
 
Nyan mini rurun9(投稿日:2011/05/02 12:39, 履歴)
NSGはスクロールしないので参考にはならんでしょ。
縦*横の二次元配列でマスを用意して、中身は
0=なし,1=壁,2=トゲ,…なんて感じで何かある場所にひとつずつ直接入れてます。
効率悪いんだろうな~て思いながら作ってた記憶が。

FCマリオとか全部で256KB以下らしいし、どうやってるんですかねぇ。
ググって出てくるのかなぁ
   mini ___(投稿日:2011/05/02 11:15, 履歴)
>>rurun9さん
 waitTime()の時間を色々試した結果、30くらいがちょうど良くてですね。
 そういえばRmakeゲームの何処かで「fps=30前後」みたいな表記を見かけたなと。

 私としてはNonStopGirlのマップの作り方をぜひご教授していただきたいですねーw
Nyan mini rurun9(投稿日:2011/05/01 22:53, 履歴)
fpsとかまで考えてるんですかー。
フムフムなるほど、参考になりマッス。