dodání ihned! nové
Hledáme programátora do rostoucího týmu ITnetwork.cz, 100% home office, 100% flexibilní pracovní doba. Více informací
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
BF
Avatar
sphex
Člen
Avatar
sphex:27.12.2016 11:04

Dobrý deň, potreboval by som pomoc s touto hrou, musím z tohto urobiť aby na obrazovke boli 3 lopty a postupne bud pribudali alebo ubudali.Skúšal som to spraviť cez pole, ale keby ho chcem inicializovať cez triedu engine tak to nejde pretože tam inicializujem iba jeden objekt aj to abstraktný a pole z abstraktných objektov nešlo spraviť. Viete mi poradiť nejaký spôsob ako pokračovať?

//trieda HraLopta.cpp kde sa všetko ininicializuje
#include "HraLopta.h"
#include "SDLSystem.h"

HraLopta::HraLopta()
        :aHraciaPlocha(new SDLSystem(800, 600)),
        aLopta(new Lopta(aHraciaPlocha)),
        aHra(new Engine(aLopta, aHraciaPlocha))
{
}

HraLopta::~HraLopta()
{
        delete aHra;
        delete aLopta;
        delete aHraciaPlocha;
}
// trieda Engine.cpp
#include <cstdio>
#include "Engine.h"

void Engine::zobrazSkore()
{
        if (aHraciaPlocha)
        {
                char buf[100];
                sprintf(buf, "Pocet bodov: %d", aSkore);
                aHraciaPlocha->zobrazData(buf);
        }
}

void Engine::aktualizuj()
{
        if (aHraciaPlocha && aObjekt)
        {
                if (aObjekt->aktualizujSa(aHraciaPlocha->dajCas()))
                {
                        aHraciaPlocha->zmaz();
                        aObjekt->zobrazSa();
                        aHraciaPlocha->update();
                }
        }
}

void Engine::spracujVstup(int x, int y)
{
        if (aObjekt && x >= 0)
        {
                int body = -aObjekt->dajBody();
                if (aObjekt->zasah(x, y))
                        body = -body;
                aSkore += body;
                zobrazSkore();
        }
}

Engine::Engine(IObjekt * objekt, ISystem * hraciaPlocha)
        :aObjekt(objekt), aHraciaPlocha(hraciaPlocha),
        aSkore(0)
{
}

Engine::~Engine()
{
}

void Engine::start()
{
        if (!aHraciaPlocha) return;
        int x(-1), y(-1);
        zobrazSkore();
        do
        {
                aktualizuj();
                spracujVstup(x, y);
        } while (aHraciaPlocha->vstup(x, y));

}
 
Odpovědět
27.12.2016 11:04
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na sphex
Martin Dráb:27.12.2016 14:29

Nějak nevidím deklaraci toho pole abstraktních tříd, ale obecně se dá říci toto:

Musíš deklarovat pole ukazatelů (ať už raw, nebo skrzt. smart pointery) na tu abstraktní třídu. Jednak tím v podstatě zajistíš fungování polymorfismu (při alokaci na zásobníku virtuální metody nefungují), druhak tím vyřešíš inicializaci. Potom akorát každý prvek toho pole inicializuješ nějak takto:

pole[i] = new KonkretnejsiPotomekAbstraktniTridy(...);
Nahoru Odpovědět
27.12.2016 14:29
2 + 2 = 5 for extremely large values of 2
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
sphex
Člen
Avatar
sphex:28.12.2016 9:53

Aha, ďakujejm a ako by som mal spraviť konštruktor pre to pole ak som si na to spravil vlastnu triedu Pole.h a keď robím Pole.cpp nechce mi to nič zobrať

A ešte neviem ako by som mal spraviť metodu pridajPrvokDoPola tak aby mi to vytváralo novú loptu a pridalo ju do pola ak na tom prvku ešte žiadna nie je

// trieda Pole.h
#pragma once

class Pole {
private:
        int maxPocet = 10;
        IObjekt *pole[10];

public:
        Pole();
        ~Pole();

};
//trieda Pole.cpp
#include "Pole.h"

Pole::Pole()
{

}

Pole::~Pole()
{
}
 
Nahoru Odpovědět
28.12.2016 9:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.