using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using DxLibDLL; namespace Action { static class Program { // プログラムは WinMain から始まります static int Main() { int player_x = 0, player_y = 0, player_way = 0, player_flight=0,player_run=0; //プレイヤーの位置 int x_move = 0, y_move; //プレイヤーの移動量 int player_maxspeed = 8; //プレイヤーの最高速度 int player_collision_x = 16, player_collision_y = 48; //プレイヤーの当たり判定の大きさ int player_margin_x = 16, player_margin_y = 16; //プレイヤーの位置から当たり判定までの長さ int acceleration_raight = 0, acceleration_left=0; //プレイヤーの加速度 int player_terminalspeed = 20; //プレイヤーの落下の終端速度 int player_weight = 1; //プレイヤーの重さ int attack_power = 0; //プレイヤーの武器の威力 int jump_power = 0; int up_power=0,down_power=0,raight_power=0, left_power=0; //応力 int up_power_flug=0,down_power_flug=0,raight_power_flug=0, left_power_flug=0; //攻撃入力フラグ int red, green, blue, alpha; int Atarihantei, BackGraph; //以下画像用の変数 int char_down_l, char_down_r; int char_jamp_r, char_jamp_up_r, char_jump_down_l, char_jump_down_r, char_jump_l, char_jump_up_l; int char_ran1_l, char_ran1_r, char_ran2_l, char_ran2_r; int char_set_l, char_set_r, char_sit_l, char_sit_r, char_stand_l, char_stand_r, char_up_l, char_up_r; int kabe_kyori_up = 0, kabekyori_down=0, kabekyori_raoght=0, kabekyori_left=0; //プレイヤーから壁までの距離 int stara1, stara2; //for文を回すための適当な変数 if( DX.DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1 ; // エラーが起きたら直ちに終了 } DX.ChangeWindowMode(DX.TRUE); //ウィンドウ640,480 DX.SetTransColor(255, 0, 0); // 透過色を変更 // グラフィックをメモリにロード Atarihantei = DX.LoadSoftImage("back.png"); BackGraph = DX.LoadGraph("back.png"); char_down_l = DX.LoadGraph("char_down_l.png"); char_down_r = DX.LoadGraph("char_down_r.png"); char_jamp_r = DX.LoadGraph("char_jamp_r.png"); char_jamp_up_r = DX.LoadGraph("char_jamp_up_r.png"); char_jump_down_l = DX.LoadGraph("char_jump_down_l.png"); char_jump_down_r = DX.LoadGraph("char_jump_down_r.png"); char_jump_l = DX.LoadGraph("char_jump_l.png"); char_jump_up_l = DX.LoadGraph("char_jump_up_l.png"); char_ran1_l = DX.LoadGraph("char_ran1_l.png"); char_ran1_r = DX.LoadGraph("char_ran1_r.png"); char_ran2_l = DX.LoadGraph("char_ran2_l.png"); char_ran2_r = DX.LoadGraph("char_ran2_r.png"); char_set_l = DX.LoadGraph("char_set_l.png"); char_set_r = DX.LoadGraph("char_set_r.png"); char_sit_l = DX.LoadGraph("char_sit_l.png"); char_sit_r = DX.LoadGraph("char_sit_r.png"); char_stand_l = DX.LoadGraph("char_stand_l.png"); char_stand_r = DX.LoadGraph("char_stand_r.png"); char_up_l = DX.LoadGraph("char_up_l.png"); char_up_r = DX.LoadGraph("char_up_r.png"); while (true) { // 画面に描かれているものをすべて消す DX.ClearDrawScreen(); //背景を描画する DX.DrawGraph(0, 0, BackGraph, DX.FALSE); //プレイヤーの移動量を調べる //入力による右移動の加速度を与える if (DX.CheckHitKey(DX.KEY_INPUT_RIGHT) == 1 && acceleration_raight < player_maxspeed) { acceleration_raight = acceleration_raight + 1; } else { acceleration_raight = 0; } //入力による左移動の加速度を与える if (DX.CheckHitKey(DX.KEY_INPUT_LEFT) == 1 && acceleration_left < player_maxspeed) { acceleration_left = acceleration_raight + 1; } else { acceleration_left = 0; } //右方向への応力を与える if (DX.CheckHitKey(DX.KEY_INPUT_LEFT) == 1 && DX.CheckHitKey(DX.KEY_INPUT_SPACE) == 1 && raight_power_flug==0) { raight_power = attack_power; raight_power_flug=1; } else { raight_power_flug = 0; } //左方向への応力を与える if (DX.CheckHitKey(DX.KEY_INPUT_RIGHT) == 1 && DX.CheckHitKey(DX.KEY_INPUT_SPACE) == 1 && left_power_flug == 0) { left_power = attack_power; left_power_flug = 1; } else { left_power_flug = 0; } //上方向への応力を与える if (DX.CheckHitKey(DX.KEY_INPUT_DOWN) == 1 && DX.CheckHitKey(DX.KEY_INPUT_SPACE) == 1 && up_power_flug == 0) { up_power = attack_power; up_power_flug = 1; } else { up_power_flug = 0; } //下方向への応力を与える if (DX.CheckHitKey(DX.KEY_INPUT_UP) == 1 && DX.CheckHitKey(DX.KEY_INPUT_SPACE) == 1 && down_power_flug == 0) { down_power = attack_power; down_power_flug = 1; } else { down_power_flug = 0; } //応力を打ち消す //左右の応力の打ち消し if (raight_power > 0 && left_power > 0) { if (raight_power >= left_power) { raight_power = raight_power - left_power; left_power = 0; } if (left_power > raight_power) { left_power = left_power - raight_power; raight_power = 0; } } //上下の応力の打ち消し if (up_power > 0 && down_power > 0) { if (up_power >= down_power) { up_power = up_power - down_power; down_power = 0; } if (down_power > up_power) { down_power = down_power - up_power; up_power = 0; } } //応力の減退(0以下にならないようにしている) if (raight_power > 0) raight_power = raight_power - player_weight; if (left_power > 0) left_power = left_power - player_weight; if (up_power > 0) up_power = up_power - player_weight; if (down_power > 0) down_power = down_power - player_weight; //落下の加速度を加える(終端速度を超えないようにしている) jump_power = jump_power + 1; if (jump_power > player_terminalspeed) jump_power = player_terminalspeed; //プレイヤーの移動量 x_move = acceleration_raight - acceleration_left + raight_power - left_power; y_move = -up_power + down_power + jump_power; //壁までの距離を調べて移動量を制限する if (x_move >= 0) //右に移動するとき { for (stara1 = player_x + player_margin_x + player_collision_x + x_move; stara1 > player_x + player_margin_x + player_collision_x; stara1--) { for (stara2 = player_y + player_margin_y; stara2 < player_y + player_margin_y + player_collision_y; stara2++) { DX.GetPixelSoftImage(Atarihantei, stara1, stara2, out red, out green, out blue, out alpha); if (red == 0 & green == 0 & blue == 0) { x_move = stara1 - 1; } } } } if (x_move < 0) //左に移動するとき { for (stara1 = player_x + player_margin_x - x_move; stara1 < player_x + player_margin_x; stara1++) { for (stara2 = player_y + player_margin_y; stara2 < player_y + player_margin_y + player_collision_y; stara2++) { DX.GetPixelSoftImage(Atarihantei, stara1, stara2, out red, out green, out blue, out alpha); if (red == 0 & green == 0 & blue == 0) { x_move = stara1 + 1; } } } } if (y_move <= 0) //上に移動するとき { for (stara1 = player_y + player_margin_y - y_move; stara1 < player_y + player_margin_y; stara1++) { for (stara2 = player_x + player_margin_x + x_move; stara2 < player_x + player_margin_x + player_collision_x + x_move; stara2++) { DX.GetPixelSoftImage(Atarihantei, stara1, stara2, out red, out green, out blue, out alpha); if (red == 0 & green == 0 & blue == 0) { y_move = stara1 + 1; } } } } if (y_move > 0) //下に移動するとき { for (stara1 = player_y + player_margin_y + player_collision_y - y_move; stara1 > player_y + player_margin_y + player_collision_x; stara1--) { for (stara2 = player_x + player_margin_x + x_move; stara2 < player_x + player_margin_x + player_collision_x + x_move; stara2++) { DX.GetPixelSoftImage(Atarihantei, stara1, stara2, out red, out green, out blue, out alpha); if (red == 0 & green == 0 & blue == 0) { y_move = stara1 - 1; } } } } //プレイヤーの移動 player_x = player_x + x_move; player_y = player_y + y_move; //プレイヤーの状態を調べる if (DX.CheckHitKey(DX.KEY_INPUT_RIGHT) == 1) player_way = 0; //右を向いている状態 if (DX.CheckHitKey(DX.KEY_INPUT_LEFT) == 1) player_way = 1; //左を向いている状態 //着地しているか調べる 着地していたら落下加速度を0にする for (stara1 = player_x + player_margin_x; stara1 < player_x + player_margin_x + player_collision_x; stara1++) { DX.GetPixelSoftImage(Atarihantei, stara1, player_y + player_margin_y + player_collision_y+1, out red, out green, out blue, out alpha); if (red == 0 & green == 0 & blue == 0) { player_flight = 0; jump_power = 0; } else { player_flight = 1; } } //プレイヤーの描画 if (player_flight == 1) //飛んでいる状態で { if (player_way == 0) //右向きで { if (DX.CheckHitKey(DX.KEY_INPUT_UP) == 1) DX.DrawGraph(player_x, player_y, char_jamp_up_r, DX.TRUE); //上ボタンを押している if (DX.CheckHitKey(DX.KEY_INPUT_DOWN) == 1) DX.DrawGraph(player_x, player_y, char_jump_down_r, DX.TRUE); //下ボタンを押している if (DX.CheckHitKey(DX.KEY_INPUT_UP) != 1 && DX.CheckHitKey(DX.KEY_INPUT_DOWN) != 1) DX.DrawGraph(player_x, player_y, char_jamp_r, DX.TRUE); //上ボタンも下ボタンも押していない } if (player_way == 1) //左向きで { if (DX.CheckHitKey(DX.KEY_INPUT_UP) == 1) DX.DrawGraph(player_x, player_y, char_jump_up_l, DX.TRUE); //上ボタンを押している if (DX.CheckHitKey(DX.KEY_INPUT_DOWN) == 1) DX.DrawGraph(player_x, player_y, char_jump_down_l, DX.TRUE); //下ボタンを押している if (DX.CheckHitKey(DX.KEY_INPUT_UP) != 1 && DX.CheckHitKey(DX.KEY_INPUT_DOWN) != 1) DX.DrawGraph(player_x, player_y, char_jump_l, DX.TRUE); //上ボタンも下ボタンも押していない } } if (player_flight == 0) //着地している状態で { if (DX.CheckHitKey(DX.KEY_INPUT_RIGHT) == 1) //右ボタンを押している { if (player_run == 0) { DX.DrawGraph(player_x, player_y, char_ran1_r, DX.TRUE); player_run = 1; } if (player_run == 1) { DX.DrawGraph(player_x, player_y, char_ran2_r, DX.TRUE); player_run = 0; } } else if (DX.CheckHitKey(DX.KEY_INPUT_LEFT) == 1) //左ボタンを押している { if (player_run == 0) { DX.DrawGraph(player_x, player_y, char_ran1_l, DX.TRUE); player_run = 1; } else if (player_run == 1) { DX.DrawGraph(player_x, player_y, char_ran2_l, DX.TRUE); player_run = 0; } } else if (DX.CheckHitKey(DX.KEY_INPUT_UP) == 1) //上ボタンを押して { if (player_way == 0) DX.DrawGraph(player_x, player_y, char_up_r, DX.TRUE); //右を向いている if (player_way == 1) DX.DrawGraph(player_x, player_y, char_up_l, DX.TRUE); //左を向いている } else if (DX.CheckHitKey(DX.KEY_INPUT_DOWN) == 1) //下ボタンを押して { if (DX.CheckHitKey(DX.KEY_INPUT_SPACE) == 1) //スペースボタンを押して { if (player_way == 0) DX.DrawGraph(player_x, player_y, char_down_r, DX.TRUE); //右を向いている if (player_way == 1) DX.DrawGraph(player_x, player_y, char_down_l, DX.TRUE); //左を向いている } if (DX.CheckHitKey(DX.KEY_INPUT_SPACE) == 1) //スペースボタンを押さずに { if (player_way == 0) DX.DrawGraph(player_x, player_y, char_up_r, DX.TRUE); //右を向いている if (player_way == 1) DX.DrawGraph(player_x, player_y, char_up_l, DX.TRUE); //左を向いている } } else { if (player_way == 0) DX.DrawGraph(player_x, player_y, char_stand_r, DX.TRUE); //右を向いている if (player_way == 1) DX.DrawGraph(player_x, player_y, char_stand_l, DX.TRUE); //左を向いている } } //リセット x_move = 0; y_move = 0; if (player_y > 400) //デバッグ用 { stara1 = 0; } // 裏画面の内容を表画面に反映させる DX.ScreenFlip(); // 待たないと処理が早すぎるのでここで20ミリ秒待つ DX.WaitTimer(20); // Windows システムからくる情報を処理する if (DX.ProcessMessage() == -1) break; // ESCキーが押されたらループから抜ける if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) == 1) break; } DX.DxLib_End() ; // DXライブラリ使用の終了処理 // 使い終わったら解放 DX.DeleteSoftImage(Atarihantei); return 0 ; // ソフトの終了 } } }