LoadDivGraph関数での画像の描画の仕方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ケイン
記事: 7
登録日時: 11ヶ月前

LoadDivGraph関数での画像の描画の仕方について

#1

投稿記事 by ケイン » 1週間前

 おはようございます、Dxライブラリでベルトスクロールアクションゲームを作っています。今回は、 LoadDivGraph関数で画像を描画させるためにはどういうコードを書けばいいのかを知りたく、質問をしました。c言語に関しては、初心者レベルです。
 LoadGraph関数での描画の仕方は大体分かっていますが、 LoadDivGraph関数での描画の仕方は全く分からなく、色々と試して何度もコードを書き換えたりしてもうまくいきませんでした。聞きたいことは色々とありますが今はこの問題を解決したいです。よろしくお願いします。

 LoadGraph関数での描画が成功しているコードはこちらです

player.cpp

コード:

#include "DxLib.h"
#include "keyboard.h"
#include "player.h"


// 初期化をする
void Player_Initialize(Player_t *Player, int x,int y, int img) {
	Player->Image = img;
	Player->y = y;
	Player->x = x;
}


// 動きを計算する
void Player_Update(Player_t *Player) {
	if (Keyboard_Get(KEY_INPUT_UP) > 0) {
		Player->y-=2;
	}
	if (Keyboard_Get(KEY_INPUT_DOWN) > 0) {
		Player->y+=2;
	}
	if (Keyboard_Get(KEY_INPUT_RIGHT) > 0) {
		Player->x+=2;
	}
	if (Keyboard_Get(KEY_INPUT_LEFT) > 0) {
		Player->x-=2;
	}
}

// 描画する
void Player_Draw(Player_t Player) {
	DrawGraph(Player.x, Player.y, Player.Image, TRUE);
}

// 終了処理をする
void Player_Finalize(Player_t Player) {
}
player.h

コード:

#pragma once
#ifndef DEF_PLAYER_H //二重include防止

#define DEF_PLAYER_H

typedef struct {
	int Image;
	int y;
	int x;
}Player_t;

// 初期化をする
void Player_Initialize(Player_t *Player, int x ,int y, int img);

// 動きを計算する
void Player_Update(Player_t *Player);

// 描画する
void Player_Draw(Player_t Player);

// 終了処理をする
void Player_Finalize(Player_t Player);

#endif 
playerMgr.cpp

コード:

#include "DxLib.h"
#include "Keyboard.h"
#include "Player.h"

static const int NUM = 2;        //プレイヤーの数

static Player_t m_Player[NUM];   //プレイヤーの実体
static int m_ImgPlayer;          //プレイヤーの画像ハンドル

								 // 初期化をする
void PlayerMgr_Initialize() {
	m_ImgPlayer = LoadGraph("images/nata.png");

	Player_Initialize(&m_Player[0],0,0, m_ImgPlayer);// 初期化
	

// 動きを計算する
void PlayerMgr_Update() {
	for (int i = 0; i<NUM; i++) {
		Player_Update(&m_Player[i]);//更新
	}
}

// 描画する
void PlayerMgr_Draw() {
	for (int i = 0; i<NUM; i++) {
		Player_Draw(m_Player[i]);//描画
	}
}

// 終了処理をする
void PlayerMgr_Finalize() {
	for (int i = 0; i<NUM; i++) {
		Player_Finalize(m_Player[i]);//終了処理
	}

	DeleteGraph(m_ImgPlayer);    //画像を解放
}
LoadGraphのところをLoadDivGraphに書き変えた後、どこをどう書き換えれば無事に画像は描画されるのでしょうか?
長いコードを見せることになってしまいましたが、よろしくお願いいたします。

アバター
みけCAT
記事: 6065
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: LoadDivGraph関数での画像の描画の仕方について

#2

投稿記事 by みけCAT » 1週間前

LoadDivGraph関数を使う場合画像ハンドルを配列に格納することになることが多いと思うので、
画像ハンドルを描画関数に渡しているところを配列の適切な要素を渡すように書き換えればいいと思います。

また、LoadDivGraph関数でも画像を1個(1マス)しか読み込まないことができます。
この場合、配列ではなく画像ハンドルを格納するint型の変数へのポインタをLoadDivGraph関数に渡すことができ、
その他の書き換えはいらないでしょう。

LoadDivGraph関数を使って失敗しているコードを見せていただけると、具体的な修正点を指摘できるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ケイン
記事: 7
登録日時: 11ヶ月前

Re: LoadDivGraph関数での画像の描画の仕方について

#3

投稿記事 by ケイン » 1週間前

みけCATさん、回答ありがとうございます!
アドバイスを色々とありがとうございます。LoadDivGraph関数で画像を一つしか読み込ませる方法もあるということですか、参考にします!

新・ゲームプログラミングの館の「管理部の作り方」を参考にコードを書いたという感じですが、正直なところ理解していないことが多いです(汗)

失敗しているコードはこちらです

player.cpp

コード:

#include "DxLib.h"
#include "keyboard.h"
#include "player.h"


// 初期化をする
void Player_Initialize(Player_t *Player, int x,int y, int img,int frameindex,int counter) {
	Player->Image = img;
	Player->y = y;
	Player->x = x;
	Player->frameindex = frameindex;
	Player->counter = counter;
}


// 動きを計算する
void Player_Update(Player_t *Player) {
	if (Keyboard_Get(KEY_INPUT_UP) > 0) {
		Player->y-=2;
	}
	if (Keyboard_Get(KEY_INPUT_DOWN) > 0) {
		Player->y+=2;
	}
	if (Keyboard_Get(KEY_INPUT_RIGHT) > 0) {
		Player->x+=2;
		Player->counter++;
		Player->frameindex = 0 + (Player->counter % 64) / 8;
	}
	if (Keyboard_Get(KEY_INPUT_LEFT) > 0) {
		Player->x-=2;
		Player->counter++;
		Player->frameindex = 9 + (Player->counter % 64) / 8;
	}
}

// 描画する
void Player_Draw(Player_t Player) {
	DrawGraph(Player.x, Player.y, Player.Image, TRUE);
}

// 終了処理をする
void Player_Finalize(Player_t Player) {
}
player.h

コード:

#pragma once
#ifndef DEF_PLAYER_H //二重include防止

#define DEF_PLAYER_H

typedef struct {
	int Image;
	int y;
	int x;
	int frameindex;
	int counter;
}Player_t;

// 初期化をする
void Player_Initialize(Player_t *Player, int x ,int y, int img,int frameindex,int counter);

// 動きを計算する
void Player_Update(Player_t *Player);

// 描画する
void Player_Draw(Player_t Player);

// 終了処理をする
void Player_Finalize(Player_t Player);

#endif 
playerMgr.cpp

コード:

include "DxLib.h"
#include "Keyboard.h"
#include "Player.h"

static const int NUM = 2;        //プレイヤーの数

static Player_t m_Player[NUM];   //プレイヤーの実体
static int m_ImgPlayer;          //プレイヤーの画像ハンドル
static int Phandle[18];
								 // 初期化をする
void PlayerMgr_Initialize() {
	m_ImgPlayer = LoadDivGraph("image/plaruki.png", 18, 3, 6, 200, 200, Phandle);

	Player_Initialize(&m_Player[0],0,0, m_ImgPlayer,0,0);// 初期化
}

// 動きを計算する
void PlayerMgr_Update() {
	for (int i = 0; i<NUM; i++) {
		Player_Update(&m_Player[i]);//更新
	}
}

// 描画する
void PlayerMgr_Draw() {
	for (int i = 0; i<NUM; i++) {
		Player_Draw(m_Player[i]);//描画
	}
}

// 終了処理をする
void PlayerMgr_Finalize() {
	for (int i = 0; i<NUM; i++) {
		Player_Finalize(m_Player[i]);//終了処理
	}

	DeleteGraph(m_ImgPlayer);    //画像を解放
}
player.cppのDrawGraphの()の中と、playerMgr.cppのplayer_Initializeの()の中を書き換えれば
問題は解決しそうだと考えているのですが、どういうふうに書き換えればいいか分かりません。
またこんな長いコードを見せることになってしまいましたが、よろしくお願いいたします。

返信

“C言語何でも質問掲示板” へ戻る