2013-04-09 35 views
37

Gần đây tôi bắt đầu nhận C++ và thư viện SFML, và tôi đã tự hỏi liệu tôi đã định nghĩa một Sprite trên một tập tin được gọi là "player.cpp" hay không, làm cách nào tôi gọi nó trên vòng lặp chính của tôi ở "main.cpp "?Làm thế nào để gọi trên một hàm được tìm thấy trên một tệp khác?

Đây là mã của tôi (Hãy lưu ý rằng đây là SFML 2.0 chứ không phải 1.6!).

main.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 
#include "player.cpp" 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(800, 600), "Skylords - Alpha v1"); 

    while (window.isOpen()) 
    { 
     sf::Event event; 
     while (window.pollEvent(event)) 
     { 
      if (event.type == sf::Event::Closed) 
       window.close(); 
     } 

     window.clear(); 
     window.draw(); 
     window.display(); 
    } 

    return 0; 
} 

player.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 

int playerSprite(){ 
    sf::Texture Texture; 
    if(!Texture.loadFromFile("player.png")){ 
     return 1; 
    } 
    sf::Sprite Sprite; 
    Sprite.setTexture(Texture); 
    return 0; 
} 

Làm thế nào mà tôi cần sự giúp đỡ là trong "main.cpp", nơi nó nói window.draw(); trong mã vẽ của tôi. Trong dấu ngoặc đơn đó, sẽ có tên của Sprite mà tôi muốn tải lên màn hình. Theo như tôi đã tìm kiếm, và cố gắng bằng cách đoán. Tôi đã không thành công trong việc làm cho chức năng vẽ đó làm việc với sprite của tôi trên tập tin khác. Tôi cảm thấy như tôi đang thiếu một cái gì đó lớn, và rất rõ ràng (trên một trong hai tập tin), nhưng sau đó một lần nữa, mỗi chuyên nghiệp đã từng là một newb.

Trả lời

49

Bạn có thể sử dụng tệp tiêu đề.

Thực hành tốt.

Bạn có thể tạo tệp có tên player.h khai báo tất cả các chức năng cần bởi các tệp cpp khác trong tệp tiêu đề đó và bao gồm nó khi cần.

player.h

#ifndef PLAYER_H // To make sure you don't declare the function more than once by including the header multiple times. 
#define PLAYER_H 

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 

int playerSprite(); 

#endif 

player.cpp

#include "player.h" // player.h must be in the current directory. or use relative or absolute path to it. e.g #include "include/player.h" 

int playerSprite(){ 
    sf::Texture Texture; 
    if(!Texture.loadFromFile("player.png")){ 
     return 1; 
    } 
    sf::Sprite Sprite; 
    Sprite.setTexture(Texture); 
    return 0; 
} 

main.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 
#include "player.h"   //Here. Again player.h must be in the current directory. or use relative or absolute path to it. 

int main() 
{ 
    // ... 
    int p = playerSprite(); 
    //... 

Không phải là một thực hành tốt nhưng làm việc cho các dự án nhỏ. tuyên bố chức năng của bạn trong main.cpp

#include "stdafx.h" 
#include <SFML/Graphics.hpp> 
// #include "player.cpp" 


int playerSprite(); // Here 

int main() 
{ 
    // ... 
    int p = playerSprite(); 
    //... 
+0

Được rồi, thưa bạn, gần như đã cứu được mông của tôi. Tôi đã luôn luôn nghe nói về các tập tin tiêu đề chết tiệt, nhưng không bao giờ thực sự nhìn vào chúng, chúng khá quan trọng, eh? Nhưng đây là một câu hỏi khác, một khi tôi đã làm điều này, và tôi đã nhập nó vào "main.cpp", tệp "main.cpp" của tôi trông như thế nào trong vùng window.draw, nó sẽ như thế nào? – Safixk

+0

@Safixk Có. Khi mã của bạn bắt đầu trở nên lớn hơn, chúng trở nên cực kỳ quan trọng. Tôi khuyên bạn nên tạo các tệp tiêu đề nếu bạn có nhiều hơn tệp cpp –

+0

Được rồi, hãy thử mã mới mà bạn vừa gửi cho tôi, kiểm tra lại trong 5 – Safixk

0

sprite của bạn được tạo ra giữa đường thông qua chức năng playerSprite ... nó cũng đi ra khỏi phạm vi và không còn tồn tại ở phần cuối của hàm tương tự. Các sprite phải được tạo ra, nơi bạn có thể vượt qua nó để playerSprite để khởi tạo nó và cũng là nơi bạn có thể vượt qua nó để vẽ chức năng của bạn.

Có thể khai báo trên while đầu tiên của bạn?

+2

Đây phải là nhận xét vì nó không liên quan đến câu hỏi mà anh ta yêu cầu – Chachmu

+3

nó được dự định để giải quyết vấn đề của mình. Bạn có luôn luôn quét qua các câu trả lời cũ của tuần để tìm kiếm? có lẽ bạn cần một sở thích hiệu quả hơn – cppguy