Tetris nachprogrammieren in Java
Ich hatte ja nun schon einige Java Tuts hier im Blog, auch zwei Spiele waren dabei (Fill IT und Snake). Nun bin ich letztens über mein erstes Java Spiel-Projekt gestolpert, da habe ich nämlich versucht Tetris nachzubasteln.
Das Ergebnis von diesem kleinen Projekt könnt ihr hier in dem Bild links betrachten.
Im Nachhinein weiß ich, dass ich lieber ein anderes (einfacheres) Spiel als erstes Projekt hätte wählen sollen, Snake oder so, denn ich habe knapp vier Wochen an diesem hier gesessen.
Natürlich hat es sich dennoch gelohnt und ich habe viel bei der Entwicklung gelernt, und dabei ist eine komplett spielbare Version bei herausgekommen!
Da dies mein erster Gehversuch war ist der Code natürlich nicht wirklich professionell und (wahrscheinlich) voll von irgendwelchen Anfängerdummheiten, desweiteren sind noch einige (meist kleinere) Bugs und Probleme vorhanden, die das Spielvergnügen trügen!
Die gute Nachricht ist aber, dass ich vieles kommentiert habe, und man sich somit relativ schnell in den Code einlesen kann!
Features:
- Bekanntes Spielprinzip
- Vier verschiedene Objekte (Zwei fehlen zum Original -> L-Blöcke)
- Punkteanzeige
- Anzeige der nächsten Figur
- Vier verschiedene Schwierigkeitslevel
Bekannte Probleme:
- Unterste Zeile ist fehlerhaft
- Man kann Objekte nach rechts aus dem Bildschirm schieben
- Die Oberfläche neigt zum "blinken"
- Die Steuerung ist nicht "flüssig"
- Letzter Schwierigkeitsgrad ist unspielbar, da zu schnell
- Stürzt manchmal ab, sobald die erste Figur unten ankommt
Die oben gelisteten Bugs sind da, stören aber nur wenig. Da ich nicht die Absicht habe dieses Spiel weiterzuentwickeln, schreibt mir bitte keine Kommentare oder Mails mit weiteren Fehlern oder Bugs.
Falls ihr selber an einem solchen Spiel arbeitet und fragen zu dem Aufbau oder dem Quellcode habt könnt ihr mich natürlich gerne kontaktieren.
Folgendes solltet ihr schon mal gesehen haben um dem Quellcode zu verstehen:
- Vererbung
- Abstrakte Klassen
- GUI Programmierung
- Zeichnen (Java Graphics Klasse)
- Allgemeine Objekt Orientierte Programmierung
- Gute Kenntnisse der Basis Java Klassen
Die Downloads findet ihr hier:
.NET Administratorrechte fuer eigenes Programm einfordern
Wenn man mit .NET entwickelt wird man schnell feststellen, dass man zur Laufzeit bestimmte Ordner nicht öffnen kann, bestimmte Dateien nicht löschen oderbestimmte Systemfunktionen nicht ausführen kann!
Das liegt daran, dass dem Programm die nötigen Rechte fehlen, denn seit Windows Vista werden alle Programme ohne Administratorrechte ausgeführt. Braucht ein Programm dann aber doch diese Rechte sieht man diesen wenig gemochten Dialog von Windows:
Bild 1: Windows Benutzerkontensteuerung in Aktion
Das Angezeigte unterscheidet sich dann natürlich je nach Programm, aber sobald man hier auf Zulassen geklickt hat wird das Programm mit den Vollen Rechten gestartet.
Aber woran kann ich erkennen, dass ich volle Rechte benötige? - Ganz einfach, wenn man Fehlermeldungen erhält, die besagen, dass man keine Rechte besitzt um auf die Dienste zuzugreifen, oder wenn Systemfunktionen (zB. WMI) nicht mehr korrekt ausgeführt werden.
Wie sorge ich nun dafür, dass mein Programm Adminrechte erhält? - Hier gibt es zwei Möglichkeiten. Die erste ist es das Programm mit rechter Maustaste anzuklicken und dann "Als Administrator ausführen" zu wählen:
Bild 2: So kann man jedem Programm Administratorrechte geben
Natürlich kann man die Adminrechte direkt in unserem Programm beantragen, in dem man in den Projekteinstellungen im Tab "Anwendung" auf den Button "Einstellungen für die Benutzerkonstensteuerung anzeigen" klickt. Dazu wird die Datei "app.manifest" im Projektordner generiert, die dann folgende Einstellungen beinhaltet:
<!-- UAC-Manifestoptionen
Wenn Sie die Ebene der Benutzerkontensteuerung für Windows ändern
möchten, ersetzen Sie den Knoten "requestedExecutionLevel" wie folgt:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Wenn Sie aus Gründen der Abwärtskompatibilität Datei- und Registrierungsvirtualisierung
verwenden möchten, löschen Sie den Knoten "requestedExecutionLevel".
-->
Wie man in dem Grünen Kommentarblock erkennen kann, gibt es drei verschiedene Einstellungsmöglichkeiten, nämlich level="asInvoker" (welcher voreingestellt ist), level="requireAdministrator" und level="highestAvailable".
requestedExecutionLevel level="requireAdministrator" uiAccess="false"
Wenn man nun den unter dem Kommentarblock stehenden Eintrag requestedExecutionLevel auf requireAdministrator ändert, wird unser Programm bei jedem Start automatisch Administratorrechte einfordern, und man wird bei jedem Start diesen unschönen Windows Dialog aus Bild 1 zu sehen bekommen.
Wie ihr euch sicher grade denkt ist das sehr unangenehm für den Benutzer, der später mit der Software arbeiten muss. Dieser muss jedes Mal die Ausführung dieses Programms bestätigen. Außerdem sollte man im Hinterkopf behalten, dass Microsoft diesen Dialog nicht zum Spaß eingeführt hat.
So sollte man immer versuchen seine Software so zu gestalten, dass man auch ohne Administratorreche auskommt. Sollte es aber nicht anders gehen, sollte man den Teil, der diese Rechte benötigt stets aus dem Programm auslagern, sodass dieser Spezielle Fall dann gesondert aufgerufen werden kann und man den Benutzer ggf darauf vorbereiten kann, dass gleich eine Meldung von Windows kommt.
Das Hauptprogramm kann und sollte dann auch weiterhin mit dem geminderten Rechten laufen. So verwirrt man den Benutzer nicht und kann Fehlerquellen später besser eingrenzen.
Programmfortschritt in der Windows Taskleiste anzeigen
Wenn ihr Windows 7 bereits verwendet, werden euch sicherlich einige Neuerungen aufgefallen sein. Einige von denen ist die neue Funktion der Taskleiste den Fortschritt eines Programms darzustellen.
Ihr werdet dies beobachten, wenn ihr z.B. eine Datei mit dem Internet Explorer 8 herunterladet oder eine Datei kopiert. Das Programm zeigt den eigenen Fortschritt dann unter dem Eigenen Symbol in der Taskleiste an.
Diese Funktion ist extrem praktisch, so kann man sie benutzen um den Benutzer immer aktuell zu halten, ohne dass er das eigentliche Programm offen hat. Mögliche Anwendungsfälle wären Dateidownloads, Kopiervorgänge, Bildererzeugung und allgemeine Vorgänge, die etwas Zeit in Anspruch nehmen.
Natürlich können auch wir diese Funktionen in unseren Projekten nutzen. Leider werden die Aufrufe an das Betriebssystem unmanaged gestartet, was bedeutet, dass diese Aufrufe umgewandelt (gewrapped) werden müssen. Da das ein sehr komplexer Vorgang ist hat Microsoft uns diesen gespart und schon einige vorgefertigte Klasse angefertigt auf die wir zurückgreifen können.
Diese Librarys finden wir im MSDN in der .NET Interop Sample Library. Diese Beispielsammlung enthällt viele weitere Beispiele. Wir betrachten hier nur das was mit dem Fortschrittsbalken in der Taskleiste zu tun hat.
Deswegen brauchen wir auch nicht alle Klassen, sondern nur diese:
Vista Bridge Sample Library
Windows7.DesktopIntegration
Windows7.DesktopIntegration. Registration.
Windows7.DesktopIntegration enthält hierbei die Klasse WindowsFormsExtensions, welche uns die nötigen "Extensions"-Funktionen zur Verfügung stellt um das Aussehen der Taskleiste ändern zu können.
In unserem (einfachen) Fall werden wir nur die beiden Methoden benötigen:
SetTaskbarProgress(float percent)
SetTaskbarProgressState(ThumbnailProgressState state)
Mit der Ersten Methode können wir den Fortschritt der Progressbar steuern, und mit der zweiten das Aussehen. Für die zweite Funktion müssen wir neben dem Zustands Parameters auch das Handle des Fensters angeben, für das die Aktion ausgeführt wird.
So könnten die Aufrufe folgendermaßen aussehen:
WindowsFormsExtensions.SetTaskbarProgress(Me.ProgressBar1)
WindowsFormsExtensions.SetTaskbarProgressState(Me, _
Windows7Taskbar.ThumbnailProgressState.Error)
Garnicht mal so kompliziert oder?
Dabei kann das Taskleistensymbol unseres Programms 5 verschiedene Werte annehmen:
Wenn wir nun also ein neues Windows Forms Projekt erstellen müssen wir ersteinmal die drei oben erwähnten Class Librarys importieren. Das machen wir in dem wir über Datei->Hinzufügen->Vorhandenes Projekt wählen
Auf diese Weise fügen wir alle drei oben erwähnten Projekte dem unseren hinzu. Wenn das geschafft ist müssen wir noch die nötigen Verweise hinzufügen. Dazu wählen wir Projekt->Verweis hinzufügen... und dann den Tab "Projekte"
Hier wählen wir alle drei Projekte aus und klicken auf "OK"!
Wie ihr nun im Projektmappen Explorer erkennen werdet ist das Projekt gleich mal um einiges gewachsen! Ihr könnt dieses Vorgehen auch umgehen, indem ihr die importierten Class Librarys als DLL kompiliert und direkt in das Projekt einbindet. Das schafft vielleicht mehr Übersicht.
Nun haben wir schon das größte Hindernis schon überwunden! Nun gehts ans Programmieren, wofür ihr die oben vorgestellten Funktionen benutzen könnt um eurem Programm den nötigen Windows 7 Look zu verpassen!
Ich habe dazu wie immer eine kleine Demo angefertigt. Meine sieht so aus:
Bild 4: Das Demoprojekt in Aktion
Das Demoprojekt könnt ihr hier laden: Download [VS 2008]
VB.NET: Saubere Klassen erstellen mit Properties
Heutzutage wird fast nurnoch Objektorientiert programmiert. Das bedeutet, dass ein größeres Projekt schnell mal auf eine Klassenanzahl von 100 und mehr wächst.
Damit man den Überblick behält und den Code, den man schon geschrieben hat möglichst wiederverwenden kann, sollte man ein paar grundlegende Regeln beachten.
In diesem Artikel möchte ich ein Beispiel zeigen, wie man eine Klasse in ein Projekt integriert und dank der benutzten Standardmethoden an ein Datagrid bindet.
Warum schreibe ich diesen Artikel überhaupt? Erst gestern habe wurde in einem Forum die Frage gestellt, warum man eine Liste (Of T) nicht als DataSource für ein DataGridView benutzen kann. Dabei ist das sehr wohl möglich, der User hat seine Klasse aber "unschön" gestaltet, weswegen sich die anderen Steuerelemente auch quer gestellt haben.
Hier ein Beispiel einer solchen "Unschönen" Klasse:
Public Class Auto
Public marke As String
Public motor As String
Public geschw As Integer
End Class
Dim al As New List(Of Auto)
al.Add(New Auto With {.marke = "VW", .motor = "Diesel", .geschw = 0})
al(0).geschw += 10
Wie man sieht sind hier alle Klassenvariablen öffentlich zugänglich, und die Klasse hat keinerlei Kontrolle darüber, wie sie befüllt werden. Ein weiterer Nachteil ist auch die Inkompabilität zu anderen Steuerelementen, da diese einen Standardkonformen Aufbau der Klasse erwarten. Finden sie bestimmte Elemente in der Klasse nicht so verweigern diese die Funktionalität!
Wie müsste diese Klasse also umgebaut werden, damit diese kompatibel zu anderen Objekten wird?
Public Class Auto
Private geschw As Integer
Public Sub New(ByVal marke As String, ByVal motor As String)
Me.Marke = marke
Me.Motor = motor
End Sub
Private _marke As String
Public Property Marke() As String
Get
Return _marke
End Get
Set(ByVal value As String)
_marke = value
End Set
End Property
Private _motor As String
Public Property Motor() As String
Get
Return _motor
End Get
Set(ByVal value As String)
_motor = value
End Set
End Property
Public Sub beschleunigen(ByVal a As String)
geschw += a
End Sub
Public Sub bremsen(ByVal a As String)
geschw -= a
End Sub
End Class
Wie man sieht ist die Klasse nun natürlich um einiges länger geworden. Leider kann man das zur zeit noch nicht anders machen. Aber Abhilfe kommt in der neuen VB.NET Version, wo man die properties so wie in C# 3.0 erstellen kann.
Die Zugriffe auf die Klassenvariablen werden nun über properties gesteuert, die nun auch zB. überprüfen könnten, ob der übergebene Wert überhaupt passt und gegebenenfalls noch Änderungen daran vornehmen.
Aber was bringt uns nun dieser längere Aufbau der Klasse? Nun, wenn wir unser Objekt, das aus dieser Klasse entsteht an andere Objekte übergeben, erwarten diese, dass sie properties vorfinden, mit denen sie arbeiten können.
Hat die Klasse keine Properties so können wir auch bestimmte Funktionen auch nicht benutzen. Ich möchte das mal an einem DataGridView demonstrieren, da dieses Element von den properties sehr schön Gebrauch macht!
Fügt man folgenden Code einem Form mit einer DataGridView hinzu:
Private Sub Form1_Load() Handles MyBase.Load
Dim autos As New List(Of Auto)
autos.Add(New Auto("VW", "Diesel"))
autos.Add(New Auto("Audi", "Benziner"))
autos.Add(New Auto("Mercedes", "Diesel"))
autos.Add(New Auto("Renault", "Diesel"))
autos.Add(New Auto("BMW", "Beziner"))
Dim bs As New BindingSource
bs.DataSource = autos
Me.DataGridView1.DataSource = bs
End Sub
erhält man folgendes Bild:
Bild 1: Die Datagridview stellt alle Informationen angenehm dar
Wie man sieht konnte man mit nur 3 Zeilen Code (Abgesehen vom Erzeugen der Werte) alle Daten der Liste visualisieren. Man beachte desweiteren, dass sogar die Namen der Properties (Marke und Motor) ausgelesen werden und der richtigen Tabelle zugeordnet werden!
Dies könnte man natürlich auch ohne Properties hinbekommen, doch würde man viel mehr Aufwand betreiben müssen und man denke an die Zukunft, in der unser Modell sehr einfach zu warten wäre.
Hier gibts ein kleines Demoprojekt: Download [VS 2008]
ASP.NET: Erzeugen eines MD5 Hashs
Wer sich schon mal mit PHP auseinander gesetzt hat, wird wissen wie einfach es ist dort einen MD5 Hash zu einem Wert zu berechnen. Dies geht dort sehr simpel mit der Funktion "MD5($wert);".
Leider oder zum Glück ist es in in ASP.NET etwas komplexer aufgebaut. Somuss man hier erst Instanzen von Kryptographie Klassen erstellen, bevor man endlich den gewünschten MD5 String bekommt.
So sieht der Code dafür aus:
using System.Security.Cryptography;
using System.Text;
public String MD5(String wert)
{
byte[] bWert = Encoding.UTF8.GetBytes(wert);
MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hash = md5.ComputeHash(bWert);
string md5Wert = BitConverter.ToString(hash).Replace("-", "").ToLower();
return md5Wert;
}
Mit dieser Funktion bekommt man einen sauberen MD5 Hash in Kleinbuchstaben. Diese Funktion lässt sich nun so benutzen wie unter PHP um bequem MD5 hashes zu berechnen.
Windows Aero Glas in eigenen Projekten nurzen Teil 3
Es ist etwas Zeit seit dem zweiten Teil vergangen, und wie ich in den Kommentaren sehe, sind da noch ein paar Fragen offen!
Das Hauptproblem mit den Glasoberflächen unter Windows sind die GDI und GDI+ Komponenten, diese unterstützen keine Transparenz. Das macht es so schwierig diese auf Glas ordentlich zu rendern.
Wenn ihr meine persönliche Meinung hören wollt, lasst es ganz bleiben! Denn seit knapp 4 Jahren stellt Microsoft uns ein sehr mächtiges grafisches Werkzeug zur Verfügung, nämlich WPF.
WPF soll die neue Präsentationsschicht unter Windows werden. Das heißt WPF regelt wie die UI-Elemente, die wir sehen, zb. Knöpfe und Fenster aussehen und sich verhalten!
Aber ich will nicht weiter auf den Aufbau von WPF eingehen, für uns ist wichtig zu wissen, dass in WPF alle Elemente die Transparenz beherrschen. Das macht sie für uns perfekt um sie auf Glas einzusetzen!
Bild 1: Ein in WPF gerendertes Fenster mit Steuerelementen
Wie man auf dem Bild 1 gut erkennen kann, sieht man keine verpixelten Texte mehr und der Hintergrund ist wunderbar Transparent, auch bei dem Button!
Alle WPF Steuerelemente beherrschen viel mehr Optische Funktionen, so sind die beiden ProgressBars im Bild 1 ebenfalls Transparent. Das geht nicht mit GDI+!
Für alle die jetzt denken, oh nein, ich will nicht schon wieder eine neue Sprache erlernen, kann ich für Entwarnung sorgen. Auch unter WPF wird mit VB.NET und C# programmiert. Ihr könnt euren Code in 80% der Fälle komplett übernehmen!
Wie gesagt liegt der Schwerpunkt von WPF auf der Präsentation, deswegen werdet ihr die alten Grafik-Klassen nicht mehr wiederfinden. Desweiteren gibts auch keine Windows.Forms mehr, sondern nurnoch Windows (Fenster). Dies sind ein paar der Stolperfallen, durch die man sich kämpfen muss und an die man sich gewöhnen muss.
Wie ihr an dem folgenden Beispielcode sehen werdet, werdet ihr viel wiedererkennen:
Imports System.Runtime.InteropServices
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Windows.Media
Imports System.Windows
Imports System.Windows.Interop
Public Class GlassForm
_
Private Shared Sub DwmExtendFrameIntoClientArea _
(ByVal hwnd As IntPtr, ByRef margin As MARGINS)
End Sub
_
Public Shared Function DwmIsCompositionEnabled() As Boolean
End Function
Public Shared Function ExtendGlassFrame(ByVal window As Window, _
ByVal margin As MARGINS) As Boolean
If Not DwmIsCompositionEnabled() Then
Return False
End If
Dim hwnd As IntPtr = New WindowInteropHelper(window).Handle
' Hintergrundfarbe auf Tranzparent setzen, für WPF und die Win32 Ansicht
window.Background = Brushes.Transparent
HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = _
Colors.Transparent
Dim margins As New MARGINS(margin.left, margin.right, _
margin.top, margin.bottom)
DwmExtendFrameIntoClientArea(hwnd, margins)
Return True
End Function
End Class
Public Structure MARGINS
Public left As Integer
Public right As Integer
Public top As Integer
Public bottom As Integer
Public Sub New(ByVal l As Integer, ByVal r As Integer, _
ByVal t As Integer, ByVal b As Integer)
left = l
right = r
top = t
bottom = b
End Sub
End Structure
Wie man sieht ähnelt der Code sogar sehr dem aus Teil 2. Nur die entsprechenden (in WPF nicht mehr vorhandenen) Elemente wurden angepasst.
Das tolle hierran ist, dass wir nun alle Steuerelemente benutzen können die wir wollen, ohne uns Sorgen machen zu müssen wie diese gerendert werden!
Das Demoprojekt gibts es hier: Download [VS 2008]
<< Teil 2 des Tutorials | Teil 4 >>
Eventuell schiebe ich noch einen vierten Teil nach, warten wir ersteinmal eure Reaktionen ab
Uebersicht mit kostenlosen E-Books gestartet
Wie ihr erkennen könnt gibt es seit heute oben im Menü einen neuen Knopf namens "E-Book".
Auf dieser Seite habe ich alle (mir bekannten) kostenlosen E-Books aufgelistet. Das wollte ich schon immer mal machen, habe mir aber erst heute die Zeit dafür genommen!
Die Liste ist aber auch noch ausbaufähig, und ich bin auf euch angewiesen! Sicher kennt ihr noch anderen kostenlose Bücher, die in den unendlichen Weiten des WWW versteckt sind!
Da ich meine eigene kleine Sammlung auch gerne ausbauen will, hoffe ich, dass der eine oder andere Tipp von euch reinkommt!
Wenn das so ist, schreibt mir einfach ne Mail oder einen Kommentar mit dem Link und ich werde das Buch auch in die Liste übernehmen!
Bitte nur Bücher angeben, die sich mit Anwendungsentwicklung auseinander setzen.
Kostenloses E-Book von Microsoft zum Thema VB.NET
Es ist wieder soweit. Microsoft bietet wiedermal ein Buch komplett gratis zum Download an. Dieses Mal ist Visual Basic.NET das Thema.
Das Buch ist von dem Hauseigenen Verlag MicrosoftPress, welches einen sehr guten Ruf genießt. Ich selber habe mehrere Bücher von denen.
Dieses Buch kostet normalerweise 59 € und ist somit ein sehr gutes "Schnäppchen". Dabei kann es sich vom Inhalt sehen lassen. Dieses Buch vermittelt alles von den Grundlagen, bishin zur fortgeschrittenen Programmierung mit Datenbanken.
Auch wenn ihr kein VB.NET Programmierer Seit kann ich es euch trotzdem empfehlen dieses Buch zu laden, den man weiß ja nie!
Download: Hier



