Верно, ребята, я здесь в серьезном рассоле.
Я делаю 2D-игру для университета, и это не должно быть сложно каким-либо образом. У меня есть опыт создания игр в С# XNA и я пытаюсь использовать похожие методы. Единственное различие, которое у меня может быть для вас, это то, что я использую движок игры S2D, написанный моим преподавателем, который имеет сходство с XNA.
По сути моя проблема в том, что у меня есть два файла заголовка (EscapeThePrison.h и Player.h) и три файла cpp (main.cpp, World.cpp и Player.cpp).
В main.cpp у меня просто есть точка входа в игру.
Однако EscapeThePrison.cpp является единственным другим исполняемым файлом. Этот файл должен (пока) рисовать фон. Это работает.
Предполагается, что Player.cpp нарисовал изображение моего игрока, но он этого не делает. Я даже использовал cout, чтобы просто выводить текст, чтобы проверить, запущен ли он, но мой код просто дерьмовый, но я ничего не получаю.
Во всяком случае, я в основном должен иметь возможность запускать весь файл player.cpp, так что чертовски все будет работать. Ниже мой код.
EscapeThePrison.h:
#include "S2D/S2D.h"
#include "Player.h"
using namespace S2D;
class EscapeThePrison : public Game
{
private:
Vector2* BGPosition;
Rect* BGRect;
Texture2D* BGTexture;
public:
EscapeThePrison(int argc, char* argv[]);
virtual ~EscapeThePrison();
void virtual LoadContent();
void virtual Update(int elapsedTime);
void virtual Draw(int elapsedTime);
};
Player.h:
#pragma once
#include "S2D\S2D.h"
using namespace S2D;
struct User
{
Vector2* pos;
Rect* rect;
Texture2D* texture;
};
class Player
{
private:
User* user;
public:
Player(int argc, char*argv[]);
virtual ~Player();
void virtual LoadContent();
void virtual Update(int elapsedTime);
void virtual Draw(int elapsedTime);
};
Main.cpp (запись для игры)
#include "EscapeThePrison.h"
#include "Player.h"
int main(int argc, char* argv[])
{
EscapeThePrison* game = new EscapeThePrison(argc, argv);
}
World.cpp (рабочий файл)
#pragma once
#include "EscapeThePrison.h"
#include "Player.h"
EscapeThePrison::EscapeThePrison(int argc, char*argv[]) : Game(argc, argv)
{
Graphics::Initialise(argc, argv, this, 1080, 720 , false, 25, 25, "EscapeThePrison", 60);
Input::Initialise();
Graphics::StartGameLoop();
}
EscapeThePrison::~EscapeThePrison()
{
delete BGTexture;
delete BGRect;
}
void EscapeThePrison:: LoadContent()
{
BGTexture = new Texture2D();
BGTexture->Load("Images/tiles.jpg", false);
BGPosition = new Vector2(0.0f,0.0f);
BGRect = new Rect(0.0f, 0.0f, 1080, 720);
}
void EscapeThePrison:: Update(int elapsedTime)
{
}
void EscapeThePrison:: Draw(int elapsedTime)
{
SpriteBatch::BeginDraw();
SpriteBatch::Draw(BGTexture, BGPosition, BGRect);
SpriteBatch::EndDraw();
}
Player.cpp (нерабочий)
#include "Player.h"
#include <iostream>
using namespace std;
Player::Player(int argc, char* argv[])
{
user = new User();
}
Player::~Player()
{
delete user->texture;
delete user->rect;
}
void Player:: LoadContent()
{
user->texture = new Texture2D();
user->texture->Load("Images/PlayerImage.png", false);
user->pos = new Vector2(100.0f, 100.0f);
user->rect = new Rect(0.0f, 0.0f, 39, 79);
}
void Player:: Update(int elapsedTime)
{
cout<< "output";
}
void Player:: Draw(int elapsedTime)
{
SpriteBatch::BeginDraw();
SpriteBatch::Draw(user->texture, user->pos, user->rect);
SpriteBatch::EndDraw();
}
Правильно, теперь код не работает, я расскажу вам о том, что я пробовал.
Я связался с моим лектором об этом, и все, что он смог сказать, не будучи конкретным, в значительной степени использовал Player-> Update(); который я пробовал, но Intellisense выделяет "->" и говорит, что он ожидает идентификатора.
Действуя по инициативе, я попытался использовать 'Player :: Update();' но он сказал мне, что не могу ссылаться на него из статического контекста. Я удалил скобки, и это позволило, но создание приложения все равно ничего не делало.
Я тоже не полный идиот, и я сделал пользователь, который не рисовал за задним фоном, комментируя код рисования для фона. Еще ничего.
Мне действительно нужна помощь в этом, поэтому никаких саркастических ответов, пожалуйста. Надеюсь, это достаточно ясно.
Вызовите обновление для экземпляра Player, а не класса Player
У вас нет никакого кода для создания Player
или вызова функций на нем; вам нужно будет добавить этот код. Функции не просто магически вызываются автономно на несуществующих объектах.
Кстати, вы нарушаете правило из трех, поэтому ваши классы имеют разрушительные/опасные ошибки без двойки. Либо добавьте конструкторы копирования, либо, что еще лучше, отбросьте все это ручное динамическое распределение.
Я связался с моим лектором об этом, и все, что он смог сказать, не будучи конкретным, в значительной степени использовал Player-> Update(); [..] Я удалил скобки, и это разрешило, но создание приложения все равно ничего не делало
Программирование путем угадывания не работает. Обратитесь к своему профессору еще раз, и на этот раз у него более трех-минутного разговора по электронной почте: сядьте на полчаса или больше, и попросите его объяснить вам, как структурировать вашу программу C++. Это то, за что он заплатил.
Player
. Можете ли вы показать это, и где вы пытаетесь вызватьUpdate
?