質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

2回答

1574閲覧

障害物を避けるゲームの障害物をなるべく重くならずにたくさん出したい

退会済みユーザー

退会済みユーザー

総合スコア0

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2017/08/19 17:24

現在Dxライブラリで簡単なゲームを作ろうと思い、プレイヤーを左右に動かし下から来る障害物に当たらないように避けるゲームを作ろうと思っています。
そこで、障害物を画像で作り下から上に上がるようにしようと思い、さらに数も多くするため配列を用いてつくったところ動作が重くなってしまいました。
for文にするのが悪いのかとおもい、一個ずつ書いても重かったです。どのようにすれば数を沢山だしても軽く動作できるのでしょうか?
↓↓ソース↓↓
Main.cpp

C++

1#include "DxLib.h" 2#include "Player.h" 3#include "Object.h" 4 5 6//void SEset() { 7// int LoadSoundMem() 8//} 9 10int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { 11 ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定{ 12 13 if (DxLib_Init() == -1) // DXライブラリ初期化処理 14 { 15 return -1; // エラーが起きたら直ちに終了 16 } 17 18 PlayerSet(); 19 ObjectSet(); 20 21 while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { 22 ClearDrawScreen(); 23 24 PlayerUpdate(); 25 ObjectPos(); 26 PlayerDraw(); 27 ObjectDraw(); 28 ScreenFlip(); 29 } 30 31 DxLib_End(); // DXライブラリ使用の終了処理 32 33 return 0; // ソフトの終了 34}

Player.h

C++

1#ifndef Player 2 3#define Player 4 5//プレイヤー初期化 6void PlayerSet(); 7 8//プレイヤー移動 9void PlayerUpdate(); 10 11//プレイヤー描画 12void PlayerDraw(); 13 14#endif

Player.cpp

C++

1#include "DxLib.h" 2#include "Player.h" 3 4static int p_image;//プレイヤー画像ハンドル 5static int px;//プレイヤー座標 6static int pm = 5;//プレイヤーの移動量 7 8 //プレイヤー初期化 9void PlayerSet() { 10 p_image = LoadGraph("Picture/Char_Front.png"); 11 px = 0; 12} 13 14//プレイヤーの座標移動 15void PlayerUpdate() { 16 if (CheckHitKey(KEY_INPUT_RSHIFT) == 1 || CheckHitKey(KEY_INPUT_LSHIFT) == 1) { 17 pm = 10;; 18 } 19 if (CheckHitKey(KEY_INPUT_A) == 1) { 20 px = px - pm; 21 } 22 if (CheckHitKey(KEY_INPUT_D) == 1) { 23 px = px + pm; 24 } 25 if (px < 0) { 26 px = 0; 27 } 28 if (px > 608) { 29 px = 608; 30 } 31 pm = 5; 32} 33 //プレイヤー描画 34 void PlayerDraw(){ 35 DrawGraph(px, 10, p_image,TRUE); 36 }

Object.h

C++

1#ifndef Object 2#define Object 3 4//障害物壁初期化 5void ObjectSet(); 6 7//障害物移動 8void ObjectPos(); 9 10//障害物描画 11void ObjectDraw(); 12#endif

object.cpp

C++

1#include "DxLib.h" 2#include "Object.h" 3 4 5static int ox[3];//オブジェクト座標 6static int oy[3];//オブジェクト座標 7static int o_image; 8static int om[3]; 9 10//障害物壁初期化 11void ObjectSet() { 12 o_image = LoadGraph("Picture/Block.png"); 13 ox[0] = GetRand(608); 14 oy[0] = 512; 15 om[0] = GetRand(5) + 5; 16 17 ox[1] = GetRand(608); 18 oy[1] = 512; 19 om[1] = GetRand(5)+5; 20 21 ox[2] = GetRand(608); 22 oy[2] = 512; 23 om[2] = GetRand(5) + 5; 24 25} 26//障害物移動 27void ObjectPos() { 28 oy[0] = oy[0] -om[0]; 29 oy[1] = oy[1] -om[1]; 30 oy[2] = oy[2] - om[2]; 31 32 if (oy[0] < 0) { 33 oy[0] = 512; 34 ox[0] = GetRand(608); 35 oy[0] = 512; 36 om[0] = GetRand(5)+5; 37 } 38 if (oy[1] < 0) { 39 oy[1] = 512; 40 ox[1] = GetRand(608); 41 oy[1] = 512; 42 om[1] = GetRand(5)+5; 43 44 } 45 if (oy[2] < 0) { 46 oy[2] = 512; 47 ox[2] = GetRand(608); 48 oy[2] = 512; 49 om[2] = GetRand(5) + 5; 50 51 } 52 53 54} 55 56//障害物描画 57void ObjectDraw() { 58 DrawGraph(ox[0], oy[0], o_image, TRUE); 59 DrawGraph(ox[1], oy[1], o_image, TRUE); 60 DrawGraph(ox[2], oy[2], o_image, TRUE); 61 62 63 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

重たい、とは、どのような状態ですか? FPSが落ちる? CPUの使用率が高い? 入力に反応しない? 環境や測定結果など、もう少し具体的に話してもらったほうが、答えやすいと思います。

投稿2017/08/20 05:07

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majiponi

2017/08/20 05:16

あ、そういえば、ClearDrawScreenをループ内で2回呼び出していますが、これ、何か理由ありますか?
退会済みユーザー

退会済みユーザー

2017/08/20 08:27

ClearDrawScreenを二回呼び出してるのはうっかりミスでした。 重いに対しての詳細ですが、プロセスメモリが100ぐらいまで上がってる以外CPU使用r津などは上がってません。FPSは測り方が正しいのかわからないので不安ですが30程度でしたのでFPSが落ちるのが原因かと
退会済みユーザー

退会済みユーザー

2017/08/20 12:48

ScreenFlip();も二回やってることに気づきました。 それを消したら治りました。初歩的なミスだったのでこれから気をつけたいです。
guest

0

ScreenFlip();を二回やるようにしていたのが原因だった。

投稿2017/08/20 12:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問