横スクロールがわかりません

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

横スクロールがわかりません

#1

投稿記事 by hasami0209 » 3ヶ月前

初めての質問なので、いたらぬ点がありますでしょうがよろしくお願いします。
C言語は学び始めて、だいたい二~三ヵ月程度です。

現在、横スクロールのアクションゲームを制作しているのですが未だに横スクロールの作り方がわからず、詰まっている状態となっています。現在は下のようなコードで実行しており、エラーは今のところ出ておりません。

自分が理解している横スクロールの原理を書いておきます。
・マップ全体でまず描画して、それから表示している画面を見せる。
・プレイヤーの座標を描画用と全体で分ける。
・プレイヤーの表示用座標が一定まで来たとき、表示している画面を横にずらす。
間違っていたり、足りないものがあったときは指摘お願いします。

環境としてはwindowsのC++、GameLibを使用しております。

コード:

//<include>
#include "all.h"

//<namespace>
using namespace GameLib;
using namespace input;

//<define>
#define MAP_SIZE_H	  (15)
#define MAP_SIZE_W	  (20)
#define STAGE_SIZE_W  (MAP_SIZE_W*4)

//マップチップ
char map[MAP_SIZE_H][STAGE_SIZE_W] = {
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,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,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,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0, 0,4,5,0,0,0,0,0,0,0, 0,0,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,0,0,0,0,0,0,0, 3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,6,7,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,0,0,0,0,4,5,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,6,7,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,6,7,0,0,0,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,1,1,1,1,1,1,1,1,1, 1,1,1,1,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,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,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,0,0,0,0,0,0,0,0,1,1,1,1 }
};

//--------------------------------
//  WinMain(エントリポイント)
//--------------------------------
int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
{
	GameLib::init(L"アクションゲーム",
		SCREEN_WIDTH, SCREEN_HEIGHT, FALSE);
	GameLib::setBlendMode(Blender::BS_ALPHA);
	
	//プレイヤーの画像
	sprite_load(&sprMap, L"Data/Images/map.png");
	sprite_load(&sprPlayer, L"Data/Images/player.png");
	
	//プレイヤー定義
	struct Data_Player {
		int hp = 1;
		float posX = 0, posY;
		float view;
		float vecX = 0, vecY = 0;
		bool ground;
	}Player;
	
	// ゲームループ
	while (GameLib::gameLoop())
	{
		srand((unsigned int)time(NULL));
		input::update();
		GameLib::clear(0, 0, 0);
	//マップの描画
	int scroll_X;
	for (int h = 0; h < MAP_SIZE_H; h++) {
		for (int w = 0; w < STAGE_SIZE_W; w++) {
			scroll_X = w * 32;
			int tmp_Y = h * 32;
			sprite_render(sprMap, scroll_X, tmp_Y, 1, 1, map[h][w] * 32, 0, 32, 32);
		}
	}
	
	if (Player.hp > 0) {
		sprite_render(sprPlayer, Player.posX, Player.posY, 1, 1, 0, 0, 32, 32, 0, 0, 0);
	}
	
	//プレイヤーまわり
	int move = Player.posX - scroll_X;
	checkX = (Player.posX + 18 + SPEED) / 32;
	checkY = (Player.posY + 4) / 32;
	
	//右への移動
	Player.view = move;
	if (STATE(0)&PAD_RIGHT) {
		Player.vecX = SPEED;
		Player.posX += Player.vecX;
		Player.view += Player.vecX;
		if (move >= 160) {
			Player.view = 160;
			scroll_X += Player.vecX;
		}
	}
	
	GameLib::present(1, 0);
	}

	GameLib::uninit();
	return 0;
}

hasami0209
記事: 2
登録日時: 3ヶ月前

Re: 横スクロールがわかりません

#2

投稿記事 by hasami0209 » 3ヶ月前

この後、かなり考え込んだ後に解決法が思いつきましたので解決とさせていただきます。ご迷惑をお掛けしました

返信

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