DirectX spustit Rendering   zodpovězená otázka

VB.NET, DirectX, Grafika

Zdravím,

mám aplikaci založenou na článku Tomáše Hercega o DirectX (článek č. 2)

zdroj je takový (jen Form1.vb):

Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectDraw

Public Class Form1
    Dim src = 0

    Dim dev As Device       'zařízení 
    Dim backBuffer As Surface, backBufferDesc As SurfaceDescription     'BackBuffer a jeho parametry 
    Dim frontBuffer As Surface, frontBufferDesc As SurfaceDescription   'FrontBuffer a jeho parametry 
    Dim clip As Clipper     'oříznutí

    'surfaces
    Dim Title As Surface
    Dim StartGame_leave As Surface
    Dim StartGame_hover As Surface
    Dim HighScores_leave As Surface
    Dim HighScores_hover As Surface
    Dim Options_leave As Surface
    Dim Options_hover As Surface
    Dim Credits_leave As Surface
    Dim Credits_hover As Surface
    Dim QuitGame_leave As Surface
    Dim QuitGame_hover As Surface
    Dim Beginner_leave As Surface
    Dim Beginner_hover As Surface
    Dim Normal_leave As Surface
    Dim Normal_hover As Surface
    Dim Expert_leave As Surface
    Dim Expert_hover As Surface
    Dim Master_leave As Surface
    Dim Master_hover As Surface
    Dim TimeOut As Surface
    Dim YourScore As Surface

    Public Sub createDevice()
        'vytvořit a nastavit zařízení 
        dev = New Device()
        dev.SetCooperativeLevel(Me, CooperativeLevelFlags.FullscreenExclusive)
    End Sub

    Public Sub createBuffers()
        'kontrola 
        If Not Me.Focused Then Exit Sub

        'nastavit zařízení 
        dev.SetCooperativeLevel(Me, CooperativeLevelFlags.FullscreenExclusive)

        'vytvořit FrontBuffer 
        If frontBuffer IsNot Nothing Then
            frontBuffer.Restore()
        Else
            frontBufferDesc = New SurfaceDescription()
            frontBufferDesc.SurfaceCaps.PrimarySurface = True
            frontBufferDesc.SurfaceCaps.Flip = True
            frontBufferDesc.SurfaceCaps.Complex = True
            frontBufferDesc.BackBufferCount = 1
            frontBuffer = New Surface(frontBufferDesc, dev)
        End If

        'vytvořit BackBuffer 
        If backBuffer IsNot Nothing Then
            backBuffer.Restore()
        Else
            backBufferDesc = New SurfaceDescription()
            backBufferDesc.SurfaceCaps.BackBuffer = True
            backBuffer = frontBuffer.GetAttachedSurface(backBufferDesc.SurfaceCaps)
        End If

        'nastavit oříznutí 
        clip = New Clipper(dev)
        clip.Window = Me
        frontBuffer.Clipper = clip
    End Sub

    Public Sub Render()
        'kontrola 
        If Not Me.Created Then Exit Sub
        If frontBuffer Is Nothing Or backBuffer Is Nothing Then Exit Sub
        If Not Me.Focused Then Exit Sub

        Try

            'vykreslit scénu na BackBuffer 
            backBuffer.ColorFill(Color.Black)
            Dim bbw = backBuffer.DrawWidth
            backBuffer.DrawFast(((bbw / 2) - (Title.DrawWidth / 2)), 0, Title, DrawFastFlags.SourceColorKey)

            'převrátit buffery 
            frontBuffer.Flip(backBuffer, FlipFlags.Wait)

        Catch ex As Exception

            'po obnovení z minimalizace 
            If ex.GetType() Is GetType(SurfaceLostException) Then
                createBuffers()
            End If

        End Try
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        'ukončení programu 
        If e.KeyCode = Keys.Escape Then
            End
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'vytvořit a nastavit zařízení 
        createDevice()
        'vytvořit buffery 
        createBuffers()
        'nahrát obsah 
        loadContents()
    End Sub

    Public Sub loadContents()
        'nahrát obsah 
        Dim sd As New SurfaceDescription
        Title = New Surface("images\Title.bmp", sd, dev)
        StartGame_leave = New Surface("images\StartGame_leave.bmp", sd, dev)
        StartGame_hover = New Surface("images\StartGame_hover.bmp", sd, dev)
        HighScores_leave = New Surface("images\HighScores_leave.bmp", sd, dev)
        HighScores_hover = New Surface("images\HighScores_hover.bmp", sd, dev)
        Options_leave = New Surface("images\Options_leave.bmp", sd, dev)
        Options_hover = New Surface("images\Options_hover.bmp", sd, dev)
        Credits_leave = New Surface("images\Credits_leave.bmp", sd, dev)
        Credits_hover = New Surface("images\Credits_hover.bmp", sd, dev)
        QuitGame_leave = New Surface("images\QuitGame_leave.bmp", sd, dev)
        QuitGame_hover = New Surface("images\QuitGame_hover.bmp", sd, dev)
        Beginner_leave = New Surface("images\Beginner_leave.bmp", sd, dev)
        Beginner_hover = New Surface("images\Beginner_hover.bmp", sd, dev)
        Normal_leave = New Surface("images\Normal_leave.bmp", sd, dev)
        Normal_hover = New Surface("images\Normal_hover.bmp", sd, dev)
        Expert_leave = New Surface("images\Expert_leave.bmp", sd, dev)
        Expert_hover = New Surface("images\Expert_hover.bmp", sd, dev)
        Master_leave = New Surface("images\Master_leave.bmp", sd, dev)
        Master_hover = New Surface("images\Master_hover.bmp", sd, dev)
        TimeOut = New Surface("images\TimeOut.bmp", sd, dev)
        YourScore = New Surface("images\YourScore.bmp", sd, dev)
    End Sub

End Class

problém je, že když spustím debug, otevře se okno Form1, ale dál nic, renderer by však měl vykreslit černou orazovku a na ní nakreslit Surface Title.bmp, horizontálně do středu, vertikálně na pozici 0.

Kde je zakopaný pes????

Přeji hezký den!

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím,

napadlo mne, že to možná má co dělat sabsencí procedury DrawBit (tak se jmenovala?), pokud někdoalespoň tušíte, prosím poraďte!

Přeji hezký den!

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím vás, ač laik, pokusím se Vám poslat pár svých postřehů:

1. Ve Vámi zaslaném kódu k vykreslení nedojde, protože není volána subrutina "render()" Ale možná toto volání máte ošetřeno jinde, v jiných modulech.

2. Hlavní problém je, si myslím, ve volání funkce backbuffer.drawfast, kterou voláte s parametrem "sourcecolorkey", což asi slouží ke "klíčování" obrázku na pozadí dle "maskovací barvy" ve zdrojovém obrázku (jednoduše řečeno "průhlednost" zvolené barvy. Jenže tuto "průhlednou barvu" nemáte definovánu. Mělo by být v modulu "loadconstens()" něco jako:

Public Sub loadContents()
        'nahrát obsah 
        Dim sd As New SurfaceDescription()
        Title = New Surface("images\Title.bmp", sd, dev)

        Dim ck As New ColorKey()
        Title.SetColorKey(ColorKeyFlags.SourceDraw, ck)
        ...

nevíj, je-li zde jádro pudla ale s touto úpravou mi to fungovalo.

3. ještě jsem si všimnul jedné drobnosti.

Při vykreslení využíváte, zřejmě pro určení polohy vykresleného obrazce, proměnnou bbw, vypočtenou jako bbw = backBuffer.DrawWidth. Nevím přesně, co tato vlastnost u backbufferu znamená, ale stále mi to vrací 1. Nemělo by tam být použito spíše bbw = backBuffer.SurfaceDescription.Width ? Toto mi skutečně vrací šířku plochy backbufferu.

Zdravím

Viktor Langer

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Zdravím,

velice Vám děkuji za Vaše cenné přimpomínky. Já už jsem na to přišel, co s tím bylo, ale nemohl jsem to sem napsat, protože jsem byl delší dobu pryč. Vy jste přesně trefil hřebíček na hlavičku, když jste se zmínit o variabilní "bbw", skutečně to byla ta chyba.

Víte já mám ve zvyku zkoušet a zkoumat vlastnosti a metody objektů a na základě jejich analýzy napsat dobrý kód, a nestačí mi nějaká stažená (ač velice, ale velice kvalitní) šablona. Nespokojil bych se s uvedením práce někoho jiného a tak kódy přepisuji. V tomto příkladu je kód ještě více či méňe duplicitní, co se týče stažené šablony, ale současný kód je už úplně překopaný, p. Herceg totiž nepoužívá úplně stejný zápis kódu na jaký jsem zvyklý a také proto jsem si to přepsal.

Ale to jsem zase odbočil. Chci tím říct, že jsem na to přišel a vše funguje skvěle.

Ještě jednou mi dovolte poděkování.

Přeji hezký den.

P.S. Teď jsem si vzpomněl, že mě také napadlo, jestli a jak lze udělat, aby mi hra mohla změnit rozlišení. Marně si s tím lámu hlavu.

Děkuji a přeji hezký den.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback