Cavte vedel by niekto upravit tento program tak aby sa namiesto jednej lopty budú na začiatku hry pohybovať 3 lopty zhora nadol a po trafení lopta zmizne?
Fórum › C / C++
Hra
#1 ukulele
tak ono praděpodobně stačí nahradit ten jeden objekt za nějaký pole/list a upravit všude logiku, ale je to zbytečně přeplácaný abstrakcí, hlavně autor nikdy nepočítal s více objekty na scene
nic nemusíš vytvářet, prostě nahradíš všechny místa, kde je parametr lopta za vector treba + úpravíš logiku všude, aby to počítalo s polem a pokud je to dobře napsaný, tak to bude fungovat
ale nemyslim si, že je dobrej nápad se učit tímto způsobem (hádám, že ten kód není tvůj), spíš v tom budeš mít zmatek, podívej se na nějaký tutoriály na SDL a zkus tohle celý od začátku sám
krom toho ten kód bych spíš celej přepsal, přijde mi až moc abstraktní, sice někde je správnej přístup, ale vypadá to jako rozenej javista co zkouší SDL :D Pro tuhle ukázku je tam opravdu zbytečně plno souborů na víc
však když ses nedostal k vektorum, tak použij normální pole, dej tam třeba 3 objekty
už jsem psal, že nic vytvářet nemusíš, stačí všude nahradit ten jeden objekt za pole a upravit všude logiku, aby to bralo pole a ne jeden objekt
můžeš si ofc. udělat další novej objekt, kterej bude přímo obsahovat 3 míče a potom předávat ten objekt místo jednoho míče, ale nevim jak je to potom s logikou pohybu, jestli by tohle fungovalo na konkrétní impl.
#10 ukulele
struct LoptaPack {
Lopta l1;
Lopta l2;
Lopta l3;
};
// nebo
struct LoptaPack {
Lopta lopta[3];
};
// nebo pouzivat primo jako parametr pole Lopta[]
// nebo vektor pripadne jinou kolekci
vector<Lopta> lopta;
// vzdy se ti jen změní vstupní parametr místo Lopta na pole nebo novej objekt..
mohl, ale nechce se mi, nemam moc čas upravovat hned celou app, napsal jsem ti, že stačí projít kód a všude se se používá a initializuje Lopta, tak použiješ pole případně tvůj objekt
#18 ondrej39
syntakticky špatně neni, jen to spíš špatně používá.. to pole obsahuje 3 ukazatele na loptu, který ofc. musí vytvořit dodatečně
ale v tomhle případě mi přijde zbytečný vytvářet novej objekt pro lopty, když nebude obsahovat nic jinýho než pole.. prostě bych všude podstrčil samotný pole nebo vektor
#17 ukulele
trochu pomůžu, ale upravovat ti celou app nebudu...
// puvodni objekt lopta (muze byt i class, je to f*ck)
struct Lopta {};
// definice typu LoptaPack obsahujici seznam ukazatelu na loptu
typedef vector<Lopta *> LoptaPack;
// nebo verze bez vektoru
typedef Lopta *LoptaPack[3];
// initializace na tom miste, kde se aktualne vytvari samotny objekt lopta,
// nyni misto Lopta* nebo co se tam predavalo budes predavat LoptaPack a
// vsude upravis logiku, aby tam byl cyklus
LoptaPack pack = { new Lopta, new Lopta, new Lopta }; // 3x lopta (muze byt i vic)
// v pripade vektoru muzes pouzit misto 3 -> pack.size() nebo rovnou iterator
for (int i = 0; i < 3; i++) {
pack[i]->promenna = neco;
}
#23 ukulele
dá se říct že ano, vector je podstatě ArrayList v javě jen lepší
tak něco děláš špatně.. doufám, že hrací plocha je ptr, pokud ne, tak tam aspon předej referenci
to, že to padne nám tady řekne vše o chybě včetně toho, co si udělal špatně a v některým případech i informace o počasí...
Takto to vyzera a nefunguje
#include <cstdlib>
#include "Lopta.h"
Lopta::Lopta(IPlocha *hraciaplocha)
: PohyblivyObjekt(hraciaplocha ? hraciaplocha->sirka() : 0, hraciaplocha ? hraciaplocha->vyska() : 0,
0, 0),
aHraciaPlocha(hraciaplocha),
aLopta(NULL)
{
if (aHraciaPlocha)
aLopta = aHraciaPlocha->citajBMP("ball.bmp");
if (aLopta)
{
aSirka = aLopta->sirka();
aVyska = aLopta->vyska();
}
LoptaPack pack = { new Lopta(hraciaplocha), new Lopta(hraciaplocha), new Lopta(hraciaplocha) };
}
Lopta::~Lopta()
{
}
void Lopta::nakreslisa()
{
if (aHraciaPlocha)
aHraciaPlocha->nakresli(aLopta, aX, aY);
}
int Lopta::dajBody()
{
return 1;
}
#pragma once
#include "PohyblivyObjekt.h"
#include "IPlocha.h"
class Lopta : public PohyblivyObjekt
{
private:
IPlocha *aHraciaPlocha;
IPlocha *aLopta;
typedef Lopta *LoptaPack[3];
public:
Lopta(IPlocha *aHraciaPlocha);
~Lopta();
virtual void nakreslisa();
virtual int dajBody();
};
#27 ukulele
ta hrací plocha musí obsahovat LoptaPack né samotná Lopta, však se nad tím zamysli, to i v realitě nedámá smysl :) a samozřejmě nesmíš mít pack jako lokální proměnnou
hlavně typedef LoptaPack je definice, né proměnná !! ta musí být úplně mimo třídu a pak samotná hrací plocha bude obsahovat loptapack
mám dojem, že by si měl začít úplně s něčím jednodušším, tohle nikam nevede, nemá smysl upravovat app když ani neznáš základy
#29 ukulele
už nevim co tam všechno bylo za objekty, ale hlavně tam je plno rozhraní, takže IPlocha bude místo Lopta* obsahovat LoptaPack a na tom místě, kde se vytváří instance Lopta budeš vytvářet samotnej LoptaPack.. potom opět na všech místech, kde je parametr jako Lopta* bude LoptaPack
víc ti už poradit nemůžu, prostě nahradíš jeden dat. typ za jinej
ale fakt zkus udělat vlastní app a bez rozhraní, myslim, že tohle začátečníka dost mate, kór v cpp.. celý by to šlo napsat o 80% méně kódu, klidně si piš všechny objekty i metody v SK místo v EN abys to lépe chápal
#31 ukulele
kdyby to byl menší kus kódu a byl v tom nějakej problém, tak to sem klidně pástnu, ale celou app upravovat nehodlam, kór když se jedná jen o změnu dat. typu, kde upravíš ukazatel lopty za pole
Jedine kde sa to dalo vlozit tak aby to nepadalo bolo LoptaEngine.h a inicializacia v konstruktore LoptaEngine.cpp.
V celom programe sa Lopta* vyskytuje len v tomto konstruktore a ked ju zamenim za
LoptaPack tak program ani neskompiluje
LoptaEngine::LoptaEngine(IPlocha *plocha)
:aHraciaPlocha(plocha)
{
Lopta *lopta = new Lopta(plocha);
aObjekt = lopta;
LoptaPack pack = { new Lopta(plocha), new Lopta(plocha), new Lopta(plocha) };
}
#34 ukulele
ano, to je správná pozice
ale hádám, že aObjeckt je ptr na loptu, takže z kontruktoru smažeš jak vytvoření Lopta, tak aObjeckt a LoptaPack bude instanční field třídy do kterýho vytvoříš ten LoptaPack
#36 ukulele
no však, ten právě nahradíš tím LoptaPackem a všude kde se bude vyskytovat parametr na PohyblivyObjekt, tak bude LoptaPack... kód ti pak trochu z červená a bude potřeba to všude upravit
Nemohol by si to fakt spravit ked presne vies ze co cim nahradit lebo ja to musim mat dnes spravene, zajtra je uz neskoro a ty si moja posledna nadej lebo ja som sa skusal pytat viacerych ako na to no nikto to nevedel spravit
no vidiš, to si pokročil, vykresluješ 3 místo jedný, jen doladíš logiku ;)
jinak takto by to mělo vypadat potom až to dokončíš http://uloz.to/xPhhdv87/lopta-rar
já původně chtěl, ale jakmile jsem koukal na ten kód, tam jsem se rozhodl to celý přepsat včetně wrapperu na SDL... plno metod bylo nesmyslně pojmenovaných, naprosto zbytečný použití rozhraní, jeden mem. leak, špatně umístěný fieldy a některý metody, zbytečný includy nebo na špatných místech a plno dalšího..
prostě tohle nešlo jen tak poupravit, mi to rvalo srdce :-D ale samozřejmě ti můžu hodit i source, ale je to z 90% celý překopaný
#45 ukulele
je to lehce poupravená tvoje verze http://uloz.to/xNfDLBFt/ballgamesolution-rar
něco bych udělal jinak, ale nechtělo se mi to úplně celý předělávat, bych to musel celý zahodit
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Java 2D hra - tvorba menu (hra nereaguje na klavesy) — založil Marek
Moderátoři diskuze