Re: Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- From: "Karsten Sosna" <k.sosna-NOSPAM@xxxxxxxxxxx>
- Date: Sun, 30 Oct 2005 06:40:18 +0100
> Viel einfacher ich suche nach simplen (wie auf dem guten alten Amiga) 2d
> Side Scrollern.
> Ala Turrican, Great Giana Sisters,Zout,R-Type,Blood Money und und und.
Kenne ich nicht.
Aber wenn es um "Jump 'n' run" kann ich Dir nur anraten mit DirectX
zuarbeiten, GDI+ oder GDI32 wird das nicht erledigen können. DirectX bedarf
aber auch fundamentiere Kenntnisse, ansonsten macht das keinen Spaß und
oftmals enden dann die Anwendungen mit einem Blue-Screen oder das System
reagiert gar nicht mehr.
Wenn Du mit DirectX arbeitest musst Du alles selber machen, dort gibt es
keine Control's die Dir Event's feuern. Hiermal mal ein Auszug aus einem
angefangen Spiel(Bei Bedarf schicke ich Dir auch das Projekt). Das ist nur
das Modul zur Intialisierung(DirectX7):
\\\
Module MOD_DirectX
Public DX7 As New DxVBLib.DirectX7()
Public DD7 As DxVBLib.DirectDraw7
Public DDScreenSurf As DxVBLib.DirectDrawSurface7
Public DDBackBufferSurf As DxVBLib.DirectDrawSurface7
Public DDBackgroundSurf As DxVBLib.DirectDrawSurface7
Public DDSpriteSurf As DxVBLib.DirectDrawSurface7
Public ddsdScreen As DxVBLib.DDSURFACEDESC2
Public ddsdBackground As DxVBLib.DDSURFACEDESC2
Public ddsdBackBuffer As DxVBLib.DDSURFACEDESC2
Public ddsdSprite As DxVBLib.DDSURFACEDESC2
Public rectScreen As DxVBLib.RECT
Public rectBackBuffer As DxVBLib.RECT
Public rectBackground As DxVBLib.RECT
Public rectSprite As DxVBLib.RECT
Public DDClip As DxVBLib.DirectDrawClipper
Public ScreenSize As Size
Public SpriteSize As Size
Public Sub InitDirectX(ByVal FRM As Form, ByVal strBackgroundFile As
String, ByVal strResourceFile As String)
DD7 = DX7.DirectDrawCreate("")
DD7.SetCooperativeLevel(FRM.Handle.ToInt32,
DxVBLib.CONST_DDSCLFLAGS.DDSCL_FULLSCREEN Or
DxVBLib.CONST_DDSCLFLAGS.DDSCL_ALLOWMODEX Or
DxVBLib.CONST_DDSCLFLAGS.DDSCL_EXCLUSIVE)
DD7.SetDisplayMode(ScreenSize.Width, ScreenSize.Height, 16, 0,
DxVBLib.CONST_DDSDMFLAGS.DDSDM_DEFAULT)
'Screen-Surface erzeugen
ddsdScreen.lFlags = DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_CAPS Or
DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_BACKBUFFERCOUNT
ddsdScreen.ddsCaps.lCaps =
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_PRIMARYSURFACE Or
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_FLIP Or
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_COMPLEX Or
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_VIDEOMEMORY
ddsdScreen.lBackBufferCount = 1
DDScreenSurf = DD7.CreateSurface(ddsdScreen)
' BackBuffer-Surface erzeugen
'Es werden die Eigenschaften und Beschreibungen der primären Surface
übernommen
Dim caps As DxVBLib.DDSCAPS2
caps.lCaps = DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_BACKBUFFER Or
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_VIDEOMEMORY
DDBackBufferSurf = DDScreenSurf.GetAttachedSurface(caps)
DDBackBufferSurf.GetSurfaceDesc(ddsdBackBuffer)
' Background-Surface erzeugen (Hintergrundbild)
ddsdBackground.lFlags = DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_CAPS
Or DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_WIDTH Or
DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_HEIGHT
ddsdBackground.ddsCaps.lCaps =
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_OFFSCREENPLAIN Or
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_VIDEOMEMORY
ddsdBackground.lWidth = ddsdBackBuffer.lWidth
ddsdBackground.lHeight = ddsdBackBuffer.lHeight
DDBackgroundSurf = DD7.CreateSurfaceFromFile(strBackgroundFile,
ddsdBackground)
' Sprite's-Surface erzeugen (Alle Symbole)
ddsdSprite.lFlags = DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_CAPS Or
DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_WIDTH Or
DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_HEIGHT
Dim IMG_Sprite As Image = Image.FromFile(strResourceFile)
ddsdSprite.lWidth = IMG_Sprite.Width
ddsdSprite.lHeight = IMG_Sprite.Height
ddsdSprite.ddsCaps.lCaps =
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_OFFSCREENPLAIN Or
DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_VIDEOMEMORY
DDSpriteSurf = DD7.CreateSurfaceFromFile(strResourceFile,
ddsdSprite)
' Clipper Objekt erzeugen
DDClip = DD7.CreateClipper(0)
DDClip.SetHWnd(FRM.Handle.ToInt32)
DDScreenSurf.SetClipper(DDClip)
' RectStrukturen
rectBackground.Bottom = ddsdBackground.lHeight
rectBackground.Right = ddsdBackground.lWidth
rectSprite.Bottom = ddsdSprite.lHeight
rectSprite.Right = ddsdSprite.lWidth
rectBackBuffer.Bottom = ddsdBackBuffer.lHeight
rectBackBuffer.Right = ddsdBackBuffer.lWidth
' Farbschlüssel definieren
Dim ColorKey As DxVBLib.DDCOLORKEY
ColorKey.low = RGB(0, 0, 0)
ColorKey.high = RGB(0, 0, 0)
DDSpriteSurf.SetColorKey(DxVBLib.CONST_DDCKEYFLAGS.DDCKEY_SRCBLT,
ColorKey)
DDBackBufferSurf.SetForeColor(System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.White))
DDBackBufferSurf.SetFontTransparency(True)
End Sub
End Module
///
Wenn Du noch die Logik und das Darstellen der einzelnen Frames dazu nimmst,
kannst Du Dir vielleicht vorstellen, dass das keine "Klicky"-Programmierung
wird. Obiger Code dient zur Abschreckung, wenn man sich damit nicht auskennt
und kein Interesse daran hat sich mit soetwas zubeschäftigen. Das ist aber
der einzige Weg, wenn man sehr schnelle Grafik-Ausgaben erreichen will, 85
FPS sind hier keine Seltenheit(Je nach Programmlogik und Peripherie
natürlich).
Wenn Du DirectX nutzen möchtest solltest Du Dir auf jeden Fall vernünftige
Lektüre zulegen(der Wälzer ca.650 Seiten hat mir geholfen; "diretx mit
visual basic programmieren" von Uwe Kettermann und Christian Schmelzer
erschienen im Markt & Technik-Verlag ISBN: 3-8272-5766-2 Preis ca. 50?).
Ansonsten natürlich auch die MSDN und das SDK sichten. Wenn mich nicht alles
täuscht gibt es auch eine MS-NG zu DirectX, musst Du aber selber mal
schauen.
Weiterhin "fällt und steht hier alles" mit der Programmlogik. Unnötige
Zeichenoperation müssen eliminiert werden(Objekt liegt außerhalb des
Screen`s). Die Zeichenoberfläche nur so groß halten, wie der Bildschirm ist,
alles andere führt zu unnötige Resource-Verbrauch und führt evtl. zum
Systemabsturz(Meine "kleine" Anwendung verbraucht ca. 35MB an
Arbeitsspeicher).
Bedenke, DirectX arbeitet immer mit Deiner Hardware zusammen und führt damit
"unmanaged Code" aus und somit werden die Treiber direkt angesprochen.
Machst Du das nicht richtig oder mit falschen Parametern "krachts"(und das
meißtens richtig, wenn Du Glück hast, schaffst Du es mit einem Reset). Will
Dir hier wirklich nicht gleich alles verderben, aber wenn Du mit DirextX
arbeitest ist wirklich Disziplin und Aufmerksamkeit angesagt.
Alles in allem kannst Du für soetwas GDI+ und GDI32 vergessen, für Spiele
ist DirectX angesagt
> Mal was ganz einfaches Back to the Roots.
Die fangen aber nicht bei der Programmierung oder der Sprache an, sondern
bei den Grundkenntnissen, kennst Du bspw. den Dijkstra-Algorithmus(>>
Wegfindung)?
Soetwas gehört auch dazu, hoffe Du bist Dir dem auch bewusst und das bspw.
n\m schneller ist als n/m oder das man durch binäre Opertionen Zeit
einsparen kann.
Hoffe ich konnte Dir erklären, das Spiele-Programmierung nicht einfach ist.
Manche Unternehemen sitzen dort mehrere Monate(mit vielen Entwicklern und
Zuarbeitern) dran, um eine Anwendung zu realisieren. So hat bspw.
EFX(Experiment Fighter Expiriment) ca. 14 Monate mit 150 Leuten gedauert.
Selbst MS-MineSweeper soll es AFAIK auf 4 Monate mit 10 Enteickern geschafft
haben.
--
Gruß Scotty
.
- Follow-Ups:
- Re: Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- From: Peter Heuer
- Re: Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- From: Herfried K. Wagner [MVP]
- Re: Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- References:
- Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- From: Kai Schmitt
- Re: Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- From: Kai Schmitt
- Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- Prev by Date: Re: *.dat Datei öffnen
- Next by Date: security settings
- Previous by thread: Re: Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- Next by thread: Re: Gibt es eigentlich gute Spiele in Vb.Net oder C# ?
- Index(es):