Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak oprogramować strzelanie z pistoletu?

Ostatnio zmodyfikowano 2011-07-27 18:46
Autor Wiadomość
diego997
Temat założony przez niniejszego użytkownika
Jak oprogramować strzelanie z pistoletu?
» 2011-07-27 14:35:20
Po raz kolejny piszę to samo bo znowu mnie to nurtuje. Staram się jakoś to zrobić w jednej klasie ale coś nie wychodzi dużo zbędnych zmiennych bym musiał tworzyć, chyba, że po prostu nie wiem jak to prosto zrobić. Powiedzcie mi czy jak wy byście robili grę i mielibyście dwa obiekty Pistolet i Naboj, to zrobilibyście to w osobnych klasach czyli class naboj, i class pistolet??


P.S bo niezbędne jest tutaj to żeby ograniczyć możliwość drugiego strzału tym samym nabojem kiedy już on leci, a taką funkcje posiada chyba tylko klasa, do każdego naboja odnosi się indywidualnie
P-37277
Thud
» 2011-07-27 14:37:36
Jeżeli ja bym to robił. Na pewno obie klasy dziedziczyłby z tej samej (chodzi mniej więcej o to żeby dziedziczyły zmienne rodzaju XPos, YPos), zaś miałbym vector Naboi w Pistolecie.
P-37280
diego997
Temat założony przez niniejszego użytkownika
» 2011-07-27 14:43:11
Heh przeważnie jak mam z czymś problem to rozwiązaniem jest temat z którym nie miałem jeszcze do czynienia. Pewnie gdybym miał to by nie było problemu ;p. Muszę poczytać o dziedziczeniu. A jak byś się uparł to funkcją byś to zrobił czy raczej niewykonalne(o ile takie pojęcie jest w c++ ;p)?
P-37283
Thud
» 2011-07-27 14:46:49
No więc tak. Zilustruję to kodem. Chwilka.
P-37285
diego997
Temat założony przez niniejszego użytkownika
» 2011-07-27 14:48:15
Wyczytałeś to w mojej głowię dzięki :)
P-37286
Thud
» 2011-07-27 15:51:15
Uff... Obczaj sobie ten kod. Nie zastosowałem tu na przykład metod wirtualnych (czyli jakby nie było polimorfizmu), kod mógł być bardziej skomplikowany. Wyabcz za brak komentarzy. Mimo zastosowania tu dziedziczenia którego jeszcze nie rozumiesz kod powinien być zwięzły.
C/C++
#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>
class Object
{
protected:
    short int PosX, PosY;
    short int SpeedX, SpeedY;
    bool Move;
public:
    Object( short int PosX, short int PosY );
    void SetSpeed( short int SpeedX, short int SpeedY );
    void Stop();
    void MoveObject();
    void SetMoving();
    short int ReturnPosX();
    short int ReturnPosY();
};
Object::Object( short int PosX, short int PosY )
{
    Move = false;
    this->PosX = PosX;
    this->PosY = PosY;
    SpeedX = SpeedY = 0;
}
void Object::SetSpeed( short int SpeedX, short int SpeedY )
{
    this->SpeedX = SpeedX;
    this->SpeedY = SpeedY;
}
void Object::Stop()
{
    SpeedX = 0;
    this->SpeedY = 0;
    Move = false;
}
void Object::MoveObject()
{
    if( Move == true )
    {
        PosX += SpeedX;
        PosY += SpeedY;
    }
}
void Object::SetMoving()
{
    Move = true;
}
short int Object::ReturnPosX()
{
    return PosX;
}
short int Object::ReturnPosY()
{
    return PosY;
}
class Ammo
    : public Object
{
public:
    Ammo( short int PosX, short int PosY );
};
Ammo::Ammo( short int PosX, short int PosY )
    : Object( PosX, PosY )
{
}
class Pistol
    : public Object
{
    unsigned int Count;
    std::vector < Ammo >::iterator Iterator;
    std::vector < Ammo > PistolAmmo;
public:
    Pistol();
    void Fire();
    void MoveAmmo();
    void ShowAmmoPosition();
};
Pistol::Pistol()
    : Object( 0, 0 )
{
}
void Pistol::Fire()
{
    PistolAmmo.push_back( Ammo( PosX, PosY ) );
    Iterator = PistolAmmo.end() - 1;
    Iterator->SetSpeed(( rand() % 20 ) + 1, 0 );
    Iterator->SetMoving();
}
void Pistol::MoveAmmo()
{
    for( Iterator = PistolAmmo.begin(); Iterator != PistolAmmo.end(); Iterator++ )
    {
        Iterator->MoveObject();
    }
}
void Pistol::ShowAmmoPosition()
{
    for( Iterator = PistolAmmo.begin(), Count = 0; Iterator != PistolAmmo.end(); Iterator++, Count++ )
    {
        std::cout << "Pozycja pocisku " << Count << ": " << Iterator->ReturnPosX() << " " << Iterator->ReturnPosY() << std::endl;
    }
}
int main()
{
    srand( time( NULL ) );
    Pistol * NewPistol = new Pistol();
    for( unsigned int Count =( rand() % 15 ) + 1; Count > 0; Count-- )
    {
        NewPistol->Fire();
        NewPistol->MoveAmmo();
        NewPistol->ShowAmmoPosition();
        std::cout << "-------" << std::endl;
    }
    delete NewPistol;
}
P-37304
waxx
» 2011-07-27 15:54:33
Błąd projektowy. Naboje są osobnym obiektem, które po stworzeniu nie powinny mieć nic wspólnego z pistoletem. Nie potrzebujesz ich wektora w klasie broni.
P-37305
akwes
» 2011-07-27 15:55:33
U mnie to by wyglądało tak (ja mam spelle i pociski zrobione w grze i wykonane to jest tak:)
Klasa Pistolet wpycha na listę obiekt klasy Pocisk, i tu się kończy rola klasy Pistolet, wszak pistolet tylko tworzy pocisk i nadaje mu prędkość i zwrot.
Później od klasy Pocisk, zależy jak się zachowa pocisk. Mam ogólną metodę nazwaną "Obsluga", ktora wykonuje wszystko co powinno sie wykonać.

U mnie może być nawet 30 pocisków naraz wiec mam listę, bo wiem że wszystkie muszą wykonać funkcję Obsluga a w niej jest Move(x,y), SprawdzKolizje() itd. Mam dodatkową funkcję IsLive(), która zwraca 1 jeżeli obiekt żyje, albo 0 jeżeli lista ma sama go usunąć z listy.
P-37306
« 1 » 2 3 4
  Strona 1 z 4 Następna strona