Grundlegene Fragen

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: Grundlegene Fragen

Beitrag von dr.e. » 14.07.2010, 17:58:30

Hallo ByStones,

um den Einstieg zu schaffen, kannst du dich vielleicht einfach mal mit Screeze unterhalten und eine einfache Fingerübung mit dem APF starten. Hier empfiehlt es sich, eine kleine Webseite mit Navigation, dynamischem Inhalts-Bereich und ein paar fertigen Modulen zu bauen. Anschließend kann man sich dann mit der Erstellung von Taglibs und Front-Controller-Actions befassen.
Ich bin mir nichtmehr sicher ob ich das Browsergame mit dem APF machen soll, da ich für so ein großes Projekt ungern eine fast unbekannte "Software"/Framework einsetzte.
Gerade weil ein Browsergame eine durchwegs sehr komplexe Sache ist - hier trägt das APF meiner Einschätzung nach überhaupt nicht zur Erhöhung der Komplexität bei -, sollte man ein Tool nutzen, das eine flexible Basis für komplexe Anwendungen bietet. Andernfalls hast du hinterher viel Spass mit dem Refactoring oder der Kapselung von Funktionalitäten während der Entwicklung.

Ich schlage daher vor, mit einer einfachen Aufgabe zu beginnen und dann dich dem Browsergame zu widmen. Allenfalls solltest du dich mal mit Screeze kurzschließen, denn ein Browsergame ist tatsächlich nicht unkomplex!
Viele Grüße,
Christian

ByStones
Beiträge: 27
Registriert: 09.07.2010, 20:25:36

Re: Grundlegene Fragen

Beitrag von ByStones » 14.07.2010, 20:17:42

So werd ich das jetzt auch machen...

Ich hab bei dem Browsergame mal mit dem Kampfsystem angefangen, da das bei der alten Version einen Haufen probleme bereitet hat und meiner Meinung nach auch nicht sonderlich gelungen ist...
Nur das neue Kampfsystem stellt mich gleich am Anfang vor große Schwierigkeiten, da es möglichst frei gestaltet werden soll. Da fast jede Einheit verschiedene Effekte haben soll muss fast jede Aktion einer Einheit von einem Effekt beeinflusst werden können und das möglichst ohne viel Code zu schreiben.
Ich erzähl mal meine Idee und wenn Ihr wollt kann ich dann auch noch Code dazu posten.
Also: Es gibt eine Master-Klasse "battlefield" die sozusagen das Kampffeld darstellt. In dieser Klasse gibt es 2 Arrays die wiederum Klassen enthalten die die einzelnen Armeen repräsentieren. (Das hab ich gemacht, dass ich später eventuell "Gruppen angriffe" einbauen kann, wobei dann jeder Spieler eine Armee stellt.)
Diese Armee enthalten dann wiederum ein Array in dem alle Einheiten drinn sind.
Nun wählt das Kampffeld eine zufällige Armee aus und diese liefert dann eine zufällige Einheit (indem die Werte aus einem Array ausgelesen werden und eine Soldaten-Klasse diese Werte dann lädt und den Soldat repräsentiert). Das gleiche passiert beim Gegner und dann kloppen sich die Einheiten.
Jede Einheit hat bestimmte auslöser, z.B. onAttack der dann ausgelöst wird wenn ein bestimmtes Ereignis wärend dieses Zweikampfes eintritt ausgelöst wird.
An diese Auslöser können Effekte gebunden werden die eben Werte der Klasse manipulieren können.
So nun soll es aber auch die möglichkeit geben, dass eine Einheit eine andere mit einem negativen Effekt belegt, der dannn wiederum jede Runde schaden oder ähnliches verursacht. Dies einzubauen war dann schon komplizierter...

Ganz zufrieden bin ich aber immer noch nicht, da es z.B.: Schwer ist auf Parameter einfluss zu nehmen (per Effekt), wie wenn eine Einheit mit 50 Angriff angegriffen wird, diesen Schaden per Effekt zu manipulieren.
Vielleicht habt Ihr ja eine Idee wie man das ganze flexibler und offener gestalten kann.

Edit: So ich hab das URL-Rewriting angeschaltet, weiß aber nun ehrlich nicht wie ich das benutzen soll ???
Ok die Frage kommt nun vermutlich arg blöd, aber wie kann ich im APF einzelne Unterseiten machen ? also example.com/hallo.php, example.com/news.php usw
Und wie kann ich wiederholende Strukturen mit der TagLib abbliden ? Also z.B: bekomm ich aus der DB eine Reihe datensätze und die will ich dann Tabelarisch darstellen ?
Und nochmal was: Wie bekomme ich dan absoluten Webpfad, um z.B.: Bilder und Css Dateien über den absoluten Pfad ansprechen zu können ?

Grüße

P.S.: Wenn Ihr den konkreten Code wollt, einfach nur sagen ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: Grundlegene Fragen

Beitrag von dr.e. » 14.07.2010, 23:42:52

Hallo ByStones,
Vielleicht habt Ihr ja eine Idee wie man das ganze flexibler und offener gestalten kann.
Grundsätzlich solltest du dich fragen, welche Elemente (Objekte) am Kampf beteiligt sind und welche Beziehungen diese ausprägen. Weiterhin ist die zeitliche Abfolge von Ereignissen zu modellieren, sprich Aktionen, die aufeinander folgen und die Zustände beeinflussen. Hier bieten sich Aktivitäts-Diagramme zur Visualisierung an.
Wie man so etwas generisch umsetzt bzw. welche Herangehensweise am besten geeignet ist können vielleicht Screeze oder Megger beantworten.
Edit: So ich hab das URL-Rewriting angeschaltet, weiß aber nun ehrlich nicht wie ich das benutzen soll ???
Das APF-URL-Rewriting ist vom Prinzip einfach. Es übersetzt Sequenzen von /param/value in ein assoziatives Array der Form

Code: Alles auswählen

array('param' => 'value')
Damit ist es dir möglich die URL beliebig zu strukturieren ohne deine Anwendung ändern zu müssen. Für die Link-Generierung hast du die Komponenten LinkHandler und FrontControllerLinkHandler zur Verfügung, die dieses Layout unterstützen, die Parameter kannst du ganz einfach aus dem $_REQUEST auslesen oder den RequestHandler nutzen.
Ok die Frage kommt nun vermutlich arg blöd, aber wie kann ich im APF einzelne Unterseiten machen ? also example.com/hallo.php, example.com/news.php usw
Das APF ist dafür ausgelegt, dass du Unterseiten nicht über einzelne PHP-Dateien abbilden musst, sondern mit einer Bootstrap-Datei arbeiten kannst. Adressierst du bei aktiviertem URL-Rewriting eine Seite beispielsweise per /page/news, kannst du einfach mit einer Tag-Definition von

Code: Alles auswählen

<core:importdesign namespace="..." template="[page = start]" incparam="page" />
die Einbindung von dynamischen Inhalten steuern. In den Templates news.html und start.html werden dann die entsprechenden Inhalte erzeugt. Gerne auch per Document-Controller aus einer Datenbank oder anderen Quellen. Hierzu ist vielleicht ds Tutorial Webseite erstellen für dich interessant.
Und wie kann ich wiederholende Strukturen mit der TagLib abbliden ? Also z.B: bekomm ich aus der DB eine Reihe datensätze und die will ich dann Tabelarisch darstellen ?
Hier kannst du den <html:iterator />-Tag nutzen oder ein Template nutzen und die Logik in einem Controller implementieren.
Und nochmal was: Wie bekomme ich dan absoluten Webpfad, um z.B.: Bilder und Css Dateien über den absoluten Pfad ansprechen zu können ?
Die für das URL-Rewriting mitgelieferte RewriteRule sorgt dafür, dass Bilder ausgeschlossen sind. Ausnahmen kannst du jedoch jederzeit per RewriteCond ergänzen. Den absoluten Pfad kannst du entweder hinterlegen oder aus der Registry aulesen.

Ich hoffe, das hilft dir weiter. Falls nicht, können wir gerne Schritt für Schritt den Aufbau einer kleinen Webseite diskutieren und daraus gleich ein Tutorial im Wiki machen. OK?
Viele Grüße,
Christian

ByStones
Beiträge: 27
Registriert: 09.07.2010, 20:25:36

Re: Grundlegene Fragen

Beitrag von ByStones » 15.07.2010, 13:38:14

Ok, das fällt mir gerade ein Problem mit der Registry auf:
Ich nutze Netbeans und dort zeigt er immer die vorhandene Funktionen an, bei der Registry fehlt aber retrive() ???
Außerdem "URLBasePath" liefert http://localhost, was aber nix bringt, da ich das APF in einen weiteren Unterordner getan habe.
Vorschlag: Einen weiteren Wert hinzufügen, der auch noch die Unterordner berücksichtigt...

Das wars dann mal wieder fürs erste, ich zeig mal meine Ergebnisse sobald ich ein wenig vorrankomme...
Aber mitlerweile schauts ganz gut aus ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: Grundlegene Fragen

Beitrag von dr.e. » 15.07.2010, 13:41:49

Hallo ByStones,
Ich nutze Netbeans und dort zeigt er immer die vorhandene Funktionen an, bei der Registry fehlt aber retrive() ???
Welche Version von Netbeans und dem APF nutzt du? Bei mir lokal mit Netbeans 6.9 und dem APF 1.12 werden die relevanten Methoden alle angezeigt.
Außerdem "URLBasePath" liefert http://localhost, was aber nix bringt, da ich das APF in einen weiteren Unterordner getan habe.
Vorschlag: Einen weiteren Wert hinzufügen, der auch noch die Unterordner berücksichtigt...
Hierzu gibt es bereits den Parameter CurrentRequestURL. ;)
Das wars dann mal wieder fürs erste, ich zeig mal meine Ergebnisse sobald ich ein wenig vorrankomme...
Aber mitlerweile schauts ganz gut aus ;)
Das freut mich!
Viele Grüße,
Christian

ByStones
Beiträge: 27
Registriert: 09.07.2010, 20:25:36

Re: Grundlegene Fragen

Beitrag von ByStones » 15.07.2010, 13:49:42

Netbeans 6.9.
Wie bekomm ich die APF-Version raus, wobei ich denke dass es die neuste stable ist ?

CurrentRequestURL ist auch net des was ich mir vorstelle, denn da kommt das raus:

Code: Alles auswählen

http://localhost/project/seite/
und eingentlich will ich das:

Code: Alles auswählen

http://localhost/project

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: Grundlegene Fragen

Beitrag von dr.e. » 15.07.2010, 23:05:13

Hallo ByStones,

die Version siehst du eigentlich am heruntergeladenen Package. Solltest du das nicht haben, ist die Klasse baseController ein Indiz für 1.11 und base_controller für 1.12.

Was den gewünschten Pfad angeht, so funktioniert URL-Rewriting nur mit einem eigenen VHOST. Du hast jedoch scheinbar URL-Rewriting auf einem Unterordner konfiguriert, was allein schon deshalb nicht funktionieren wird, weil die Parameter-Zuordnung im Input-Filter nicht korrekt stattfinden kann. Entweder du deaktivierst das URL-Rewriting, dann gibt dir CurrentRequestURL aus was du brauchst oder du erstellst einen eigenen VHOST, dann wird URLBasePath den gewünschten Pfad ausgeben.

Noch eine Frage dazu: wofür brauchst du den Pfad/die URL überhaupt? Vielleicht gibt es ja noch eine andere Lösung...
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Grundlegene Fragen

Beitrag von Megger » 16.07.2010, 11:23:38

Nun wählt das Kampffeld eine zufällige Armee aus und diese liefert dann eine zufällige Einheit
Da würde ich aufpassen! Wenn du nicht soviele Einheiten hast ist es ok, wenn du aber zum Beispiel ein Endlosbrowsergame entwickelst, dann kann es ja vorkommen, dass sich 2 riesige Armeen gegenüberstehen und dadurch dein ganzes Spiel in die Knie gezwungen wird. Dann würde ich vielleicht Einheiten des gleichen Typs gruppieren und diese Gruppen dann gegeneinander antreten lassen.
Ganz zufrieden bin ich aber immer noch nicht, da es z.B.: Schwer ist auf Parameter einfluss zu nehmen (per Effekt), wie wenn eine Einheit mit 50 Angriff angegriffen wird, diesen Schaden per Effekt zu manipulieren.
Vielleicht habt Ihr ja eine Idee wie man das ganze flexibler und offener gestalten kann.
Spontane Gedanken:
Einheit1 vs. Einheit2
Einheit1 hat einen negativen Effekt der die Rüstung reduziert.
Einheit2 greift nun Einheit1 an und zwar mit 50 Angriff plus Effekt "10% Chance doppelter Schaden"
Ich würde es so machen, dass Einheit2 nun ein Array an Einheit1 übergibt mit den entsprechenden Informationen.
Einheit1 übernimmt nun die Berechnungen und berücksichtigt dabei auch die eigenen Effekte (sowohl positiv als negativ)
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

ByStones
Beiträge: 27
Registriert: 09.07.2010, 20:25:36

Re: Grundlegene Fragen

Beitrag von ByStones » 16.07.2010, 13:33:20

Der Kampfcode wird grad noch "entwickelt", sobald der halbwegs fertig ist stell ich ihn mal hier rein, dann könnt ihr ihn ansehen.
Das mit den riesigen Armeen haben wir uns auch schon überlegt und rein rechenmäßig werden wir wohl eine Obergrenze von 8000 bis 10000 Soldaten pro Kampf setzten.
Was natürlich passieren kann, dass einer in seinem Dorf schon 20000 Einheiten hat und er dann von X Einheiten angegriffen wird, dann sind ja bereits die Verteidigenden über dem Limit...
Hat jemand für das Problem eine vernünftige Lösung.

Die Einheiten in Gruppen zusammenfassen finde ich nicht sonderlich gut, da eine Einheit z.B. die andere Einheit vergiften kann (kontinuierlich Schaden) oder mit anderen Effekten belegen kann und wie will man das verrechnen wenn die Einheiten zusammengefasst werden...

Die Effekte sehen imho so aus:
Es gibt bestimmte Auslöser, wie z.B. onAttack. An diese Auslöser können Effekte gebunden werden und wenn eben das Eregnis eintritt werden alle relevanten Informationen in einem Array an den Effekt übergeben und der berechnet dann und gibt die Informationen zurück. Dadurch kann einfach der Effekt sehen ob die 10% Chance zutrifft und falls ja einfach den übergebenen Schaden verdoppeln und dann zurückgegebn.

EDIT: Gibt es sowas wie eine ACL-Klasse in APF (hab in der Doku keine gefunden), oder etwas änhliches, damit sich eine Benutzerverwaltungs leicht abbilden lässt ?
Edit2: http://adventure-php-framework.org/Seit ... management

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: Grundlegene Fragen

Beitrag von dr.e. » 16.07.2010, 17:46:44

Hallo ByStones,
EDIT: Gibt es sowas wie eine ACL-Klasse in APF (hab in der Doku keine gefunden), oder etwas änhliches, damit sich eine Benutzerverwaltungs leicht abbilden lässt ?
Edit2: http://adventure-php-framework.org/Seit ... management
Korekt. Das Modul usermanagement ist ein generisches Modul, mit dem die Themen ACL (permissions) und Berechtigungen (visibility definitions) abgebildet werden können. Hierzu würde ich dir aber empfehlen, den aktuellen SVN-Code-Stand zu nutzen (RC1 gibts morgen, wenn nichts dazwischen kommt), denn dort wurde das Thema Sichtbarkeits-Berechtigungen erst für 1.12 eingebaut. Doku und Tutorials werden gerade noch produziert, wenn du also Fragen hast, sag Bescheid.
Viele Grüße,
Christian

ByStones
Beiträge: 27
Registriert: 09.07.2010, 20:25:36

Re: Grundlegene Fragen

Beitrag von ByStones » 16.07.2010, 20:30:24

So ich versuche gerade ein Array über den <html:iterator />-Tag abzubilden.
Das ganze sieht so aus:

Code: Alles auswählen

<@controller namespace="sites::site::pres::documentcontroller" file="tags" class="tags" @>
                    <core:addtaglib namespace="tools::html::taglib"  prefix="html" class="iterator" />                    
                    <html:iterator name="tags">
                        <iterator:item>
                            <span style="font-size: <html:placeholder name="tag-size" />px;">
                                <html:placeholder name="tag" />
                            </span>
                        </iterator:item>
                    </html:iterator>
Der Controller sieht so aus:

Code: Alles auswählen

<?php
import('tools::html::taglib::documentcontroller','iteratorBaseController');

class tags extends iteratorBaseController {

   function transformContent(){

      // Referenz auf den Iterator holen
      $Iterator = $this->__getIterator('tags');

      // Datencontainer mit einer Liste von Objekten oder assoziativen Arrays fuellen
      $Iterator->fillDataContainer(array(
          array(
              'tag' => 'suche',
              'tag-size' => '20'
          ),
          array(
              'tag' => 'google',
              'tag-size' => '10'
          )
          ,
          array(
              'tag' => 'web',
              'tag-size' => '30'
          ),
          array(
              'tag' => 'google',
              'tag-size' => '15'
          )
      ));

      // Am Ort der Definition ausgeben ...
      $Iterator->transformOnPlace();

      // ... oder den Inhalt in einen Platzhalter einsetzen
      //$this->setPlaceHolder('...', $Iterator->transformIterator());

   }

}
Nun bleibt aber der <@controller />-Tag stehen und der Rest verschwindet...
Was mach ich falsch ?

Edit: Einen Fehler hab ich schon gefunden: Es muss <item:placeholer /> sein statt <html:placeholder />
Das behebt das Problem aber nicht

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: Grundlegene Fragen

Beitrag von dr.e. » 16.07.2010, 23:43:51

Hallo ByStones,

befindet sich vielleicht irgendwo ein TAB-Zeichen ind er Datei? Das mag der APF-Parser nicht als Trennzeichen von Tag-Attributen. Der Code an sich ist korrekt und funktioniert bei mir lokal auch (natürlich mit <item:placeholder />).

Sofern Taglib- oder Controller-Definitionen im Quelltext erhalten bleiben ist immer irgendwas mit der Definition nicht ganz korrekt und der Parser erkennt das nicht.
Viele Grüße,
Christian

ByStones
Beiträge: 27
Registriert: 09.07.2010, 20:25:36

Re: Grundlegene Fragen

Beitrag von ByStones » 17.07.2010, 11:22:38

Nein es sind keine Tabs dazwischen...
Ich hab ganz oben in dem Dokument schonmal nen Controller eingebunden, aber das dürfte ja keine Probleme machen ?

Code: Alles auswählen

<html:placeholder name="URI" />
Kann man das auch irgendwie anders schreiben, weil wenn ich einen Placeholder in ein Attribut, oder einen normalen HTML-Tag reinmachen will, zeigt Netbeans logischwerweise einen Syntaxfehler an...

Grüße

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: Grundlegene Fragen

Beitrag von dr.e. » 17.07.2010, 11:39:39

Hallo ByStones,

das MVC-Pattern und insbesondere das HMVC-Pattern erlauben jeweils nur einen Controller pro View. Im APF ist ein View durch ein Template repräsentiert, das seinen Controller kennt. Damit darf die <@controller-Direktive auch nur einmal in einer Template-Datei auftauchen.

Möchtest du das oben aufgeführte Element so beibehalten, lagere das einfach in ein eigenes Template aus und binde es in deinem Haupt-Template per <core:importdesign /> ein. Genau das ist der Vorteil des APF, dass du beliebige Strukturen von MVC-Elementen aufbauen kannst ohne dass du einer Einschränkung unterliegst. Die Informationen, die du im Controller verarbeitest sind also nicht abhängig von der Hierarchie-Ebene, sondern du kannst das für dich strukturieren, wie es dir am besten gefällt und wie es am effizientesten ist.
Kann man das auch irgendwie anders schreiben, weil wenn ich einen Placeholder in ein Attribut, oder einen normalen HTML-Tag reinmachen will, zeigt Netbeans logischwerweise einen Syntaxfehler an...
Korrekt. Netbeans zeigt einen Fehler an, aber das ist der Tatsache geschuldet, dass du einen Tag in ein Attribut schreibst. Selbiges Problem gibt es auch im JAVA-/JSP-Umfeld, wo du auch etwas in der Art

Code: Alles auswählen

<a <c:if="${foo == 'true'}">class="123" </c:if>href="<c:out="${bar}" />">...</a>
schreiben kannst. Sofern du das kürzer haben möchtest, kannst du dir einfach eine eigene Methode in deinem Controller schreiben, die kürzere Platzhalter-Syntax versteht.

Aber zuvor muss ich noch ein Wort zur Transformation von Baum-Knoten einwerfen:
Bei der Transformation eines MVC-DOM-Knotens wird dem Controller der komplette Inhalt des Knotens mitgegeben, für den er zuständig ist. Das passiert im Page-Controller (siehe Methode Document::transform()) und kann in deinem Fall dazu genutzt werden auf sehr einfache Weise Platzhalter zu realisieren. Weiterhin kennt ein Document-Controller über das Attribut $this->__Document den aktuellen DOM-Knoten und dann darüber im Baum traversieren.

Die Implementierung einer Platzhalter-Methode ist damit sehr einfach: du schreibst dir eine Methode in einer Controller-Klasse die von baseController/base_controller erbt, die nichts anderes tut als deine Syntax abzubilden. Alle deine Controller erben dann von diesem und können die Methode benutzen. Hier ein Beispiel für die Umsetzung:

Code: Alles auswählen

class short_replacer_base_controller extends base_controller {
   protected function setShortPlaceHolder($name,$value){
      $this->__Content = str_replace('{'.$name.'}',$value,$this->__Content);
   }
}

class news_controller extends short_replacer_base_controller {
   public function transformContent() {
      $this->setShortPlaceHolder('foo','bar');
   }
}
Ich hoffe, das hilft dir weiter.
Viele Grüße,
Christian

ByStones
Beiträge: 27
Registriert: 09.07.2010, 20:25:36

Re: Grundlegene Fragen

Beitrag von ByStones » 17.07.2010, 12:16:17

Kann ich einen globalen Placeholder definieren ?
Weil einen URL-Placeholder mit dem absoluten Webpfad braucht man immer und den muss ich dann ja global haben, sodass ich nicht in jedem Controller extra den gleichen Code kopieren muss.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast