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

SFML - Symulator jazdy samochodem 2d

Ostatnio zmodyfikowano 2011-09-29 19:33
Autor Wiadomość
jaupl
Temat założony przez niniejszego użytkownika
SFML - Symulator jazdy samochodem 2d
» 2011-09-25 13:36:36
Witam. :) Stworzyłem kod który imituje jazdę samochodem . podczas tworzenia wystąpiły pewne problemy na które nie potrafię znaleźć rozwiązania. Oto one :
1.- Nie chce by samochód mógł wyjeżdżać poza mapę i poza ekran. Co mi się częściowo udaje: auto nie wyjedzie poza mapę. Ale kiedy przykładowo jadę szybko(albo długo) w dół mapy to wyjeżdża poza ekran. a potem już nie chce wrócić na miejsce (do lewego górnego rogu gdzie "gra" się zaczyna). przeszkadza mu w tym warunek na końcu funkcji ruch klasy samochód. Problem w tym że nie wiem jak inaczej ten warunek napisać. Błędy mogą być też w funkcji przesun klasy mapa.
2.- kolizje ... jeśli mam mieć "ruchomą" mapę, to jak obiektom mam nadać jakieś współrzędne? Musiały by się "poruszać" tak jak mapa.

Na razie się uczę więc wykonanie wszystkiego może być dość niezgrabne więc proszę o wyrozumiałość. :P

plik: main.cpp
C/C++
#include "drive.hpp"
using namespace std;

int main()
{
   
    string imie;
    cout << "Podaj Imie swojego kierowcy." << endl;
    cin >> imie;
   
    sf::Image obraz;
    obraz.LoadFromFile( "samochod.png" );
    obraz.SetSmooth( false );
    samochod nasze_auto( obraz, imie, 300, 400 );
   
    obraz.LoadFromFile( "dom.png" );
    przeszkoda dom( 0, 104, 0, 111, obraz );
   
    obraz.LoadFromFile( "miasto.png" );
    mapa miasto( obraz, 0, 0, 2048, 2048, 900, 1440 );
    miasto.sprite.SetScale( 4, 4 );
    sf::RenderWindow okno( sf::VideoMode( 1440, 900, 32 ), "Driver" /** sf::Style::Fullscreen***/ );
    while( okno.IsOpened() )
    {
       
        okno.Clear( sf::Color( 0, 255, 0 ) );
        //const sf::Input & sterowanie = okno.GetInput();
        sf::Event zdarzenie;
        while( okno.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == sf::Event::Closed )
                 okno.Close();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape )
                 okno.Close();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Left )
                 nasze_auto.skrec( false );
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Up )
                 nasze_auto.przyspiesz();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Down )
                 nasze_auto.chamuj();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Right )
                 nasze_auto.skrec( true );
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Space )
                 nasze_auto.wychamuj();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::S )
                 nasze_auto.sprite.SetPosition( 0, 0 );
           
        }
       
        if( nasze_auto.predkosc != 0 )
             nasze_auto.ruch( nasze_auto.predkosc ), miasto.przesun( nasze_auto.kierunek, nasze_auto.predkosc );
       
        oczekuj( 0.05 );
        okno.Draw( miasto.sprite );
        okno.Draw( dom.sprite );
        okno.Draw( nasze_auto.sprite );
        okno.Display();
        cout << nasze_auto.predkosc << endl << nasze_auto.kierunek << endl;
        cout << "pozycja x " << nasze_auto.poz_x << endl << "pozycja Y" << nasze_auto.poz_y << endl; // cout << nasze_auto.sprite.Getx << endl;
    }
    return 0;
}

plik : drive.hpp

C/C++
#include <iostream>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <string>
#include <ctime>
using namespace std;

double przelicznik_katow( double stopnie )
{
    double radiany =( stopnie * M_PI ) / 180.0f;
    return radiany;
}

void oczekuj( float sekundy )
{
    clock_t przestan_czekac;
    przestan_czekac = clock() + sekundy * CLOCKS_PER_SEC;
    while( clock() < przestan_czekac ) { }
}

class przeszkoda
{
public:
   
    static int ilosc_przeszkod;
    sf::Image wyglad;
    sf::Sprite sprite;
   
    int pozycjax1;
    int pozycjax2;
    int pozycjay1;
    int pozycjay2;
   
   
    przeszkoda( int argument1, int argument2, int argument3, int argument4, sf::Image obraz )
    {
        wyglad = obraz;
        sprite.SetImage( wyglad );
       
        pozycjax1 = argument1;
        pozycjax2 = argument2;
       
        pozycjay1 = argument3;
        pozycjay2 = argument4;
       
        sprite.SetPosition( pozycjax1, pozycjay1 );
    }
   
};

class samochod
{
public:
   
    static int ilosc_pojazdow;
   
    string kierowca;
    sf::Sprite sprite;
    sf::Image wyglad;
   
    //unsigned int zwrotnosc;
    int predkosc_max;
    int kierunek;
    int predkosc;
    int poz_x;
    int poz_y; // ruch
   
    samochod( sf::Image obraz, string nazwa, int startY, int startX ) /***KONSTRUKTOR***/
    {
        wyglad = obraz;
        sprite.SetImage( wyglad );
        kierowca = nazwa;
        // ilosc_pojazdow ++;
        kierunek = 0;
        predkosc = 0;
        poz_x = startX;
        poz_y = startY;
        sprite.SetPosition( poz_x, poz_y );
        sprite.SetScale( 0.5, 0.5 );
        sprite.SetCenter(( wyglad.GetWidth() / 2.0f ),( wyglad.GetHeight() / 2.0f ) );
    }
   
    /***Metody***/
   
    void przyspiesz() { /*if (predkosc < predkosc_max)*/ predkosc++; }
   
    void chamuj() { predkosc--; }
   
    void wychamuj()
    {
        predkosc = 0;
        /*while (predkosc != 0)
            {
                if (predkosc > 0)
            chamuj();
            if (predkosc < 0)
            przyspiesz()
            ruch (predkosc);
        czekaj(0.05);
       
                okno.Draw(sprite);
            okno.Display();
       
            }*/
       
    }
   
    void skrec( bool strona )
    {
       
        if( predkosc != 0 )
        {
            if( strona == true ) kierunek -= 6, sprite.SetRotation( kierunek );
           
            if( strona == false ) kierunek += 6, sprite.SetRotation( kierunek );
           
            if( kierunek > 360 ) kierunek -= 360;
           
            if( kierunek < 0 ) kierunek += 360;
           
        }
    }
   
    void ruch( int predkosc )
    {
        double kat;
        double argumentA;
        double argumentB;
       
        if( kierunek <= 90 )
             kat = kierunek;
       
        if( kierunek >= 180 && kierunek < 270 )
             kat = kierunek - 180;
       
        if( kierunek > 90 && kierunek < 180 )
             kat = 180 - kierunek;
       
        if( kierunek >= 270 )
             kat = 360 - kierunek;
       
        if( kierunek == 360 )
             kierunek = 0;
       
       
        kat = przelicznik_katow( kat );
       
       
        if( kierunek < 90 && kierunek >= 0 )
        {
            argumentA =+ predkosc *( cos( kat ) );
            argumentB =- predkosc *( sin( kat ) );
        }
       
        if( kierunek >= 180 && kierunek < 270 )
        {
            argumentA =- predkosc *( cos( kat ) );
            argumentB =+ predkosc *( sin( kat ) );
        }
       
        if( kierunek >= 90 && kierunek < 180 )
        {
            argumentA = - predkosc *( cos( kat ) );
            argumentB = - predkosc *( sin( kat ) );
        }
        if( kierunek >= 270 && kierunek < 360 )
        {
            argumentA =+ predkosc *( cos( kat ) );
            argumentB =+ predkosc *( sin( kat ) );
        }
        if(( argumentA >= 0 - poz_x && argumentA <= 2048 - poz_y ) &&( argumentB >= 0 - poz_x && argumentB <= 2048 - poz_y ) )
        { sprite.Move( argumentA, argumentB );
            poz_x += argumentA;
            poz_y += argumentB;
        }
    }
   
};

class mapa
{
public:
    sf::Image wyglad;
    sf::Sprite sprite;
   
    double pozycjax;
    double pozycjay;
   
    int dlugosc;
    int szerokosc;
    int wysokosc_ekranu;
    int szerokosc_ekranu;
   
    mapa( sf::Image obraz, int posx, int posy, int dlg, int szer, int wys_e, int szer_e )
    {
        wyglad = obraz;
        pozycjax = posx;
        pozycjay = posy;
        dlugosc = dlg;
        szerokosc = szer;
        wysokosc_ekranu = wys_e;
        szerokosc_ekranu = szer_e;
        sprite.SetImage( wyglad );
        sprite.SetSubRect( sf::IntRect( posx, posy, posx + szerokosc_ekranu, posy + wysokosc_ekranu ) );
    }
   
    void przesun( int kierunek, int predkosc )
    {
        double argumentA;
        double argumentB;
        double kat;
       
        if( kierunek <= 90 )
             kat = kierunek;
       
        if( kierunek > 180 && kierunek < 270 )
             kat = kierunek - 180;
       
        if( kierunek > 90 && kierunek < 180 )
             kat = 180 - kierunek;
       
        if( kierunek >= 270 )
             kat = 360 - kierunek;
       
        if( kierunek == 360 )
             kierunek = 0;
       
       
        kat = przelicznik_katow( kat );
       
       
        if( kierunek < 90 && kierunek >= 0 )
        {
            argumentA = pozycjax + predkosc *( cos( kat ) );
            argumentB = pozycjay - predkosc *( sin( kat ) );
        }
       
        if( kierunek >= 180 && kierunek <= 270 )
        {
            argumentA = pozycjax - predkosc *( cos( kat ) );
            argumentB = pozycjay + predkosc *( sin( kat ) );
           
        }
       
       
        if( kierunek >= 90 && kierunek < 180 )
        {
            argumentA = pozycjax - predkosc *( cos( kat ) );
            argumentB = pozycjay - predkosc *( sin( kat ) );
        }
       
        if( kierunek > 270 && kierunek < 360 )
        {
            argumentA =( pozycjax + predkosc *( cos( kat ) ) );
            argumentB =( pozycjay + predkosc *( sin( kat ) ) );
        }
       
        if(( argumentA >= 0 && argumentA <= 2048 ) &&( argumentB >= 0 && argumentB <= 2048 ) )
        {
            sprite.SetSubRect( sf::IntRect( argumentA, argumentB, argumentA + szerokosc_ekranu, argumentB + wysokosc_ekranu ) );
            pozycjax = argumentA;
            pozycjay = argumentB;
        }
       
       
    }
   
};

/** bool kolizja(int pozycjax1 ,int pozycjax2 ,int pozycjay1 , int pozycjay2 ,samochod zderzajacy)
{
    if (pozycjax1 == zderzajacy.sprite.GetPosition() + (1/2 * zderzajacy.wyglad.GetWidth()) && (pozycjay2 == (zderzajacy.sprite.GetPosition() - (1/2 * zderzajacy.wyglad.GetHeight()))))
    cout << "kolizja" << endl;
    if (pozycjax2 == zderzajacy.sprite.GetPosition() - (1/2 * zderzajacy.wyglad.GetWidth())&& (pozycjay1 == (zderzajacy.sprite.GetPosition() + (1/2 * zderzajacy.wyglad.GetHeight()))))
    cout << "kolizja" << endl;
    if ( pozycjax1 == zderzajacy.sprite.GetPosition() - (1/2 * zderzajacy.wyglad.GetWidth())&& (pozycjay1 == (zderzajacy.sprite.GetPosition() + (1/2 * zderzajacy.wyglad.GetHeight()))))
    cout << "kolizja" << endl;
    if ( pozycjax2 == zderzajacy.sprite.GetPosition() - (1/2 * zderzajacy.wyglad.GetWidth())&& (pozycjay2 == (zderzajacy.sprite.GetPosition() + (1/2 * zderzajacy.wyglad.GetHeight())))
    cout << "kolizja" << endl;
}**/

Wiem że kod jest dość długi i w dodatku może mętnie i nie estetycznie napisany :P Wielkie dzięki za każdą wskazówkę.
P-41408
DejaVu
» 2011-09-25 19:40:57
Hamuj przez samo H się pisze :)
P-41436
jaupl
Temat założony przez niniejszego użytkownika
» 2011-09-25 20:35:59
Jestem dysortografem :) ale cieszy mnie to że czytałeś :P :) jakieś inne wnioski ?? :D
P-41439
DejaVu
» 2011-09-25 21:59:46
Nie - po prostu rzuciło mi się w oczy jak scrollowałem kod - a zaintrygował mnie sam fakt, że starasz się organizować kod obiektowo i 'coś' Ci działa :) Stąd ta uwaga odnośnie błędu ortograficznego. Co do dysortografii to staraj się na to nie zwalać tylko walczyć z tym :) W programowaniu stosunkowo mało wprowadza się nowych słów, więc staraj się sprawdzać w słowniku (w wordzie) wyrazy jeżeli nie jesteś pewien czegoś na 100% - to też jest ważny element staranności programisty - w końcu jak będziesz miał potrzebę pokazać komuś swój kod (np. przy rekrutacji) to głupio będzie jeżeli takie byki ortograficzne będą się w nim znajdowały :)
P-41441
jaupl
Temat założony przez niniejszego użytkownika
» 2011-09-29 19:33:31
Ehh ... zamykam temat. napisze warunek który będzie albo poruszał autem albo samą mapą (nigdy razem) a co do kolizji ... to stworzę w klasie przeszkoda funkcje taką samą jak w mapa (przesun) i będę sprawdzał pozycję względem okna . ;) No to tyle z myślenia . czas pisać . grę może wrzucę do działu nasze prace za kilka dni jak skończę(bo jest jeszcze do zrobienia grafika :D chwilowo zapożyczam mapę z innej gry czego wolę uniknąć w wersji końcowej. ). mój cały wolny czas pochłania teraz nauka gry na gitarze :d także poślizg też jest możliwy ;pp
P-41541
« 1 »
  Strona 1 z 1