2013-08-17 4 views
1

저는 SFML을 처음 사용하고 있으며 스페이스 바를 누를 때마다 총알을 발사하는 스크롤링 비행기 게임을 만들고 있습니다. 나는 모든 운동을하고 있지만, 총알을 다른 클래스 파일에 넣는 방법을 알아 내려고하고있다. 그래서 나는 나중에 그것들 전체 세트를 가질 수있다. (IE create.bullet(), create.missle() 등). 여기에 제가 지금 가지고있는 코드가 있습니다.SFML 다른 클래스에서 움직이는 스프라이트 그리기

void create::bullet(int xPos, int yPos) 
{ 
sf::Texture bulletTexture; 
if(!bulletTexture.loadFromFile("bullet.png")) 
    cout << "There was an error loading the bullet texture file." << endl; 
sf::Sprite bulletSprite; 
bulletSprite.setTexture(bulletTexture); 
bulletSprite.setPosition(xPos, yPos); 

window.draw(bulletSprite); 

} 

나는 메인 클래스에서 김포 :: RenderWindow의 인스턴스라는 창을 가지고,하지만 난 분명히 다른 클래스에서 직접 참조 할 수 없습니다. 저는 아직 속도를 구현할 수 없었지만, 그렇게 할 수 있어야합니다. 그러나 도움이 필요한 또 다른 사항은 해고 될 수있는 총알 수에 제한이 없도록 가져 오는 것입니다. 스페이스 바를 누를 때마다이 함수를 실행하면 스프라이트가 새 위치로 재설정되고 이전 위치가 제거됩니다. 도와 주셔서 감사합니다!

답변

1

우선 파일에서 텍스처를로드하는 속도가 느립니다. 프로그램이나 레벨이 시작될 때 한 번해야하며 어딘가에 텍스처를 저장해야합니다.

Create 클래스 대신 Bullet 클래스를 만듭니다. 그런 다음 총알의 벡터 (또는 포인터/스마트 포인터)를 가질 수 있습니다. 새 탄환을 원할 때마다 벡터에 push_back()합니다. 총알을 소멸해야 할 경우 지우기()합니다. 그런 다음 게임 자체에 대해 모든 글 머리에 대해 Move()를 호출하고 벡터에있는 모든 글 머리에 대해 Draw()를 호출해야합니다. 완료되면 충돌 감지 등을 추가 할 수 있습니다.

각 탄환에는 고유 한 sf :: sprite가 있고이를 수정할 수도 있고 각 게임 스프라이트에 대해 하나의 sf :: sprite를 가질 수 있으며 모든 불릿에 대해 위치를 변경할 수 있습니다. 개인적으로 두 번째 방법을 사용하고 있습니다. 내 글 머리 기호 클래스는 다음과 같습니다.

Bullet::Bullet(std::string ntype, double nx, double ny, double nvx, double nvy): 
    type(ntype), x(nx), y(ny), vx(nvx), vy(nvy) 
{ 
    angle=atan2(vy, vx)*(180/M_PI); 
} 
void Bullet::Move() 
{ 
    x+=vx; 
    y+=vy; 
}; 
void Bullet::Draw() 
{ 
    DrawSprite(type, x, y, angle+90); 
}; 

별도의 .cpp 파일에서 sf :: sprites의 문자열 정렬 맵이 있습니다. 내 그리기 기능은 다음과 같습니다.

void DrawSprite(std::string type, float x, float y, float angle) 
{ 
    sf::Sprite temp=sprites[type]; 
    temp.setRotation(angle); 
    temp.setPosition(x, y); 
    window.draw(temp); 
} 
관련 문제