IBM Doors DXL: Save global properties (key/value-pairs) in Module / Globale Einstellungen in Modul speichern

Problem

In manchen Fällen ist es notwendig globale Einstellungen zu speichern und zu lesen.

Ansatz – Approach

Für diese Zwecke nutze ich ein Include-File, welches einfach mit dem #include Befehl eingebunden werden kann

Vorraussetzungen – Prerequirements

Das Modul /Project/Properties mit den Attributen BB_Key und BB_Value muss bereits angelegt worden sein.

Lösung – Solution

Die Datei setProperty.dxl….


/************************************************
 * Author: Bjoern Karpenstein
 * Date:   2015-08-05
 *
 * Description:
 * This module stores key/value pairs in 
 * a module (i.e. for publishing)
 *
 * Prerequirements:
 * Module has to be created before and hast to have 
 * the BB_Key / BB_Value attributes
 * The path has to be customized when using it for 
 * Different projects
 *************************************************/
string propertiesModulePath="/Project/Properties";

Module oldCurrentModule = current;
Module propertiesModule = null;
current=oldCurrentModule;

Object propObject;

string getValue(string theKey)
{
	propertiesModule = read(propertiesModulePath, false);
	for propObject in propertiesModule do
	{
		if(propObject."BB_Key" "" == theKey)
		{
			return propObject."BB_Value" "";
		}
	}
	propObject=null;
	close(propertiesModule);
	return "n/a";
}

void setValue(string theKey, theValue)
{
	string checkIfExists=getValue(theKey);
		
	propertiesModule = edit(propertiesModulePath, false);
	
	if(!canCreate(propertiesModule))
	{
		ack "Permission for Module: " propertiesModulePath;
		halt;
	}
	
	if(checkIfExists != "n/a" && !null propObject)
	{
		propObject."BB_Key" = theKey;
		propObject."BB_Value" = theValue;
	}
	else
	{
		Object newObject = create(propertiesModule);
		newObject."BB_Key" = theKey;
		newObject."BB_Value" = theValue;
	}
	
	save(propertiesModule);
	close(propertiesModule);
}

inkludiere ich anschließen im Kopf des Hauptprogramms mit


#include "path/setProperties.dxl"

und rufe die Methoden


void setValue(string theKey, theValue) - Bsp. setValue("Administrator", "Björn Karpenstein");
string getValue(string theKey) - Bsp. string adminName=getValue("Administrator");

auf.

Veröffentlicht unter DXL, IBM DOORS | Hinterlasse einen Kommentar

IBM Doors DXL: Object Trigger fires on Object enter and block fields / prevent fields from being edited / Objekt Trigger verhindert Editieren von Attributen vor Texteingabe

Problem

Depending on a selected value of a field, other fields should be editable / not be editable.

In this case the requirements are:

  • The object shall be editable, when no other Attribute with the description „Variant Status“ has the text (or the selection in case of enum) „Proposal“
  • The object shall be not ediablte, when one of Attribute with the description „Variant Status“ is set to „Proposal“
  • Exception: The field, that contains a set „Proposal“ Value, shall be editable in each case, otherwise it would not be possible to leave that state

Approach – Ansatz

The following codes installs an Object-Trigger (not attribute), that is fired every time a user double-clicks our is entering an object, but only when the module is in edit mode;

Solution – Lösung


string DXLCode = "
Trigger    trg = current;           
if (null trg) halt(); 
AttrDef ad  = attrdef(trg); 
if (null ad) halt();  // Error?
Object  obj = object(trg);  
if (null obj) halt();  // Error?
string  Name = ad.name;   

Module mod      = module(trg);
if(!isEdit(mod)) halt();

Object oCurr    = current(mod);	
string thisFieldShouldBeEditable = \"n/a\";
bool hasProposal = false;
int i=0;
for ad in mod do
{
  if(ad.object)
  {
    if(ad.description \"\" == \"Variant Status\")
    {
      string BB_Variant_name=ad.name;
      if(obj.BB_Variant_name \"\" == \"Proposal\")
      {
        hasProposal=true;
        thisFieldShouldBeEditable=BB_Variant_name;
      }
    }
  }
}

bool thisIsTheProposalField=false;
if(Name==thisFieldShouldBeEditable)
{
	thisIsTheProposalField=true;
}

// Wenn kein Attribut auf Proposal steht oder das angeklickte Feld 
// das Proposal Feld ist, brauchen wir nix mehr machen
if(!hasProposal||thisIsTheProposalField) halt();
// Wenn ein Attribut auf Proposal steht soll er blockieren

// Der nachfolgende Text text verhindert dass das Edit-Event zu Ende gebracht wird
set(trigPreConFail);


if (isVisible(mod) and obj == oCurr)                       
{
   infoBox(\"The field \" thisFieldShouldBeEditable \" is set to proposal.");
}
else{} 
"      // End definition of string DXLCode
 
Trigger trg;
bool    TrigOK  = true;
string  ErrMess = checkDXL(DXLCode);
 
if (!null ErrMess)
{
   print ErrMess "\n***********\n" DXLCode "**********\n"
   TrigOK       = false
}
 
string  NameTrig = "TriggerResetValidatedOn"
 
string  Prompt = "Delete trigger '" NameTrig "' ??"
if (!TrigOK) Prompt = "Trigger code has errors.\n" Prompt
if (confirm(Prompt))
{
   ErrMess = delete (NameTrig, module->object, pre, open, 6);
}
 
if (TrigOK && confirm("Deploy trigger '" NameTrig "' ??"))
{
   trg     = trigger(NameTrig, module->object, pre, open, 6, DXLCode)
}
Veröffentlicht unter DXL, IBM DOORS | Hinterlasse einen Kommentar

Excel VBA: Create dynamic worksheet from SQL Query / Excel Arbeitsblatt durch SQL Query erstellen

Problem

A new Worksheet should be created, that contains the result of an SQL Query (ADODB) generic (in the way, that no column names have to be adressed in the recordset.

Approach – Ansatz

  • Iteration over the Resultsets field names to get Meta Information / Header names
  • Usage of CopyFromRecordSet method of the Range Object: worksheet.Range(„A2″).CopyFromRecordset Rs

Solution – Lösung


Sub CreateExcelSheetWithQueryResult(ws As Worksheet, sql As String)
    Dim Cn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim vaTmp() As String
    
    Cn.Provider = "SQLOLEDB.1"
    
    Cn.ConnectionString = "Password=pass;" & _
    "Persist Security Info=True;" & _
    "User ID=user;" & _
    "Initial Catalog=databaseName;" & _
    "Data Source=ServernameOrIP"
    
    Cn.Open
    
    Rs.CursorType = adOpenKeyset
    Rs.LockType = adLockPessimistic
    Rs.Open sql, Cn, adOpenStatic
   
    ws.Cells.Clear
    
    ' This section fills in the field names from the Orders table.
    ReDim vaTmp(Rs.Fields.Count)
    For x = 0 To Rs.Fields.Count - 1
        vaTmp(x) = Rs.Fields(x).Name
    Next
    ws.Cells(1, 1).Resize(1, Rs.Fields.Count) = vaTmp
   
    ws.Range("A2").CopyFromRecordset Rs
    
    Rs.Close
    Cn.Close
End Sub

And if you want to create a new Excel sheet you can do this with a button that assigned macro contains the following source:


Sub DetailQuery1_KlickenSieAuf()
    Dim ws As Worksheet
    Sheets.Add After:=Sheets(Sheets.Count)
    ' Referenz darauf
    Set ws = Sheets(Sheets.Count)
    CreateExcelSheetWithQueryResult ws, "SELECT TOP 10 * FROM irrsinn"
    
End Sub
Veröffentlicht unter MS SQL Server, VBA | Hinterlasse einen Kommentar

MS SQL Server: Concat Strings in Group By Clausel / Group By, Strings gruppieren

Problem

Strings sollen in einer Group By Klausel anhand eines Attributs gruppiert und Komma separiert dargestellt werden.

Beispiel:

ID Name Value
1 A 4
1 B 8
2 C 9

Approach – Ansatz

Durch Verwendung der XPath Funktionen lässt sich etwas kreatives erreichen…

Solution – Lösung


CREATE TABLE #YourTable ([ID] INT, [Name] CHAR(1), [Value] INT)

INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'A',4)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'B',8)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (2,'C',9)

SELECT 
  [ID],
  STUFF((
    SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) 
    FROM #YourTable 
    WHERE (ID = Results.ID) 
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  ,1,2,'') AS NameValues
FROM #YourTable Results
GROUP BY ID

DROP TABLE #YourTable
Veröffentlicht unter Allgemein | Hinterlasse einen Kommentar

IBM Doors DXL: Versioned Links – Experimente mit BaselineSets, BaselineSetDefinitions

Intention

Allgemein

Für den Doors-Spezialisten erscheint das Thema der „Versioned Links“ mit Sicherheit trivial, ich hingegen habe desöfteren Probleme zu verstehen, wann sich ein „Versioned Link“ bildet. Daher habe ich mir ein Test-Szenario überlegt, anhand dessen ich das Verhalten von „Versioned Links“ näher analysieren möchte.

Was ist ein „Versioned Link“?

Einfach gesagt ist ein „Versioned Link“ ein Link, der auf eine Baseline eines Moduls ( einen eingefrorenen Stand) und nicht auf die „Current Version“ (die akutelle Arbeitsversion) des Moduls zeigt.

Wo ist also mein Problem?

Wer den Mechanismus des Link-Ziehens kennt, der weiß, dass es keine Möglichkeit gibt einen solchen Link bewusst auf eine Baseline zu ziehen.

zustandAinDoors

Desweiteren beziehen sich die Link-Module, über die man ebenfalls iterieren kann, um Quell- und Ziel-Objekte zu ermitteln, ausschließlich auf current LinkModules. Was passiert wenn ein Link-Modul gelöscht wird? Existiert nach dem Löschen der Satisfy-Beziehung (des Satisfy-Linkmoduls) in den alten Baselines immer noch?

Der folgende Code gibt die Baselines von Link-Modulen aus. Bei mir handelt es sich um hohe Versionszahlen größer als 200, die nicht mit den formellen/herkömmlichen Modul-Baselines in Verbindung gebracht werden können. Es ist also nicht ganz korrekt, das Link-Module keine Baselines haben, sie sind nur leider für den Endanwender unbrauchbar… oder kennt jemand einen Anwendungsfall wo er sie bisher nutzten konnte?


string nSatisfiesLinkModule = "/NDS/90 Administration/Satisfies"; 
Module SatisfiesLinkModule = read(nSatisfiesLinkModule, false); 
Baseline b = null;
int i = 0;

for b in SatisfiesLinkModule do 
{ 
    print i ") ";
    print(major b)"."(minor b)(suffix b)" "(annotation b)"\n" 
    i++;
} 

Wann entstehen „Versioned Links“?

„Versioned Links“ entstehen dann, wenn ein current Quell-Modul, welches noch nicht ins letzte  BaselineSet gestellt wurde, einen Outgoing-Link auf ein Ziel-Modul, welches gerade ins BaselineSet gestellt wurde, hat.

versioned_links1

(Zustand A: Quellmodul noch nicht im Baseline Set)

Dies bedeutet, dass der Auslöser für die Duplikation eine Modul-Baseline des Source-Moduls ist und nicht etwas auf Objekt-Ebene ausgelöst wird.

Wird anschließend eine Baseline für das Quell-Modul erstellt, wandern die Links in das gebaselinte Quell-Modul und die Duplikation im „Current Module“ verschwindet wieder.

versioned_links2

(Zustand B: Quellmodul wandert mit duplizierten Links ins BS)

Anmerkung: Den Zustand A sieht man i.d.R. nur in current Modules, die noch nicht ins letzte BaselineSet aufgenommen wurden.

Warum existieren „Versioned Links“?

Ich glaube fast, dass die Existenz von „Versioned Links“ vorwiegend der Tatsache geschuldet ist, dass die Links im Quell-Modul gespeichert werden und anschließend durch eine Art „Verschieben“ dem Baseline-Modul/der Snapshot-Kopie zugewiesen werden. Wenn das so ist, wäre der Zweck dieser Funktion nicht die Erfüllung von Nutzer-Anforderungen oder User-Stories, sondern lediglich einem technischem Zweck geschuldet.

Oder ist es für das Vorstellungsvermögen des Nutzers einfacher sich vorzustellen, wie eine Kopie des Quellmoduls (nämlich die Baseline) langsam mit den duplizierten, verankerten Links ins Baseline Set wandert?

Sorgen „Versioned Links“ im Zustand A für die Korrektheit/Versionssicherheit von Daten?

Wenn nun das Quellmodul, was z.B. eine Design Spezifikaton ist, Links auf die Current-Version und die gebaselinte Version hat, würde durch Veränderung in der Current-Version (also in den Requirements) nicht sichergestellt sein dass das Design noch stimmt. Die Aufgabe könnten Suspect Links erfüllen.

Daher lautet meine Antwort:

Nein (OXI)! „Versioned Links“ im Zustand A können nicht für die Korrektheit der verlinkten Daten sorgen. Meines Erachtens wäre es sinnvoller, wenn dass Source-Modul nur dann auf die Baseline zeigt, wenn das Source-Module seit der Target-Baseline nicht verändert wurde.
–> Wenn sich das „Current Ziel-Modul“ (z.B. die Software Requirements) seitdem geändert hat, so dass sich das Design ändern würde, stellt sich die Frage wieso das „Current Quell-Modul“ (z.B. das Software Design) auf geänderte Requirements zeigt.
Falls es geändert wurde, kann es auf die Current-Version des Ziel-Moduls zeigen… oder auch nicht, da ja noch nicht das ganze Modul geändert wurde…

Test Szenario

Test Beschreibung

Es soll nun getestet werden, wie der Zustand A (Link-Duplikation) bei Modulen, die ausschließlich Quellen, Modulen die ausschließlich Senken und Zwischenmodulen beim Verfolgen von Links darstellt.

Test Aufbau

Ich habe 11 Module auf 4 verschiedenen Ebenen erstellt, die ich mit willkürlichen Link-Typen miteinander verlinkt habe.

Anschließend habe ich eine Baseline Set Definition erstellt, die alle 11 Module beinhaltet und 4 Module (E1I1, E2I3, E3I1, E4I1) bereits in das BaselineSet gestellt (in der Grafik unten rot umrahmt).

TraceabilityTest

Das Baseline Set existiert in der Version 2.0:

tool_baselines

Test Durchführung

Die untenstehende Tabelle geht von current Quell-Modulen bei Outgoing-Links, und current Ziel-Modulen bei Incoming-Links aus.

D.h. bei Incoming-Links ist die Spalte Ziel-Modul das geöffnete Modul, bei dem das Phänomen der gespaltenen Links im Zustand A auftritt, bei Outgoing-Links ist das Quell-Modul der Ort, in dem das Phänomen der gespaltenen Links auftritt.

Auswertung1

Es ergibt sich darauf die folgende Wahrheitstabelle:

Auswertung2

Ergebnis

Der Zustand A von „Versioned Links“ tritt bei Outgoing Links im current Quellmodul auf, wenn das Quellmodul nicht im Baseline Set ist und das Zielmodul im Baseline Set ist.
Der Zustand A von „Versioned Links“ tritt bei Incoming Links im current Zielmodul auf, wenn das Quellmodul im Baseline Set ist, aber das Zielmodul nicht im Baseline Set.
Der Zustand A von „Versioned Links“ tritt auch in Baseline Modulen auf, wenn diese durch die Duplikation auf current Module zeigt.

Navigation mit DXL durch Versioned Links

Um ALLE Links eines Moduls, auch die Current- und Baseline-Versionen für ein Objekt zu bekommen, nutzt man den „ALL“ Quantor in der For-Schleife


Module m=current;
Link lnk;
Object o;
int numLinks=0;

for o in m do
{
  for lnk in all(o->"*") do
  {
    numLinks++;
  }
}  
print "There are " numLinks " outgoing links from this module.";
Veröffentlicht unter DXL, IBM DOORS | Hinterlasse einen Kommentar

Persönlicher Bericht: Mein Einstieg in die HTML5 Spieleentwicklung mit phaser.io

Intention

Viele Entwickler, die selber schon leidenschaftlich ein Spiel gezockt haben, träumen von der Umsetzung eigener Spieleideen.

Bei mir ist es hier nicht anders. Ich habe viele Ideen und viele davon sind unsinnig. Man würde sie vermutlich in die Kategorie „Trash“ stecken. Aber gerade professionell anmutende Spiele mit Trash-Faktor sind es, die viele Spieler fesseln. Die meisten Spiele, die nicht als „Trash“ gekennzeichnet sind, sind unter reellen Bedingungen absoluter Humbug.

Beispiele:
* Ein Klempner aus Brooklyn der Pilze frisst und auf Schildkröten rumtrampelt
* Eine Steinschleuder die kleine Vögel auf grüne Schweine schießt
* Prügelnde Kontrahenten, die Energiebälle schießen und mit Hubschrauberkicks durch die Gegend fliegen
* .. etc

Obwohl diese Spiele absolut unrealistisch sind, haben diese eine „Spielephysik“, die aber nicht unbedingt realisitsch sein muss.
* Super Mario springt und fällt auch wieder auf den Boden
* Ein Angry Bird schubst Teile seiner Welt an, diese stürzen um und schubsen wiederum weitere Teile an, solange bis das Schweinehaus zusammenfällt.
* Die Sequenz des Schießens bei Ryu/Ken benötigt eine gewisse Zeit in der sie angreifbar sind. Wenn Chun Li in der Luft ist kann Guile sie mit seinem Flip-Kick unbeschadet runterholen.

Distanziert betrachtet haben mich diese Spiele gefesselt und viel Zeit gekostet, waren aber konzeptuell absoluter Quatsch. Ob ich als Hobbyentwickler und Familienvater in meiner Frezeit die Zeit finde, an einem Spiel zu entwickeln, möchte ich an diesem Punkt noch bezweifeln aber ich lasse mich jetzt mal überraschen.

Aus diesem Grund wollte ich während meines Urlaubes den Einstieg in die HTML 5 Spieleentwicklung so hinbekommen, dass ich grundsätzlich ein 2D-Spieleentwicklungsproblem angehen kann.

Idee

Die erste Idee ist nichts weltbewegendes und sie ist absoluter Quatsch:
Beer Througher Professional

Wir haben eine Person, die ein Bierglas über einen Tisch wirft. Während das Bierglas über den Tisch fliegt, soll die Kamera mitscrollen (wie bei Angry Birds). Am Ende soll die Kamera stehen bleiben, dass Bier auf ein Trampolin fallen (oder auch nicht – je nachdem wie stark geworfen wurde) und dem Biertrinker, der faul auf der rechten Seite liegt, in den Mund gekippt werden.

Grundlagenforschung

Nachdem ich nun Google nach dem Thema „HTML 5 Canvas Games“ befragte, landete ich in dem Forum http://www.html5gamedevs.com in dem ich mich auch prompt registrierte um meine Idee den „Profis“ vorzustellen. Ich wollte mir Anregungen und Tipps holen, die mich bei der Umsetzung dieser Spieleidee als HTML5 Spiel befähigen.

Dazu schrieb ich diesen Forenbeitrag:

Während ich auf Antwort wartete, stöberte ich etwas in dem Forum und stieß auf die eigene Forenrubrik „Phaser.io“. Hierbei handelt es sich um ein HTML 5 Canvas Spieleframework, welches momentan scheinbar eine relativ weite Verbreitung hat.

Meine erster Beantworter auf den Forenbeitrag schlägt außerdem die Nutzung einer Bibliothek namens „PIXI.JS“ für das 2D Rendering vor, die angeblich auch in phaser.io vorhanden ist, ebenfalls wie diverse Spielephysik, auf die man direkt über die Phaser-Framework-Methoden zugreifen kann. Desweiteren gibt es Add-Ons, die man zwar für kleines Geld dazukaufen muss, aber welche die Funktionalitäten von Box2D hinzufügen:

http://phaser.io/shop

Hier ist eine Box2D Wasserpartikeldemo:

http://google.github.io/liquidfun/

Um kleine Javascripte auszuprobieren wurde auf der Seite von phaser.io folgendes Minitool empfohlen:

http://jsfiddle.net/

Entschluss

Ich werde mich daher in Phaser.io einarbeiten, da es als Werkzeugkasten die meisten Features für die Entwicklung von Spielen bietet.

Phaser kann man im Web unter der folgenden URL finden:

http://phaser.io/

Einstieg in Phaser.io / Erfahrungsbericht:

Die Entwicklungsumgebung

Zunächst stellt sich die Frage, welche Entwicklungsumgebung man nutzen möchte.

Da ich von Online-Quellcodeeditoren wie Codeanywhere begeistert bin, wollte ich die auf der Website phaser.io vorgeschlagene Cloud9-Variante testen. Hierbei handelt es sich ebenfalls um einen Online-Quellcodeeditor

http://c9.io <- Cloud9 Quellcodeditor

Erste Hürde: „First, sign up to the website using GitHub, and once this is completed, you will be redirected to your dashboard.“

Hierzu musste ich mich erstmal bei GitHub (ja hatte noch keinen Account 😉 ) anmelden und das Hello World Tutorial durchgehen, was mich 20 Minuten gekostet hat. Im Tutorial musste man einen „Branch“ anlegen und diesen mit dem „Master“ wieder vereinigen.

Der benannte Vorteil von GitHub: “ You don’t have to worry about losing data on your hard drive or managing a project across multiple computers“

Es lebe die Cloud!

In GitHub musste ich zunächst den Cloud9 Editor authorisieren auf mein Repository zugreifen zu dürfen:
„Authorize application
Cloud9 by @cloud9Deploy would like permission to access your account“

Auf dem Cloud9 Dashboard angelangt, erzeugt man ein neues Projekt von der URL
http://github.com/photonstorm/phaser.git

Diese URL scheint das komplette Phaser-Framework zu beinhalten.

Meine erste Überraschung beim Cloud9 Editor:
* Man kann PHP Code anlegen, der interpretiert wird
* Es gibt eine Ubuntu Command Line Zeile, in der man BASH-Kommandos ausführen kann

Der Cloud9 Editor bietet einen Debugger, den hatte ich für PHP schon länger gesucht, allerdings bleibt die Ausführung nicht bei den Breakpoints hängen. Evtl. muss man etwas konfigurieren?

Zurück zu phaser.io . Ich will ja erstmal mein Hello World Projekt erstellen :). Also mal gucken ob mir das die eingerichtete kostenlose Umgebung auch erlaubt…

Ich habe nun den gesammten root-Folder des Phaser-Ordners in den Ordner „Phaser“ kopiert, da man in der kostenlosen Version von Cloud9 nur einen Workspace nutzen darf.

Da ich mit Chrome arbeite, hat sich zum Switchen zwischen den Tabs (Editor <-> Tutorial <-> WordPress) die Tastenkombination STRG+BILD Hoch / STRG+Bild Runter als praktisch erwiesen. Auffällig ist, das der Cursorfokus des aktuellen Tabs nicht verloren geht.

Im Ordner phaser/Ressources/tutorials befinden sich alle Tutorials, die auf der Seite phaser.io aufgeführt sind. Ich hatte den Fehler gemacht über die Cloud9-Bashconsole die ZIP-Dateien mit wget runterzuladen und mit unzip zu entpacken. Dies ist unnötig.

Über den RUN-Button des Cloud9-Editors ist schnell eine geöffnete HTML-Datei geladen und mit dem Preview-Button auf den Bildschirm gebracht.

Schnell habe ich die ersten beiden Tutorials durch…

http://phaser.io/tutorials/making-your-first-phaser-game/part2

Es ist nicht nötig den Run-Button bei jedem Versuch neu zu klicken sondern es reicht aus den Refresh button zu klicken.

Fazit

* Die kostenlose Variante von Cloud9 (http://c9.io) ist sehr zu empfehlen.

* Ich hätte das GitHub Tutorial nicht benötigt, da lediglich GitHub für den Login von Cloud9 genutzt wird.

* Ich kann nun relativ schnell rechner- und ortsunabhängig an einem Canvas-Spiel entwickeln

Erste Schritte mit dem Framework

Meines Erachtens macht es durchaus Sinn auf der Hauptebene seines Cloud9 Workspace das Phaser-Framework mit den Tutorials als Nachschlagewerk zu nutzen. Die Hauptstruktur eines Phaser-Projektes sieht so aus:


var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update });

function preload() {

    game.load.image('sky', 'assets/sky.png');
    game.load.image('ground', 'assets/platform.png');
    game.load.image('star', 'assets/star.png');
    game.load.spritesheet('dude', 'assets/dude.png', 32, 48);

}

var platforms, player, cursors, stars;
var score = 0;
var scoreText;

function create() {

    //  We're going to be using physics, so enable the Arcade Physics system
    game.physics.startSystem(Phaser.Physics.ARCADE);

    //  A simple background for our game
    game.add.sprite(0, 0, 'sky');

    //  The platforms group contains the ground and the 2 ledges we can jump on
    platforms = game.add.group();

    //  We will enable physics for any object that is created in this group
    platforms.enableBody = true;

    // Here we create the ground.
    var ground = platforms.create(0, game.world.height - 64, 'ground');

    //  Scale it to fit the width of the game (the original sprite is 400x32 in size)
    ground.scale.setTo(2, 2);

    //  This stops it from falling away when you jump on it
    ground.body.immovable = true;

    //  Now let's create two ledges
    var ledge = platforms.create(400, 400, 'ground');

    ledge.body.immovable = true;

    ledge = platforms.create(-150, 250, 'ground');

    ledge.body.immovable = true;

    // The player and its settings
    player = game.add.sprite(32, game.world.height - 150, 'dude');

    //  We need to enable physics on the player
    game.physics.arcade.enable(player);

    //  Player physics properties. Give the little guy a slight bounce.
    player.body.bounce.y = 0.2;
    player.body.gravity.y = 300;
    player.body.collideWorldBounds = true;

    //  Our two animations, walking left and right.
    player.animations.add('left', [0, 1, 2, 3], 10, true);
    player.animations.add('right', [5, 6, 7, 8], 10, true);
    
    cursors = game.input.keyboard.createCursorKeys();
    
    stars = game.add.group();

    stars.enableBody = true;

    //  Here we'll create 12 of them evenly spaced apart
    for (var i = 0; i < 12; i++)
    {
        //  Create a star inside of the 'stars' group
        var star = stars.create(i * 70, 0, 'star');

        //  Let gravity do its thing
        star.body.gravity.y = 6;

        //  This just gives each star a slightly random bounce value
        star.body.bounce.y = 0.7 + Math.random() * 0.2;
    }    
    
    scoreText = game.add.text(16, 16, 'score: 0', { fontSize: '32px', fill: '#000' });

}

function update() {
        //  Collide the player and the stars with the platforms
    game.physics.arcade.collide(player, platforms);
    
    //  Reset the players velocity (movement)
    player.body.velocity.x = 0;

    if (cursors.left.isDown)
    {
        //  Move to the left
        player.body.velocity.x = -150;

        player.animations.play('left');
    }
    else if (cursors.right.isDown)
    {
        //  Move to the right
        player.body.velocity.x = 150;

        player.animations.play('right');
    }
    else
    {
        //  Stand still
        player.animations.stop();

        player.frame = 4;
    }

    //  Allow the player to jump if they are touching the ground.
    if (cursors.up.isDown && player.body.touching.down)
    {
        player.body.velocity.y = -350;
    }    
    
    // Prüfe ob die Sterne auf die Plattform treffen
    game.physics.arcade.collide(stars, platforms);
    
    // Prüfe ob der Spieler mit einem Stern kollidiert, falls ja gehe in die 
    // Funktion collectStar
    game.physics.arcade.overlap(player, stars, collectStar, null, this);
}

function collectStar (player, star) {

    // Removes the star from the screen
    star.kill();

    //  Add and update the score
    score += 10;
    scoreText.text = 'Score: ' + score;


}

Fazit

* In der Preload-Methode werden die Grafiken (PNGs) geladen. Spritesheets sind dabei Animationen, die als PNG vorliegen und die einzelnen Frames nebeneinander beinhalten.
* Die Objekte werden mit game.add.sprite in der entsprechenden Reihenfolge in der Create-Methode hinzugefügt
* Phaser besitzt 3 Physikengines. wobei Arcade die einfachste sein soll
** Arcade Physics
** Ninja Physics
** P2.JS Full-Body Physics
* Kollisionen werden immer in der Update-Prozedur abgefragt
* Tastatureingaben werden in der Update-Prozedur abgefragt
* Velocity ist die Geschwindigkeit, die ein Objekt bekommt

Anwendbarkeit

Wir haben hier eine fixe Welt, ich möchte aber sowas wie ein scorllendes Spiel nach dem Angry Birds Vorbild haben. Dafür brauche ich ein Beispiel. Die Frage ist, ob man Tilemaps, welche vorwiegend für scrollende Jump-and-runs wie Super Mario oder Giana Sisters verwendet werden benutzen sollte.

Ich suche also ein Beispiel das ich idealerweise nutzen kann…

Durchgehen der Phaser.io Examples

N

Debugging

Der Cloud9 Editor bietet die Möglichkeit, Break Points zu setzen. Ob diese Breakpoints nun das PHP oder Javascript debuggen können habe ich nicht rausgefunden, da sie keine Auswirkung haben. Allerdings hat mein Google Chrome Debugger auch recht nützliche Funktionen für das Debuggen. Nachteil ist, das man die Cloud9 Umgebung kurz verlassen muss. Man kann allerdings die URL (siehe Screenshot) des gestarteteten Webservers einfach in einen neuen Tab pasten.

Hierbei wunder ich mich wie lange dieser Webserver von c9.io laufen wird, da er ja für einen kostenlosen Account massig Systemressourcen frisst.

 

Canvas_debugging_with_chrome

Veröffentlicht unter Grafik, HTML/CSS, Javascript, Programmierung, Spaß und Spiel, Unsinn | Hinterlasse einen Kommentar

Javascript: CSV Datei zeilenweise einleise / read csv file line by line

Problem

Eine CSV Datei soll zeilenweise per Javascript eingelesen werden
A CSV file should be read line by line via javascript

Ansatz – Approach

Es wird die $.ajax-Funktion von JQuery verwendet. JQuery wird entsprechend http://jquery.com/download/ eingebunden.
We are using the $.ajax-Method of JQuery. JQuery will be embedded according to http://jquery.com/download/.

Lösung – Solution


$(document).ready(function() {
    $.ajax({
        type: "GET",
        url: "data.txt",
        dataType: "text",
        success: function(data) {processData(data);}
     });
});

function processData(allText) {
    var allTextLines = allText.split(/\r\n|\n/);
    var headers = allTextLines[0].split(',');
    var lines = [];

    for (var i=1; i<allTextLines.length; i++) {
        var data = allTextLines[i].split(',');
        if (data.length == headers.length) {

            var tarr = [];
            for (var j=0; j<headers.length; j++) {
                tarr.push(headers[j]+":"+data[j]);
            }
            lines.push(tarr);
        }
    }
    // alert(lines);
}
Veröffentlicht unter Javascript | Hinterlasse einen Kommentar

IBM Doors DXL: Attribute von Linkmodulen / Linkmodulobjekten ausgeben

Problem

Bei der Iteration über Linkmodule, sollen die Objekt-Attribute ermittelt werden.

Ansatz

* Öffnen Des Link Moduls
* Ausgabe der Modulattribute


Module m = current;

AttrDef ad = null;
		
for ad in m do
{
	print ad.name "\t\t" ad.description "\n";
}

Lösung – Solution


Absolute Number                        System Attribute
Created By                             System Attribute
Created On                             System Attribute
Description                            System Attribute
Fehlerverdacht rückwärts behoben		
Fehlerverdacht vorwärts behoben		
FG_FrameworkDescription		
Last Modified By                       System Attribute
Last Modified On                       System Attribute
Mapping                                System Attribute
Name                                   System Attribute
Prefix                                 System Attribute
Source                                 System Attribute
Source Index                           System Attribute
Suspicion Cleared Backwards		
Suspicion Cleared Forwards		
Target                                 System Attribute
Target Index                           System Attribute
Veröffentlicht unter Allgemein | Hinterlasse einen Kommentar

Kung Fury: Der Urvater der 80er Action-Trash-Filme mit Soundtrack von „The Hoff“ ist fertig

Der Film:

Und hier der Soundtrack:

Der Trailer beinhaltet Szenen, die nicht im Film sind:

Veröffentlicht unter Unsinn | Hinterlasse einen Kommentar

IBM DOORS DXL: Zurücksetzen mehrere Werte auf ihre gebaselinte Version

Problem

Mehrere Werte in einem Current Modul sollen auf ihre Werte in der letzten Baseline zurückgesetze werden.

Ansatz

* Einlesen der letzen Baseline.
* Filterung der betroffenen Objekte
** Hier Bsp. h.newValue==“Internal“ && h.attrName == „BB_Type“ && h.author==“karpbjde“ && h.date „“==“03/27/15 11:33:58″

Lösung

History h;
Module m = current;
Object o, baselineObject;

// Anstelle von getMostRecentBaseline(m) kann die Baseline auch definiert werden 
Baseline b = getMostRecentBaseline(m) 
Module mostRecentBaseline = load(m, b, false)

for baselineObject in mostRecentBaseline  do
{
  for h in baselineObject do
  {
    HistoryType hisType = h.type;

    if(hisType==modifyObject)
    {
	if(h.newValue=="Internal" && h.attrName == "BB_Type" && h.author=="karpbjde" && h.date ""=="03/27/15 11:33:58")
	{
           for o in m do
           {
             if(identifier(baselineObject) "" == identifier(o) "")
             {
                 print "Set " identifier(baselineObject) "\t" h.author "\t" h.date " to " h.oldValue "\n";
                 o."BB_Type" = h.oldValue;
                 break;
	      }
	    }
	}
      }
   }
}
Veröffentlicht unter DXL, IBM DOORS | Hinterlasse einen Kommentar