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

Snake w sfml problem z dziedziczeniem po Drawable

Object Storage Arubacloud
+2 głosów
503 wizyt
pytanie zadane 19 lutego 2017 w C i C++ przez fenq80 Bywalec (2,940 p.)

 

witam. Od niedawna ucze sie SFML-a i postanowiłem napisać grę Snake. Stworzyłem klasę Snake (dziedzicząca po Drawable) oraz klase Engine zawierajaca składową prywatna w postaci klasy Snake.

klasa Snake:
#pragma once
#include<SFML/Graphics.hpp>
#include<iostream>
#include<vector>

class Snake: public sf::Drawable,
sf::Transformable
{
public:
    Snake();
    ~Snake();
    void SnakeMove(int a,int b);
   // void AddElement();
   // void SnakeColision();

private:
    int length;
    sf::RectangleShape snakeHead;
    std::vector<sf::RectangleShape> pieceOfSnake;
    virtual void draw(sf::RenderWindow &target, sf::RenderStates states) const;

};

klasa Engine:
#pragma once
#include "Snake.h"

class Engine
{
public:
    Engine(sf::RenderWindow& window);
    void runEngine();


private:
    sf::RenderWindow *window1;
    Snake snake;
   // Food food;
    void Collision(){};
    void update(){};
    void draw();

};

pliki cpp.

Snake

#include "Snake.h"

Snake::Snake():length(0)
{
 snakeHead.setSize(sf::Vector2f(40,40));
 snakeHead.setFillColor(sf::Color::Red);
 snakeHead.setOrigin(sf::Vector2f(20,20))
 snakeHead.setPosition(sf::Vector2f(400,250));

}

void Snake::SnakeMove(int a ,int b)
{
    if(sf::Keyboard::isKeyPressed(RIGHT)
       {
           snakeHead.rotate(90)
       }
    else if(sf::Keyboard::isKeyPressed(LEFT))
       {
        snakeHead.rotate(-90);
       }

    snakeHead.move(a,b);


}

void Snake::draw(sf::RenderWindow &target,sf::RenderStates states)const
{
    states.transform *= getTransform();
    target.draw(snakeHead,states);
}

Engine

#include "engine.h"


Engine::Engine(sf::RenderWindow & window)
{
    window1 = &window;
}

void Engine::runEngine()
{
    sf::Event event1;
    while(window1->pollEvent(event1))
    {
        if(event1.type == sf::Event::KeyPressed)
            snake.SnakeMove(0,0);
    }
    sf::Clock clock;
    sf::Time time = clock.getElapsedTime();
    if(time == sf::seconds(1) )snake.SnakeMove(5,0);
    draw();
}
void Engine::draw()
{
	window1->clear();

	window1->draw(snake);


	window1->display();
}

Bład pojawia sie w miejscu w którym tworzę składową typu Snake w klasie Engine.

error; cannot declare field 'Engine::snake' to be of abstract type 'Snake'|
  note: because the following virtual functions are pure within 'Snake':|     virtual void note:sf::Drawable::draw(sf::RenderTarget&, sf::RenderStates) const|
 Bardzo długo szukałem błedu ale nie udało sie nic znależć. Proszę o pomoc.

Pozdrawiam

4 odpowiedzi

+2 głosów
odpowiedź 19 lutego 2017 przez C☺ndzi Stary wyjadacz (12,100 p.)
wybrane 19 lutego 2017 przez fenq80
 
Najlepsza

W metodzie draw w klasie Snake masz sf::RenderWindow& zamiast sf::RenderTarget& wink

komentarz 19 lutego 2017 przez fenq80 Bywalec (2,940 p.)
Jak ty to wypatrzyles xD.  Dzięki działa.  Pozdrawiam
komentarz 19 lutego 2017 przez C☺ndzi Stary wyjadacz (12,100 p.)
Trochę się kodzi, poza tym dawno temu też miałem ten błąd więc jestem na niego wyczulony.
komentarz 19 lutego 2017 przez fenq80 Bywalec (2,940 p.)
No ja spędziłem pewnie ze 2 godziny porównując mój niedziałający kod (zwłaszcza funkcje draw)  z innymi kodami gdzie im działało  i tak nie znalazłem xD.  Nie wiem gdzie miałem oczy. XD
+1 głos
odpowiedź 19 lutego 2017 przez obl Maniak (51,280 p.)

cannot declare field 'Engine::snake' to be of abstract type 'Snake'|
  note: because the following virtual functions are pure within 'Snake':|     virtual void note:sf::Drawable::draw(sf::RenderTarget&, sf::RenderStates) const

Napisane jest, że próbujesz utworzyć obiekt klasy abstrakcyjnej. A to dlatego, że klasa sf::Drawable ma metodę czysto wirtualną, którą musisz w swojej klasie snake obsłużyć żeby ta nie była klasą abstrakcyjną..

Edit.

Tą metodą jest sf::Drawable::draw(sf::RenderTarget&, sf::RenderStates) const

komentarz 19 lutego 2017 przez fenq80 Bywalec (2,940 p.)
Ale przecież ja obsługuje w pliku cpp. Snake linia 28? Co źle robie?
komentarz 19 lutego 2017 przez obl Maniak (51,280 p.)

Rzeczywiście to w takim przypadku może dlatego, że masz virtual void w klasie a w deklaracji metody masz tylko void?

komentarz 19 lutego 2017 przez fenq80 Bywalec (2,940 p.)
Niestety ani z virtual ani bez virtual nie działa wciąż ten sam błąd
komentarz 19 lutego 2017 przez obl Maniak (51,280 p.)
Wygląda, że zrobiłeś tak jak tutaj: https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Drawable.php i powinno to działać.
+1 głos
odpowiedź 19 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)
Snake::Snake():length(0)
{
 snakeHead.setSize(sf::Vector2f(40,40));
 snakeHead.setFillColor(sf::Color::Red);
 snakeHead.setOrigin(sf::Vector2f(20,20))    // srednik
 snakeHead.setPosition(sf::Vector2f(400,250));
 
}
 
void Snake::SnakeMove(int a ,int b)
{
    if(sf::Keyboard::isKeyPressed(RIGHT)
       {
           snakeHead.rotate(90) // srednik
       }

brakuje ci 2 srednikow ale watpie ze to przez to

komentarz 19 lutego 2017 przez fenq80 Bywalec (2,940 p.)
Niestety ;/
0 głosów
odpowiedź 19 lutego 2017 przez Michał Muzyka Pasjonat (24,080 p.)
Funkcja draw powinna być publiczna w klasie snake
komentarz 19 lutego 2017 przez fenq80 Bywalec (2,940 p.)
Także nie działa.  A w tutorialu na stronie głównej sfml było pokazane używanie draw w sekcji prywatnej
komentarz 19 lutego 2017 przez Michał Muzyka Pasjonat (24,080 p.)
nie wiem czy ty dodatkowo nie masz błędu tutaj:

sf::Keyboard::isKeyPressed(LEFT)

sf::Keyboard::isKeyPressed(RIGHT)

powinno chyba być

sf::Keyboard::isKeyPressed(sf::Keyboard::Left)

sf::Keyboard::isKeyPressed(sf::Keyboard::Right)
komentarz 19 lutego 2017 przez fenq80 Bywalec (2,940 p.)
Błąd dalej pozostał.  I zauważyłem trochę dziwna rzecz otóż jeśli celowo zrobię błąd w którymś z plików różnym od engine. h to kompilator nie znajduje mi tego błędu i wciąż wskazuje tylko ten błąd co na początku podałem

Podobne pytania

+4 głosów
0 odpowiedzi 396 wizyt
pytanie zadane 1 listopada 2016 w Nasze projekty przez Ehlert Ekspert (212,670 p.)
+21 głosów
8 odpowiedzi 1,733 wizyt
pytanie zadane 19 lutego 2016 w Nasze projekty przez emSon Stary wyjadacz (10,480 p.)
+2 głosów
1 odpowiedź 803 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

61,938 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!

...