Allegro OO ?
-
Gibt es Allegro auch mit Objekt Orientierten Ansatz, also irgendwelche Wrapper?
-
Allegro IST bereits ein Wrapper, eine gute Alternative wäre zB die Clanlib.
-
aber allegro ist C!
gibts nicht irgendeine C++ Version?
-
Nein, aber sowas selbst zu schreiben ist wohl kein Problem.
Wenn Du das nicht möchtest nimm die Clanlib.
-
machst du da mit, oder warum wirbst du so für sie *achtung rhetorische frage*
ne, ich mach mir das dann lieber selber!
cu!
-
Hi !
Die Clanlib ist wirklich gut, nix da mit Eigenwerbung
IIRC gibts schon einen Allegro C++ Wrapper, frag mal google...
-
Aber allzu toll sieht das IMO nicht aus,
-
Hi,
Allegro ist doch einfach in OOP umzusetzen
-
*räusper* nman hat recht, so toll sieht das nicht aus. außerdem hab ich jetzt schon mit meiner eigenen Kapselung angefangen: sieht dann im end-code ca. so aus:
int main () { Allegro &a = allegro(); //Allegro ist ein Meyers-Singleton a.install (keyboard); //Keyboard ist eine Instanz von keyboard_, die //Tochter von device_ a.screen.init (640, 480);//oder wäre ein install(screen(640,480)) besser? Allegro::Datafile datafile("test.dat"); //Sollte klar sein Allegro::Bitmap backbuf(640, 480); //hoffe, dass auch das klar ist int x = 400, y = 300; //dummy variablen zum testen while (!a.keyboard.key[KEY_ESC]) { //sieht vielleicht nicht so aus, aber //key ist eine eigene Klasse mit überladnen operator[] und einigen extras if (a.keyboard.key[KEY_LEFT] == pressed) x-=4; //andere Schreibweise if (a.keyboard.key[KEY_RIGHT]) x+=4; //hat die selbe bedeutung, obigerer //style ist allerdings besser erweiterbar if (a.keyboard.key[KEY_UP] == pressed) y-=4; if (a.keyboard.key[KEY_DOWN] == pressed) y+=4; backbuf.clear(); //Bitmap typische funktionen sind natürlich eingebaut backbuf.draw (datafile.get_RLE_Sprite(AN_IMAGE), x, y); //sollte eignetlich selbsterklärend sein a.screen.swap(backbuf); //Double-Buffer Technik, sorgt dafür, dass //screen's bitmap mit backbuf's ausgetauscht wird a.screen.update(); //neues Bild auch Zeichnen } }
Gefällt euch dieser Style?
-
Original erstellt von <Alleger>:
***räusper* nman hat recht, so toll sieht das nicht aus. außerdem hab ich jetzt schon mit meiner eigenen Kapselung angefangen: sieht dann im end-code ca. so aus:int main () { Allegro &a = allegro(); //Allegro ist ein Meyers-Singleton a.install (keyboard); //Keyboard ist eine Instanz von keyboard_, die //Tochter von device_ a.screen.init (640, 480);//oder wäre ein install(screen(640,480)) besser? Allegro::Datafile datafile("test.dat"); //Sollte klar sein Allegro::Bitmap backbuf(640, 480); //hoffe, dass auch das klar ist int x = 400, y = 300; //dummy variablen zum testen while (!a.keyboard.key[KEY_ESC]) { //sieht vielleicht nicht so aus, aber //key ist eine eigene Klasse mit überladnen operator[] und einigen extras if (a.keyboard.key[KEY_LEFT] == pressed) x-=4; //andere Schreibweise if (a.keyboard.key[KEY_RIGHT]) x+=4; //hat die selbe bedeutung, obigerer //style ist allerdings besser erweiterbar if (a.keyboard.key[KEY_UP] == pressed) y-=4; if (a.keyboard.key[KEY_DOWN] == pressed) y+=4; backbuf.clear(); //Bitmap typische funktionen sind natürlich eingebaut backbuf.draw (datafile.get_RLE_Sprite(AN_IMAGE), x, y); //sollte eignetlich selbsterklärend sein a.screen.swap(backbuf); //Double-Buffer Technik, sorgt dafür, dass //screen's bitmap mit backbuf's ausgetauscht wird a.screen.update(); //neues Bild auch Zeichnen } }
Gefällt euch dieser Style?**
meine gedanken dazu...
vielleicht könnte man allegro besser als namespace machen, weil das ein sammelsurium von subclassen ist... aber ich weiß net zuviel über allegro, deswegen ist diese aussage vielleicht von vornherein disqualifiziert..
jedoch untermauertAllegro::Datafile datafile("test.dat"); //Sollte klar sein
meinen gedanken.
wieso schreibst du nicht
a.keyboard[KEY_ESC]
oder hat keyboard noch mehr in sich als .key ? ich weiß das ja so wie das hier steht nicht, aber es schaut von der logic ein wenig komisch aus, wenn du von der tastatur, der taste den []-operator überlädst um die taste zu fragen ob die angegebene taste gedrückt ist, sollte das nicht eher vom keyboard zurückgegeben werden?... korrigier mich, falls ich irgendwie auf dem falschen pfad bin.
a.screen.init (640, 480);//oder wäre ein install(screen(640,480)) besser?
so wie es ist find ich es besser als die alternative.
was ich mich frage ist, wieso machst du das beim keyboard nicht genauso?
a.keyboard.init(); anstatt a.install (keyboard); soll doch an sich die gleiche funktion sein für verschiedene module bzw. geräte.aber an sich ne schön saubere kapselung finde ich.
rapso->greets();
-
Hm, na ja, beim Keyboard hab ich noch andere Dingens, z.b. die LEDs zum herumsteuern, deshalb die extra key-instanz.
Natürlich könnte ich auch einen namespace Allegro machen, und das in mehrere header aufteilen. aber weil sowieso immer die ganze allegro lib mit gelinkt wird, und ich namenskonflikt Allegro::Allegro (Namespace::Klasse) nicht haben will, verwende ich die Allegro Klasse auch gleichzeitig als Superklasse mit mehreren Subclassen.
Das mit install(keyboard) hab ich mir so gedacht, weil allegro selbst ja die Funktionen install_keyboard, install_mouse, install_bla hat, eben bis auf install_screen, das ist anders. deshalb.
Und dann hab ich eine Keyboard Subklasse gemacht, das war nicht mitgedacht. Ich hätte da entweder
Keyboard_Klasse keyboard;
a.install(keyboard);
keyboard.key[KEY_A];
machen, oder
a.keyboard.init();
a.keyboard.key[KEY_A];
aber jetzt ist beides gemischt...
wahrscheinlich werde ich auf die zweite Variante umsteigen.hm das mit dem keyboard.key werd ich wahrscheinlich auch ändern
Danke
-
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