挙動がおかしいです。
files:
src:
main.cpp
graph.cpp
load.cpp
char.cpp
include:
struct.h
GV.h
function.h
define.h
main.cpp
#include "../../DxLib/DxLib.h"
#include "../include/GV.h"
int ch_img[12];
ch_t ch;
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
SetGraphMode(800, 600, 32);
ChangeWindowMode(TRUE);
SetMainWindowText("東方風弾幕");
SetDrawScreen(DX_SCREEN_BACK);
SetAlwaysRunFlag(TRUE);
if (DxLib_Init() == -1) return -1;
//============================
// ここから
//============================
load();
ch_init();
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ClearDrawScreen() == 0)
{
ch_move();
graph_main();
ScreenFlip();
}
DxLib_End();
return 0;
}
#include "../include/GV.h"
// キャラクターの描画関係
void graph_ch() {
DrawGraph(ch.first_x + ch.x, ch.first_y + ch.y, ch_img[ch.img], TRUE);
}
// 描画関係のメイン関数
void graph_main() {
graph_ch();
}
#include "../include/GV.h"
void load() {
LoadDivGraph("../img/char/c01.png", 12, 4, 3, 50, 50, ch_img);
}
#include "../include/GV.h"
void ch_init() {
ch.first_x = (FIELD_WIDTH - 50) / 2;
ch.first_y = 500;
}
void ch_move() {
int joge_flag = 0, sayu_flag = 0; //左右上下の押下フラグ
int frame_cnt = 0; //フレームカウント
double x, y, mx, my, naname = 1; //x座標y座標、動いたx距離、動いたy距離
double move_x[4] = {-4.0, 4.0, 0.0, 0.0}, move_y[4] = {0.0, 0.0, -4.0, 4.0}; //{左右上下}の移動スピード
int input_key[4]; //左右上下のキー格納
input_key[0] = CheckHitKey(KEY_INPUT_LEFT); input_key[1] = CheckHitKey(KEY_INPUT_RIGHT); //左右方向のキー入力
input_key[2] = CheckHitKey(KEY_INPUT_UP); input_key[3] = CheckHitKey(KEY_INPUT_DOWN); //上下方向のキー入力
//左右キ-が押されていなかったら
for (int i = 0; i < 2; i++) { //左右分のループ
if (input_key[i] == 0) { //もしi番目(左右)が押されていなかったら
if (frame_cnt % 15 == 0) { //もしframe_cntを15で割った余りが0ならば
if (ch.img == NEUTRAL_CH_IMG_MAX) //もしキャラの画像が3(最大)だったのなら
ch.img = FIRST_NEUTRAL_CH_IMG; //元の番号に戻す
ch.img++; //キャラ画像をプラスする
}
}
}
if (input_key[0] == 1) { //左方向キーが押されていたら
ch.img = FIRST_LT_CH_IMG; //画像をはじめの左向き画像に
if (frame_cnt % 15 == 0) { //もしframe_cntを15で割った余りが0ならば
if (ch.img == LT_CH_IMG_MAX) //もしキャラの画像が11(最大)だったのなら
ch.img = FIRST_LT_CH_IMG; //元の番号に戻す
ch.img++; //キャラの画像番号をプラスする
}
} else if (input_key[1] == 1) { //右方向キーが押されていたら
ch.img = FIRST_RT_CH_IMG; //左向きの初期値
if (frame_cnt % 15 == 0) { //もしframe_cntを15で割った余りが0ならば
if (ch.img == RT_CH_IMG_MAX) //もしキャラの画像が8(最大)だったのなら
ch.img = FIRST_RT_CH_IMG; //元の番号に戻す
ch.img++; //キャラの画像番号をプラスする
}
}
for (int i = 0; i < 2; i++) //左右二回分
if (input_key[i] == 1) //左右どちらかの入力があれば
sayu_flag = 1; //左右フラグを1にする
for (int i = 2; i < 4; i++) //左右二回分
if (input_key[i] == 1) //左右どちらかの入力があれば
joge_flag = 1; //上下フラグを1にする
if (sayu_flag == 1 && joge_flag == 1) //どちらも入力があれば
naname = sqrt(2.0); //斜めを1√2に
for (int i = 0; i < 4; i++) { //左右上下の4回分繰り返す
if (input_key[i] == 1) { //i番目のキーの入力があれば
x = ch.x, y = ch.y; //現在の座標を取り敢えず代入
mx = move_x[i], my = move_y[i]; //i番目の移動分をmx,myに代入
x += mx / naname, y += my / naname; //現在の座標と移動分を足す
if (x > 0 || x < FIELD_WIDTH || //x,yが可動範囲内なら
y > 0 || y < FIELD_HEIGHT) {
ch.x = x, ch.y = y; //実際に動かす
}
}
}
}
// load.cpp
// データのロード
extern void load();
// graph.cpp
// 描画のメイン
extern void graph_main();
// char.cpp
// キャラの移動制御
extern void ch_init();
extern void ch_move();
// 画面サイズ
#define WINDOW_WIDTH (800)
#define WINDOW_HEIGHT (600)
// ゲーム画面のサイズ(フィールド)(仮)
#define FIELD_WIDTH (600)
#define FIELD_HEIGHT (600)
// ◯方向時の最初の画像番号
#define FIRST_LT_CH_IMG (8) // 8~11
#define FIRST_RT_CH_IMG (4) // 4~7
#define FIRST_NEUTRAL_CH_IMG (0) // 0~3
// ◯方向時の最大の画像番号
#define LT_CH_IMG_MAX (11)
#define RT_CH_IMG_MAX (7)
#define NEUTRAL_CH_IMG_MAX (3)
#include <math.h>
#include "../../DxLib/DxLib.h"
#include "struct.h"
#include "function.h"
#include "define.h"
// 画像用変数宣言区域
extern int ch_img[12];
// 構造体変数宣言区域
extern ch_t ch;
一回でも方向キーを押すと、ニュートラル状態でも正常に動きません。
方向キーを押している間は表示されるのですが、離すと消えてしまいます。
また、フィールドの当たり判定ができていません・・・
細かいバグはちゃんと表示されていからじゃないとわからないと思います。
丸投げのようになってすみません、お願いします