キャラ移動をサイトを参考に、ベルレ法で書きました。
void player::update()の中が、何回も衝突判定を呼び出して割り算したりして
もっと効率よく書きたいと思ってます。が、どうすればいいのか全然考えつきません。
(効率よく書きたいというのは、冗長性を少なくしたいということです。)
あれこれいろいろなサイトを参考にしてますが、どうしても思いつきません。
本当はそれでも自分で考えなきゃ勉強にならないことはわかってますが
あまりにもここのリファクタリングで時間を書けているので掲示板で質問させていただきました。
シーンマネージャークラス等もあるので、キャラ移動の処理に関係するファイルだけ抜粋して載せました。
//プレイヤークラスのヘッダファイル
#pragma once
#include <Dxlib.h>
#include <Sources\Data\Map.h>
class Player
{
public:
Player();
~Player();
void Update();
void Draw();
int getpX() const;
int getpY() const;
private:
int player;
int Width = 32;
int Height = 32;
int X, X_prev, X_move;
int Y, Y_prev, Y_move;
int f;
bool canJump;
Map* map;
};
//プレイヤークラスのソースファイル
#include "Player.h"
Player::Player() : X(320), Y(240), X_prev(320), Y_prev(240), X_move(0), Y_move(0), f(2)
{
player = LoadGraph("Resources/player.png");
map = Map::Instance(); //マップ管理(シングルトン)
map->Initialize();
}
Player::~Player()
{
}
void Player::Update() {
//重力の設定(Verlet積分)
Y_move = (Y - Y_prev) + f;
if (Y_move > 31) Y_move = 31;
Y_prev = Y;
Y += Y_move;
f = 1;
//天井衝突判定
if (map->collisiton_Block_up(X, Y)) {
Y = Y / 32 * 32 + 32;
}
//床衝突判定
if (map->collisiton_Block_down(X, Y)) {
Y = Y / 32 * 32;
canJump = true;
} else {
canJump = false;
}
//左右移動
if (CheckHitKey(KEY_INPUT_RIGHT) || CheckHitKey(KEY_INPUT_D)) X += 2;
if (CheckHitKey(KEY_INPUT_LEFT) || CheckHitKey(KEY_INPUT_A)) X -= 2;
//壁衝突判定(右側)
if (map->collisiton_Block_right(X, Y)) {
X = X / 32 * 32;
}
//壁衝突判定(左側)
if (map->collisiton_Block_left(X, Y)) {
X = X / 32 * 32 + 32;
}
//ジャンプ処理(Verlet積分)
if (CheckHitKey(KEY_INPUT_SPACE) && canJump) {
f = -15;
}
}
void Player::Draw() {
DrawGraph(X, Y, player, TRUE);
}
//マップクラスのヘッダファイル
#pragma once
#include <vector>
class Map //シングルトン
{
public:
static Map* Instance();
void Initialize();
void Draw();
bool collisiton_Block_up(int pX, int pY);
bool collisiton_Block_down(int pX, int pY);
bool collisiton_Block_left(int pX, int pY);
bool collisiton_Block_right(int pX, int pY);
private:
//Mapをシングルトンにするため下記3つをprivateに
Map(); //デフォルトコンストラクタ
Map(const Map& r) {} //コピーコンストラクタ
Map& operator=(const Map& r) {} //代入演算子のオーバーライド
std::vector<std::vector<int>> originalmap{
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,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,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,1,0 },
{ 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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 },
};
std::vector<std::vector<int>> map;
int map_height = originalmap.size();
int map_width = originalmap.front().size();
int chip[2];
int chipSize = 32;
};
//マップクラスのソースファイル
#include "Map.h"
#include <DxLib.h>
#include <Sources\Character\Player.h>
Map::Map()
{
}
Map* Map::Instance() {
static Map instance;
return &instance;
}
void Map::Initialize() {
map.clear();
map = originalmap;
LoadDivGraph("Resources/chip.png", 2, 2, 1, chipSize, chipSize, chip);
}
void Map::Draw() {
for (int y = 0; y < map_height; y++) {
for (int x = 0; x < map_width; x++) {
DrawGraph(x * chipSize, y * chipSize, chip[map[y][x]], TRUE);
}
}
}
bool Map::collisiton_Block_up(int pX, int pY) {
return map[pY / 32][pX / 32] == 1 || map[pY / 32][(pX + 31) / 32] == 1;
}
bool Map::collisiton_Block_down(int pX, int pY) {
return map[(pY + 31) / 32][pX / 32] == 1 || map[(pY + 31) / 32][(pX + 31) / 32] == 1;
}
bool Map::collisiton_Block_left(int pX, int pY) {
return map[pY / 32][pX / 32] == 1 || map[(pY + 31) / 32][pX / 32] == 1;
}
bool Map::collisiton_Block_right(int pX, int pY) {
return map[pY / 32][(pX + 31) / 32] == 1 || map[(pY + 31) / 32][(pX + 31) / 32] == 1;
}