Gå til innhold

2D spill. Hvordan flytte et bilde effektivt?


Anbefalte innlegg

Hei

 

Tenkte jeg skulle lage et 2D spill. Veldig simpelt spill egentlig, men det jeg sliter med er å få Pictureboxen til å flytte seg på en bra måte. Den jeg bruker nå er stygg.

 

Picture1.left = clng(1) + clng(picture1.left)

 

Dette er vel ikke noen god måte, må da finnes andre alternativer?

Lenke til kommentar
Videoannonse
Annonse

Med BitBlt behøver du ikke benytte en GIF-fil - alt som trengs er to bilder av det samme objektet der den ene har en svart bakgrunn mens den andre har hvit bakgrunn, såsom eksempelvis følgende:

 

PlaneWhite.pngPlaneBlack.png

 

Lim begge bildene inn i to bildebokser (PictureBox) med navn picImage og picMask, hvorpå egenskapen AutoRedraw må settes til True og Visible til False. Legg dernest inn følgende kode:

 

' API-kall nødvendig for opptegningsprosessen

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

 

Private Sub Form_Load()

 

    ' Forhindrer flimring

    Me.AutoRedraw = True

 

End Sub

 

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

 

    ' Fjerner foregående opptegninger

    Me.Cls

 

    ' Tegner opp objekt

    BitBlt Me.hDC, X, Y, picImage.Width, picImage.Height, picImage.hDC, 0, 0, vbSrcAnd

    BitBlt Me.hDC, X, Y, picImage.Width, picImage.Height, picMask.hDC, 0, 0, vbSrcPaint

 

End Sub

 

Verre skulle det ikke være.

Lenke til kommentar

Hmm, mener å ha gjort allt rett, får ingen feilmeding eller noe, skjer bare ingenting når jeg kjører programmet, får bare opp bildene i pic-boxene, det følger ikke musepekeren :ermm:

 

EDIT: måtte gjøre om bildene til .jpg, vb6.0 tok ikke .png, kansje det har noe å si?

Endret av Stig Jøran
Lenke til kommentar

VB6 støtter ikke alpha kaneler på noen som helst type bilder.

Da må du bruke TransparentBlt (funskjon fra Win2000)

 

Public Declare Function TransparentBlt Lib "msimg32" (hdcDest As Long, nXOriginDest As Long, nYOriginDest As Long, nWidthDest As Long, nHeightDest As Long, hdcSrc As Long, nXOriginSrc As Long, nYOriginSrc As Long, nWidthSrc As Long, nHeightSrc As Long, crTransparent As Long) As Long

 

crTransparent er det samme som color key

 

for semi transparente bilder, bruker du en funksjon som heter AlphaBlend

 

Public Const AC_SRC_ALPHA = &H01

Public Type BLENDFUNCTION

  BlendOp As Byte

  BlendFlags As Byte

  SourceConstantAlpha As Byte

  AlphaFormat As Byte ' Satt til AC_SRC_ALPHA hvis bitmap bildet er 32-bit

End Type

Public Declare Function AlphaBlend Lib  "Gdi32" (hdcDest As Long, nXOriginDest As Long, nYOriginDest As Long, nWidthDest As Long, nHeightDest As Long, hdcSrc As Long, nXOriginSrc As Long, nYOriginSrc As Long, nWidthSrc As Long, nHeightSrc As Long, blendFunctionAs BLENDFUNCTION) As Long

 

Men denne er vel et helvete å få til å fungere uten å kunne laste png bilder.

Endret av GeirGrusom
Lenke til kommentar

.NET Framework har et veldig bra gjennomført grafikk API (den bruker GDI+)

 

Du kan gjøre det aller meste som du kan i GDI+ med hjelp av veldig enkle klasser, som System.Drawing.Graphics, System.Drawing.Font, System.Drawing.Color, System.Drawing.LinearGradientBrush etc.

 

Det eneste jeg vet GDI+ har, som ikke .NET har, er effekter, som blur og slikt.

 

For å tegne et bilde i VB.NET gjør du slik:

Private Override Sub OnPaint(sender As Object, e As PaintEventArgs)
 ' Dette er paint eventen, hvor all tegning bør foregå
 Dim r As Rectangle = New Rectangle(0, 0, 32, 32) ' Demo rektangel
 Dim img As Bitmap = Bitmap.FromFile("C:\MittBilde.png") ' Bilder skal ikke lastes her (grunnet ytelse) i et ordentlig program, dette er bare for å vise
 e.Graphics.DrawImage(img, r)
 img.Dispose()
End Sub

 

.NET støtter flere bildeformater, og kan dermed tegne bilder med alpha kanaler, tilogmed 48/64 bit bilder.

Lenke til kommentar

Tja, det er tregere en DX, men mye enklere å ha med å gjøre.

Det som er irriternede i DX er at du ikke flippe i noe annet en fullscreen, da må man bruke offscreen plain og slikt, GDI har ikke noe sånt, men er også bare laget for å vise enkel grafikk.

 

Det er egentlig ikke laget for å konkurere med DX, det er laget for å bytte ut gamle GDI, med noe som er litt mer objektorientert.

 

Laget en software 3D engine i C#, den er treg, og tegner bare wireframe, men man kan rotere :p

Lenke til kommentar

Tja, du kan prøve.

Jeg har tøyset litt med den nå, men det er stort sett bare Matrix.cs som er viktig, paster den her jeg (jeg har forsøkt å få den til å fungere med OpenGL, uten hell)

 

Det kan være ganske enkelt å oversette, men jeg tror ikke Visual basic kan override operators... du får bare kikk på koden og oversette.

 

Den er laget sånn at du har en vertex, du multipliserer en vertex med en matrise slik:

vertex = vertex * matrix

du multipliserer en matrix med en matrix slik

matrix = matrix * matrix

 

Nå kommer problemet jeg fikk, jeg får ikke perspektiv, men hvis ikke det er så viktig,

kan du bare multipliserer alle vertexene med matrisen, og tegne (vertex.x, vertex.y) og figuren skal være rotert/skalert/translert

 

lykke til

Matrix.cs

Lenke til kommentar

Må prøves! Kan jeg tolke det slik at det egentlig er en matrise-kalkulator med noen bestemte operasjoner innebygget? (Det er jo stort sett enkel matrise-regning som gjør "3D-bevegelsene").l

 

Men perspektiv må det jo være mulig å få til. Husker jeg har sett en del formler for å få det til... skal se om jeg klarer å fiske dem frem.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...