Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Dość nietypowy problem


Rekomendowane odpowiedzi

Opublikowano

Witam, niedawno powróciłem do programowania. Postanowiłem napisać platformówkę lecz w pewnym momencie napotkałem na dość wg. mnie nietypowy problem. Zobrazuje go może na przykładzie kodu:

 

Fragment pliku player.cpp:

Player::Player()
{
    player_width = 30;
    player_height = 30;
    PLAYER_RIGHT = 1;
    PLAYER_LEFT = 0;
    frame = 0;
    xPos = 10;
    yPos = 1;
    xVel = 0;
    yVel = 0;
    status = PLAYER_RIGHT;
    playerR = NULL;
    playerL = NULL;
    jump = false;
    speed = 4;
    friction = 0.9;
    gravity = 0.05;
    player.x = xPos;
    player.y = yPos;
    player.w = player_width;
    player.h = player_height;
    test.x = 550; // TEST
    test.y = 0;   // TEST
    test.w = 100; // TEST
    test.h = 700; // TEST
}


Player::~Player(){}


void Player::Player_move(int SCREEN_WIDTH, int SCREEN_HEIGHT)
{
    xPos+=xVel;
    player.x = (int)xPos;


    if((xPos<0)||(xPos+player_width>SCREEN_WIDTH)||(check_collision(player,Vect[1]->wall))) <--- WEKTOR
    {
        xPos-=xVel;
    }


    yPos+=yVel;
    player.y = (int)yPos;


    if((yPos<0)||(yPos+player_height>SCREEN_HEIGHT))
    {
        yPos-=yVel;
    }
}

player.h:

#include "SDL/SDL.h"
#include "map.h"


class Player:protected Map
{
private:
    float xPos, yPos;
    float xVel, yVel;
    int player_height, player_width;
    int frame, status;
    SDL_Rect clipRight[5];
    SDL_Rect clipLeft[5];
    int PLAYER_RIGHT, PLAYER_LEFT;
    SDL_Surface* playerR;
    SDL_Surface* playerL;
    float speed, gravity, friction;
    bool jump;
    SDL_Rect player;
    SDL_Rect test;


public:
    Player();


    bool Player_load();
    bool check_collision(SDL_Rect A, SDL_Rect ;
    void Player_move(int SCREEN_WIDTH, int SCREEN_HEIGHT);
    void Player_event(SDL_Event event);
    void Player_animation();
    void Player_show(SDL_Surface* screen, int width, int height);


    ~Player();
};

Oraz plik, który dziedziczę map.h:

#include "SDL/SDL.h"
#include <vector>


class Map
{
protected:
// Zmienne (Klasa Vector) //////////////
    class Vector
    {
    public:
        bool show;
        SDL_Rect wall;
    };
///////////////////////////////////////
    int map_block_size;
    std::vector<Vector*> Vect;


private:
    SDL_Surface* map_square;
    int x, y;
    int walls[10][10];
    int Map_width, Map_height;


public:
    Map();


    bool Map_texture();
    void Map_draw(SDL_Surface* screen);
    int Map_load_file();
    void Map_list();


    ~Map();
};

Wszystko opiera się o sprawdzanie kolizji, gdyż z rysowaniem itp. nie mam problemów.

W pliku player.cpp, kiedy zamienię wartość Vect[1]->wall wartością "test", kolizja działa normalnie na opisanym wczesnej obszarze.

Lecz mój "dziwny problem" jak to wyżej ująłem własnie występuje z wartością Vect[1]->wall. Po kompilacji nie wyświetlają się żadne błędy, lecz gdy uruchomi się okienko, to znika w trybie natychmiastowym.

 

Podejrzewam, ze jest jakieś problem z komunikacja miedzy klasami.

Wartości raczej nie są błędne skoro własnie z vector'a rysuje mapę.

 

Z góry dziękuje za pomoc.

ywug.jpg



Smacznego

Opublikowano

Problemem jest to, że twój kod jest tak dziwnie napisany, że sam nie możesz się w nim połapać.

1. Dlaczego Player dziedziczy po Map

2. Dlaczego klasa Vector nie ma nic wspólnego z jakimkolwiek wektorem.

3. Naucz się korzystać z debuggera, on ci pokaże dokładnie gdzie jest problem.

4. Jeśli nie dostajesz błędu 0x0000005c (czyli sigsegv) to problem leży gdzie indziej. Twój opis błędu nie jest wystarczający, żeby dokładnie stwierdzić o co chodzi.

4.1. Jeśli dostajesz taki błąd to dlatego, że nie istnieje takie coś jak Vect[1]

Opublikowano

Jakby to było wszystko takie proste, to nie prosił bym o pomoc.

 

@Edit:

 

Może to jest przeciążenie ? Bo pierwsza informacje pobieram z map.h do player.cpp, a następnie map.h i player.h wywołuje w głównej pętli (main.cpp)

ywug.jpg



Smacznego

Opublikowano

Problemem jest to, że twój kod jest tak dziwnie napisany, że sam nie możesz się w nim połapać.

1. Dlaczego Player dziedziczy po Map

2. Dlaczego klasa Vector nie ma nic wspólnego z jakimkolwiek wektorem.

3. Naucz się korzystać z debuggera, on ci pokaże dokładnie gdzie jest problem.

4. Jeśli nie dostajesz błędu 0x0000005c (czyli sigsegv) to problem leży gdzie indziej. Twój opis błędu nie jest wystarczający, żeby dokładnie stwierdzić o co chodzi.

4.1. Jeśli dostajesz taki błąd to dlatego, że nie istnieje takie coś jak Vect[1]

Jakby to było wszystko takie proste, to nie prosił bym o pomoc.

 

Wszystko masz wypisane jak na tacy. Radziłbym spojrzeć na radę nr. 3.

Spróbuj przed robieniem: "Vect[1]->wall" czy vektor zawiera jakieś elementy (!Vect.empty())

Opublikowano

Dodałem prostego if'a w funkcji Player_move, wygląda on następująco:

if(arena->Vect.empty())
    {
        test.x = 500;
    }

Wyszło, że zbiór jest pusty, gdyż punkt x w zmiennej "test" zmienił swą wartość (domyślnie - 50 / po zmanie - 500).

ywug.jpg



Smacznego

Opublikowano

 

Dodałem prostego if'a w funkcji Player_move, wygląda on następująco:

if(arena->Vect.empty())
    {
        test.x = 500;
    }

Wyszło, że zbiór jest pusty, gdyż punkt x w funkcji "test" zmienił swą wartość (domyślnie - 50 / po zmanie - 500).

 

To pokaż miejsce w kodzie, gdzie wkładasz jakieś elementy do tego vectora.

Opublikowano

Trochę pozmieniałem, ale idea jest taka sama.

Map.cpp:

 

Informacje z tablicy wrzucam do Wektora (Wiem, wiem, mogę dodawać elementy przy pomocy konstruktora):

void Map::Map_list()
{
    for(int i=0 ; i<Map_width ; i++){
        for(int j=0 ; j<Map_height ; j++){
            for(int p=0 ; p<Map_height*Map_width ; p++){
            if(walls[i][j]==1)
            {
                Vector *Wector = new Vector;
                Wector->x = map_block_size*j;
                Wector->y = map_block_size*i;
                Wector->width = map_block_size;
                Wector->height = map_block_size;
                Wector->show = true;

                Vect.push_back(Wector);
            }
        }
        }
    }
    delete walls;
}

A następnie to rysuje:

void Map::Map_draw(SDL_Surface* screen)
{
    for(int i=0 ; i<Vect.size() ; i++){
        different.apply_surface(Vect[i]->x, Vect[i]->y, map_square, screen, NULL);
    }
}

 

@Edit:

 

Konstukcja klasy wektora w map.h:

        class Vector
        {
        public:
            bool show;
            int x, y;
            int width, height;
        };


    std::vector<Vector*> Vect;

 

ywug.jpg



Smacznego

Opublikowano

Mały fail z 3 for'em :P Jak już nie korzystam potem z tablicy walls to nie mogę jej usunąć ?

ywug.jpg



Smacznego

Opublikowano
Opublikowano

Mały fail z 3 for'em :P Jak już nie korzystam potem z tablicy walls to nie mogę jej usunąć ?

nawet gdybyś mógł to tak się nie usuwa tablicy dwuwymiarowej.

Poza tym, poczytaj o różnicach pomiędzy

i++, i--
i
++i, --i
. I:

http://stackoverflow.com/questions/409348/iteration-over-vector-in-c

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...