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

[C++ SDL] Problem z klasą


Rekomendowane odpowiedzi

Opublikowano

Witam, Podczas pisania mojego nowego projektu napotkałem na dość denerwujący problem. Może zobrazuje to w kodzie(Niektóre zmiennie i funkcje wykasowałem bo są nie istotne):

 

player.h

class player{
    private:
        float x,y;
    public:
        float xpos();
        float ypos();

player.cpp


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


#include "player.h"
#include "other.h"


other other1;


void player::show(SDL_Surface* obraz){
    load();


    other1.apply_surface(x,y,ludek,obraz);
}


void player::move(int w,int h){
load();


    x+=xVel;
    if( ( x < 0 ) || ( x + ludek->w > w ) )
        {
            x-=xVel;
        }


    y+=yVel;
    if( ( y < 0 ) || ( y + ludek->h > h ) )
        {
            y-=yVel;
        }
}


float player::xpos(){
    return x;
}


float player::ypos(){
    return y;
}

ammo.h

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


class ammo{
public:
    float x,y;
    float deltaX,deltaY;
    float time;


    ammo(float xammo,float yammo):x(xammo),y(yammo){}
};


std::vector<ammo>Ammo;

cross.cpp

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

#include "cross.h"
#include "other.h"
#include "ammo.h"
#include "player.h"

other other2;
player player1;

void cross::event_cross(SDL_Event event){
    if(event.type == SDL_MOUSEBUTTONDOWN){
        if(event.button.button == SDL_BUTTON_LEFT){
            xClick = event.motion.x;
            yClick = event.motion.y;


            Ammo.push_back(ammo(player1.xpos(),player1.ypos()));
        }
    }


    if(event.type == SDL_MOUSEMOTION){
        xCross = event.motion.x;
        yCross = event.motion.y;
    }
}

Problem polega na tym że funkcje xpos() oraz ypos() w pliku player.h cały czas zwracają zero, a powinny zwracać współrzędne gracza.

Próbowałem już wszystkiego łącznie z dziedziczeniem i zmiany słowa kluczowego z private na protected / public.

 

Liczę na szybką pomoc.

ywug.jpg



Smacznego

Opublikowano
Opublikowano

Plik main.cpp

 


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


#include "other.h"
#include "player.h"
#include "cross.h"


// SCREEN ////////
const int SCREEN_WIDTH = 1024;
const int SCREEN_HEIGHT = 768;
const int SCREEN_BPP = 32;
/////////////////
SDL_Event event;
SDL_Surface* screen = NULL;
bool quit = false;


other other;
player player;
cross cross;


void Init(){
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);


    SDL_WM_SetCaption("Test",NULL);
}


int main(int argc,char* argv[])
{
    Init();
    player.load();
    cross.load();


    while(!quit){
        while(SDL_PollEvent(&event)){
            if(event.type == SDL_QUIT){ quit = true; }
            player.event_player(event);
            cross.event_cross(event);
        }
        SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );


        player.move(SCREEN_WIDTH,SCREEN_HEIGHT);
        cross.draw(screen);
        player.show(screen);


        SDL_Flip(screen);
    }
    SDL_Quit();


    return 0;
}

 

Wszystko się kompiluje i działa tak jak wcześniej tylko nadal kula rysuje się na pozycji 0,0 a nie na pozycji gracza.

 

Poprawiłem:

- Funkcja load z plików gracza i celownika jest wywoływana w main.cpp,

 

Licze na pomoc bo już sam nie wiem co jest nie tak ;d

ywug.jpg



Smacznego

Opublikowano

xVel, yVel (użyte w metodzie move) pewnie jest równe 0 i nic z tym nigdy nie robisz

nie widzę nawet, żeby ta zmienna była gdzieś zadeklarowana

Opublikowano
void player::event_player(SDL_Event event){
    ruch = 0.4;


    if(event.type == SDL_KEYDOWN){
        switch(event.key.keysym.sym){
            case SDLK_UP:
            case SDLK_w:
                yVel-=ruch;
            break;


            case SDLK_DOWN:
            case SDLK_s:
                yVel+=ruch;
            break;


            case SDLK_RIGHT:
            case SDLK_d:
                xVel+=ruch;
            break;


            case SDLK_LEFT:
            case SDLK_a:
                xVel-=ruch;
            break;
        }
    }


    if(event.type == SDL_KEYUP){
        switch(event.key.keysym.sym){
            case SDLK_UP:
            case SDLK_w:
                yVel+=ruch;
            break;


            case SDLK_DOWN:
            case SDLK_s:
                yVel-=ruch;
            break;


            case SDLK_RIGHT:
            case SDLK_d:
                xVel-=ruch;
            break;


            case SDLK_LEFT:
            case SDLK_a:
                xVel+=ruch;
            break;
        }
    }
}

player.h

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


class player{
    private:
        float x,y;
        float xVel,yVel;
        SDL_Surface* ludek;
        float ruch;
    public:
        void event_player(SDL_Event event);
        void move(int w,int h);
        void show(SDL_Surface* obraz);


        bool load();


        float xpos();
        float ypos();
};

ywug.jpg



Smacznego

Opublikowano
Opublikowano

Są inne nazwy.

Dodałem do klasy player.h konstruktor, który nadawał wartości zmiennym x = 100 oraz y = 100, to punkt rysowania kuli w momencie kliknięcia lpm wynosił 100 na 100.

Dodam, że postać nie pozostawała na tych coordach.

ywug.jpg



Smacznego

Opublikowano
Są inne nazwy.

 

są inne zmienne

 

 

Dodałem do klasy player.h konstruktor, który nadawał wartości zmiennym x = 100 oraz y = 100, to punkt rysowania kuli w momencie kliknięcia lpm wynosił 100 na 100.

 

bo player1, z którym nigdy nic nie robisz ciągle był na 100,100

 

 

pokaż konstruktory klasy player

Opublikowano

player.h

 

#include "SDL/SDL.h"
#include <string>
class player{
    private:
        float x,y;
        float xVel,yVel;
        SDL_Surface* ludek;
        float ruch;
    public:
        player();


        void event_player(SDL_Event event);
        void move(int w,int h);
        void show(SDL_Surface* obraz);


        bool load();


        float xpos();
        float ypos();


        ~player();
};
A w cpp
player::player(){
    x=100; y=100;
    ruch = 0.4;
}


player::~player(){
}

 

ywug.jpg



Smacznego

Opublikowano
Opublikowano

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...