2012-03-06 3 views
0

Я читал учебное слово в слово, но я получаю сообщение об ошибке, из-за которого я не мог получить ответ от парня, который сделал учебник!не является членом 'tagINPUT'

я попал в этот раздел учебника, который где пошло не так: http://www.gamefromscratch.com/page/Game-From-Scratch-CPP-Edition-Part-6.aspx

Ошибка я получаю:

playerpaddle.cpp(32): error C2039: 'IsKeyDown' : is not a member of 'tagINPUT' 
c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(5332) : see  declaration of 'tagINPUT' 

playerpaddle.cpp(36): error C2039: 'IsKeyDown' : is not a member of 'tagINPUT' 
c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(5332) : see declaration of 'tagINPUT' 

playerpaddle.cpp(40): error C2039: 'IsKeyDown' : is not a member of 'tagINPUT' 
c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(5332) : see declaration of 'tagINPUT' 

1>c:\users\dave\c++\pang\playerpaddle.cpp(54): error C2064: term does not evaluate to a function taking 1 arguments 

В этом разделе сценария:

void PlayerPaddle::Update(float elapsedTime) 
{ 
if(Game::GetInput().IsKeyDown(sf::Key::Left)) 
{ 
    _velocity-=3.0f; 
} 
if(Game::GetInput().IsKeyDown(sf::Key::Right)) 
{ 
    _velocity+=3.0f; 
} 
if(Game::GetInput().IsKeyDown(sf::Key::Down)) 
{ 
    _velocity = 0.0f; 
} 

if(_velocity > _maxVelocity) 
    _velocity = _maxVelocity; 

if(_velocity < -_maxVelocity) 
    _velocity = -_maxVelocity; 

sf::Vector2f pos = this->GetPosition(); 

if(pos.x <= GetSprite().GetSize().x/2 || 
    pos.x >= (Game::SCREEN_WIDTH - GetSprite().GetSize().x/2)) 
{ 
    _velocity = -_velocity; 
} 

GetSprite().Move(_velocity * elapsedTime, 0); 
} 

Я приложил свой проект к кому-то, чтобы посмотреть: http://tinyurl.com/7evajju

ответ

4

GetInput() static в игре возвращает структуру Windows. Довольно уверен, что это не то, что вы хотели, поскольку у этой структуры есть только данные и никакие методы. Эта функция фактически не реализована, поэтому, если вы просто делаете ошибки, у вас будет ошибка компоновщика для неопределенного символа.

Вы видите это как '_tagINPUT' как эффект от того, как windows typedef объявляет структуры.

Вы, вероятно, намеревался вернуться в класс 'Input', как определено в включают \ SFML \ Window \ Input.hpp

Я считаю, что вы, как правило, называют GetInput() в классе SFML Window.

Так может быть все, что вы хотели, чтобы game.h вместо этого:

const sf::Input& GetInput() { return _mainWindow.GetInput(); } 

Я думаю, что вы могли бы сделать так, чтобы сосредоточить внимание на C++ в качестве языка, прежде чем погрузиться так глубоко в программировании игр. Если игровое программирование - это все, что вас интересует, вы можете захотеть изучить технологии более высокого уровня, которые позволят вам создавать игры. Спуск по дороге C/C++, не вникая в понимание языка, скорее всего, вызовет у вас достаточно боли, что вы в конечном итоге будете ненавидеть то, что вы делаете, что было бы неудачно.

+0

Спасибо за ответ - то, что я не понимаю, потому что учебник работает, но у меня нет, когда у них тот же код =/ – Sir

+1

Это ключ, они * не * тот же код. Джо пригвоздил проблему. Исходный код: const static sf :: Input & GetInput(); в то время как ваш код: const static :: INPUT & GetInput() ;. Входные и INPUT - две разные вещи. – Serapth

+0

Для более подробного описания 'Input' является определяемым пользователем классом, тогда как' INPUT' является структурой данных Windows для хранения входной информации. Он используется в функции «SendInput». Кроме того, структура 'INPUT' фактически является typedef структуры' _tagINPUT'. – chris

Смежные вопросы