AdSense

Montag, 15. Juli 2013

Visual Studio - Fehler bei Projekt veröffentlichen

(Englich version) Tja, ein Fehler (Die Gültigkeit der Anwendung konnte nicht überprüft werden. Der Vorgang kann nicht fortgesetzt werden.) trat neulich bei Panzerkampf auf, nachdem ich den Joystick implementiert hatte:



Die Lösung ist aber zum Glück recht simpel: Ich musste im Joystick-Projekt unter Sicherheit "ClickOnce-Sicherheitseinstellungen aktivieren" und dort dann auf "Voll vertrauenswürdige Anwendung" klicken, danach funktionierte alles.

Freitag, 12. Juli 2013

C# - Joystick ansprechen

(English version) Da Konsolen doof sind möchte ich in nächster Zeit versuchen, mehrere Gamepads an einem Windows-PC zum laufen zu bringen, da kommen also eventuell noch einige interessante Posts.

Fürs Erste spreche ich einen Joystick an. Das geht so: Ich benutze das Joystick-Projekt von hier, das ganze wird einfach in ein neues Windows Forms Projekt in eine Klasse Joystick.cs geschmissen (Und Direct X eingebunden, mehr dazu hier). Ich habe das Projekt leicht umgeschrieben: ganz unten public delegate void OnAxeChanged(Int32 X, Int32 Y, Int32 Z, Int32 Rz);, also die Achse Z eingefügt und dann natürlich noch beim Aufruf von AxeChanged: AxeChanged.Invoke(X, Y, Z, Rz);.

Mein restliches Programm (um z.B. die x-Achse auszulesen) sieht dann so aus (man muss natürlich das Joystick-Projekt einbinden):

public partial class Form1 : Form
{
    Joystick.Joystick joystick;
    public Form1()
    {
        InitializeComponent();
        joystick = new Joystick.Joystick(this, true);
        joystick.PushChange += joystick_PushChange;
        joystick.AxeChanged += joystick_AxeChanged;
    }

    void joystick_AxeChanged(int X, int Y, int Z, int Rz)
    {
        System.Console.Write("Axis: {0}\t{1}\t{2}\t{3}\n", X, Y, Z, Rz);
    }

    void joystick_PushChange(int Push)
    {
        System.Console.Write("Push: {0}\n", Push);
    }
}


Damit lassen sich jetzt beliebig viele Sachen anstellen, z.B. Panzerkampf per Joystick steuern. Events gibt es glücklicherweise auch für alles (Tasten, Achsen, etc), also sollte man damit gut arbeiten können.

Falls jemand das fertige Joystick-Projekt haben möchte, kann ich es hochladen, aber eigentlich sollte das erstellen des Projektes trivial sein.

Falls jemand mehrere Joysticks ansprechen will muss er eine von mir aktualisierte Version des Projektes benutzen: JoystickMultiple. Das Grundprinzip ist das gleiche geblieben, man kann das Joystick-Projekt wie bisher benutzen oder aber auch gezielt einzelne Joysticks ansprechen. Das geht dann so:

Dictionary<Guid, string> foundSticks = Joystick.Joystick.GetAllJoysticks();
foreach (KeyValuePair<Guid, string> pair in foundSticks)
{
    Joystick.Joystick localStick = new Joystick.Joystick(this, false, pair.Key);
    System.Console.Write("stick: {0}\n", pair.Value);
    localStick.ButtonDown += joystick_ButtonDown;
}


joystick_ButtonDown sieht bei mir folgendermaßen aus:

void joystick_ButtonDown(int ButtonNumber, Joystick.Joystick stick)
{
    System.Console.Write("{1} - Button: {0}\n", ButtonNumber, stick.Name);
}


Man bekommt in der von mir veränderten Klasse also ganz einfach bei jedem Event den Joystick zurück und kann damit arbeiten. Wie jedoch auch bei DirectSound muss für das DirectInput-Zeug die app.config bearbeitet werden: <startup> muss verändert werden zu <startup useLegacyV2RuntimeActivationPolicy="true">, sonst wird das Programm nicht ausgeführt.

Ein kleines Spiel mit PHP

(English version) Vor einiger Zeit habe ich mal angefangen, ein kleines textbasiertes Spiel in PHP zu schreiben. Das Spiel orientiert sich an ähnlichen, bekannten Spielen wie z.B. Legend of the Green Dragon.

Bisher ist nicht viel implementiert, man kann im Wald gegen neutrale Monster kämpfen und sich in der Stadt heilen lassen bzw. bessere Waffen kaufen. Über den folgenden Link kann man das Spiel ausprobieren:

Spiel

Da ich ziemlich unkreativ bin gibt es noch keinen Namen für das Spiel, ebensowenig sind irgendwelche Farben, Hintergründe oder ähnliches implementiert.

Über Anregungen jeglicher Art freue ich mich, falls also jemand eine Idee hat, was dem Spiel fehlt, was man besser machen könnte, oder einen Bug findet - einfach ein Kommentar schreiben.

Donnerstag, 11. Juli 2013

Besucherzähler mit PHP

(English version) Ein Besucherzähler mit PHP lässt sich total simpel realisieren. Das Grundprinzip ist: Jedes mal wenn eine Seite geöffnet wird, wird ein PHP-Skript ausgeführt, welches eine Datei mit der alten Besucherzahl öffnet, diese Zahl um 1 erhöht und dann wieder abspeichert. Für mein Beispiel muss die Datei "counter.dat" im selben Verzeichnis wie die PHP-Datei liegen. Der Code für den Besucherzähler ist folgender:

$fileName="counter.dat";
$fileHandle=fopen($fileName, 'r') or die("can't open file");
$count = 0;
if(!feof($fileHandle))
{
  $input = fgets($fileHandle, 4096);
  $count = intval($input);
  $count++;
}
fclose($fileHandle);

if ($count != 0)
{
  $fileHandle = fopen($fileName, 'w') or die ("can't open file");
  fwrite($fileHandle, $count);
  fclose($fileHandle);
}
echo('Besucher: '.$count);


Natürlich lässt sich das auch schöner darstellen, im Moment geht es aber nur um die grundsätzliche Funktionalität.

ATmega - Einfaches und kompaktes Thermometer mit dem DS18S20

(English version) Um endlich mal ein kompaktes, abgeschlossenes Projekt mit ATmega8 und DS18S20 zu haben, habe ich heute aus den beiden Teilen ein Thermometer gebaut. Das Ergebnis:
Für das Projekt benötigt man: 1 Steckbrett, 1 ATmega8, 1 DS18S20, 3 7-Segment-Anzeigen mit Decoder, einen Quarz (nicht notwendig) für den ATmega und viele, viele Kabel.

Fangen wir unten an: Der ATmega ließt die Temperatur des DS18S20 aus, genau wie hier: ATmega - Temperaturmessung mit dem DS18S20. Die Verkabelung direkt am ATmega sieht folgendermaßen aus:
An PORTD0 und PORTD1 hängt der mittlere Fuß des DS18S20, PORTD0 ist Ausgang, PORTD1 ist Eingang. Danach rechnet der ATmega die Temperatur in die 3 Stellen um und gibt das entsprechend an die 7-Segment-Decoder weiter, welche das dann wiederum weiter an die Anzeige geben.
So sah das Steckbrett am Anfang aus, ohne die vielen Kabel. Zu beachten ist, dass ich zwischen den 7-Segment-Anzeigen nachträglich eine Reihe frei gelassen habe. Der Code für den ATmega kann hier heruntergeladen werden: Quellcode. Die Ausgänge sind folgendermaßen: PORTC0..3: Zehner, PORTB0..3: Einer, PORTD4..7: Nachkommastelle. Diese werden einfach an die 7-Segment-Decoder (bei mir: 74HC4543) gelegt.

Von dort gehen 7 Kabel je Decoder weiter an die Anzeigen. Da das mit einzelnen Kabeln etwas nervig wäre habe ich mir vor einiger Zeit spezielle "Adapter"-Kabel gebaut, welche gleich den benötigten Vorwiderstand (220 Ohm) beinhalten. Das Zusammenlöten war ein gutes Stück Arbeit, im Nachhinein lohnt es sich aber. Falls jemand weitere Fragen zu diesen Kabeln hat, einfach bei den Kommentaren melden. Das Kabel sieht so aus:


Mittwoch, 10. Juli 2013

C# - Auf SQL-Datenbank zugreifen

(English version) Eine SQL-Datenbank ist etwas ziemlich mächtiges. Für einen SQL-Server gibt es kostenlose Software (z.B. MySQL) welche auch nicht sonderlich schwer einzurichten ist. Ich gehe davon aus, dass man sich mit SQL auskennt, und weiß was man dem Server senden möchte und wie das mit SQL geht. Um von C# dann auf diesen Server zuzugreifen geht man folgendermaßen vor:

string server = "serverName";
string database = "databaseName;
string uid = "userName";
string password = "password;
string table = "tableName;


string connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";

MySqlConnection connection = new MySqlConnection(connectionString);
connection.Open();

string query = "some SQL query";

MySqlCommand cmd = new MySqlCommand(query, connection);


try
{
  cmd.ExecuteNonQuery();
}
catch (Exception)
{}

Montag, 8. Juli 2013

C# - Klasse in xml-Datei serialisieren

(English version) Um Klassenstrukturen in eine Datei zu schreiben ohne sich dabei um das Dateiformat kümmern zu müssen gibt es bei C# einen Serializer. Dieser kann ganz einfach komplette Klassen (welche durchaus auch Unterklassen beinhalten dürfen). In einer Klasse muss jedes Objekt, welches mit abgespeichert werden soll, markiert werden. Das sieht dann so aus:

[DataContract()]
public class TestClass
{
  [DataMember()]
  public int testInt = 5;
  [DataMember()]
  public string testString = "Test";
}


Man muss also vor die Klasse [DataContract()] schreiben und dann vor jedes Objekt, welches abgespeichert werden soll [DataMember()]. Ich musste bei mir in den Verweisen von Visual Studio noch System.Runtime.Serialization hinzufügen.

Um nun z.B. die Klasse testClass welche vom Typ TestClass ist abzuspeichern, benötigt man 5 Zeilen Code. Das sieht dann so aus:

var writer = new FileStream("outputFileName.xml", FileMode.Create);
Type type = testClass.GetType();
DataContractSerializer serializer = new DataContractSerializer(type);
serializer.WriteObject(writer, testClass);
writer.Close();


Die produzierte Datei sieht dann folgendermaßen aus:

<?xml version="1.0"?>
<TestClass xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SerializeTest">
<test1>5</test1>
<test2>Test</test2>
</TestClass>


Man kann also sofort auf einen Blick sehen, welchen Wert welches Objekt hat, was beim Serialisieren in eine Datei im binary-Format nicht möglich ist.

Um nun die Datei wieder einzulesen geht man folgendermaßen vor:

var reader = new FileStream("outputFileName.xml", FileMode.Open);
Type type = testClass.GetType();
DataContractSerializer deSerializer = new DataContractSerializer(type);
testClass = (TestClass)deSerializer.ReadObject(reader);
reader.Close();