アクション講座第 1 回目 講師 : ウェンディアーサー (WENDY ARTHUR)
講座資料のプロジェクトファイル (zip ファイル ) はソフメ wiki にアップしてますので予めダウンロードしておいてください 講座資料のプロジェクトファイル (zip ファイル ) は解凍してソリューションファイルを開く URL は下記 http://softmedia.sakura.ne.jp/wiki/2017%e5%b9%b4%e5%ba%a6_%e3%82%a2%e3 %82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B2%E3%83%BC%E3%83 %A0%E8%AC%9B%E5%BA%A7
今日やること (TODAY S TOPIC) ジャンプのプログラムについて 課題 1: ボタンの連続押しを防止させる アニメーションのプログラムについて 課題 2: マップチップの作成 ( おまけ ) 今回使った DX ライブラリの関数について軽 ~ く紹介
その前に (BEFORE THAT) ゲームプログラミング講座の内容覚えてる?( ジト目 ) 今回配布したプログラムは 分割コンパイルや自作関数 それのプロトタイプ宣言 構造体などが容赦なく含まれます 上記の内 わからないまたは忘れたものがあったら 復習しておきましょう ( )
ジャンプのプログラムについて (ABOUT THE PROGRAM OF JUMP)
ジャンプのプログラムについて (ABOUT THE PROGRAM OF JUMP) ジャンプのアルゴリズムは様々ですが 今回は加算 減算のみで出来るものを紹介します ジャンプのプログラムは下記のものでこんな感じ
ジャンプのプログラムについて (ABOUT THE PROGRAM OF JUMP) どういうプログラムか? 1. Jflag が 0 の状態でスペースキーを押す すると Jflag が 1 になる ジャンプ中に追加でジャンプできなくなる 2. 変数 py に Player.Cy を保存 ( 格納 ) する 後に Player.Cy から PLAYER_JUMP を減算 3. Jflag が 1 になったら 変数 ty に Player.Cy を保存 ( 格納 ) し Player.Cy( 現在の Y 座標 ) から py( 前回の Y 座標 ) を減算し 1 加算する 4. 3. を初期位置 400 になるまで繰り返す 5. 400 になったら Jflag を 0 にする
ジャンプのプログラムについて (ABOUT THE PROGRAM OF JUMP) Y 座標 移動量 図. もっとわかりやすい図 時間
ジャンプのプログラムについて (ABOUT THE PROGRAM OF JUMP) まとめ 1. Jflag を上手く使う! 使い方次第で二段ジャンプが出来る かもしれない 2. ジャンプの表現は放物線を描くイメージで! 当たり前 3. ジャンプのアルゴリズムは様々なので 他にも触れてみる これは一例です 他には物理法則を使った方法もあります
課題 1: ボタンの連続押しを防止させる スペースキーを押し続けてもぴょんぴょん跳ばないようにしてみよう スペースキーを一度放して 再び跳べるように改良すること 新たに整数型変数 bflag を宣言し 0 の時はジャンプ可 1 の時は不可 ( ヒント ) さっきの Jflag はどんな役割をしていたのかな?
小休止 (~14:30)
課題 1: ボタンの連続押しを防止させる 答え bflag の宣言 bflag が 0 の時はジャンプ可 1 の時は不可にしたいから
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION)
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) 忍者が左右に走っているアニメーションを例に説明します 忍者が走るアニメーションのプログラムは下記のこんな感じ
その前に (BEFORE THAT)
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) まず 下準備として下記の画像をそれぞれLoadDivGraph 関数で分割読み込みをする NinjaL.png NinjaR.png Created by ねこざめ
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) 例として NInjaR.png を LoadDivGraph 関数で読み込みをしてみる LoadDivGraph( picture/ninjar.png,16,4,4,100,100,playergrar) として読み込む 1. 2. 3. 4. 5. 6. 7. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1. 画像ファイルのパス 2. 画像の分割総数 3.X 方向の分割数 4.Y 方向の分割数 5. 分割する X サイズ 6. 分割する Y サイズ 7. 分割した画像の格納をする int 型の配列へのポインタ この画像では分割総数は 16 個 画像の X 方向の分割数 Y 方向の分割数はいずれも 4 分割する画像のサイズは 100 100
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) 7. の PlayerGraR は配列へのポインタなので 配列として扱われる つまり PlayerGraR[0] からPlayerGraR[15] まで下記の画像を分割し 1コマずつ格納される 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) もうこの時点でお気づきかと思いますが ( 切 実 ) アニメーションのプログラムは配列の添 え字をひたすら変化させてできるものである ΩΩΩ< な なんだってー!!
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) Player.cpp の void PlayerAnime() を参照 配列 PlayerGraR[] PlayerGraL[] の添え字を frame とし frame の値を変化させることでア ニメーションを作成します 例 ) 忍者を右に向かせ走らせたい時 frame の値をどう変化させるか? 解 )frame の値を 0 1 2 0 永遠と繰り返す frame=(frame+1)%3 0 1 2
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) Player.cpp の void PlayerAnime() を参照 問 ) 忍者を左に向かせ走らせたい時 frame の値をどう変化させるか? 解 )frame の値を 2 3 1 2 永遠と繰り返す frame=((3-frame)+1)%3+1 1 2 3
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) 警告 Player.cpp の void PlayerAnime() を参照 frame の値の変化で間隔を設ける目的で DX ライブラリの関数 WaitTimer (int) を使っていますが 実際のゲームプログラミングでそれを使うのは 絶対にやめてください 他のプログラムが一時的に止まってしまい ゲームの挙動がおかしくなり ます WaitTimer(int) を使わずに済む方法を考えましょう
アニメーションのプログラムについて (ABOUT THE PROGRAM OF ANIMATION) まとめ 1. LoadDivGraph関数を使って画像の分割読み込む 2. 配列の添え字の値を変化させてモーションを付けよう! 3. WaitTimer() 関数はアニメーションで何が何でも使わな い!
課題 2: マップチップの作成 LoadDivGraph 関数を使って 画像を分割読み込みさせてマップチップを作ってみよう ( 当たり判定は抜き ) 新たに Map.cpp を追加し マップチップを初期化する void Map_Init() とマップチップの描画をする void MapDraw() を作成 例 )int MapGra[CHIP_NUM]; LoadDivGraph( picture/mapchip.png,4,2,2,50,50,mapgra); DrawGraph(x*MAP_CHIP_SIZE,y*MAP_CHIP_SIZE,MapGra[Map[y][x]],TRUE); ( ヒント ) 二次元配列 二重ループ
課題 2: マップチップの作成 答え (1/2) Map[][],MapGra[] の宣言 MAP_X,MAP_Y,MAP_CHIP_SIZE, CHIP_NUM のマクロ定義 void Map_Init() と void MapDraw() の作成
課題 2: マップチップの作成 答え (2/2) void Map_Init() と void MapDraw() のプロトタイプ宣言 最後にメイン関数で呼び出し 注 ) 間違っても while 文の中に Map_Init() は書かない事!While 文の中に書いてプログラムを実行すると最悪の場合パソコンが死にます
おわり 次回マップチップの当たり判定スクロール城之内死す
( おまけ ) 今回使った DX ライブラリの関数について軽 ~ く紹介
今回使った DX ライブラリの関数について軽 ~ く紹介 LoadDivGraph(char *filename,int Allnum,int Xnum,int Ynum,int Xsize,int Ysize, int *HandleBuf ) 画像をメモリ上に分割読み込み アニメーションまたはマップチップの作成に役立つ DeleteGraph(int GrHandle) 指定の画像をメモリ上から削除 ( 解放 ) WaitTimer(int time) time[ ミリ秒 ] だけ処理を止める アニメーションの間隔を設ける 目的では使わない!( 念押し )