マップの描画について

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

マップの描画について

#1

投稿記事 by iwao330 » 11年前

はじめまして、マップの描画について質問させて頂きます。
あと、このフォームの使い方がよく理解できていないので見づらい点があるかもしれませんがよろしくお願いします。

今までは、講座式のサイトを見ながら見よう見まねでやって成功したので
次の段階としてオブジェクト指向型に移行して記述したのですが、お手本にしているサイトのようにうまく行きません。
予定では、
①手続き型でうまく行っていたようにOPP型で復元する。
②マップの中身の読み込みと書き込みを分ける。
③マップの読み込みを外部ファイルを使えるようにする。
④マップ関係のクラスを作る。
⑤プレイヤーと敵がマップクラスの影響を受けて移動や攻撃をしてくる。
…といこうしているのですが
②の段階でうまく行きません…ご教授お願いします。

コード:


#include"DxLib.h"
#pragma once

class GameMain{
public:
	int PlayerGh[48];
	
	int HaikeiGh[64],BackGh[30]; 
	int Map[30][40];
	GameMain();
	~GameMain();
	void GameMain::Read();
};

extern GameMain *Game;
 

コード:

#include "Main.h"
#include"Player.h"
#include"Stage.h"

GameMain *Game;


GameMain::GameMain(){
	
	LoadDivGraph("image/haikei01.bmp", 64, 8, 8, 32, 32, HaikeiGh, 0);
	LoadDivGraph("image/Back.png", 30, 3, 10, 33, 33, BackGh, 0);
	LoadDivGraph("image/Player.png", 48, 6, 8, 64, 64, PlayerGh, 0);
};

void GameMain::Read(){
	int Map[30][40] =
	{
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
	};
};
GameMain::~GameMain(){

};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	CPlayer player;
	Stage stage;
	Game = new GameMain();
	Game->Read();
	// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
		
		//stage.Draw();
		player.Draw();
		player.Move();
		
		
	}
	delete Game;
	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

コード:


#include"Main.h"
#pragma once

class CPlayer{
public:
	float afX, afY;
	float PosX, PosY;
	int VX, VY;
	bool MoveFlag;
	enum emuki{ RIGHT, LEFT }muki;
	
	int kabeX,kabeY;

	
	CPlayer();
	 ~CPlayer();

	 void Move();
	 void Draw();
	 float MapCheak(float afX, float afY);
	 
};

コード:

#include"Player.h"

CPlayer::CPlayer(){
	
	PosX = 100;
	PosY = 400;
	VX = 0;
	VY = 0;
	MoveFlag = 0;
	muki = RIGHT;
	kabeX;
}
CPlayer::~CPlayer(){

}
float CPlayer::MapCheak(float afX, float afY){
	if (afX = kabeX){
		return MoveFlag = 1;
	}


	else

		return MoveFlag = 0;

}
void CPlayer::Move(){
	int Key;
	afX = PosX + VX;
	afY = PosY + VY;
	if (MoveFlag == !1){
		PosX = afX;
	}
	if (MoveFlag == !1){
		PosY = afY;
	}
	// キー入力取得
	Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);

	

	// 右を押していたら右に進む
	if (Key & PAD_INPUT_RIGHT) {
		  VX=3;
		muki = RIGHT;
	}
	// 左を押していたら左に進む
	else if (Key & PAD_INPUT_LEFT) {
		 VX=-3;
		muki = LEFT;
	}
	else{
		VX = 0;
	}
}
void CPlayer::Draw(){
	
	for (int y = 0; y < 15; y++)
	{
		for (int x = 0; x < 20; x++)
		{
			switch (Game->Map[y][x])
			{
			case 1:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[9], TRUE);
				break;
			case 2:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[9], TRUE);
				break;
			case 3:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[10], TRUE);
				break;
			case 41:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[10], TRUE);
				break;
			case 50:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[2], TRUE);
				break;
			case 51:
				DrawGraph(x * 32, y * 32, Game->BackGh[0], TRUE);
				break;
			default:
				//DrawGraphF( (x-offsetX)*32, (y-offsetY)*32, game->ImgTown[game->StageIndex], TRUE );
				break;
			}
		}
	}



	DrawRotaGraph(afX, afY,1.0,0, Game->PlayerGh[4],1, muki);
	DrawFormatString(10, 10, GetColor(255, 255, 255), "dir=%d...PosX=%3.2f...PosY=%3.2f", muki,PosX,PosY);
	DrawFormatString(10, 30, GetColor(255, 255, 255), "dir=%d...MAP[%d][%d]", muki, (int)PosX / 32, (int)PosY / 32);
}
余計な実験中の変数などが入ってしまっていますがお許しください。
ちなみにPlayer::Draw()にMain::Read()の 
int Map[30][40] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
     以下省略
};
の一文を置着替えてやればうまくいくのですが、これは何が起きているのでしょうか?
ループの中に入っているので毎回int Mapのデータが挿入されていると考えると具合が悪そうなのですが…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップの描画について

#2

投稿記事 by softya(ソフト屋) » 11年前

codeタグの使い方が間違っていました。プレビューで確認して下さいね。
code=のあとに書くのは言語形式なので、ファイル名じゃないです。
iwao330 さんが書きました:はじめまして、マップの描画について質問させて頂きます。
あと、このフォームの使い方がよく理解できていないので見づらい点があるかもしれませんがよろしくお願いします。

今までは、講座式のサイトを見ながら見よう見まねでやって成功したので
次の段階としてオブジェクト指向型に移行して記述したのですが、お手本にしているサイトのようにうまく行きません。
予定では、
①手続き型でうまく行っていたようにOPP型で復元する。
②マップの中身の読み込みと書き込みを分ける。
③マップの読み込みを外部ファイルを使えるようにする。
④マップ関係のクラスを作る。
⑤プレイヤーと敵がマップクラスの影響を受けて移動や攻撃をしてくる。
…といこうしているのですが
②の段階でうまく行きません…ご教授お願いします。

Main.h

コード:

#include"DxLib.h"
#pragma once

class GameMain{
public:
	int PlayerGh[48];
	
	int HaikeiGh[64],BackGh[30]; 
	int Map[30][40];
	GameMain();
	~GameMain();
	void GameMain::Read();
};

extern GameMain *Game;
 
Main.cpp

コード:

#include "Main.h"
#include"Player.h"
#include"Stage.h"

GameMain *Game;


GameMain::GameMain(){
	
	LoadDivGraph("image/haikei01.bmp", 64, 8, 8, 32, 32, HaikeiGh, 0);
	LoadDivGraph("image/Back.png", 30, 3, 10, 33, 33, BackGh, 0);
	LoadDivGraph("image/Player.png", 48, 6, 8, 64, 64, PlayerGh, 0);
};

void GameMain::Read(){
	int Map[30][40] =
	{
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
	};
};
GameMain::~GameMain(){

};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	CPlayer player;
	Stage stage;
	Game = new GameMain();
	Game->Read();
	// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
		
		//stage.Draw();
		player.Draw();
		player.Move();
		
		
	}
	delete Game;
	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
Player.h

コード:


#include"Main.h"
#pragma once

class CPlayer{
public:
	float afX, afY;
	float PosX, PosY;
	int VX, VY;
	bool MoveFlag;
	enum emuki{ RIGHT, LEFT }muki;
	
	int kabeX,kabeY;

	
	CPlayer();
	 ~CPlayer();

	 void Move();
	 void Draw();
	 float MapCheak(float afX, float afY);
	 
};
Player.cpp

コード:

#include"Player.h"

CPlayer::CPlayer(){
	
	PosX = 100;
	PosY = 400;
	VX = 0;
	VY = 0;
	MoveFlag = 0;
	muki = RIGHT;
	kabeX;
}
CPlayer::~CPlayer(){

}
float CPlayer::MapCheak(float afX, float afY){
	if (afX = kabeX){
		return MoveFlag = 1;
	}


	else

		return MoveFlag = 0;

}
void CPlayer::Move(){
	int Key;
	afX = PosX + VX;
	afY = PosY + VY;
	if (MoveFlag == !1){
		PosX = afX;
	}
	if (MoveFlag == !1){
		PosY = afY;
	}
	// キー入力取得
	Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);

	

	// 右を押していたら右に進む
	if (Key & PAD_INPUT_RIGHT) {
		  VX=3;
		muki = RIGHT;
	}
	// 左を押していたら左に進む
	else if (Key & PAD_INPUT_LEFT) {
		 VX=-3;
		muki = LEFT;
	}
	else{
		VX = 0;
	}
}
void CPlayer::Draw(){
	
	for (int y = 0; y < 15; y++)
	{
		for (int x = 0; x < 20; x++)
		{
			switch (Game->Map[y][x])
			{
			case 1:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[9], TRUE);
				break;
			case 2:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[9], TRUE);
				break;
			case 3:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[10], TRUE);
				break;
			case 41:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[10], TRUE);
				break;
			case 50:
				DrawGraph(x * 32, y * 32, Game->HaikeiGh[2], TRUE);
				break;
			case 51:
				DrawGraph(x * 32, y * 32, Game->BackGh[0], TRUE);
				break;
			default:
				//DrawGraphF( (x-offsetX)*32, (y-offsetY)*32, game->ImgTown[game->StageIndex], TRUE );
				break;
			}
		}
	}



	DrawRotaGraph(afX, afY,1.0,0, Game->PlayerGh[4],1, muki);
	DrawFormatString(10, 10, GetColor(255, 255, 255), "dir=%d...PosX=%3.2f...PosY=%3.2f", muki,PosX,PosY);
	DrawFormatString(10, 30, GetColor(255, 255, 255), "dir=%d...MAP[%d][%d]", muki, (int)PosX / 32, (int)PosY / 32);
}
余計な実験中の変数などが入ってしまっていますがお許しください。
ちなみにPlayer::Draw()にMain::Read()の 
int Map[30][40] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
     以下省略
};
の一文を置着替えてやればうまくいくのですが、これは何が起きているのでしょうか?
ループの中に入っているので毎回int Mapのデータが挿入されていると考えると具合が悪そうなのですが…
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: マップの描画について

#3

投稿記事 by usao » 11年前

GameMain::Read()が,以下のようなことになっているのではないでしょうか.

コード:

class C
{
public:
    //このf()を呼んでもメンバ変数aの値は変化しない
    void f()
    {   int a = 10; } //このaは関数f()内のローカル変数であり,メンバ変数のaではない.(要するにintが余計)
public:
    int a;  //メンバ変数
};

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップの描画について

#4

投稿記事 by softya(ソフト屋) » 11年前

で、コードですが変数の寿命やスコープを理解されていない様です。
まず、代入文と初期化を混同されていると思いますが、int Map[30][40] = {}はローカル変数の初期化ですので、メンバ変数に代入されるわけではありません。

それとオブジェクト指向的には、カプセル化が不十分、オブジェクトの役割が不明確、オブジェクト間の結合度が強い、グローバル変数的な扱いのクラスのインスタンスなどが気になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: マップの描画について

#5

投稿記事 by milfeulle » 11年前

はじめまして! オブジェクト指向で書き直そうとされているのですね。
2. マップの中身の読み込みと書き込みを分ける。
3. マップの読み込みを外部ファイルを使えるようにする。
4. マップ関係のクラスを作る。
(丸付き数字は適宜変換させていただきました) とありますが、マップのことを操作(読み込み・書き込み・外部ファイルを使うなど)するのはマップ自身にさせる、それがオブジェクト指向の第一歩です! ですから、先にマップのクラスを作り、そのなかに各種データと操作を書き並べます。最後に、GameMainのなかにマップを入れてあげればいいですね! 以下はイメージです。

コード:

class Map {
	読み込み(ファイル);
	書き込み(ファイル);
	判定(座標);
}

class GameMain {
	Map map;
}
はじめは、どんなに細かいことでもオブジェクトに分解して、そのオブジェクトを弄くるのは自分自身、と徹底させることでそれっぽく仕上がるかと思います。
オフトピック
このフォームの使い方がよく理解できていない
場合は、フォーラムルールをしっかりと読まれると解決すると思います。

同様に、C++の前にC言語が怪しいな、と思えば入門書や入門サイトをしっかりと読まれるとスムーズに進められると思います。
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

iwao330

Re: マップの描画について

#6

投稿記事 by iwao330 » 11年前

codeタグの件とすみませんでした…

カプセル化はどこを隠すか、そして隠したところを操作する仕組みをどう作リ方などは難しすぎてまだまだ後回しになりそうです。
クラスをたくさん作ってクラスに仕事をさせて楽をするってのがオブジェクト指向の最終到達点なんでしょうね。
例えば天気だけのクラスや当たり判定だけのクラスを作っても、MapクラスとPlayerクラスと敵クラスなどたくさんのクラスを連携させるってすごい難しそうです…

read()の中でintつけちゃうと宣言になって{}を抜けると寿命を迎えちゃうんですね。
勉強不足でした。
早速勉強してみる。
①Main.hにint test;を作ってread()でtest=100;にしてみる。(成功)
②test[5]にしてみるread()でtest[5]={0,1,2,3,4,}にしてみる。  (失敗)(初期化子が多すぎます)…?
③MainGame::MainGame()に置いてみる。  (失敗)(初期化子が多すぎます)…同じ結果?宣言時にしないとダメか…
④GameMain.hに変数宣言時に int test[5]={0,1,2,3,4}にしてみる。成功…?
エラー 1 error C2536: 'GameMain::GameMain::test' : クラス、構造体、共用体のメンバーは、初期化できません。 爆死

配列になるとここまで状況が変わってしまうのですね。

read()で
test[1] = 100;
test[2] = 200;
test[5] = 500;でやると成功!
なるほど{x,x,x,x,x}は使えないのか!?でも、これって凄く困る!しかも終了すると怖いエラーがでる!
で止まってしまいました。

おんぶにだっこで申し訳ないのですが、次に勉強するようなキーワードとかはありますか?
やさしいC++の本では手続き型でMain関数にtest[5]={0,1,2,3,4,}で初期化してるパターンしかなく手詰まりしました…

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: マップの描画について

#7

投稿記事 by milfeulle » 11年前

そうですね・・・iwao330さんはすこし焦りすぎていると思います。もちろん、実際の製作を通してプログラミング能力を磨くのは重要な事ですが、まずはその道具となる言語自体をある程度知る必要があります。それには地味ながら、基礎的なトレーニングが欠かせません。
次の段階としてオブジェクト指向型に移行して
と仰るので次の段階として、クラスに分割することを提案しましたが、その前にC言語の基礎を固めたほうが早いと思います。私が初めて勉強したWebサイトは苦しんで覚えるC言語ですが、ここでは〈12.変数の寿命〉で書かれています。
オフトピック
配列は宣言時にしか{ ... }で初期化できません。・・・というのは上記のWebサイトにも書いてあり、おそらくどの入門サイトにも書いてあります。やさしいC++は読んだことありませんが、目次を見る限り配列の項目に書いてあると思います。それどころか、softyaさんが
まず、代入文と初期化を混同されていると思いますが、int Map[30][40] = {}はローカル変数の初期化ですので、メンバ変数に代入されるわけではありません。
と仰っています。闇雲に「失敗したか成功したか」だけ見て判断するのは今後のことを考えるとあまり良いとは思えません・・・。
次の段階は手続き型をマスターすることです。オブジェクト指向は、手続きよりもより上位の概念です。実際のプログラミングではメソッド(メンバ関数)のなかに処理が書かれ、それはいわば手続きです。焦らずゆっくりと確実に組み上げていきましょう!

私は苦しんで覚えるC言語の回し者ではありませんが、最低限そのページの全ては頭に入れておくべきだと思います。それが終わったら、個人的には基礎的なアルゴリズムの実装をされるといいと思います。つまらないとは思いますが、例えばアルゴリズムとデータ構造編 -Programming Place-にかかれている例はどれもトレーニングになると思います。それが終わってからC++のクラスを勉強することをおすすめします。

(追記) すみません、ご質問に答えていませんでした;; { ... }で宣言時に配列を初期化できるなら、
1. int source[] = { 1, 2, 3 };などで初期化する
2. int destination[3]; にsourceの内容をコピーする
それは例えば、string.hあるいはcstringにあるmemcpy関数を使って、memcpy(destination, source, 3);とかけます。もちろん、for文で1つ1つコピーしてもいいですね。これに関してはどの入門書にも書いてありますよ!
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップの描画について

#8

投稿記事 by softya(ソフト屋) » 11年前

よく混同される方がいますが初期化と代入は文法が別で動作が全く違います。一緒にすると後々苦労すること成ります。
なので、今のうちにちゃんと理解しましょう。

それと宣言と定義と言う言葉をうまく使い分けてください。業界的には「宣言」は型だけを決めるもので「定義」は実体を伴います。
ややこしい!と思ったら、「定義」じゃなくても良いので「実体を伴う宣言」とか相手に通じる書き方を心がけてみてください。
ヘッダに書く場合、実体を伴わないないので明確にグローバル宣言である証のexternを書いた方がよいでしょう。

①Main.hにint test;を作ってread()でtest=100;にしてみる。(成功)
不明確なのですが、ただヘッダに書いたのかクラスのメンバ変数にしたのか明確に書いておいてくださいね。
意識することは非常に重要です。

②test[5]にしてみるread()でtest[5]={0,1,2,3,4,}にしてみる。  (失敗)(初期化子が多すぎます)…?
,で終わっているので実験になっていないですね。ここの文法エラーです。
復習してみてください。

③MainGame::MainGame()に置いてみる。  (失敗)(初期化子が多すぎます)…同じ結果?宣言時にしないとダメか…
②と同じ問題です。復習してみてください。

④GameMain.hに変数宣言時に int test[5]={0,1,2,3,4}にしてみる。成功…?
グローバル変数的には別のエラーの可能性が出てきます。
複数のcppからインクルードすると変数の多重定義と言われると思います。

>エラー 1 error C2536: 'GameMain::GameMain::test' : クラス、構造体、共用体のメンバーは、初期化できません。 爆死
メンバ変数として書いたのなら、それをうまく伝えてください。④の説明だとタダの変数としてしか

> おんぶにだっこで申し訳ないのですが、次に勉強するようなキーワードとかはありますか?
> やさしいC++の本では手続き型でMain関数にtest[5]={0,1,2,3,4,}で初期化してるパターンしかなく手詰まりしました…

その理解の範囲でも応用は出来ると思うんですけどね。
目線を変えてやればちょっと面倒ながらも出来る方法はあります。
なんというか勉強方法ではなく考え方というか・・・。
ローカル変数でtest[5]={0,1,2,3,4};と書いた時に同じ値をメンバ変数に複製するには?
と考えてみましょう。
オフトピック
すぐテキストに頼ったり、サンプルに頼ると自分で考える癖がつきません。
効率が悪くても失敗してもよいので七転八倒していかないと真の意味で理解につながりません。
どうしようも無かったり、意味不明なエラー状況が続いたらこの掲示板を頼ってください。

【補足】
本当はすごく楽な方法があるかもしれませんが、今は自分の分かる範囲で効率的な書き方ができないか考える事が重要なので考えに考えてください。
よく理解していない人がハマる罠として
・代入文を書き並べる
・if文をただ必要個数書き並べる
・計算式が複雑怪奇
これらはループをうまく使うと解決することなのかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

iwao330

Re: マップの描画について

#9

投稿記事 by iwao330 » 11年前

最初は、ゲームプログラムの館を見て、ゲーム作るぞ!ってなったのに
苦しんで覚えるで基礎やってこい。まじかよー…指定された最低限やるか…
よし!終わった!はやく作りたい作りた…いい感じのゲームのサンプルはみんなオブジェクト指向で書いてるじゃないか!?
で、仕方がない…参考にしたいソースがコレならC++もやらねば
よし、クラスの基本の章が終わった!はやく作りた…

だったので、焦ってるのはあるかもしれません。
ただ、ひしひしとゲーム制作の難しさは体感してきてるので、ガツガツ感がなくなってきている今が
今度はインプットとアウトプットやりながら苦しんでC言語をもう一度やるいい頃合いかなと思ってます。

教授頂いてる内容も見たことある用語はあるが、ここで必要だったのか~と感心させられることばかりと同時に
こんな内容も自分は理解してなかったのか…ってなってます。

前向きに出直して参ります。

閉鎖

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