2d_patformer/player.cpp
2025-09-24 14:22:47 +00:00

99 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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