Как правильно ссылаться на объект класса из другого класса в C ++? - PullRequest
0 голосов
/ 23 октября 2018

Я использую C ++ и SFML, чтобы сделать нисходящий шутер Zombie.На данный момент у меня есть игрок, которого я могу передвигать, который может стрелять, но я пытаюсь получить базовый ИИ для зомби, который преследует игрока в зависимости от позиции игрока.

По какой-то причине зомби движется по прямойНаправление, а не погоня за игроком.Я считаю, что проблема связана с неправильной позицией игрока, используемой для расчета направления зомби.Я постоянно получаю 0 за позицию игрока, когда использую значение позиции из класса игрока в классе зомби.

Но я не могу понять, как решить проблему.Любая помощь будет оценена.Спасибо!

Вот мой код:

Player.cpp

//GetPosition() is getting player position
//I even tried getting output of player's x and y position in this class and 
//its correctly showing player's position
sf::Vector2f Player::GetPosition()
{
  xPos = playerSprite.getPosition().x;
  yPos = playerSprite.getPosition().y;

  sf::Vector2f position = sf::Vector2f(xPos, yPos);

  //Correctly outputs position
  std::cout << "X: " << position.x << " Y: " << position.y << std::endl;

  return position;
}

Zombie.h

#pragma once
#include <SFML/Graphics.hpp>
#include "Player.h"
class Zombie
{
public:
  Zombie();

  //Here I am trying to create a player object to access player position 
  //variable to use for Zombie direction calculations
  Player p1;
  Player *player = &p1;

  sf::Texture zombieTexture;
  sf::Sprite zombieSprite;

  sf::Vector2f zombiePosition;
  sf::Vector2f playerPosition;
  sf::Vector2f direction;
  sf::Vector2f normalizedDir;

  int xPos;
  int yPos;
  float speed;
  void Move();

};

Zombie.cpp

void Zombie::Move()
{

// Make movement
xPos = zombieSprite.getPosition().x;
yPos = zombieSprite.getPosition().y;

zombiePosition = sf::Vector2f(xPos, yPos);

playerPosition = player->GetPosition();

//Incorrectly outputs player position
//This outputs 0 constantly. But why?
std::cout << "X: " << playerPosition.x << " Y: " << 
playerPosition.y << std::endl;

direction = playerPosition - zombiePosition;
normalizedDir = direction / sqrt(pow(direction.x, 2) + pow(direction.y, 2));

speed = 2;

//Rotate the Zombie relative to player position
const float PI = 3.14159265;

float dx = zombiePosition.x - playerPosition.x;
float dy = zombiePosition.y - playerPosition.y;

float rotation = (atan2(dy, dx)) * 180 / PI;
zombieSprite.setRotation(rotation + 45);

sf::Vector2f currentSpeed = normalizedDir * speed;

zombieSprite.move(currentSpeed);
}

1 Ответ

0 голосов
/ 23 октября 2018

Как зомби узнает, какого игрока преследовать?В вашем Zombie классе у вас есть член p1, который никогда не перемещается, и player всегда указывает на это.Вероятно, вам нужна функция

void Zombie::chasePlayer(Player* p)
{
   player = p;
}

, а затем в main.cpp добавьте строку

zombie.chasePlayer(&player);

В более общем случае вы можете, например, проверить, кто является ближайшим игроком, и преследовать его.один вместо.

...