#c #sfml
#c #sfml
Вопрос:
Я кодирую игру на c с помощью SFML. Я написал код для игрока, конечной цели и сетки, но когда игра начинается, консоль показывает, что координаты игрока меняются, но сам игрок не отображается и не отображается в окне. Кто-нибудь может помочь? кроме того, в игре все о игроке, перемещающемся внутри сетки. когда игрок сталкивается (здесь это означает, что игрок находится в той же сетке) с конечной целью.
main.cpp
#include <SFML/Graphics.hpp>
#include <iostream>
#include <SFML/System/Clock.hpp>
#include "Player.h"
float tileSize = 25.f;
sf::RectangleShape endGoal(sf::Vector2f(tileSize - tileSize / 10, tileSize - tileSize / 10));
Player player(tileSize);
int main()
{
sf::Clock clock;
sf::RenderWindow window(sf::VideoMode(1080, 720), "Player amp; End Goal - Grid Game");
window.setVerticalSyncEnabled(true);
endGoal.setFillColor(sf::Color(0, 185, 0, 255));
endGoal.setOutlineColor(sf::Color(0, 185, 0, 255));
endGoal.setOutlineThickness(tileSize / 10);
endGoal.setPosition(tileSize * 20, tileSize * 15);
/////// Game Loop //////
while (window.isOpen())
{
float dt = clock.restart().asSeconds();
sf::Event evnt;
while (window.pollEvent(evnt))
{
switch (evnt.type)
{
case sf::Event::Closed:
std::cout << "Window has been closed." << std::endl;
window.close(); // closes the window when the 'X' button gets pressed
}
}
//Player Movement
player.handleMovement();
if (player.isPlayerColliding(endGoal)) {
std::cout << "Player is colliding with End Goal.." << std::endl;
}
else {
std::cout << "X" << std::endl;
}
window.clear(sf::Color::White);
//Drawing The Grid
for (int i = 0; i <= window.getSize().x / tileSize; i ) {
for (int j = 0; j <= window.getSize().y / tileSize; j ) {
sf::RectangleShape gridTile(sf::Vector2f(20.f, 20.f));
gridTile.setSize(sf::Vector2f((float)tileSize, (float)tileSize));
gridTile.setFillColor(sf::Color(210, 210, 210, 255));
gridTile.setOutlineColor(sf::Color(155, 155, 155, 255));
gridTile.setOutlineThickness(2.5f);
gridTile.setPosition(sf::Vector2f(i * gridTile.getSize().x, j * gridTile.getSize().y));
window.draw(gridTile);
}
}
std::cout << " Player X: " << player.getPosition().x / tileSize<< " Y: " << player.getPosition().y / tileSize << " EndGoal X: " << endGoal.getPosition().x / tileSize << " Y: " << endGoal.getPosition().y / tileSize << std::endl;
window.draw(endGoal);
player.draw(window);
window.display();
}
return 0;
}
Player.h
#pragma once
#include <SFML/Graphics.hpp>
class Player {
public:
Player(float size) {
gridSize = size;
player.setFillColor(sf::Color::Black);
player.setOutlineThickness(gridSize / 10);
player.setOutlineColor(sf::Color::Black);
player.setPosition(sf::Vector2f(gridSize, gridSize));
}
void draw(sf::RenderWindow amp;renderWindow) {
renderWindow.draw(player);
}
void handleMovement() {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) { player.move(0, -gridSize); }
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) { player.move(0, gridSize); }
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) { player.move(-gridSize, 0); }
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) { player.move(gridSize, 0); }
}
bool isPlayerColliding(sf::RectangleShape amp;collider) {
if (player.getPosition() == collider.getPosition())
return true;
else
return false;
}
sf::Vector2f getPosition() { return player.getPosition(); }
sf::Vector2f getSize() { return player.getSize(); }
private:
float gridSize;
sf::RectangleShape player;
};
Ответ №1:
Проигрыватель выполняет рендеринг, но его размер равен (0, 0).
Установите размер проигрывателей в его конструкторе.
Это может выглядеть так:
player.setSize(sf::Vector2f(size, size));