Allegro OO ?
-
Hi !
Was mir auf den ersten Blick aufgefallen ist :
Der direkte Zugriff auf das Keyarray ist extrem schlecht ! Du solltest public Member Variablen absolut vermeiden !
Außerdem ist dieser Weg äußert benutzerunfreundlich. Was ist z.b. wenn du auch noch eine Tastaturwiederholungsrate einführen möchtest (d.h.: Wie in Linux oder Windows in den Editfeldern. Dort werden die Tastaturstates ja auch nur alle 100ms oder so aktualisiert). Dat geht so direkt nämlich nicht.Besser wäre :
//cursor links gedrückt ? äquivalent zu key[KEY_LEFT] [WHATEVER].getKey (KEY_LEFT); //cursor links gedrückt ? true gibt an dass die Wiederholungsrate beachtet werden soll. D.h. : Diese Funktion kann -selbst wenn Cursor links gedrückt ist- false zurückgeben ! [WHATEVER].getKey (KEY_LEFT, true);
Oh, ich sehe grade : Du hast den operator [] überladen... Na egal, das obige gilt trotzdem
Nochwas : Mein "gutes (C++)Gewissen" rät dir dazu C++ Exceptions zu verwenden ...
Hoffe die Kommentare helfen dir was
-
das würd ich so machen (deshalb mach ich es auch so :D):
-Achtung, stark vereinfacht-class press_status {}; const press_status pressed, not_pressed; class sync_press_status {}; const sync_press_status spressed, snot_pressed; //Für die Wiederholungsrate press_status operator [] (int x) { return key[x] ? pressed : not_pressed; } sync_press_status operator [] (int y) { return bs_specific_blub_key_status ? spressed : snot_pressed; }
und dann könnt ich einfach so aussuchen:
if (keyboard[KEY_ENTER] == pressed) { /*Asyncron, ohne Rücksicht auf die Wiederholungsrate*/ } if (keyboard[KEY_ENTER] == spressed) { /*Mit Rücksicht auf die Wiederholungsrate*/ }
Allerdings kenn ich unter Allegro (noch) nicht die Funktion die die Wiederholungsrate berücksichtigt
nimmt die variable von allegro: extern volatile char *key; rücksicht auf
set_keyboard_rate()?
nimmt die funktion readkey() rücksicht?Und das mit den Exceptions? Ich verwende schon exceptions, aber in diesem Beispiel nicht, wo würde da eine Exception reinpassen?
-
So, ein paar Designänderungen: Ab in nen Namespace
using namespace AllegrOO; int main() { Allegro &a = allegro(); //Hier seht ihr, wie Devices installiert werden können: 2 Arten Screen screen(640, 480); a.install(screen); //1. Art: lokal, der Benutzer kontrolliert die //Lebensdauer von screen //2. Lass AllegrOO das übernehmen und hol dir nur ne Referenz Keyboard &keyboard = a.install<Keyboard>(); //Anmerkung: zu späteren Zeitpunkt kann man mit //a.get<Keyboard>() einen Zeiger auf ein Device bekommen und mit //a.use<Keyboard>() eine [b]immer[\b] gültige Referenz: falls das Device noch //nicht installiert ist, wird es das Datafile datafile("test.dat"); //ohne Allegro::, da jetzt im NS Bitmap backbuf(640, 480); int x = 400, y = 300; RLE_Sprite image = datafile.get_RLE_Sprite(IMAGE); while (!keyboard[KEY_ESC] == pressed) { //Auch hier ist es nun kürzer if (keyboard[KEY_LEFT] == pressed) x-=16; if (keyboard[KEY_RIGHT] == pressed) x+=16; if (keyboard[KEY_UP] == pressed) y-=16; if (keyboard[KEY_DOWN] == pressed) y+=16; backbuf.clear(); backbuf.draw (image, x, y); a.get<Screen>()->swap(backbuf); a.get<Screen>()->update(); } }
- Tadamm
-
also jetzt, nachdem das Design festgelegt ist, würde es auch Interessenten geben, die AllegrOO benutzen wollen, bzw. kann ich das irgendwo Online zugänglich machen? Muss ich die Leute von Allegro kontaktieren?
Hat überhaupt jemand lust diese Allegro in OO Design zu verwenden? Was denkt ihr? Soll ich da weitermachen?
-
<OT>ich denk das ist das erste forum das ich hier über mehr als 5posts verfolge indem nicht geflammed wird :)</OT>
wieviel MB sind es denn? wenn du nur den wrapper zugänglich machen möchtest, dann kann ich dir webspace leihen sofern das net übermässig viel ist.
rapso->greets();
-
Original erstellt von <Alleger>:
also jetzt, nachdem das Design festgelegt ist, würde es auch Interessenten geben, die AllegrOO benutzen wollen, bzw. kann ich das irgendwo Online zugänglich machen?
Muss ich die Leute von Allegro kontaktieren?
Hat überhaupt jemand lust diese Allegro in OO Design zu verwenden? Was denkt ihr? Soll ich da weitermachen?Dafür gäbe es garantiert eine Zielgruppe.
Wegen dem Webspace etc schau Dir mal http://sourceforge.net an, ich habe nur ausgesprochen gute Erfahrungen damit gemacht!
Das Allegro-Team musst Du nicht kontaktieren, aber es wäre IMO doch eher ratsam da die dann Dein Projekt verlinken können und sicher auch gute Tips für Dich haben, vielleicht finden sich ja auch andere Programmierer die Dir helfen möchten.
Also ich würde zwar wohl trotzdem eher Clanlib als AllegroOO verwenden wenn ich was derartiges bräuchte, aber mach ruhig mal, Du lernst garantiert etwas dabei.Zum Design: Lege Dich nicht zu früh auf Kleinigkeiten fest, sieh Dir Allegro an und überleg dann, was Sinn macht und nicht umgekehrt. Ich muss allerdings sagen dass ich die ganzen Init()-Funktionen die unter Spieleprogrammierern üblich sind ausgesprochen hässlich finde, wozu gibt es denn Konstruktoren + Exceptions? (/me liest gerade "Effective C++"...
)
[ Dieser Beitrag wurde am 03.04.2003 um 00:18 Uhr von nman editiert. ]
-
[code]<OT>ich denk das ist das erste forum das ich hier über mehr als 5posts verfolge indem nicht geflammed wird </OT>[code]
Stimmt. Jetzt wo Du's sagst...
Ich wußte doch: Irgendwas fehlt - irgendwas kommt Dir hier doch spanisch vor... :-))Da Sarge
-
Original erstellt von nman:
**
Zum Design: Lege Dich nicht zu früh auf Kleinigkeiten fest, sieh Dir Allegro an und überleg dann, was Sinn macht und nicht umgekehrt. Ich muss allerdings sagen dass ich die ganzen Init()-Funktionen die unter Spieleprogrammierern üblich sind ausgesprochen hässlich finde, wozu gibt es denn Konstruktoren + Exceptions? (/me liest gerade "Effective C++"...)
[ Dieser Beitrag wurde am 03.04.2003 um 00:18 Uhr von [qb]nman** editiert. ][/QB]in einem der bücher der reihe effective c++ steht dass man lieber init und release verwenden soll bei dingen die schiefgehen können anstatt sie in die constructor zu schieben...
rapso->greets();
ps. wenn's dir wichtig ist suche ich nach dem zitat in den büchern hier
-
ps. wenn's dir wichtig ist suche ich nach dem zitat in den büchern hier
gerne. mach das bitte
-
effective c++ second edition
seite 55 ziemlich mittig.rapso->greets();
-
unter welcher lektion steht das? ich hab nur die deutsche version und da ist die seitenverteilung glaub ich ein bisschen anders.
-
12 oder 13 ist das soweit ich weiß, da ist eine recht lange construktorlist in der nähe als quelltext beispiel.
auf deutsch müßte da in etwa stehen, dass initialisierungs funktionen genauso gut wie constructor sind und in einigen fällen besser... wenn ich's richtig im kopf habe.
vielleicht ist auch mein english zu schlecht
rapso->greets();
-
es geht darum eine große anzahl von buildins zu initialiesieren und damit man nicht bei jeden ctor das wiederhollen muss, kann mann eine private funktion machen
da es bei buildins kein unterschied macht ob man sie in der initialiesierungsliste oder im ctor body durch zuweisung initialiesiert
-
hmm... steht da wirklich nirgendwo dass man init gegenüber constructor bevorzugen sollte? ich hätte schwör'n können *amkopfreib*
hmm.. ich kann mich aber auch immer net entscheiden ob ich konstruktorlisten oder init benutzen will...
rapso->greets();
-
Noch nichtmal lesen kann der rapso.
-
ja das mit den Init funktionen mach ich jetzt so:
Screen screen1(640,480); //Hier wird noch gar nichts initialisiert Screen screen2(800,600); //auch da nicht screen1.set_colordepth(32); //blub nix passiert allegro().install(screen1); //Erst hier, Allegro ruft screen1.install auf, eine //private methode von Device, von der Screen abgeleitet ist, die die virutelle //protected Methode do_install aufruft :) - hört sich komplizierter an, als es //ist
Ich finde das ist ein guter Kompromiss
-
ich würde das set_ weglassen
FlaMor ist da nicht ein F zuviel *reflame*
rapso->greets();
-
eigentlich ne gute idee
ok
-
aber ich hab auch noch mal dieselben get methoden, was soll ich tun?
-
ups, hab vergessen, dass es ja sowas wie "function overloading" auch noch gibt