• 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

HackNation - ogólnopolski hackathon
+2 głosów
1,052 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,300 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,300 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,300 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 449 wizyt
pytanie zadane 1 listopada 2016 w Nasze projekty przez Ehlert Ekspert (215,070 p.)
+21 głosów
8 odpowiedzi 2,454 wizyt
pytanie zadane 19 lutego 2016 w Nasze projekty przez emSon Stary wyjadacz (10,480 p.)
+2 głosów
1 odpowiedź 1,035 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)

93,624 zapytań

142,544 odpowiedzi

323,031 komentarzy

63,129 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 968p. - dia-Chann
  2. 959p. - DziarnowskiJ
  3. 941p. - Łukasz Piwowar
  4. 940p. - CC PL
  5. 930p. - Maurycy W
  6. 913p. - Adrian Wieprzkowicz
  7. 913p. - Tomasz Bielak
  8. 906p. - ssynowiec
  9. 899p. - raydeal
  10. 889p. - rucin93
  11. 885p. - Dominik Łempicki (kapitan)
  12. 878p. - Mariusz Fornal
  13. 874p. - robwarsz
  14. 847p. - Grzegorz Aleksander Klementowski
  15. 649p. - Michal Drewniak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...