0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

私がゲーム制作のときに自機を動かすときにつくるもの

Posted at

最初にゲーム制作を始めたころに,まず自機をどう動かすかとかで非常に悩んだので適当においておく.
きっと,もっと効率的に且つもっとわかりやすく書かれている方はたくさんいると思うので他の方のも参考にすることを非常に強くお勧めする.

まずはクラスを作る

以下のような感じで$\texttt{player.h}$を作った:

player.h
#pragma once

#include <DxLib.h>
#include "core.h"

class player
{
private:
	char KeyBuf[_KEY_BUF_];						// キーボードのバッファ
	unsigned int PLAYER_IMAGE;

public:
	int Velocity;								// 速度
	int X;										// 座標
	int Y;										// 座標

	/// <summary>
	/// 画像
	/// </summary>
	/// <param name="_FILE_NAME_">ファイルパス</param>
	void SetImage(const char* _FILE_NAME_);

	/// <summary>
	/// 自機を動かす関数
	/// </summary>
	void Move();

	/// <summary>
	/// 自機の描画
	/// </summary>
	void Draw();
};

そして$\texttt{player.cpp}$の中身は以下の様にした.

player.cpp
#include "player.h"

void player::SetImage(const char* _FILE_NAME_)
{
	PLAYER_IMAGE = LoadGraph(_FILE_NAME_);
}

void player::Move()
{
	GetHitKeyStateAll(KeyBuf);
    
	if (! KeyBuf[KEY_INPUT_LSHIFT]) // シフトを押していないときは通常移動
	{
		if (KeyBuf[KEY_INPUT_RIGHT])
		{
			X = X >= WIDTH_X ? WIDTH_X : X + Velocity; // Velocity分だけ右に移動
		}
		if (KeyBuf[KEY_INPUT_LEFT])
		{
			X = X <= 0 ? 0 : X - Velocity; // Velocity分だけ左に移動
		}
		if (KeyBuf[KEY_INPUT_UP])
		{
			Y = Y <= 0 ? 0 : Y - Velocity; // Velocity分だけ上に移動
		}
		if (KeyBuf[KEY_INPUT_DOWN])
		{
			Y = Y >= WIDTH_Y ? WIDTH_Y : Y + Velocity; // Velocity分だけ下に移動
		}
	}
	else // シフトを押しているときは低速移動(移動速度半分)
	{
		if (KeyBuf[KEY_INPUT_RIGHT])
		{
			X = X >= WIDTH_X ? WIDTH_X : X + Velocity / 2;
		}
		if (KeyBuf[KEY_INPUT_LEFT])
		{
			X = X <= 0 ? 0 : X - Velocity / 2;
		}
		if (KeyBuf[KEY_INPUT_UP])
		{
			Y = Y <= 0 ? 0 : Y - Velocity / 2;
		}
		if (KeyBuf[KEY_INPUT_DOWN])
		{
			Y = Y >= WIDTH_Y ? WIDTH_Y : Y + Velocity / 2;
		}
	}
}

void player::Draw()
{
	DrawExtendGraph(X - 15, Y - 15, X + 15, Y + 15, PLAYER_IMAGE, TRUE);
}

謎のWIDTH_XWIDTH_Yなどがあるが,これは$\texttt{core.h}$内で定義されているマクロで,それぞれウィンドウの幅と高さである.

core.h
#pragma once

#include <DxLib.h>

// 画面サイズ
#define WIDTH_X 640
#define WIDTH_Y 480

#define _KEY_BUF_ 256

/// <summary>
/// FPSを設定する関数
/// </summary>
/// <param name="__FPS__"></param>
void FPS(int __FPS__);

/*
core.cpp の中身:

#include "core.h"

void FPS(int __FPS__)
{
	WaitTimer(1000.0 / __FPS__);
}
*/

実際に動かしてみる

メイン関数には以下の様に書いてみた.

main.cpp
#include <DxLib.h>

#include "core.h"
#include "player.h"

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	if (DxLib_Init() == -1)
	{
		return -1;
	}

	ChangeWindowMode(TRUE);							// ウィンドウモードに変更
	SetGraphMode(WIDTH_X, WIDTH_Y, 32);				// ウィンドウサイズの変更
	SetDrawScreen(DX_SCREEN_BACK);

    player Player;						// 自機
    Player.X = WIDTH_X / 2;				// 自機のX座標を中央に
    Player.Y = WIDTH_Y / 2;				// 自機のY座標を中央に
    Player.Velocity = 4;				// 自機の移動速度の変更
    Player.SetImage("hoge.png");		// 画像の設定

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
	{
         Player.Move();
         Player.Draw();

         FPS(60); // 60 fps
	}

	DxLib_End();
	return 0;
}

これを動かすと以下のアニメーションのようになる.
bandicam 2025-01-01 17-18-17-218.gif

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?