// 神経衰弱 リザルト void result_nervous(AppEnv& app_env, Texture& sys, Texture& frm, bool& isCont, bool& g_set, short& chain, short p_score, short r_score) { // システムメッセージの表示位置 float sys_x, sys_y; // スコアを一時的に保存 short score[] = {p_score, r_score}; while (1) { if (!app_env.isOpen()) { return; } // 左クリックで終了 if (app_env.isPushButton(Mouse::LEFT)) { app_env.flushInput(); break; } app_env.setupDraw(); // システムメッセージの表示 NV_disp_message(sys, frm, isCont, g_set, chain, score); // スコアの表示 { sys_x = (-Window::WIDTH / 2) + Card_W + Icon_W * 2; sys_y = (-Window::HEIGHT / 2) + (Telop_H * 4) - 2; CO_disp_number(sys, p_score, sys_x, sys_y); // プレイヤーの点数 CO_disp_number(sys, r_score, sys_x, sys_y - (Telop_H + 2)); // 対戦相手の点数 } app_env.update(); } }
void game_main(AppEnv& app_env) { while (1) { if (!app_env.isOpen()) { return; } app_env.setupDraw(); app_env.update(); } }
// タイトル画面 void game_title(AppEnv& app_env) { // 画像読み込み Texture title("res/png/sys01_logo.png"); // タイトルロゴ Texture start("res/png/sys02_start.png"); // スタートボタン Texture BG("res/png/bg01_gradation.png"); // 背景 // この処理内だけで使う変数 const short One_Second = 60; // 1秒 = 60.frame const short Logo_Line = 8; // 描画サイズ const short Draw_Limit = Logo_Ha - Logo_Line; // 描画アニメの終了判定 short time_count = 0; // タイマー short blink = 0; // 点滅アニメーション float draw_y = 0; // ロゴ変化アニメ:描画位置 while (1) { if (!app_env.isOpen()) { return; } // 左クリックでループ終了 if (app_env.isPushButton(Mouse::LEFT)) { app_env.flushInput(); return; } // 画像の点滅処理 { blink = (time_count / 30) % 2; time_count++; if (time_count == One_Second) { time_count = 0; } // 1秒カウントしたらリセット } // タイトルロゴに変化をつける処理 { draw_y += 1.5; if (draw_y >= Draw_Limit) { draw_y = 0; } // 描画位置をリセット } app_env.setupDraw(); // 背景表示 drawTextureBox((-Window::WIDTH / 2), (-Window::HEIGHT / 2), Window::WIDTH, Window::HEIGHT, 0, 0, Bg_W, Bg_H, BG, Color(0, 0, 0, 0.5)); // タイトルロゴ表示 drawTextureBox((-Logo_W * 1), (Logo_Ha * 1), Logo_W * 2, Logo_Ha, 0, 0, Logo_W, Logo_Ha, title, Color(1, 0.75, 0.5)); drawTextureBox((-Logo_W * 1), (Logo_Ha * 1) + draw_y, Logo_W * 2, Logo_Line, 0, (Logo_Ha - Logo_Line) - draw_y, Logo_W, Logo_Line, title, Color(1, 1, 1)); // クリックスタート drawTextureBox((-Logo_W * 0.5), (-Logo_Hb * 2), Logo_W, Logo_Hb, 0, 0, Logo_W, Logo_Hb, start, Color(1, 1, 0.5, blink)); app_env.update(); } }
void Update(AppEnv& env){ const Vec2f SUPREMUM = Vec2f(env.viewSize().x() * .5f - origin.x(), env.viewSize().y() * .5f - origin.y()); const Vec2f INFIMUM = Vec2f(-env.viewSize().x() * .5f + origin.x(), -env.viewSize().y() * .5f + origin.y()); std::cout << env.viewSize() << std::endl; if(env.isPressKey('W')){ pos.y() += speed.y(); pos.y() = std::min(pos.y(), SUPREMUM.y()); } if (env.isPressKey('S')){ pos.y() += -speed.y(); pos.y() = std::max(pos.y(), INFIMUM.y()); } if (env.isPressKey('D')){ scale.x() = 1; pos.x() += speed.x(); pos.x() = std::min(pos.x(), SUPREMUM.x()); } if (env.isPressKey('A')){ scale.x() = -1; pos.x() += -speed.x(); pos.x() = std::max(pos.x(), INFIMUM.x()); } }
void Menu::disp_menu(AppEnv& app,Vec2f mouse, Player& player){ drawTextureBox(-400, -200, 800, 400, 0, 0, 800, 400, textures[1], Color(1, 1, 1)); drawTextureBox(-350, 100, 200, 50, 0, 0, 200, 50, textures[2], Color(1, 1, 1)); drawTextureBox(-350, 35, 200, 50, 0, 0, 200, 50, textures[2], Color(1, 1, 1)); drawTextureBox(-350, -30, 200, 50, 0, 0, 200, 50, textures[2], Color(1, 1, 1)); drawTextureBox(-350, -95, 200, 50, 0, 0, 200, 50, textures[2], Color(1, 1, 1)); if (Mouse_Sq(-350, -160, 200, 50, mouse)){ drawTextureBox(-350, -160, 200, 50, 0, 0, 200, 50, textures[2], Color(0.5,0.5,0.5)); if (app.isPushButton(Mouse::LEFT)){ player.copy_params(save_data); } ofstream save("res/Saves/test_data.txt"); save << "1" << endl; save << endl; save << "Map_ID " << save_data.Map_ID << endl; save << "LV " << save_data.LV << endl; save << "STR " << save_data.STR << endl; save << "VIT " << save_data.VIT << endl; save << "ENDUR " << save_data.ENDUR << endl; save << "DEX " << save_data.DEX << endl; } else{ drawTextureBox(-350, -160, 200, 50, 0, 0, 200, 50, textures[2], Color(1, 1, 1)); } }
void SceneManager::Update(AppEnv& env) { ChanageScene(); if (env.isPushKey(GLFW_KEY_S)){ sceneType = GameMain_; } scene->Update(); }
void gameMainUpdate(AppEnv& env) { using namespace GameMainVar; state.update(); stage.Update(); enemy_manager.Update(); gimic_manager.Update(player); player.Update(env); Getter::get().patern = player.gimic_patern; if (stage.isClear()) { Getter::get().isClear = true; setSceneState(SceneState::Result); } if (env.isPushKey('R')) { Getter::get().isClear = true; setSceneState(SceneState::Result); } }
void resultUpdate(AppEnv& env) { using namespace ResultVar; if (env.isPushKey('T')) { setSceneState(SceneState::Title); } }
// 神経衰弱 本編 void game_nervous(AppEnv& app_env) { // 乱数の基準値設定 Random random; random.setSeed((u_int)time(nullptr)); // 画像の読み込み Texture t_card("res/png/c01_standard.png"); // カードの画像 Texture system("res/png/m01_nv.png"); // システムメッセージ Texture wframe("res/png/sys04_frame.png"); // テロップ用フレーム // BGM と SE の読み込み Media thema(M_THEMA); thema.gain(0.5); thema.looping(true); Media intro(M_INTRO); intro.gain(0.5); // イントロ Media click(SE_CLICK); click.gain(0.5); // クリックしたとき Media success(SE_SUCCESS); success.gain(0.25); // カードのペアを作れた Media failure(SE_FAILURE); failure.gain(0.25); // カードのペアを作れなかった Media finish(SE_FINISH); finish.gain(0.25); // ゲーム終了 // このゲーム内専用の変数 short i; // 繰り返し処理用 short open_count = 0; // カードをめくった回数 short open_chain = 0; // 連続でペアを見つけた回数 short hist_count = 0; // 履歴に情報を保存した回数 short field_count = 0; // 場に残っているカードの枚数 float card_x, card_y; // カードの表示位置(始点) float sys_x, sys_y; // システムメッセージの表示位置 bool isContinue = true; // 続けてカードをめくれるか bool isCheck = false; // 対戦相手のAI用:履歴の確認 bool isRandom = false; // 対戦相手のAI用:検索で見つからないとき、ランダムで選択 bool game_turn = true; // 誰のターンか:true = プレイヤー、false = 対戦相手 bool game_set = true; // ゲーム終了判定 // このゲーム内専用の変数:マウス判定用 Vec2f mouse_pos; // マウスカーソルの座標 bool on_mouse; // マウスカーソルの判定 // 場に配置されるカードの情報 struct Card { short number; // カードの数字 short mark; // カードの記号 bool isOpen; // 表向きになっているか }; // カード情報の生成 Card field[JOKER_NG] = {}; // 場のカード情報 short open_hist[MAX_HIST] = {}; // 表にしたカードの履歴 short prev_1, prev_2; // 表にしたカードの比較用 short game_score[] = {0, 0}; // プレイヤーと対戦相手の点数 // ゲームの初期化 { // 履歴の初期化 for (i = 0; i < MAX_HIST; i++) { open_hist[i] = -1; } // カード情報の初期化 for (i = 0; i < JOKER_NG; i++) { field[i] = {i % CARD_NUM, i / CARD_NUM, false}; } // カードのシャッフル for (i = 0; i < JOKER_NG; i++) { std::swap(field[i], field[random.fromZeroToLast(JOKER_NG)]); } intro.play(); // イントロ再生 } /* 本編 */ //////////////////////////////////////////////////////////////////////////////// while (1) { if (!app_env.isOpen()) { return; } // BGM再生:イントロが終わったらループ部分の再生 if (!intro.isPlaying()) { if (!thema.isPlaying()) { thema.play(); } } // カードの残り枚数を確認、2枚未満なら強制的に終了する if (game_set) { open_count = 0; // めくった回数をリセット field_count = 0; // カードの残り枚数をリセット // 残り枚数をカウント for (i = 0; i < JOKER_NG; i++) { if (!field[i].isOpen) { field_count++; } } // 2枚未満なら強制終了 if (field_count < OPEN_ACT) { thema.stop(); break; } game_set = false; } app_env.setupDraw(); // システムメッセージの表示 { // メッセージ全体 NV_disp_message(system, wframe, isContinue, game_set, open_chain, game_score); // スコアの表示 { sys_x = (-Window::WIDTH / 2) + Card_W + Icon_W * 2; sys_y = (-Window::HEIGHT / 2) + (Telop_H * 4) - 2; CO_disp_number(system, game_score[DEF_PLAYER], sys_x, sys_y); // プレイヤーの点数 CO_disp_number(system, game_score[DEF_RIVAL], sys_x, sys_y - (Telop_H + 2)); // 対戦相手の点数 } } switch (game_turn) { // プレイヤーのターン case true: // マウス座標の取得 mouse_pos = app_env.mousePosition(); // カードごとの処理 for (i = 0; i < JOKER_NG; i++) { // カードの表示位置設定 card_x = (Card_W + 8) * ((i % CARD_NUM) - 6.5); card_y = (Card_H + 8) * ((i / CARD_NUM) - 1); // カードの上にマウスカーソルがあるか判定 on_mouse = CO_on_mouse(mouse_pos, card_x, card_y, Card_W, Card_H); if (on_mouse && open_count < OPEN_ACT) { // まだ表向きになってないカードだったとき if (!field[i].isOpen) { // 左クリックしたときの処理 if (app_env.isPushButton(Mouse::LEFT)) { app_env.flushInput(); if (open_count == 0) { click.play(); } // 1枚目をめくったときだけ SE再生 field[i].isOpen = true; // 選んだカードを表にする open_count++; // めくった回数をカウント open_hist[hist_count] = i; // めくったカードの場所を履歴に保存 hist_count++; // 履歴を保存した回数をカウント } } } } // カードを2枚めくったとき if (open_count == OPEN_ACT) { // カードを続けて選択できるとき if (isContinue) { // 表にしたカードの情報を取得 prev_2 = open_hist[hist_count - OPEN_ACT]; // 最初にめくったカード prev_1 = open_hist[hist_count - OPEN_ACT + 1]; // 次にめくったカード // 表にしたカードの数字が同じだったとき if (field[prev_2].number == field[prev_1].number) { success.play(); // SE再生 game_score[DEF_PLAYER]++; // 点数を加算 open_chain++; // ペアを見つけた回数をカウント hist_count -= OPEN_ACT; // 履歴に保存した回数をめくった回数だけ戻す game_set = true; // 残り枚数が変化するので、もう一度確認する } // 違う数字だったとき、カードを選択できないようにする else { failure.play(); // SE再生 isContinue = false; // 履歴が埋まったらカウンタをリセット if (hist_count >= MAX_HIST) { hist_count = 0; } } } // カードが選択できなくなったとき else { // 左クリックで相手のターンにする if (app_env.isPushButton(Mouse::LEFT)) { app_env.flushInput(); click.play(); game_turn = false; // 対戦相手のターンに設定 // 数字が違うので、表にしたカードを元に戻す field[prev_2].isOpen = false; field[prev_1].isOpen = false; // 各種カウンタのリセット open_chain = 0; isContinue = true; game_set = true; } } } break; // プレイヤーのターン 終了 // 対戦相手のターン case false: // カードを選択できなくなるまで処理を実行 if (isContinue) { switch (open_count) { // 1枚目:裏向きのカードをランダムに選択 case 0: prev_2 = random.fromZeroToLast(JOKER_NG); // ランダムに選択されたカードが裏向きなら決定 if (!field[prev_2].isOpen) { open_count++; // 2枚目の選択を開始 // フラグをリセット isCheck = false; isRandom = true; } break; // 2枚目:履歴を検索、同じ数字が見つからなければランダムに選択 case 1: // 1回だけ履歴を検索する if (!isCheck) { for (i = 0; i < MAX_HIST; i++) { // 履歴に1枚目と同じ数字があれば「とりあえず」決定、ランダム選択を回避 if (field[open_hist[i]].number == field[prev_2].number) { prev_1 = open_hist[i]; isRandom = false; break; } } isCheck = true; // 履歴を確認したので、次の自分のターンまで確認しない } // 履歴検索に失敗していたら、ランダムにカードを選択 if (isRandom) { prev_1 = random.fromZeroToLast(JOKER_NG); } // 選択されたカードが裏向き、かつ1枚目と違うカードなら確定、そうでなければランダム選択開始 if (!field[prev_1].isOpen && prev_1 != prev_2) { open_count++; } else { isRandom = true; } break; // カードを2枚選択したとき case 2: // 選択されたカードを表向きにする field[prev_2].isOpen = true; field[prev_1].isOpen = true; // 選択された2枚が同じ数字だったら点数を加算して、もう一度選択する if (field[prev_1].number == field[prev_2].number) { game_score[DEF_RIVAL]++; // 点数を加算 game_set = true; // 残り枚数が変化するので、もう一度確認する } // 同じ数字ではなかったとき、カードを選択できないように設定 else { isContinue = false; } break; } } // カードを選択できなくなったとき else { // 左クリックでプレイヤーのターンにする if (app_env.isPushButton(Mouse::LEFT)) { app_env.flushInput(); click.play(); // 選択されたカードを元に戻す field[prev_2].isOpen = false; field[prev_1].isOpen = false; // 各種フラグのリセット game_turn = true; game_set = true; isContinue = true; isRandom = false; } } break; // 対戦相手のターン 終了 } // カード画像の表示 for (i = 0; i < JOKER_NG; i++) { // カードの表示位置設定 card_x = (Card_W + 8) * ((i % CARD_NUM) - 6.5); card_y = (Card_H + 8) * ((i / CARD_NUM) - 1); // カードの上にマウスカーソルがあるか判定 on_mouse = CO_on_mouse(mouse_pos, card_x, card_y, Card_W, Card_H); if (field[i].isOpen || (app_env.isPressKey('O') && app_env.isPressKey('P'))) { // カードが表側のとき drawTextureBox(card_x, card_y, Card_W, Card_H, Card_W * field[i].number, Card_H * field[i].mark, Card_W, Card_H, t_card, Color(1, 1, 1)); } else { // カードが裏側のとき drawTextureBox(card_x, card_y, Card_W, Card_H, Card_W * 1, Card_H * 4, Card_W, Card_H, t_card, NV_set_cardcolor(on_mouse)); } } app_env.update(); } // 本編 終了 // リザルト画面 finish.play(); result_nervous(app_env, system, wframe, isContinue, game_set, open_chain, game_score[DEF_PLAYER], game_score[DEF_RIVAL]); }
float PlayerMover(AppEnv& env, Player& player) { if (env.isPressKey('S')){ return player.pos.x()++; } if (env.isPressKey('A')){ return player.pos.x()--; } }
void gameMainUpdate(AppEnv& env) { using namespace GameMainVar; if (env.isPushKey('R')) { setSceneState(SceneState::Result); } }
void titleUpdate(AppEnv& env) { using namespace TitleVar; if (env.isPushButton(Mouse::LEFT)) { setSceneState(SceneState::GameMain); } }
// タイトル画面の処理 void game_title(AppEnv& app_env) { // 画像の読み込み Texture titleBG("res/png/BG04_title.png"); // タイトルの背景 Texture titleLG("res/png/BG04_title_logo.png"); // タイトルロゴ Texture result("res/png/BG05_result.png"); // リザルト画面の背景 Texture window("res/png/SYS01_window.png"); // ウィンドウ Texture button("res/png/SYS03_button.png"); // ボタンの画像 // BGMの設定 // この画面だけで使う変数 bool click = false; // クリックの真偽判定 Vec2f mouse_pos; // マウスカーソルの位置 // ボタン画像の表示位置 float button_x, button_y; while (1) { if (!app_env.isOpen()) { return; } // 開始ボタンを押したらループ終了 if (click) { break; } // マウスの座標を取得 mouse_pos = app_env.mousePosition(); app_env.setupDraw(); // 背景画像の表示 drawTextureBox(-BG_hW, -(BG_H / 2), BG_W, BG_H, 0, 0, BG_W, BG_H, titleBG, Color(1, 1, 1)); // ロゴ用フレームの表示 drawTextureBox(-(TitleLG_W / 2), TitleLG_H, TitleLG_W * 1.1, TitleLG_H * 2, 0, 0, TitleLG_W, TitleLG_H * 0.5, window, Color(1, 1, 1)); // タイトルロゴの表示 drawTextureBox(-(TitleLG_W / 2), TitleLG_H, TitleLG_W, TitleLG_H * 2, 0, 0, TitleLG_W, TitleLG_H * 2, titleLG, Color(1, 1, 1)); // ボタンの処理 for (short i = 0; i < 2; i++) { button_x = (-Button_W * 1.5) + (Button_W * 2) * i; button_y = -Button_H; // クリック判定 if (mouse_on_texture(button_x, button_y, Button_W, Button_H, mouse_pos)) { if (app_env.isPushButton(Mouse::LEFT)) { app_env.flushInput(); // 開始ボタンの処理 if (i == 0) { click = true; } // 番付ボタンの処理 else { game_ranking(app_env, result, button); } break; } } // ボタン画像の表示 drawTextureBox(button_x, button_y, Button_W, Button_H, 0, Button_H * i, Button_W, Button_H, button, Color(1, 1, 1)); } app_env.update(); } }
void Player::hitcheck(AppEnv& app,int& map_id,bool& change){ /* //右側の判定 if (Square_Hit(this->x,this->y,this->tex_x,this->tex_y,X_MIN + x*CHIP_X,Y_MAX - (y+1)*CHIP_Y,CHIP_X,CHIP_Y)){ if (this->x>X_MIN + CHIP_X * x + CHIP_X - 6){ if (this->y + this->tex_y>Y_MAX - (y + 1)*CHIP_Y + 6 && this->y < Y_MAX - (y + 1)*CHIP_Y + CHIP_Y - 6){ this->x = X_MIN + CHIP_X * x + CHIP_X; } } //左側の判定 if (this->x + this->tex_x < X_MIN + CHIP_X * x + 6){ if (this->y + this->tex_y>Y_MAX - (y + 1)*CHIP_Y + 6 && this->y < Y_MAX - (y + 1)*CHIP_Y + CHIP_Y - 6){ this->x = X_MIN + CHIP_X*x - this->tex_x; } } //上部の判定 if (this->y>Y_MAX - y * CHIP_Y - 10){ this->y = Y_MAX - y * CHIP_Y; if (!jumping){ on_foot = true; } } //下部の判定 if (this->y + this->tex_y <Y_MAX - (y+1) * CHIP_Y + 6){ if (this->x>X_MIN + CHIP_X * x + 6 && this->x + this->tex_x < X_MIN + CHIP_X * x + CHIP_X){ this->y = Y_MAX - (y+1) * CHIP_Y - this->tex_y; } } }*/ for (int y = 0; y < 20; y++){ for (int x = 0; x < 32; x++){ //ワープチップ if (map[y][x] == 8){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ on_platform = false; on_foot = false; if (app.isPushKey('Z')){ warp(app, map_id,x,y); /*switch (this->map_id){ case ALPHA01: map_id = ALPHA02; break; case ALPHA02: if (x >= 0 && x <= 3){ map_id = ALPHA03; } if (x >= 29 && x <= 31){ map_id = ALPHA04; } break; case ALPHA03: case ALPHA04: map_id = ALPHA01; break; }*/ change = true; } } } //上辺のみ当り判定チップ else if (map[y][x] == 2){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ if (this->y > Y_MAX - CHIP_Y * y - 15){ if (!jumping){ on_foot = true; on_platform = true; } this->y = Y_MAX - CHIP_Y * y; } } } //上辺&左当り判定チップ else if (map[y][x] == 3){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ if (this->x + this->tex_x < X_MIN + CHIP_X * x + 10){ if (this->y + this->tex_y > Y_MAX - (y + 1)*CHIP_Y - 6 && this->y < Y_MAX - (y + 1)*CHIP_Y + CHIP_Y + 6){ this->x = X_MIN + CHIP_X*x - this->tex_x; on_platform = true; } } else if (this->y > Y_MAX - CHIP_Y * y - 15){ if (!jumping){ on_foot = true; on_platform = true; } this->y = Y_MAX - CHIP_Y * y; } } } //上辺&右当り判定チップ else if (map[y][x] == 4){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ if (this->x>X_MIN + CHIP_X * x + CHIP_X - 10){ if (this->y + this->tex_y > Y_MAX - (y + 1)*CHIP_Y - 6 && this->y < Y_MAX - (y + 1)*CHIP_Y + CHIP_Y + 6){ this->x = X_MIN + CHIP_X * x + CHIP_X; } } else if (this->y > Y_MAX - CHIP_Y * y - 15){ if (!jumping){ on_foot = true; on_platform = true; } this->y = Y_MAX - CHIP_Y * y; } } } //上辺、下辺当り判定チップ else if (map[y][x] == 5){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ if (this->y > Y_MAX - CHIP_Y * y - 15){ if (!jumping){ on_foot = true; on_platform = true; } this->y = Y_MAX - CHIP_Y * y; } if (this->y + this->tex_y < Y_MAX - CHIP_Y * (y+1) + 15){ jumping = false; on_platform = false; y_speed = 0; this->y = Y_MAX - CHIP_Y*(y + 1) -1 - this->tex_y; } } } //上辺&左当り判定チップ else if (map[y][x] == 6){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ if (this->x + this->tex_x < X_MIN + CHIP_X * x + 10){ if (this->y + this->tex_y > Y_MAX - (y + 1)*CHIP_Y - 6 && this->y < Y_MAX - (y + 1)*CHIP_Y + CHIP_Y + 6){ this->x = X_MIN + CHIP_X*x - this->tex_x; on_platform = true; } } else if (this->y > Y_MAX - CHIP_Y * y - 15){ if (!jumping){ on_foot = true; on_platform = true; } this->y = Y_MAX - CHIP_Y * y; } } } //上辺&右当り判定チップ else if (map[y][x] == 7){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ if (this->x>X_MIN + CHIP_X * x + CHIP_X - 10){ if (this->y + this->tex_y > Y_MAX - (y + 1)*CHIP_Y - 6 && this->y < Y_MAX - (y + 1)*CHIP_Y + CHIP_Y + 6){ this->x = X_MIN + CHIP_X * x + CHIP_X; } } else if (this->y > Y_MAX - CHIP_Y * y - 15){ if (!jumping){ on_foot = true; on_platform = true; } this->y = Y_MAX - CHIP_Y * y; } } } //ステージベースチップ else if (map[y][x] == 1){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ if (!jumping){ on_foot = true; on_platform = true; } this->y = Y_MAX - (y + 1)*CHIP_Y + CHIP_Y; } } //チップ無し else if (map[y][x] == 0){ if (Square_Hit(this->x, this->y, this->tex_x, this->tex_y, X_MIN + x*CHIP_X, Y_MAX - (y + 1)*CHIP_Y, CHIP_X, CHIP_Y)){ on_platform = false; on_foot = false; } } } } }
//移動処理 void Player::move(AppEnv& app){ this->y += y_speed; /*---上---*/ if (app.isPushKey(GLFW_KEY_UP) && on_foot){ y_speed = 20; on_foot = false; jumping = true; } if (!on_platform){ y_speed -= 0.75; } if (y_speed < 0){ jumping = false; } if (y_speed <= -10){ y_speed = -10; } if (on_foot){ y_speed = 0; } if (!c_ex.UP && this->y >= UP_X){ this->y = UP_X; ex.UP = true; } else ex.UP = false; if (!c_ex.UP && ex.UP){ cam_y += 10; } if (cam_y >= 800){ cam_y = 800; c_ex.UP = true; if (y + tex_y >= 400){ y = 400 - tex_y; y_speed = -0.75; } } if (c_ex.UP && this->y<UP_X){ c_ex.UP = false; } /*///--左--///*/ //!カメラのx軸最少値(左) && ボタン判定 && 動ける範囲内 if (!c_ex.LEFT && app.isPressKey(GLFW_KEY_LEFT) && x > LEFT_X){ x -= speed; if (x <= LEFT_X){ x = LEFT_X; } } //ボタン判定 && 動ける範囲のx軸最小値(左) if (app.isPressKey(GLFW_KEY_LEFT) && x <= LEFT_X){ ex.LEFT = true; } else ex.LEFT = false;//それ以外はfalse //!カメラx軸最小値(左) && 動ける範囲のx軸最小値(左) if (!c_ex.LEFT && ex.LEFT){ //カメラが動く cam_x -= speed; if (cam_x < 0){ //最小値により小さくなれば、カメラ固定 cam_x = 0; c_ex.LEFT = true; //カメラのx軸最少値(左)に居る判定 } } //カメラのx軸最小値(左)に居る判定 if (c_ex.LEFT && app.isPressKey(GLFW_KEY_LEFT)){ //カメラが固定されたら、カメラ方向に行ける x -= speed; if (x <= -640){ x = -640; } } //フラグがtrue && 動ける範囲に戻った if (c_ex.LEFT && x > LEFT_X){ c_ex.LEFT = false;//カメラの最小値には居ない } /*---下---*/ if (!c_ex.DOWN && this->y <= DOWN_X){ this->y = DOWN_X; ex.DOWN = true; } else ex.DOWN = false; if (!c_ex.DOWN && ex.DOWN){ cam_y -= 10; } if (cam_y <= 0){ cam_y = 0; c_ex.DOWN = true; } if (c_ex.DOWN && this->y > DOWN_X){ c_ex.DOWN = false; } /*///--右--///*/ //!カメラのx軸最大値(右) && ボタン判定 && 動ける範囲内 if (!c_ex.RIGHT && app.isPressKey(GLFW_KEY_RIGHT) && x < RIGHT_X){ x += speed; if (x >= RIGHT_X){ x = RIGHT_X; } } //ボタン判定 && 動ける範囲のx軸最大値(右) if (app.isPressKey(GLFW_KEY_RIGHT) && x >= RIGHT_X){ ex.RIGHT = true; } else ex.RIGHT = false;//それ以外はfalse //!カメラのx軸最大値(右) && 動ける範囲のx軸最大値(右) if (!c_ex.RIGHT && ex.RIGHT){ //カメラが動く cam_x += speed; if (cam_x > 1280){ //最小値により小さくなれば、カメラ固定 cam_x = 1280; c_ex.RIGHT = true;//カメラのx軸最大値(右)に居る判定 } } //カメラのx軸最大値(右)に居る判定 if (c_ex.RIGHT && app.isPressKey(GLFW_KEY_RIGHT)){ //カメラが固定されたら、カメラ方向に行ける x += speed; if (x + tex_x >= 640){ x = 640 - tex_x; } } //フラグがtrue && 動ける範囲に戻った if (c_ex.RIGHT && x < RIGHT_X){ c_ex.RIGHT = false;//カメラの最大値には居ない } std::cout << "X " << this->x << std::endl; std::cout << "Y " << this->y << std::endl; std::cout << "cam_X " << this->cam_x << std::endl; std::cout << "cam_Y " << this->cam_y << std::endl; std::cout << "ex " << this->ex.UP << this->ex.LEFT << this->ex.DOWN << this->ex.RIGHT << std::endl; std::cout << "c_ex " << this->c_ex.UP << this->c_ex.LEFT << this->c_ex.DOWN << this->c_ex.RIGHT << std::endl; }
void Map::drawMap(AppEnv& env) { Player player; int map[56][32]; int x, y; std::ifstream mapfile("res/mapchip.txt"); for (y = 0; y < 56; y += 1) { for (x = 0; x < 32; x += 1) { mapfile >> map[y][x]; } } bool map_flag = true; if (map_flag) { const char* mapfile = "res/mapchip.txt"; std::ifstream* list = new std::ifstream(mapfile); for (y = 0; y < 56; y += 1) { for (x = 0; x < 32; x += 1) { *list >> map[y][x]; //map[y][x] = 0, 1; std::cout << map[y][x]; } std::cout << std::endl; } if (!env.isOpen()) exit(0); { std::fstream file; file.open("res/mapchip.txt", std::ios::out | std::ios::binary); for (y = 0; y < 56; y += 1) { for (x = 0; x < 32; x += 1) { float x_offset = (map[y][x] % 1) * CHIP_SIZE; float y_offset = (map[y][x] / 1) * CHIP_SIZE; file << map[y][x] << ' '; if (map[y][x] == 0) { drawTextureBox(map_pos.x() + (x * CHIP_SIZE), map_pos.y() - (y * CHIP_SIZE), CHIP_SIZE, CHIP_SIZE, x_offset, y_offset, 64, 64, yuka, Color::white, 0.0, Vec2f(1.0, 1.0), Vec2f(32, 32)); } if (map[y][x] == 1) { drawTextureBox(map_pos.x() + (x * CHIP_SIZE), map_pos.y() - (y * CHIP_SIZE), CHIP_SIZE, CHIP_SIZE, x_offset, y_offset, 64, 64, block, Color::white, 0.0, Vec2f(1.0, 1.0), Vec2f(32, 32)); player.HitBlocks(map_pos.x() + (x * CHIP_SIZE), map_pos.y() - (y * CHIP_SIZE), CHIP_SIZE, CHIP_SIZE); } } file << std::endl; } file.close(); } player.Move(env, map_pos); } env.flushInput(); }