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;
}