Почему функция работает некорректно? C++
Создал функцию простейшей гравитации которая должна двигать персонажа вниз на 1 клетку, по координатам привязанным к массиву, вызываю функцию в вечном цикле затем идёт вызов функции рисования игрового окна и заново, но ничего не происходит, зато при нажатии персонаж уезжает очень далеко.
#include<iostream>
#include<conio.h>
#include<windows.h>
using namespace std;
const int size_x=15;
const int size_y=30;
char world[size_x][size_y];
class Player
{
private:
int g = 1;
public:
int jumpforce = 2;
int point_x;
int point_y;
int HP;
Player()
{
point_x = 0;
point_y = 0;
HP = 100;
};
Player(int x, int y, char skin)
{
this->point_x = x;
this->point_y = y;
this->HP = 100;
for (int i = 0; i < size_x; i++)
{
for (int k = 0; k < size_y; k++)
{
if (i == this->point_x && k == this->point_y)
{
world[i][k] = skin;
break;
}
}
}
};
void ChangePositiont(char skin)
{
for (int i = 0; i < size_x; i++)
{
for (int k = 0; k < size_y; k++)
{
if (i == this->point_x && k == this->point_y)
{
world[i][k] = skin;
}
if(world[i][k] == skin&&(i!=this->point_x||k!=this->point_y))
{
world[i][k] = '.';
}
}
}
}
###
void Gravity()
{
this->point_x=this->point_x + g;
}
###
};
class Enemy :public Player
{
public:
Enemy(int x, int y, char skin)
{
this->point_x = x;
this->point_y = y;
this->HP = 100;
for (int i = 0; i < size_x; i++)
{
for (int k = 0; k < size_y; k++)
{
if (i == this->point_x && k == this->point_y)
{
world[i][k] = skin;
break;
}
}
}
};
};
void ArrFill(char a)
{
for (int i = 0; i < size_x; i++)
{
for (int j = 0; j < size_y; j++)
{
world[i][j] = a;
}
}
};
void ShowScene()
{
for (int i = 0; i < size_x; i++)
{
for (int k=0; k < size_y; k++)
{
cout << world[i][k];
}
cout << endl;
}
}
void Move(Player &pl)
{
if (_kbhit())
{
char a = _getche();
switch (a)
{
case 'a':
pl.point_y = pl.point_y - 1;
pl.ChangePositiont('$');
break;
case 'd':
pl.point_y = pl.point_y + 1;
pl.ChangePositiont('$');
break;
case 's':
pl.point_x = pl.point_x + 1;
pl.ChangePositiont('$');
break;
case 'w':
pl.point_x = pl.point_x - 1;
pl.ChangePositiont('$');
break;
}
}
}
int main()
{
setlocale(LC_ALL, "ru");
ArrFill('.');
Player player(size_x/2, size_y/2, '$');
Enemy DrowRanger(5, 5, '%');
while (1)
{
cout << "Здоровье: " << player.HP << endl;
player.Gravity();
ShowScene();
Move(player);
system("cls");
}
return 0;
}
Ответы (1 шт):
Проблема в том, что смену положения персонажа на поле, которое программа отрисовывет каждый кадр, ты вызываешь только тогда, когда пользователь нажимает кнопку. Вот и получается, что по факту координата меняется, но вот рисовать он это не будет, пока пользователь не нажмет кнопку.
Путей решения много, например использовать ChangePositiont() в функции Gravity()
Хотя правильнее тогда будет просто каждый кадр вызывать эту функцию (ведь Gravity() в любом случае так будет делать, но при нажатии кнопки движения ChangePositiont() будет вызываться 2 раза за кадр)