99 lines
4.1 KiB
C++
99 lines
4.1 KiB
C++
#include "player.hpp" // Включаємо заголовок класу Player, щоб компілятор знав про його методи та змінні.
|
||
using namespace std;
|
||
// Конструктор класу Player. Він автоматично викликається при створенні об'єкта Player.
|
||
|
||
Player::Player()
|
||
: shape(sf::Vector2f(50.f, 50.f)), // тут лише "чисте" створення
|
||
speed(500.f), //швидкість
|
||
velocityY(0.f),
|
||
jumpStrength(700.f), // пиржок
|
||
onGround(true),
|
||
gravity(1500.f),
|
||
groundLevel(1040.f)
|
||
{
|
||
// А тут уже викликаємо методи, які налаштовують shape
|
||
shape.setFillColor(sf::Color::Green);
|
||
shape.setPosition(50.f, 1040.f);
|
||
}
|
||
|
||
|
||
|
||
// Закоментований метод `update` (робота на потім).
|
||
// Він призначений для оновлення логіки гравця у кожному кадрі гри.
|
||
// Усередині цього методу, ви будете обробляти рух, зіткнення, анімацію тощо.
|
||
// `deltaTime` — це час, що минув з попереднього кадру, і він забезпечує плавний рух незалежно від швидкості комп'ютера.
|
||
void Player::update(float deltaTime, const std::vector<Platform>& platforms) { // Тут буде логіка руху гравця
|
||
float moveX = 0.f;
|
||
|
||
|
||
|
||
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)){
|
||
moveX -= speed * deltaTime;} //рух вліво
|
||
|
||
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)){
|
||
moveX += speed * deltaTime;} //рух вправо
|
||
|
||
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && onGround==true) {
|
||
velocityY = -jumpStrength;
|
||
}
|
||
velocityY += gravity * deltaTime;
|
||
|
||
shape.move(moveX, 0.f);
|
||
shape.move(0.f , velocityY * deltaTime);
|
||
|
||
//перевірка чи є земля та обмеження щоб фігура не вилитіла
|
||
|
||
if(shape.getPosition().y + shape.getSize().y >= groundLevel){
|
||
shape.setPosition(shape.getPosition().x, groundLevel -shape.getSize().y);
|
||
velocityY = 0;
|
||
onGround = true;
|
||
}else{
|
||
onGround = false;
|
||
}
|
||
/////////////////////////////////////////////////////
|
||
|
||
sf::FloatRect playerBounds = shape.getGlobalBounds();
|
||
|
||
for (const auto& platform : platforms) {
|
||
sf::FloatRect platformBounds = platform.getBounds();
|
||
if (playerBounds.intersects(platformBounds)){
|
||
if (playerBounds.intersects(platformBounds)) {
|
||
// Додатковий if — перевіряємо, чи гравець зверху
|
||
if (playerBounds.top + playerBounds.height <= platformBounds.top + 20.f) {
|
||
shape.setPosition(shape.getPosition().x, platformBounds.top - shape.getSize().y);
|
||
velocityY = 0.f;
|
||
onGround = true;
|
||
}else if(playerBounds.top> platformBounds.top){shape.setPosition(shape.getPosition().x, platformBounds.top +platformBounds.height);
|
||
velocityY =0.f;}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
/////////////////////////////////////////////////////
|
||
|
||
if(shape.getPosition().x < 0.f)
|
||
shape.setPosition(0.f, shape.getPosition().y);
|
||
|
||
if(shape.getPosition().x+shape.getSize().x>1925.f)
|
||
shape.setPosition(1925.f - shape.getSize().x ,shape.getPosition().y);
|
||
|
||
|
||
if(shape.getPosition().y < 0.f)
|
||
shape.setPosition(shape.getPosition().x,0.f);
|
||
|
||
if(shape.getPosition().y+shape.getSize().y>1200.f)
|
||
shape.setPosition(shape.getPosition().x, 1200.f - shape.getSize().y);
|
||
}
|
||
|
||
|
||
// Метод `draw` для відмальовування гравця на екрані.
|
||
// Приймає посилання на вікно, щоб знати, де малювати.
|
||
void Player::draw(sf::RenderWindow& window)
|
||
{
|
||
// Викликаємо метод `draw` вікна, щоб намалювати наш об'єкт `shape`.
|
||
window.draw(shape);
|
||
}
|