• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z CanvaxShape w liscie.Jak zapisac vecrtor2f w liscie ? Sfml,c++

Object Storage Arubacloud
0 głosów
305 wizyt
pytanie zadane 9 grudnia 2021 w C i C++ przez pawel_000 Początkujący (450 p.)
#include "Game.hpp"
    #include<SFML/Graphics.hpp>
    #define side 15
    #define size 208.5
    using namespace sf;
    using namespace std;
    ZAPIS Game::wprowadzStatek(ZAPIS statek, ConvexShape* sprite) {
        ZAPIS pomoc_temp;
        pomoc_temp = (ZAPIS)malloc(sizeof(struct zapis));
        switch (statek->kierunek) {
        case kierunek(up):
            pomoc_temp->glowa_y = statek->glowa_y - side * 2;
            pomoc_temp->lewy_y = statek->lewy_y - side * 2;
            pomoc_temp->prawy_y = statek->prawy_y - side * 2;
            pomoc_temp->dol_y = statek->dol_y - side * 2;
            pomoc_temp->glowa_x = statek->glowa_x;
            pomoc_temp->prawy_x = statek->prawy_x;
            pomoc_temp->lewy_x = statek->lewy_x;
            pomoc_temp->dol_x = statek->dol_x;
            break;
        case kierunek(down):
            pomoc_temp->glowa_y = statek->glowa_y + side * 2;
            pomoc_temp->lewy_y = statek->lewy_y + side * 2;
            pomoc_temp->prawy_y = statek->prawy_y + side * 2;
            pomoc_temp->dol_y = statek->dol_y + side * 2;
            pomoc_temp->glowa_x = statek->glowa_x;
            pomoc_temp->prawy_x = statek->prawy_x;
            pomoc_temp->lewy_x = statek->lewy_x;
            pomoc_temp->dol_x = statek->dol_x;
            break;
        case kierunek(lewo):
            pomoc_temp->glowa_x = statek->glowa_x - side * 2;
            pomoc_temp->lewy_x = statek->lewy_x - side * 2;
            pomoc_temp->prawy_x = statek->prawy_x - side * 2;
            pomoc_temp->dol_x = statek->dol_x - side * 2;
            pomoc_temp->glowa_y = statek->glowa_y;
            pomoc_temp->lewy_y = statek->lewy_y;
            pomoc_temp->prawy_y = statek->prawy_y;
            pomoc_temp->dol_y = statek->dol_y;
            break;
        case kierunek(prawo):
            pomoc_temp->glowa_x = statek->glowa_x + side * 2;
            pomoc_temp->lewy_x = statek->lewy_x + side * 2;
            pomoc_temp->prawy_x = statek->prawy_x + side * 2;
            pomoc_temp->dol_x = statek->dol_x + side * 2;
            pomoc_temp->glowa_y = statek->glowa_y;
            pomoc_temp->lewy_y = statek->lewy_y;
            pomoc_temp->prawy_y = statek->prawy_y;
            pomoc_temp->dol_y = statek->dol_y;
            break;
        }
        pomoc_temp->kierunek = statek->kierunek;
        pomoc_temp->s = sprite;
        pomoc_temp->pocz = NULL;
        pomoc_temp->kon = statek;
        statek->pocz = pomoc_temp;
        return pomoc_temp;
    }


    void Game::Update() {
        if (statek->glowa_x > 810)
            statek->glowa_x = 0;
        if (statek->glowa_x < 0)
            statek->glowa_x = 810;
        if (statek->glowa_y > 600)
            statek->glowa_y = 0;
        if (statek->glowa_y < 0)
            statek->glowa_y = 600;
        statek = wprowadzStatek(statek, &Statek);
        count = 0;
    }



    void Game::Start() {
        TworzenieSprita();

        statek = (ZAPIS)malloc(sizeof(struct zapis));

        window.create(sf::VideoMode(800, 600), "Train", sf::Style::Titlebar | sf::Style::Close);
    }

    void Game::Run() {
        Start();
        while (window.isOpen()) {
            Render();
            if (count == speed) {
                Update();
            }
            count++;
        }
    }
    void Game::Render() {
        window.clear(Color::Blue);
        statek_pom = statek;
        while (statek_pom != NULL) {
            (*statek_pom->s).setPoint(0, Vector2f(statek_pom->glowa_x, statek_pom->glowa_y));
            (*statek_pom->s).setPoint(1, Vector2f(statek_pom->lewy_x, statek_pom->lewy_y));
            (*statek_pom->s).setPoint(2, Vector2f(statek_pom->prawy_x, statek_pom->prawy_y));
            (*statek_pom->s).setPoint(3, Vector2f(statek_pom->dol_x, statek_pom->dol_y));
            window.draw(*statek_pom->s);
            statek_pom = statek_pom->kon;
        }
        window.display();
    }



    void Game::TworzenieSprita() {

        // create an empty shape
        ConvexShape Statek;

        // resize it to 5 points
        Statek.setPointCount(4);
        // define the points
        Statek.setPoint(0, sf::Vector2f(0.f, 0.f));
        Statek.setPoint(1, sf::Vector2f(150.f, 10.f));
        Statek.setPoint(2, sf::Vector2f(120.f, 90.f));
        Statek.setPoint(3, sf::Vector2f(30.f, 100.f));









        /*  this->textur_statek.loadFromFile("resources/trainsprite.png");
            Statek.setTexture(textur_statek);
            Statek.setScale(sf::Vector2f(0.25, 0.25));
            Statek.setOrigin(104.5, 104.5);*/
    }

**Game.hpp**

 #pragma once
        #include<SFML/Graphics.hpp>
        using namespace sf;
        struct zapis{
            float glowa_x, glowa_y,lewy_x,lewy_y,prawy_x,prawy_y,dol_x,dol_y;
            int kierunek;
            ConvexShape* s;
            struct zapis* pocz;
            struct zapis* kon;
        };
        typedef struct zapis* ZAPIS;
        enum kierunek {
            up, down, lewo, prawo
        };
        class Game
        {
        private:ZAPIS statek, statek_enmy,wyspa,wyspa_enmy, statek_pom,cialo;
               int speed = 200;
               int count = 0;
        private:RenderWindow window;
               ConvexShape Statek;
               Texture textur_statek;
               Event event;
        private:void Update();
               void Render();
               void Start();
               void TworzenieSprita();
               ZAPIS wprowadzStatek(ZAPIS statek, ConvexShape* sprite);
        public: void Run();
        };

Mam do stowrzenia bitwe morska(nie standardowe statki).Gra ma byc stworzona strukturalnie wiec musze stwrzyc statek w  Canvaxshape i nie wiem jak przekazac vector2f do listy .

komentarz 11 grudnia 2021 przez j23 Mędrzec (194,920 p.)

Dlaczego pisząc w C++ używasz malloc, przed nazwą struktury dajesz struct itd.?

komentarz 11 grudnia 2021 przez pawel_000 Początkujący (450 p.)
Czy to jest niepoprawny zapis ? W innym projekcie działa .
komentarz 11 grudnia 2021 przez j23 Mędrzec (194,920 p.)

Nie chodzi o niepoprawność, a to, że mieszasz dwa języki (style programowania) - C i C++. IMO niepotrzebnie. Takie mieszanie jest też błędogenne, bo jak zaczniesz tworzyć funkcją malloc struktury z klasami, które mają konstruktory i te konstruktory coś konkretnego robią, to prosta droga do katastrofy.

komentarz 11 grudnia 2021 przez pawel_000 Początkujący (450 p.)
Dobrze. Czyli mam tworzyc zapisy struct zapis* zamienna?Czy to jest problemem działania gry ?
komentarz 12 grudnia 2021 przez j23 Mędrzec (194,920 p.)

Jeszcze raz:

// zamiast
#define side 15
#define size 208.5

struct zapis* pocz;
struct zapis* kon;
typedef struct zapis* ZAPIS;

// daj
const int side = 15;
const double size = 208.5;

zapis* pocz;
zapis* kon;
typedef zapis* ZAPIS;

Zamiast malloc/free użyj new/delete. Itd. Jeśli zapis tworzy jakąś listę, to może lepiej użyć std::vector/list zamiast wymyślać koło od nowa?

Czy to jest problemem działania gry ?

To może być problemem, ale jak pisałem, chodzi o styl.

Nie wiadomo za bardzo, jaki masz problem. Jaka lista, jaki vector2f? Zamiast wklejać cały kod, daj fragment, który konkretnie odnosi się do problemu. Problem też dokładniej opisz.

komentarz 12 grudnia 2021 przez pawel_000 Początkujący (450 p.)
pomoc_temp->glowa_y = statek->glowa_y - side * 2;

Zwraca ze statek jest nullptr.

komentarz 12 grudnia 2021 przez j23 Mędrzec (194,920 p.)
edycja 12 grudnia 2021 przez j23

Jak zwraca? Dostajesz wyjątek?

Skoro statek jest nullptr, to znaczy, że metoda Game::wprowadzStatek dostaje taką wartość w parametrze. A może dostać wartość null, jeśli nie będzie wywołana wcześniej metoda Game::Start (ta jest wywoływana w Game::Run).

Popraw kod:

struct zapis {
   float glowa_x, glowa_y,lewy_x,lewy_y,prawy_x,prawy_y,dol_x,dol_y;
   int kierunek;
   ConvexShape* s = nullptr;
   zapis* pocz = nullptr;
   zapis* kon = nullptr;
};

class Game
{
private:
	ZAPIS statek = nullptr, statek_enmy,wyspa,wyspa_enmy, statek_pom,cialo;
	...
};

...

void Game::Start() 
{
    TworzenieSprita();
    statek = new zapis;
    statek->s = &Statek;
    window.create(sf::VideoMode(800, 600), "Train", sf::Style::Titlebar | sf::Style::Close);
}

Zwróć uwagę, jak użycie new upraszcza zapis (tak samo musi być w Game::wprowadzStatek).

Wskaźnik statek_pom nie powinien być polem klasy, tylko zmienną lokalną, bo tak jest używany.

Powinieneś także stworzyć metodę, która usuwa listę statek. Powinna być wywołana w destruktorze klasy Game i na samym początku Game::Start.

A najlepiej użyć std::list i nie bawić się wskaźnikami...

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 118 wizyt
0 głosów
0 odpowiedzi 151 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez wojtij99 Użytkownik (630 p.)
0 głosów
3 odpowiedzi 476 wizyt
pytanie zadane 12 listopada 2018 w C i C++ przez Marcin951 Gaduła (3,250 p.)

92,568 zapytań

141,422 odpowiedzi

319,642 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...