プログラムが重くなる大きな要因は?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: プログラムが重くなる大きな要因は?

Re: プログラムが重くなる大きな要因は?

#8

by Dixq (管理人) » 5年前

解決したようでよかったです。
https://dixq.net/g/
こちらにあるゲームプログラミング設計の章をお読み頂ければどのように設計すればよい分かると思います。

Re: プログラムが重くなる大きな要因は?

#7

by parsley » 5年前

返信がとても遅くなり申し訳ありません。
指摘された通りに改善したところ問題なくスムーズに動きました!
アドバイス通りにこれからは自分ですぐ改善できるような範囲でプログラムを書いてプログラムに慣れていこうと思います。本当にありがとうございました!

Re: プログラムが重くなる大きな要因は?

#6

by Dixq (管理人) » 5年前

LoadGraphという関数はメモリに画像等のリソースを展開する処理を行います。
DeleteすることなくLoadをし続けるとドンドンメモリ容量がなくなりしまいにスワップが始まるでしょう。
以下のようなコードだと思ってもらうとよいと思います。

コード:

while(1){
    p = new Hoge();
}

コード:

while(1){
    p = malloc(hoge);
}
Deleteすることなくメモリ確保を続けるとどうなるか・・。
画像のロードなどはメインループに入る前に行うべきです。(入った後に行いたいならその瞬間だけ通るようにし、不要なものをDeleteすべき)

コード:

Initialize();
while(...){
    Update();
    Draw();
}
最初はこのように作るべきでしょう。
最初にInitialize関数を通ったとき必要なリソースのロードなど準備をします。
メインループに入ったら更新と描画を1秒間に60回行います。
この方法は先のリンク先で紹介しています。(私の書いた記事です)
上でも言っているようにメインループの構造を教えてもらえたらアドバイスができるかもしれません。

最初はいきなり大きなプログラムを作ろうとせず小さなプログラムを綺麗に書くように努めてみましょう。

Re: プログラムが重くなる大きな要因は?

#5

by parsley » 5年前

すみません・・・最近プログラムを勉強し始めたばかりで人に見せるような事は今回が初めてなもので
質問ばかりで申し訳ないのですがLoadGraphのやりすぎでメモリが膨らんでいるなら、どういった方法ならメモリが膨らまずに画像を読み込めますか?少しは自分で考えろと思うんですが、自分では方法が全く想像できなくて・・・
あとご丁寧にリンクを教えていただきありがとうございます。早速参考にしようと思います。

Re: プログラムが重くなる大きな要因は?

#4

by Dixq (管理人) » 5年前

もう少し回答する人の気持ちになって質問してもらいたいです。
これではとてもコードを読むのが難しいです。せめてcodeタグで囲んでください。
また、大量にコードが掲載されていますが、肝心な部分がないようです。
メインループはどんな構造になっているのでしょうか?
game_mainはどこかから何度も呼び出されるのでしょうか?
そうだとしたらLoadGraphをやり過ぎてドンドンメモリが膨らんでいるのではないかと思います。
VisualStudioやタスクマネージャーを使う等して実行しているプロセスがどれくらいメモリを使っているか確認してください。

また、プログラムの設計方法があまりにもできていないです。
このまま突き進んでも現在のように自分ではどうしようもなくなるばかりになるかと思います。
シンプルでわかり易い設計をするように設計の勉強をしてみましょう。

https://dixq.net/g/
こちらにあるゲームプログラミング設計やメニューのサンプルなどをご覧ください。

Re: プログラムが重くなる大きな要因は?

#3

by parsley » 5年前

#include "DxLib.h"
#include "game_main.h"
#include "../support/Support.h"
#include <time.h>
#include <math.h>

#define PI 3.1415926535897932384626433832795f


//初期設定
int is_init = false;

int viewer = 0;


//文字列の格納


int gyou = 0;
int num_moji = 0;
int page = 0;
int page_a = 0;
int gyou_a = 0;
int num_moji_a = 0;
const int interval = 1;

int counter = interval;
//文字を格納
const char* moji[2][3] = {
{
"勝てるわけがない…",
"そう思った自分は自然に逃げ出していた。",
"しかし相手が逃がしてくれるはずもなく…",
},
{
"BAD END",
"世の中そんなに甘くはない",
"Escでゲーム終了、Backでタイトルへ",
},
};
char hyouji[3][256] = {
"\0",
"\0",
"\0",
};

const char* tutolial[4][3] = {
{
"じゃんけんバトルでの勝利条件は",
"相手の体力を0にすれば勝ち、",
"されれば負け犬となりゲームオーバーとなります。",
},
{
"基本ルールとしてはじゃんけんをして",
"勝てば相手にダメージがあいこはお互いに",
"負ければ自分にダメージが入ります。",

},
{
"じゃんけん道にはじゃんけん四天王がおり",
"その四天王全てに勝つことで",
"ゲームクリアとなります。",

},
{
"見事じゃんけん道を制覇し",
"じゃんけんチャンピオンを目指してください!",
"Enterでチュートリアル終了",
},
};

char kaisetu[3][256] = {
"\0",
"\0",
"\0",
};
const char* badend[3]{
"BAD END",
"きみじゃんけん弱いね",
"Escでゲーム終了、Backでタイトルへ",
};

char end_b[3][256] = {
"\0",
"\0",
"\0",
};


const char* ending[3][3] = {
{
"見事じゃんけん道を制覇し",
"じゃんけんチャンピオンとなった",
"あなたの名は瞬く間に広がり",
},
{
"一躍有名人となり",
"富と名声を手に入れ",
"幸せに暮らしました",
},
{
"NOMAL END",
"ありふれた幸せ",
" Backでタイトルへ",
},
};
char end[3][256] = {
"\0",
"\0",
"\0",
};

const char* tend[3][3] ={
{
"あなたが最後に倒した相手は",
"なんとじゃんけんの神様でした",
"神の一人を倒したあなたは",
},
{
"神々に認められ",
"神様の一人となり",
"未来永劫語り継がれていきました",

},
{
"TRUE END",
"神の頂へ",
"Enterでタイトルへ",

},
};
char endt[3][256] = {
"\0",
"\0",
"\0",
};



//各キャラの体力
int player_a_life = 300;
int player_b_life = 400;
int player_c_life = 500;
int enemy_a_life = 200;
int enemy_b_life = 280;
int enemy_c_life = 350;
int enemy_d_life = 420;
int boss_life = 600;


//各画像
int start;
int player_a;
int player_b;
int player_c;
int corsour;
int start_2;
int battle_1;
int battle_2;
int battle_3;
int battle_4;
int rock;
int paper;
int scissous;
int loser;
int bear;
int battle;
int end_1;
int end_2;
int battle_5;
int battle_6;
int battle_7;
int boss;
int boss_1;
int boss_2;
int boss_3;

//カーソルの座標
int x_p = 0;
int x_p_2 = 0;

int x = 475;
int y = 400;
int ax = 525;
int ay = 440;

int r_p = 560;
int s_p = 720;
int p_p = 880;

int color_r = 255;
int color_g = 255;
int color_b = 255;

//ステタース管理 体力 攻撃力(グー チョキ パー) 防御
int player_a_status[5] = { 300,180,90,80,5 };
int player_b_status[5] = { 400,80,120,80,8 };
int player_c_status[5] = { 500,60,60,90,12 };
int enemy_a_status[5] = { 200,80,60,60,3 };
int enemy_b_status[5] = { 280,70,70,80,6 };
int enemy_c_status[5] = { 350,85,85,85,8 };
int enemy_d_status[5] = { 420,60,60,100,10 };
int boss_status[5] = { 600,100,100,140,10 };

//じゃんけん用変数
int player_hand = 0;
int cpu_hand;
int win_count = 0;
int lose_count = 0;
int rezult;
int damage_player = 0;
int damage_enemy = 0;
int random = 0;

//フラグ管理用
int opening_tutorial = 0;
int count = 0;
int choise = 0;
int damaged = 0;
int critical;
int downed = 0;


//返し値用変数
int t = 10;

int corsour_move() {
if (IsKeyDownTrigger(KEY_INPUT_LEFT)) player_hand -= 1;

if (player_hand < 0) player_hand = 2;

if (IsKeyDownTrigger(KEY_INPUT_RIGHT)) player_hand += 1;

if (player_hand > 2) player_hand = 0;

if (0 == player_hand) {
DrawRotaGraph(590, 590, 0.4, 0, corsour, true);
}
if (1 == player_hand) {
DrawRotaGraph(755, 590, 0.4, 0, corsour, true);
}
if (2 == player_hand) {
DrawRotaGraph(920, 590, 0.4, 0, corsour, true);
}


if (0 == player_hand) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 9;
}
}
if (1 == player_hand) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 9;
}
}
if (2 == player_hand) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 9;
}
}
return t;
}

int choise_move() {
if (0 == player_hand) {
DrawGraph(r_p, 480, rock, false);
if (r_p > 140) {
r_p -= 20;
if (r_p < 140) {
r_p = 140;
}
}
}
if (1 == player_hand) {
DrawGraph(s_p, 480, scissous, false);
if (s_p > 140) {
s_p -= 20;
if (s_p < 140) {
s_p = 140;
}
}
}
if (2 == player_hand) {
DrawGraph(p_p, 480, paper, false);
if (p_p > 140) {
p_p -= 20;
if (p_p < 140) {
p_p = 140;
}
}
}
if (r_p == 340 || s_p == 340 || p_p == 340) {
count = 1;
}
if (count == 1) {
SetFontSize(60);
DrawStringEx(680, 500, 0x0000, "じゃん");
}

if (r_p < 200 || s_p < 200 || p_p < 200) {
count = 2;
}

if (r_p < 150 || s_p < 150 || p_p < 150) {
DrawStringEx(720, 500, 0x0000, "けん");
}
if (IsKeyDownTrigger(KEY_INPUT_BACK)) {
viewer = 8;
}
if (r_p == 140 || s_p == 140 || p_p == 140) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 10;
}
}
return t;
}



int rezults() {
// rezult 0がグー1がチョキ2がパー rezult0が勝ち 1が負け 2があいこ
if (cpu_hand == 0) {
if (player_hand == 1) {
rezult = 1;

}
if (player_hand == 2) {
rezult = 0;
}
if (player_hand == 0) {
rezult = 2;
}
}
if (cpu_hand == 1) {
if (player_hand == 2) {
rezult = 1;
}
if (player_hand == 0) {
rezult = 0;
}
if (player_hand == 1) {
rezult = 2;
}
}

if (cpu_hand == 2) {
if (player_hand == 0) {
rezult = 1;
}
if (player_hand == 1) {
rezult = 0;
}
if (player_hand == 2) {
rezult = 2;
}
}
return t;
}




int game_main() {
//乱数シード
srand((int)time(NULL));

start = LoadGraph("title.png", true);
player_a = LoadGraph("player_a.png", true);
player_b = LoadGraph("player_s.png", true);
player_c = LoadGraph("player_c.png", true);
corsour = LoadGraph("カーソル.jpg", true);
start_2 = LoadGraph("road.png", true);
battle_1 = LoadGraph("view_1.png", true);
rock = LoadGraph("rock.png", true);
paper = LoadGraph("paper.png", true);
scissous = LoadGraph("scissous.png", true);
loser = LoadGraph("loser.png", true);
bear = LoadGraph("bear.png", true);
battle = LoadGraph("view.png", true);
battle_2 = LoadGraph("view_2.png", true);
battle_3 = LoadGraph("view_3.png", true);
battle_4 = LoadGraph("view_4.png", true);
end_1 = LoadGraph("hapy.png", true);
end_2 = LoadGraph("happy_2.png", true);
battle_6 = LoadGraph("view.jpg", true);
battle_7 = LoadGraph("view_5.jpg", true);
boss = LoadGraph("boss.jpg", true);
boss_1 = LoadGraph("boss_1.jpg", true);
boss_2 = LoadGraph("boss_2.jpg", true);
boss_3 = LoadGraph("boss_3.jpg", true);






switch (viewer) {
//タイトルの文字の表示
case 0:

if (IsKeyDownTrigger(KEY_INPUT_SPACE)) {
viewer = 6;
opening_tutorial = 2;
}

DrawRotaGraph(520, 370, 1.6, 0, start, true);
SetFontSize(60);
SetFontThickness(7);
DrawStringEx(50, 90, 0xefab, "じゃんけん道");
DrawStringEx(220, 680, 0xefab, "Please push the Enter Key");
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 1;
}

break;
//キャラクター選択
case 1:

if (IsKeyDownTrigger(KEY_INPUT_SPACE)) {
viewer = 35;
downed = 4;
lose_count = 0;
win_count = 10;
}

SetFontSize(35);
SetFontThickness(5);
DrawStringEx(50, 100, 0xffffffff, "キャラクターを選択してください。");
DrawStringEx(50, 150, 0xffffffff, "キャラクター毎に性能が違います。");
DrawStringEx(650, 100, 0xffffffff, "←→で選択");
DrawStringEx(650, 150, 0xffffff, "Enterで決定");
//キャラ三人を表示
DrawGraph(30, 250, player_a, false);
DrawGraph(380, 235, player_b, false);
DrawGraph(690, 260, player_c, false);



//カーソル移動
if (IsKeyDownTrigger(KEY_INPUT_LEFT)) x_p -= 1;

if (x_p < 0) x_p = 2;

if (IsKeyDownTrigger(KEY_INPUT_RIGHT)) x_p += 1;

if (x_p > 2) x_p = 0;

if (0 == x_p) DrawGraph(140, 680, corsour, false);

if (1 == x_p) DrawGraph(494, 680, corsour, false);

if (2 == x_p) DrawGraph(790, 680, corsour, false);

//キャラ選択時 対象キャラ詳細表示
if (x_p == 0) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 2;
}
}
if (x_p == 1) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 3;
}
}
if (x_p == 2) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 4;
}
}
break;

//キャラ詳細説明
case 2:
DrawGraph(400, 200, player_a, false);
DrawStringEx(300, 100, 0xffffff, "一撃特化型");
DrawStringEx(300, 130, 0xffffff, "火力が高い分、体力が低い。");
DrawStringEx(300, 160, 0xffffff, "じゃんけんに自信がある人向け");
DrawStringEx(300, 520, 0xffffff, "体力300");
DrawStringEx(300, 550, 0xffffff, "得意な手 : グー");
DrawStringEx(400, 700, 0xffffff, "Enterで決定 backで選択画面へ");
if (IsKeyDownTrigger(KEY_INPUT_BACK)) viewer = 1;

if (IsKeyDownTrigger(KEY_INPUT_RETURN)) viewer = 5;


break;

case 3:
DrawGraph(300, 200, player_b, false);
DrawStringEx(300, 100, 0xffffff, "オールラウンダー");
DrawStringEx(300, 130, 0xffffff, "バランスが良く、使いやすい");
DrawStringEx(300, 160, 0xffffff, "あいこでもダメージを受けない");
DrawStringEx(300, 630, 0xffffff, "体力400");
DrawStringEx(300, 660, 0xffffff, "得意な手 : チョキ");
DrawStringEx(400, 700, 0xffffff, "Enterで決定 backで選択画面へ");
if (IsKeyDownTrigger(KEY_INPUT_BACK)) viewer = 1;

if (IsKeyDownTrigger(KEY_INPUT_RETURN)) viewer = 5;

break;

case 4:
DrawGraph(450, 200, player_c, false);
DrawStringEx(300, 100, 0xffffff, "耐久型");
DrawStringEx(300, 130, 0xffffff, "火力が低い分、体力が高い。");
DrawStringEx(300, 160, 0xffffff, "じゃんけんを楽しみたい人向け");
DrawStringEx(300, 600, 0xffffff, "体力500");
DrawStringEx(300, 630, 0xffffff, "得意な手 : パー");
DrawStringEx(400, 700, 0xffffff, "Enterで決定 backで選択画面へ");
if (IsKeyDownTrigger(KEY_INPUT_BACK)) viewer = 1;

if (IsKeyDownTrigger(KEY_INPUT_RETURN)) viewer = 5;

break;
//---------------------------------------------------------------------------------------------------------

//ゲームの大まかなストーリー解説-------------------------------------------------------------------------
case 5:
DrawRotaGraph(515, 350, 2.50, 0, start_2, true);
SetFontSize(50);
SetFontThickness(4);
DrawStringEx(50, 50, 0xffffff, "あなたはじゃんけんを極めようと");
DrawStringEx(50, 120, 0xffffff, "このじゃんけん道にやってきました。");
DrawStringEx(50, 190, 0xffffff, "これから戦うことになる");
DrawStringEx(300, 260, 0x07e0, "じゃんけん四天王");
DrawStringEx(500, 320, 0xffffff, "に勝てば");
DrawStringEx(350, 390, 0xffffff, "あなたも晴れて");
DrawStringEx(370, 460, 0xffffff, "じゃんけんマスターです!");
DrawStringEx(650, 670, 0xffffff, "Enterで次へ");

if (IsKeyDownTrigger(KEY_INPUT_RETURN)) viewer = 6;


break;
//------------------------------------------------------------------------------------------------------------
case 6:
//光度が80以上かつチュートリアルが始まってないとき--------------------------------
SetDrawBright(color_r, color_g, color_b);
if (color_r > 80 && opening_tutorial == 0) {
color_r -= 10;
color_g -= 10;
color_b -= 10;
}
if (color_r < 80) {
color_r = 80;
color_g = 80;
color_b = 80;
opening_tutorial = 1;
}
if (opening_tutorial == 2) {
color_r += 20;
color_g += 20;
color_b += 20;
}
//--------------------------------------------------------------------------------
DrawRotaGraph(515, 350, 1.7, 0, battle_1, true);
DrawBox(30, 100, 280, 220, 0xffffff, true);
SetFontSize(30);
DrawStringEx(40, 100, 000000, "化け熊");
DrawStringEx(150, 170, 000000, "%d/200", enemy_a_life);
DrawBox(30, 500, 280, 620, 0xffffff, true);
SetFontSize(30);
DrawStringEx(40, 500, 000000, "あなた");
if (x_p == 0) DrawStringEx(140, 570, 000000, "%d/%d", player_a_life, player_a_status[0]);
if (x_p == 1) DrawStringEx(140, 570, 000000, "%d/%d", player_b_life, player_b_status[0]);
if (x_p == 2) DrawStringEx(140, 570, 000000, "%d/%d", player_c_life, player_c_status[0]);

//カーソルの移動--------------------------------------------
if (opening_tutorial == 2) {
if (IsKeyDownTrigger(KEY_INPUT_UP)) x_p_2 -= 1;

if (x_p_2 < 0) x_p_2 = 0;

if (IsKeyDownTrigger(KEY_INPUT_DOWN)) x_p_2 += 1;

if (x_p_2 > 1) x_p_2 = 1;

if (0 == x_p_2) {
DrawRotaGraph(610, 520, 0.4, PI / 2, corsour, true);
}
if (1 == x_p_2) {
DrawRotaGraph(900, 585, 0.4, PI / 2, corsour, true);
}



if (0 == x_p_2) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 8;
}
}
if (1 == x_p_2) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 7;
}
}
}
//----------------------------------------------------------------------

//選択画面
SetFontSize(50);
DrawStringEx(650, 500, 0x0000, "じゃんけん");
SetFontSize(15);
DrawStringEx(930, 580, 0x07e0, "逃げる");

//opening_tutorial =0 チュートリアルしてない
// =1 チュートリアル中
// =2 チュートリアルした
if (opening_tutorial == 1) {

SetFontSize(50);
SetDrawBright(255, 255, 255);

DrawStringEx(250, 50, 0x07e0, "チュートリアル");

for (int x = 0; x < 3; x++) {
SetFontSize(30);
DrawStringEx(230, 200 + 80 * x, 0xffffff, kaisetu[x]);
}

if (counter <= 0) {
if (gyou_a < 3 && num_moji < 1024) {
if (tutolial[page_a][gyou_a][num_moji_a] != '\0') {
kaisetu[gyou_a][num_moji_a] = tutolial[page_a][gyou_a][num_moji_a];
num_moji_a += 1;
kaisetu[gyou_a][num_moji_a] = '\0';
counter = interval;
}
}
}
counter -= 1;

if (IsKeyDownTrigger(KEY_INPUT_SPACE) || tutolial[page_a][gyou_a][num_moji_a] == '\0') {
if (gyou_a < 3 && num_moji_a < 1024) {

//現在の行を最後まで表示
while (tutolial[page_a][gyou_a][num_moji_a] != '\0') {
//一文字表示を進める
kaisetu[gyou_a][num_moji_a] = tutolial[page_a][gyou_a][num_moji_a];
num_moji_a += 1;
}
kaisetu[gyou_a][num_moji_a] = '\0';

//次の行に進める
if (gyou_a < 3 - 1) { //最後の行より一行以上前の行なら次の行へ行っていい
gyou_a++;
counter = interval;
num_moji_a = 0;
}
}
}

if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
page_a += 1;
gyou_a = 0;
num_moji_a = 0;
kaisetu[0][0] = '\0';
kaisetu[1][0] = '\0';
kaisetu[2][0] = '\0';
}
if (page_a == 4) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
opening_tutorial = 2;
}
}
}











break;


case 7:


for (int i = 0; i < 3; i++) {
SetFontSize(30);
DrawStringEx(250, 100 + 70 * i, 0xffffff, hyouji);
}

if (counter <= 0) {
if (gyou < 3 && num_moji < 1024) {
if (moji[page][gyou][num_moji] != '\0') {
hyouji[gyou][num_moji] = moji[page][gyou][num_moji];
num_moji += 1;
hyouji[gyou][num_moji] = '\0';
counter = interval;
}
}
}
counter -= 1;

if (IsKeyDownTrigger(KEY_INPUT_SPACE) || moji[page][gyou][num_moji] == '\0') {
if (gyou < 3 && num_moji < 1024) {

//現在の行を最後まで表示
while (moji[page][gyou][num_moji] != '\0') {
//一文字表示を進める
hyouji[gyou][num_moji] = moji[page][gyou][num_moji];
num_moji += 1;
}
hyouji[gyou][num_moji] = '\0';

//次の行に進める
if (gyou < 3 - 1) { //最後の行より一行以上前の行なら次の行へ行っていい
gyou++;
counter = interval;
num_moji = 0;
}
}
}




//Enterを押すと新しいページに進む
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
page += 1;
gyou = 0;
num_moji = 0;
hyouji[0][0] = '\0';
hyouji[1][0] = '\0';
hyouji[2][0] = '\0';
}
if (page == 1) {

DrawRotaGraph(300, 450, 1.4, 0, loser, true);
if (IsKeyDownTrigger(KEY_INPUT_BACK)) {
viewer = 0;
page = 0;
gyou = 0;
num_moji = 0;
hyouji[0][0] = '\0';
hyouji[1][0] = '\0';
hyouji[2][0] = '\0';
}
}



break;


case 8:
//---------------------------------------------------------------------------------------------
//画像表示
DrawRotaGraph(515, 350, 1.7, 0, battle_1, true);
DrawBox(30, 100, 280, 220, 0xffffff, true);
SetFontSize(30);
DrawStringEx(40, 100, 000000, "化け熊");
DrawStringEx(150, 170, 000000, "%d/200", enemy_a_life);
DrawBox(30, 500, 280, 620, 0xffffff, true);
SetFontSize(30);
DrawStringEx(40, 500, 000000, "あなた");
if (x_p == 0) DrawStringEx(140, 570, 000000, "%d/%d", player_a_life, player_a_status[0]);
if (x_p == 1) DrawStringEx(140, 570, 000000, "%d/%d", player_b_life, player_b_status[0]);
if (x_p == 2) DrawStringEx(140, 570, 000000, "%d/%d", player_c_life, player_c_status[0]);

DrawStringEx(570, 440, 000000, "どれか選択してください");
DrawGraph(r_p, 480, rock, false);
DrawGraph(s_p, 480, scissous, false);
DrawGraph(p_p, 480, paper, false);

if (IsKeyDownTrigger(KEY_INPUT_SPACE)) {
enemy_a_life = 0;
viewer = 15;
}

//----------------------------------------------------------------------------------------------

//カーソル移動----------------------------------------------------------------------------------

corsour_move();

break;
//---------------------------------------------------------------------------------------------

case 9:
//count 0が出てない 1でじゃんが出る 2でけんが出る
//手の移動用----------------------------------------------

if (downed == 0) {
DrawRotaGraph(515, 350, 1.7, 0, battle_1, true);
}
if (downed == 1) {
DrawRotaGraph(515, 350, 1.7, 0, battle_2, true);
}
if (downed == 2) {
DrawRotaGraph(515, 350, 1.7, 0, battle_4, true);
}
if (downed == 3) {
DrawRotaGraph(515, 350, 1.7, 0, battle_3, true);
}
if (downed == 4) {
DrawRotaGraph(515, 350, 1.7, 0, battle_5, true);
}
choise_move();

break;
//---------------------------------------------------------------------------
case 10:
//ここでお互いに手を出す-----------------------------------------------------
if (choise == 0) {
cpu_hand = GetRand(3);
}
if (downed == 0) {
DrawRotaGraph(515, 350, 1.7, 0, battle_1, true);
}
if (downed == 1) {
DrawRotaGraph(515, 350, 1.7, 0, battle_2, true);
}
if (downed == 2) {
DrawRotaGraph(515, 350, 1.7, 0, battle_4, true);
}
if (downed == 3) {
DrawRotaGraph(515, 350, 1.7, 0, battle_3, true);
}
if (downed == 4) {
DrawRotaGraph(515, 350, 1.7, 0, battle_5, true);
}

if (player_hand == 0) {
DrawGraph(140, 430, rock, false);
}
if (player_hand == 1) {
DrawGraph(140, 430, scissous, false);
}
if (player_hand == 2) {
DrawGraph(140, 430, paper, false);
}

DrawStringEx(640, 500, 0x0000, "ポン!");

if (cpu_hand == 0) {
DrawRotaGraph(180, 200, 1, PI / 1, rock, true);
choise = 1;
}
if (cpu_hand == 1) {
DrawRotaGraph(180, 200, 1, PI / 1, scissous, true);
choise = 1;
}
if (cpu_hand == 2) {
DrawRotaGraph(180, 200, 1, PI / 1, paper, true);
choise = 1;
}
if (IsKeyDownTrigger(KEY_INPUT_BACK)) {
viewer = 8;
choise = 0;
r_p = 560;
s_p = 720;
p_p = 880;
}
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
if (downed == 0) {
viewer = 11;
}
if (downed == 1) {
viewer = 18;
}
if (downed == 2) {
viewer = 24;
}
if (downed == 3) {
viewer = 30;
}
if (downed == 4) {
viewer = 43;
}
}
break;
//------------------------------------------------------------------------------------------------------------
case 11:
// rezult 0がグー1がチョキ2がパー rezult0が勝ち 1が負け 2があいこ
if (cpu_hand == 0) {
if (player_hand == 1) {
rezult = 1;

}
if (player_hand == 2) {
rezult = 0;
}
if (player_hand == 0) {
rezult = 2;
}
}
if (cpu_hand == 1) {
if (player_hand == 2) {
rezult = 1;
}
if (player_hand == 0) {
rezult = 0;
}
if (player_hand == 1) {
rezult = 2;
}
}

if (cpu_hand == 2) {
if (player_hand == 0) {
rezult = 1;
}
if (player_hand == 1) {
rezult = 0;
}
if (player_hand == 2) {
rezult = 2;
}
}


SetFontSize(30);
DrawRotaGraph(515, 350, 1.7, 0, battle_1, true);
DrawBox(30, 100, 280, 220, 0xffffff, true);
DrawStringEx(40, 100, 000000, "化け熊");
DrawStringEx(150, 170, 000000, "%d/200", enemy_a_life);
SetFontSize(30);
DrawBox(30, 500, 280, 620, 0xffffff, true);
SetFontSize(30);
DrawStringEx(40, 500, 000000, "あなた");
if (x_p == 0) DrawStringEx(140, 570, 000000, "%d/%d", player_a_life, player_a_status[0]);
if (x_p == 1) DrawStringEx(140, 570, 000000, "%d/%d", player_b_life, player_b_status[0]);
if (x_p == 2) DrawStringEx(140, 570, 000000, "%d/%d", player_c_life, player_c_status[0]);

//rezult の値で表示を変更-------------------------------------------------------------------------------------------------
//Enterでダメージシークエンスに移行
if (rezult == 0) {
DrawStringEx(580, 500, 000000, "あなたの勝ちです!");
win_count += 1;
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 12;
}
}

if (rezult == 1) {
DrawStringEx(580, 500, 000000, "あなたの負けです…");
lose_count += 1;
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 12;
}
}
if (rezult == 2) {
DrawStringEx(580, 500, 000000, "あいこです");
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 12;
}

}
if (IsKeyDownTrigger(KEY_INPUT_BACK)) {
viewer = 8;
choise = 0;
r_p = 560;
s_p = 720;
p_p = 880;
}


break;
//--------------------------------------------------------------------------------------------------------------------------------------------

//critical乱数を用意 criticalの値が10以上なら追加ダメージ
//各キャラによって乱数の範囲が違う
case 12:

SetFontSize(30);
DrawRotaGraph(515, 350, 1.7, 0, battle_1, true);
DrawBox(30, 100, 280, 220, 0xffffff, true);
DrawStringEx(40, 100, 000000, "化け熊");
DrawStringEx(150, 170, 000000, "%d/200", enemy_a_life);

SetFontSize(30);
DrawBox(30, 500, 280, 620, 0xffffff, true);
SetFontSize(30);
DrawStringEx(40, 500, 000000, "あなた");
if (x_p == 0) DrawStringEx(140, 570, 000000, "%d/%d", player_a_life, player_a_status[0]);
if (x_p == 1) DrawStringEx(140, 570, 000000, "%d/%d", player_b_life, player_b_status[0]);
if (x_p == 2) DrawStringEx(140, 570, 000000, "%d/%d", player_c_life, player_c_status[0]);

if (x_p == 0) {
if (damaged == 0) {
critical = GetRand(10);
}
}
if (x_p == 1) {
if (damaged == 0) {
critical = GetRand(20);
}
}
if (x_p == 2) {
if (damaged == 0) {
critical = GetRand(10);
}
}

//ステタース+乱数で微量に与えるダメージをまばらにしている
if (damaged == 0) {
random = GetRand(10);
}
//勝利時
//------------------------------------------------------------------------------------------------------------


//ダメージ計算がループしないように
//damaged 0 でダメージ計算をしていない 1でした
if (rezult == 0) {
if (damaged == 0) {
if (x_p == 0) {
//グーの時
if (player_hand == 0) {
damage_enemy = 180 + random - 5 ;
damaged = 1;
}
//チョキの時
if (player_hand == 1) {
damage_enemy = 90 + random - 5 ;
damaged = 1;
}
//パーの時
if (player_hand == 2) {
damage_enemy = 80 + random - 5 ;
damaged = 1;
}
}


if (x_p == 1) {

if (player_hand == 0) {
damage_enemy = 90 + random - 5 ;
damaged = 1;
}
if (player_hand == 1) {
damage_enemy = player_b_status[2] + random - enemy_a_status[5] ;
damaged = 1;
}
if (player_hand == 2) {
damage_enemy = player_b_status[3] + random - enemy_a_status[5] ;
damaged = 1;
}
}
if (x_p == 2) {

if (player_hand == 0) {
damage_enemy = 80 + random - 5 ;
damaged = 1;
}
if (player_hand == 1) {
damage_enemy = player_c_status[1] + random - enemy_a_status[5] ;
damaged = 1;
}
if (player_hand == 2) {
damage_enemy = player_c_status[1] + random - enemy_a_status[5] ;
damaged = 1;
}
}

}
SetFontSize(25);
DrawStringEx(600, 500, 000000, "%dのダメージを与えます", damage_enemy);
if (critical >= 10) {
DrawStringEx(600, 550, 000000, "今のは痛い!+50ダメージ");

}
//Enterを押したときに各フラグ管理用変数と動かしたじゃんけんの手を初期値に戻す-----------------

if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
enemy_a_life -= damage_enemy;
if (critical >= 10) {
enemy_a_life -= 50;
}
//敵の体力が0以下になったとき0に固定
if (enemy_a_life < 0) {
enemy_a_life = 0;
}
viewer = 8;

choise = 0;
damage_enemy = 0;
damaged = 0;
r_p = 560;
s_p = 720;
p_p = 880;
}
}
//----------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------
//負けた時
//---------------------------------------------------------------------------------------------------------------
if (rezult == 1) {
if (damaged == 0) {
if (x_p == 0) {
if (player_hand == 0) {
damage_player = 60 + random - 5 ;
damaged = 1;
}

if (player_hand == 1) {
damage_player = 80 + random - 5 ;
damaged = 1;
}

if (player_hand == 2) {
damage_player = 60 + random - 5 ;
damaged = 1;
}

}
if (x_p == 1) {
if (player_hand == 0) {
damage_player = enemy_a_status[3] + random - player_b_status[5] ;
damaged = 1;
}
if (player_hand == 1) {
damage_player = enemy_a_status[1] + random - player_b_status[5] ;
damaged = 1;
}
if (player_hand == 2) {
damage_player = enemy_a_status[2] + random - player_b_status[5] ;
damaged = 1;
}
}
if (x_p == 2) {
if (player_hand == 0) {
damage_player = enemy_a_status[3] + random - player_a_status[5] ;
damaged = 1;
}
if (player_hand == 1) {
damage_player = enemy_a_status[1] + random - player_a_status[5] ;
damaged = 1;
}
if (player_hand == 2) {
damage_player = enemy_a_status[2] + random - player_a_status[5] ;
damaged = 1;
}
}

}
DrawStringEx(600, 500, 000000, "%dのダメージを受けます", damage_player);
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
if (x_p == 0) {
player_a_life -= damage_player;
}
if (x_p == 1) {
player_b_life -= damage_player;
}
if (x_p == 2) {
player_c_life -= damage_player;
}
//---------------------------------------------------------------------------
//プレイヤーの体力が0以下になったら0に固定
if (player_a_life < 0) {
player_a_life = 0;
}
if (player_b_life < 0) {
player_b_life = 0;
}
if (player_c_life < 0) {
player_c_life = 0;
}
//--------------------------------------------------------------------------

viewer = 8;

//フラグ管理変数を初期化
damage_player = 0;
choise = 0;
damage_enemy = 0;
damaged = 0;
r_p = 560;
s_p = 720;
p_p = 880;

}
}
//-------------------------------------------------------------------------------------

//あいこの時
//--------------------------------------------------------------------------------------
if (rezult == 2) {
if (damaged == 0) {
if (x_p == 0) {
damage_player = (enemy_a_status[0] + player_a_status[0]) / 50;
damage_enemy = damage_player;
damaged = 1;

}

if (x_p == 1) {
damage_enemy = (enemy_a_status[0] + player_b_status[0]) / 50;
damaged = 1;
}
if (x_p == 2) {
damage_player = (enemy_a_status[0] + player_c_status[0]) / 50;
damage_enemy = damage_player;
damaged = 1;
}
}

//player_bはあいこの時はダメージを受けない
DrawStringEx(580, 500, 000000, "%dのダメージを互いに受けます", damage_enemy);
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
enemy_a_life -= damage_enemy;
if (x_p == 0) {
player_a_life -= damage_player;
}
if (x_p == 1) {
player_b_life -= damage_player;
}
if (x_p == 2) {
player_c_life -= damage_player;
}

viewer = 8;

choise = 0;
damage_enemy = 0;
damage_player = 0;
damaged = 0;
r_p = 560;
s_p = 720;
p_p = 880;
}
}
if (enemy_a_life == 0) {
viewer = 15;
}
if (player_a_life == 0) {
viewer = 15;
}
if (player_b_life == 0) {
viewer = 15;
}
if (player_c_life == 0) {
viewer = 15;
}
break;
//-----------------------------------------------------------------------------------------------
case 15:
SetFontSize(30);
DrawRotaGraph(515, 350, 1.7, 0, battle_1, true);
DrawBox(30, 100, 280, 220, 0xffffff, true);
DrawStringEx(40, 100, 000000, "化け熊");
DrawStringEx(150, 170, 000000, "%d/200", enemy_a_life);
DrawBox(30, 500, 280, 620, 0xffffff, true);
DrawStringEx(40, 500, 000000, "あなた");
if (x_p == 0) DrawStringEx(140, 570, 000000, "%d/%d", player_a_life, player_a_status[0]);
if (x_p == 1) DrawStringEx(140, 570, 000000, "%d/%d", player_b_life, player_b_status[0]);
if (x_p == 2) DrawStringEx(140, 570, 000000, "%d/%d", player_c_life, player_c_status[0]);
if (enemy_a_life == 0) {
DrawStringEx(600, 500, 000000, "相手を倒しました!");
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 13;
downed = 1;
}
}

if (player_a_life == 0) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
DrawStringEx(600, 500, 000000, "負けてしまいました…");
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 14;
}
}
}
if (player_b_life == 0) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
DrawStringEx(600, 500, 000000, "負けてしまいました…");
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 14;
}
}
}
if (player_c_life == 0) {
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
DrawStringEx(600, 500, 000000, "負けてしまいました…");
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 14;
}
}
}
break;

case 13:
DrawRotaGraph(515, 350, 1.7, 0, battle, true);
DrawStringEx(600, 500, 000000, "次の対戦に移ります");
if (IsKeyDownTrigger(KEY_INPUT_RETURN)) {
viewer = 16;
player_a_life += 50;
player_b_life += 50;
player_c_life += 50;
if (player_a_life > 300)player_a_life = 300;
if (player_b_life > 400)player_b_life = 400;
if (player_c_life > 500)player_c_life = 500;
}
break;

case 14:
DrawRotaGraph(300, 450, 1.4, 0, loser, true);
for (int i = 0; i < 3; i++) {
SetFontSize(30);
DrawStringEx(250, 100 + 70 * i, 0xffffff, end_b);
}

if (counter <= 0) {
if (gyou < 3 && num_moji < 1024) {
if (badend[gyou][num_moji] != '\0') {
end_b[gyou][num_moji] = badend[gyou][num_moji];
num_moji += 1;
end_b[gyou][num_moji] = '\0';
counter = interval;
}
}
}
counter -= 1;

if (IsKeyDownTrigger(KEY_INPUT_SPACE) || badend[gyou][num_moji] == '\0') {
if (gyou < 3 && num_moji < 1024) {

//現在の行を最後まで表示
while (badend[gyou][num_moji] != '\0') {
//一文字表示を進める
end_b[gyou][num_moji] = badend[gyou][num_moji];
num_moji += 1;
}
end_b[gyou][num_moji] = '\0';

//次の行に進める
if (gyou < 3 - 1) { //最後の行より一行以上前の行なら次の行へ行っていい
gyou++;
counter = interval;
num_moji = 0;
}
}
if (downed == 3) {
SetFontSize(25);
DrawStringEx(800, 900, 0xffffff, "じゃんけんチャンピオンまであとちょっと!");

}

break;

返信ありがとうございます。
こんな感じのが敵キャラ四人分あってcase 50 くらいまで続いています。ダメージ計算などの所は最初は一括でフラグを使ってまとめようと思ったんですがフラグでまとめたら表示や結果がおかしくなったので別々にコードを書いています。

Re: プログラムが重くなる大きな要因は?

#2

by にほ » 5年前

ソースコードがないと何のアドバイスのしようもないと思うのでまずはあなたが書いたソースコードを提示してみてください。

プログラムが重くなる大きな要因は?

#1

by parsley » 5年前

プログラムのみでゲームを作ってみようと思い互いにじゃんけんをしてお互いの体力を減らしていくというようなゲームを作ったのですが、最初は特に問題なかったのですが段々と重くなっていきたまにフリーズするようにまでなってしまいました。自分なりにどうすれば軽くなるのか調べたのですが、プログラム歴が浅くよくわかりませんでした。そこで質問なのですが、こういう事をすると重くなるようなものがあったら教えてください。
個人的に重くなっている要因としてダメージ計算をするプログラムを敵ごとに別々で書いてたり、
switch関数で画面の切り替えを行っているんですがcaseで保持している数が多すぎることが問題なのかなと思っています。
ちなみに使用しているのはとvisualstudioです。

ページトップ