Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Webgamers. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

sinus

Fortgeschrittener

Beiträge: 223

Danksagungen: 55

  • Nachricht senden

21

Dienstag, 20. Dezember 2016, 19:47

Hallo Fhizban,

zu deinem vorgehen würde ich folgendes einbringen:

1) versuche schliessende php-tags zu vermeiden, wenn danach kein html kommt:
d13_basic.data.inc.php

Quellcode

1
2
3
4
5
6
7
8
9
10
11
...

//----------------------------------------------------------------------------------------
// 
//----------------------------------------------------------------------------------------



//=====================================================================================EOF

?>

(das wirst du beherzigen, sobald du mal einen "output already send" fehler hattest und die suche dich mehrere stunden gekostet hat)

2) ich sehe du versuchst dich sehr in oop, jedoch bricht das konzept völlig, wenn du variablen globalisiert:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...

	//----------------------------------------------------------------------------------------
	// blockword
	// 3.0
	// @ A simple wrapper to get the right language string, this might change in the future.
	//----------------------------------------------------------------------------------------
	public static function blockword($string) {	
	
		global $bw;
		
		foreach ($bw as $blockword) {
   			if (stristr($blockword, $string) !== false) {
    			         return true;
    		        }
		}
		return false;
	}

...


3) die daten im ordner "data" solltest du strukturiert in einer datenbank festhalten und so auslesen wie du sie benötigt, dann cachen und dann vom cache lesen und benutzen.
4) um das alles in einer klasse abzubilden, müsstest du den punkt 3) realisieren und dann das "Proxy Pattern" (mir fällt kein passenderes ein) verwenden. Falls dich das interessiert: https://de.wikipedia.org/wiki/Stellvertr…Entwurfsmuster)


ich hoffe damit ist dir ein wenig geholfen ;)

gruß
sinus
loading ..

Fhizban

unregistriert

22

Dienstag, 20. Dezember 2016, 20:21

@sinus: danke, mir ist bewusst das da noch viel arbeit getan werden muss.

das mit den globalen ist noch aus der ersten version, deswegen muss das dringend geändert werden.

das jetzt mit einer klasse zu lösen ist auch wieder schlechtes design, aber was solls (ich habe meine gründe dafür).

ich hätte jetzt noch eine frage:

cachen und vom cache lesen

wie mache ich das?

gibt es hier ein bestimmtes konstrukt das gut geeignet ist? derzeit sind das ja alles nur überkomplexe arrays.

in einem meiner alten projekte habe ich das in session variablen gespeichert was natürlich auch totaler quatsch ist.

danke schonmal!

BlackScorp

Moderator

Beiträge: 1 235

Wohnort: 127.0.0.1

Danksagungen: 398

  • Nachricht senden

23

Mittwoch, 21. Dezember 2016, 16:56

cachen und vom cache lesen

wie mache ich das?

gibt es hier ein bestimmtes konstrukt das gut geeignet ist? derzeit sind das ja alles nur überkomplexe arrays.
Ich glaube da geht es darum, dass du nicht in jeder Funktion in der Datenbank nach einem Wert abgragst, es reicht, für den aktuellen Request, die Daten abzufragen, diese in eine PHP Variable zu hinterlegen und beim erneuten Aufruf innerhalb des Requests, eben den Wert aus der Variable auslesen.

Keine Ahnung, angenommen du hast eine Funktion "getText"

Quellcode

1
2
3
4
5
6
7
8
9
10
11
function getText($key,$language = 'de_DE',$default = ''){
$connection = getDBConnection(); 
$key = $connection>quote($key);
$language = $connection->quote($language);
$sql =sprintf("SELECT text FROM words WHERE key = %s AND language = %s LIMIT 1",$key,$language);
$statement = $connection->query($sql);
if(!$statement->numRows()){
return $default;
}
return $statement->fetchColumn();
}



wenn du im script jetzt 3 Mal hintereinader getText('foo'); aufrufst, hast du dreimal ein SQL query abgefeuert.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getText($key,$language = 'de_DE',$default = ''){
static $cache = [];
$cacheKey = sprintf('%s-%s',$key,$language);

if(isset($cache[$cacheKey])){
return $cache[$cacheKey];
}
$connection = getDBConnection(); 
$key = $connection>quote($key);
$language = $connection->quote($language);
$sql =sprintf("SELECT text FROM words WHERE key = %s AND language = %s LIMIT 1",$key,$language);
$statement = $connection->query($sql);
if(!$statement->numRows()){
return $default;
}
$text  = $statement->fetchColumn();
$cache[$cacheKey] = $text;
return $text;
}


und hier, prüfst du vorher ob der Wert in einem Array drin steht, wenn ja, dann returne ihn direkt, wenn nein, lade ihn aus der datenbank und speichere in ein Array.

Damit hast du ein Cache für einen Request, sobald du HTML Code siehst, ist der Cache schon durch den Garbage collector geleert.
Qualität eines Codes misst man in WTF/Sekunde

sinus

Fortgeschrittener

Beiträge: 223

Danksagungen: 55

  • Nachricht senden

24

Mittwoch, 21. Dezember 2016, 22:23

cachen und vom cache lesen


Hey Fhizban,

du könntest das temporäre caching, wie von BlackScorp beschrieben, nutzen.
Dies würde ich dir immer raten, sobald es an die Datenbank geht.

Was ich meinte ist eigentlich das richtige caching.
Sobald du für einen bereich die daten geaden hast, kannst du dies in einem temporären ordner als json-datei hinterlegen.
Beim nächsten aufruf prüfst du auf die datei und solange diese nicht existiert bzw. eine gewisse zeit bereits da liegt, aktualisierst du die datei.
Sollte alles ok sin mit den caching-kriterien, lädst du die, konvertierst sie in das ausgangsformat und kannst es normal verarbeiten.

Die vorteile dazu liegen auf der hand.
1) Weniger interaktion mit der datenbank an kritischen stellen
2) Schnellerer zugriff auf die daten nach dem caching
3) Das caching wird über seiten hinweg genutzt und beschleunigt deine seite dadurch

gruß
sinus
loading ..

Fhizban

unregistriert

25

Donnerstag, 22. Dezember 2016, 08:22

danke für eure tipps! ich setze so etwas um, sobald der rest aufgeräumt ist.

gestern abend war erstmal etwas refactoring angesagt.

es gibt jetzt eine factory klasse zur produktion der gebäudeklassen, eingeteilt in ein basis gebäude und abgeleitete gebäude

das ist schonmal deutlich besser

als nächstes sind die globals dran!

Fhizban

unregistriert

26

Freitag, 23. Dezember 2016, 21:46

gebäudeupgrades endlich fertig inkl. erhöhte resourcenkosten und kampfwerte

was jetzt noch fehlt sind skalierende werte der anderen gebäudeparameter wie produktion

dazu kamen etliche bugfixes und umbauten

mittlerweile kann man schon ein paar lustige sachen mit dem ding anstellen

als nächstes nochmal die kampfdarstellung überarbeiten und endlich die landkarte

aber jetzt erstmal pause und euch allen frohe weihnachten!

hppt://www.sourceforge.net/p/d13

Fhizban

unregistriert

27

Sonntag, 25. Dezember 2016, 13:55

und noch zwei neue screenshots zu den erwähnten gebäudeupgrades:

der erste screen zeigt auch gleich noch ein neues feature: die grafiken der gebäude können sich verändern wenn ein gebäude aufgelevelt wird.





Fhizban

unregistriert

28

Sonntag, 25. Dezember 2016, 19:10

und dann nochmal ein paar weihnachts-euronen in diversen asset-stores versenkt. schon witzig was man für 50 euro so alles bekommt.

es braut sich was zusammen!


nOnAmE

Fortgeschrittener

Beiträge: 172

Wohnort: Neuenkirchen

Beruf: Anwendungsentwickler

Danksagungen: 14

  • Nachricht senden

29

Sonntag, 25. Dezember 2016, 22:03

Die Gebäude hab ich vor 2 Wochen auch schon gekauft :D
Direkt zugeschlagen, nicht lange überlegt hrhr

Fhizban

unregistriert

30

Montag, 26. Dezember 2016, 18:42

huch, weihnachten schon wieder fast rum.

jetzt bräuchte ich doch nochmal eure hilfe.

thema interne datenorganisation. die lösung nennt sich IteratorAggregate - allerdings übersteigt das noch mein wissen und die PHP doku ist da auch recht dünn.

so sieht es jetzt aus (screenshot, da das CODE tag hier an meinem mac nicht funktioniert (broken line breaks)).

(bitte die fehler im code ignorieren)





Das funktioniert auch alles sehr gut soweit, bis ich an den Punkt komme wo das $data innerhalb der d13_collection ein mehrdimensionales array anstatt eines eindimensionalen ist.

dann geht mir leider die ganze schöne funktionalität flöten.

beispiel:

resourcen sind nicht auf die fraktionen im spiel spezialisiert, deswegen hat jede fraktion diesselben resourcen. das ist toll:

Quellcode

1
foreach ($data->resources as $resource)


aber, die einheiten sind in fraktionen eingeteilt, das bedeutet das der $data wert innerhalb der d13_collection mit einem mehrdimensionalem array abgebildet wird. und den kann ich meines wissens nicht mehr so einfach iterieren. leider verstehe ich diese Iteratoren insgesamt noch nicht so gut, kann sein das es durchaus ordentliche lösungen dafür gibt.

die probleme:

- iterieren eines mehrdimensionalen arrays, bzw. eines unter-arrays davon
- den count eines mehrdimensionalen arrays bzw. eines unter-arrays auslesen

sagen wir mal:

Quellcode

1
2
3
4
5
units[zwerge][einheitA][einheitenwerte]units[zwerge][einheitB][einheitenwerte]
units[zwerge][einheitC][einheitenwerte]
units[elfen][einheitA][einheitenwerte]
units[elfen][einheitB][einheitenwerte]
units[elfen][einheitC][einheitenwerte]



und jetzt möchte ich gerne alle zwergeneinheiten durchgehen

Quellcode

1
foreach ($data->units[zwerge] as $unit)


geht leider nicht!

auch den count kann ich nicht auslesen, das wäre noch schön (iterator countable kenne ich, aber nicht bei mehrdimensionalen arrays):

Quellcode

1
$zwergeneinheiten = count($data->units[zwerge]);$elfeneinheiten = count($data->units[elfen]);



nope, das geht so einfach nicht.

einzige lösung bisher:

den teil des arrays welcher benötigt wird, aus dem Iterator Objekt herauskopieren und dann wieder damit rumhantieren. BAD!

ich steh grad ziemlich auf dem schlauch und die uhr läuft, danke für jeden tipp!

sinus

Fortgeschrittener

Beiträge: 223

Danksagungen: 55

  • Nachricht senden

31

Montag, 26. Dezember 2016, 23:11

Hallo Fhizban,

eine bitte: schreib code bitte in den [ code ] tag (habe auf arbeit auch nen mac :P >> Link) ;)
btw: zeile 33 im bild kann nicht funktionieren, da hier ein "_" die logik stört und der zweite parameter beim collection konstruktor nicht entgegengenommen wird.

du kannst prüfen, ob es ein array ist und dann eines erstellen, wenn es dies nicht ist:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
...

if(!is_array($data->units['zwerge'])) {
  $data->units['zwerge'] = array($data->units['zwerge']);
}
if(!is_array($data->units['elfen'])) {
  $data->units['elfen'] = array($data->units['elfen']);
}

$zwergeneinheiten = count($data->units['zwerge']);
$elfeneinheiten = count($data->units['elfen']);

...


ansonsten schau dir mal folgende funktion an: Link

dadurch kann du unter anderen folgendes machen:

Quellcode

1
2
3
4
5
...

$array = ArrayHelper::getValue($data->units, 'zwerge', array());

...


hier wird dir ein array zurückgegeben, falls der schlüssel nicht existiert.
dann hast du ein array auf dem du "count()" ausführen kannst.

evtl. hilft dir das etwas oder ich versteh dein problem noch nicht ganz.

gruß
sinus
loading ..

Fhizban

unregistriert

32

Donnerstag, 29. Dezember 2016, 19:24

Liebe webgamers Gemeinde!
Dies ist mein letztes grosses Update für das Jahr 2016

leider hat Webgamers über das Jahr hinweg ordentlich gelitten, die teilnahme am Forum ist nicht mehr so wie früher. Na klar, derzeit sind Feiertage aber das täuscht nicht über das geringe Grundrauschen hinweg. Auch wenn ich nur über mein "eigenes Zeug" zu berichten vermag, so versuche ich über diesen Weg auch etwas zum arterhalt des forums beizutragen.

Großer Dank geht an Sinus für Informationsbrocken die mir beim Coden weitergeholfen haben sowie an Harald für das ausführliche testen des bisherigen Projekts. Harald war auch noch so freundlich dem Vorhaben einen netten Eintrag auf seinem Blog zu widmen (http://otip.de/spannendes-projekt-d13/ ).

...

Das refactoring ist abgeschlossen, d13 tickt jetzt nach einem programing pattern welches ich "evil god pattern" getauft habe (LOL). ich habe das in teilen von der alten BG World Engine mit ihrer Gottklasse abgekupfert. Nicht besonders gut, aber es tut seinen zweck. Das ganze wurde aber mit einflüssen aus dem von Sinus empfohlenen Proxy Patterns gewürzt damit es beherrschbar bleibt.

Auf serverseitiger speicherebene werden zwar immernoch arrays verwendet, für spätere objekte kommt dann allerdings ein IteratorAggregate zum Einsatz. Zudem wurden die Arrays in eine eigene klasse verwandelt, welche ich wesentlich leichter ansprechen und handhaben kann. Gespeist werden diese Daten aus Dateien und nicht aus einer Datenbank, da ich die einfache editierung durch einen admin via texteditor beibehalten möchte.

Sämtliche Datendateien basieren jetzt auf JSON, das mag suboptimal sein aber es ist besser als XML und weit besser als ein eigenbau system, für ein kleines spiel mit wenigen hundert komponenten wird es reichen. Es gibt hier verschiedene für- und gegen-meinungen. ich berufe mich auf ein US blog sowie ein blog aus Österreich wo es hieß:

"never use a homebrew file format for an open-source project - use a widely accepted format instead"

sowie

"JSON is moving beyond JS and becoming a web standard, quickly surpassing XML and other formats"

Das ganze war mit viel refactoring verbunden und etliche bugs müssen noch gefixed werden. Aber das Projekt steht mittlerweile gut da. Neben dem Stadtaufbau sind auch die anderen Funktionen wie Karte, Kampf, Nachrichten und Allianzen schon vorhanden - müssen allerdings noch auf den neuesten Stand gebracht werden.

Feature technisch war ich mehr mit Kleinigkeiten und Komfort-Features beschäftigt. So kann man jetzt den Bau bzw. die Upgrades von Gebäuden durch den Einsatz zusätzlicher Arbeiter deutlich beschleunigen.

Wenn die Fehler beseitigt sind, werde ich mich nächstes Jahr endlich um neue Features kümmern. Allen voran die Karte sowie das Kampfsystem.

Danke für das bisherige Interesse an meinem ersten vollumfänglichem Browser-Game-Engine-Projekt!




Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fhizban« (29. Dezember 2016, 19:33)


Harald

Fortgeschrittener

Beiträge: 255

Danksagungen: 88

  • Nachricht senden

33

Donnerstag, 29. Dezember 2016, 20:29

Huhu,

ich finde das Projekt super – und der Open-Source-Ansatz gefällt mir ausgesprochen gut. Ich teste gerne weiterhin – wobei ich es ja einfach habe: Einfach spielen, und wenn ein Bug auftaucht, nach Fhizban schreien :P

Ob es im Forum zur Zeit etwas ruhiger als sonst zugeht, kann ich nicht beurteilen – bin ja erst seit kurzem dabei. Allerdings fürchte ich manchmal, ein wenig zu nerven, wenn ich schon wieder was schreibe 8| Also: Ich habe Urlaub bis Anfang Januar und dann habe ich nur noch den halben Tag für Postings zur Verfügung...

Spannendes Projekt, das D13... und ich drücke mal die Daumen, dass es gebührende Resonanz findet – ich bin auf die beiden großen K`s (Kampf und Karte) gespannt... allein schon für einen neuen Blog-Beitrag.

Danke für die ganze Arbeit, Fhizban. Mir macht das Projekt Laune!

Gruß
Harald

Sebastian

Schüler

Beiträge: 51

Danksagungen: 27

  • Nachricht senden

34

Freitag, 30. Dezember 2016, 13:54

Dein Spiel hat leider kein Impressum, deswegen kann ich dir nicht direkt eine E-Mail schreiben.

Ich habe eine schwere Sicherheitslücke gefunden und würde sie ungern hier posten. Bitte schreib mich kurz an, dann sende ich dir alles was du wissen musst...


s.heinisch-AT-shplay.de

Fhizban

unregistriert

35

Freitag, 30. Dezember 2016, 14:32

du hast leider PMs hier geblockt, ich kann dir nicht schreiben.

du findest mich unter tobias[at]critical-hit.biz

ansonsten ist das projekt noch nicht wirklich öffentlich, deshalb kein impressum.

DaBu

Administrator

Beiträge: 873

Danksagungen: 333

  • Nachricht senden

36

Samstag, 31. Dezember 2016, 11:00

mal davon abgesehen, dass ihr kein impressum braucht.
Irgendwas mit Medien

Fhizban

unregistriert

37

Samstag, 31. Dezember 2016, 13:23

@DaBu: hast recht.

so, die sicherheitslücke konnte schnell geschlossen werden

bin erstmal raus. guten rutsch!

Fhizban

unregistriert

38

Mittwoch, 4. Januar 2017, 08:43

Anbei die d13 projekt updates der letzten Tage:

Zitat



* started project documentation at http://www.critical-hit.biz
* workers inside a building cannot be modified anymore when a task is running
* implemented class based OP caching of the JSON files to increase performance
* cleaned up some templates
* multiple research/craft/train projects can now run at the same time when the player has
enough extra buildings of the same type available (aka 2+ Barracks)
* buildings can now have a unique pending image, defined in modules.data
* Users now have a level, experience and trophies (no effect yet)
* Usernames are now unique (mixed lowercase, uppercase etc. registration disabled)
* Hybrid harvest/storage buildings implemented
* Unlimited resources that require no storage building implemented
* Fixed a minor security issue
* Replaced most text inputs with HTML input slider (Mobile First)
* Restyled resource bar a bit


Die Projektdokumentation befindet sich nun im Aufbau unter:

www.critical-hit.biz

Das Projekt ist weiterhin auf Sourceforge gehostet, mit Release Candiate 1 folgt Github (das wird aber noch dauern).

Der nächste Meilenstein ist das Kampfsystem. Dieses wird Browser-Game typisch recht einfach ausfallen (in Form eines Kampfberichtes), beinhaltet jedoch einige taktische Optionen. Geplanter Zeitraum: ca. 2 Wochen.


Harald

Fortgeschrittener

Beiträge: 255

Danksagungen: 88

  • Nachricht senden

39

Mittwoch, 4. Januar 2017, 16:30

Lass dir ein wenig Zeit mit dem Kampfsystem... das ist für viele später Dreh- und Angelpunkt. So wäre es nicht gut, wenn es die "ultimative" Technik, die "ultimative" Einheit geben würde...also sowohl vom Preis als auch vom Leistungsverhältinis.

Ich will dich nicht bremsen - aber rate dir: Brich es nicht übers Knie – das Kampfsystem ist Kern der Spielerfahrung später!

Fhizban

unregistriert

40

Mittwoch, 4. Januar 2017, 16:35

@Harald Komplett fertig wird es bis dahin ohnehin nicht. Sondern nur der grobe Rahmen (senden, berechnen, überlebende zurückbeordern).

Aber diesen grob umrissenen Rahmen schaffe ich in der Zeit.


Übrigens: Ich brauch dann jemand zuverlässigen um das zu testen :-D

(wunder mich wer das sein könnte)

Ähnliche Themen

Social Bookmarks

Thema bewerten