frame dropping   zodpovězená otázka

VB.NET, WinForms, Grafika

Dobrý deň, urobil som jednu takú pokusnú blbosť, aby som si vyskúšal frame dropping a neviem, kde je chyba, ale zdá sa mi, že to nerobí to, čo by to malo robiť.Ide o takú guličku, ktorá by sa mala zvetšovať z priemeru 20 px na veľkosť formulára, ale mne sa to najprv začne z 20 px zmenšovať, a keď to dosiahne veľkosť asi 0 px, tak sa to začne zvetšovať z 20 px na veľkosť o 20 px menšiu, než veľkosť formulára.Guľočka má výplň pravidelného prechodu medzi Color.Firebrick a COlor.FloralWhite(color.firebrick je v ľavom hornom rohu, color.floralwhite je v pravom dolnom rohu).Je vždy v strede formulára, čo je v poriadku, ale to, ako sa mení veľkosť sa mi dosť nezdá.

Mám to celé rozdelené na dva súbory:

FDCore.vb:

Public Class FDCore
    Public Shared Function get_dynval(ByVal lastframelen_ms As Integer, ByVal speed_pxpersec As Integer) As Integer
        Return (speed_pxpersec / 1000) * lastframelen_ms
    End Function
    Public Shared Function get_dynsz(ByVal lastframelen_ms As Integer, ByVal valmax As Integer, ByVal valmin As Integer, ByVal valcurrent As Integer, ByVal speed_pxpersec As Integer) As Integer
        Return (((get_dynval(lastframelen_ms, speed_pxpersec) + valcurrent) - valmin) Mod (valmax)) + valmin
    End Function
End Class

Form1.vb:

Public Class Form1
    Friend sz As Int32 = 20
    Friend Const Min As Int32 = 20
    Friend lastframelen As Integer = 0
    Friend framestarttickcount As Integer
    'Friend timer As Diagnostics.Stopwatch
    Public Sub New()
        InitializeComponent()
        DoubleBuffered = True
        'initfdtimer()
    End Sub
    'Friend Sub initfdtimer()
    '    timer = New Diagnostics.Stopwatch
    '    timer.Reset()
    'End Sub
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        'Timer.Start()
        framestarttickcount = Environment.TickCount
        With e.Graphics
            .Clear(Color.White)
            Dim ballbrush As Brush
            ballbrush = New Drawing2D.LinearGradientBrush(PointF.Empty, New PointF(ClientSize.Width, ClientSize.Height), Color.Firebrick, Color.FloralWhite)
            updateball()
            .FillEllipse(ballbrush, CSng((ClientSize.Width / 2) - sz / 2), CSng((ClientSize.Height / 2) - sz / 2), CSng(sz), CSng(sz))
        End With
        'Timer.Stop()
        'lastframelen = Timer.ElapsedMilliseconds
        lastframelen = framestarttickcount - Environment.TickCount
        'Timer.Reset()
        Invalidate()
    End Sub
    Friend Sub updateball()
        sz = FDCore.get_dynsz(lastframelen, Math.Min(ClientSize.Width, ClientSize.Height), Min, sz, Math.Min(ClientSize.Width, ClientSize.Height))
    End Sub
End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přiznám se, že Váš kód je hodně těžce čitelný (stálé volání něčeho někam s fůrou parametrů) a při minimálním okomentování jsem možná ne vše pochytil. proto jsem také nedumal, proč se Vám to chová přesně tak, jak popisujete, ale proč se vám to hned na začátku zmenšuje bych si dovolil tipnout.

Počítáte tam délku posledního frame (předpokládám, že tak to bylo myšleno) jako

lastframelen = framestarttickcount - Environment.TickCount

jenomže zde odečítáte větší číslo (TickCount aktuálního okamžiku) od čísla menšího (TickCount při vstupu do metody), takže dostanete číslo záporné a proto se Vám i sz zmenšuje (alespoň zpočátku)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano s tým máte pravdu lebo to framestarttickcount je vždy menšie než to, čo dostanem z Environment.TickCount a teda na začiatku sa to potom stále zmenšuje a ďalej sa to prevráti odorovne aj zvislo a zväčšuje sa to, ale aby to potom dosiahlo veľkosŤ formulára, by som musel zvetšiť maximálnu veľkosť o tých 20 px.Ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A není lepší tu délku počítat správně

lastframelen = Environment.TickCount - framestarttickcount

?

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