• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+2 głosów
790 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 411 wizyt
pytanie zadane 1 listopada 2016 w Nasze projekty przez Ehlert Ekspert (214,530 p.)
+21 głosów
8 odpowiedzi 2,038 wizyt
pytanie zadane 19 lutego 2016 w Nasze projekty przez emSon Stary wyjadacz (10,480 p.)
+2 głosów
1 odpowiedź 887 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)

93,176 zapytań

142,185 odpowiedzi

321,980 komentarzy

62,506 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1637p. - dia-Chann
  2. 1614p. - Łukasz Piwowar
  3. 1599p. - CC PL
  4. 1597p. - Łukasz Eckert
  5. 1537p. - Łukasz Siedlecki
  6. 1531p. - rucin93
  7. 1356p. - ssynowiec
  8. 1351p. - Tomasz Bielak
  9. 1328p. - Michal Drewniak
  10. 1288p. - rafalszastok
  11. 1273p. - Adrian Wieprzkowicz
  12. 1232p. - Mikbac
  13. 1169p. - Grzegorz Aleksander Klementowski
  14. 1155p. - Piotr Aleksandrowicz
  15. 1149p. - Michał Telesz
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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...