29. oktober 2002 - 16:45Der er
12 kommentarer og 1 løsning
Rotation af billeder
Hejsa fellow developers!
Jeg har et problem. Jeg er ved at lave et spil, og en af grundelementerne i spillet går ud på, at et hjul skal rotere jævnligt. Hjulet er en del af spilbrættet (Spillet er lidt brætspilsagtigt).
Nu er spørgsmålet så: hvis dette billede findes i en Picture- eller Image-control, hvordan roterer jeg så billedet et ønsket antal grader?
Følgende skal tilføjes: eftersom der er tale om et hjul, opdelt i en række lige store felter, kommer hjulets udseende til at være det samme før og efter rotationen. Kan det hjælpe? Muligvis kunne man jo lave et synsbedrag, ved at indsætte en GIF-animation i det pågældende øjeblik eller lignende...
Du kan mig bekendt ikke rotere billeder i VB - og hvis du kan, kan jeg forestille mig at det er alt andet end simpelt :o(
Jeg tror det er nemmere at have 4 billeder, som hver især er roteret, og så skifte imellem dem. Så roter billederne i et bileldprogram e.l. (Paint Shop Pro, Corel Photo Paint, ACDSee, ...), og gem dem som billed0grader.jpg, billed90grader.jpg, billed180grader.jpg og billed270grader.jpg
Og når du rotere, så bare loade det ønskede billede:
Hvis du vil opdele i finere rotationsgrader (mindre end 90 grader ad gangen), kan du jo bare gøre det. At indsætte en animation er vist heller ikke helt simpelt...
Har du ikke noget software til at rotere, så send dem til mig, og jeg skal rotere dem for dig :o)
> chanoa: Hvordan vil du loade i forvejen og så skifte? Man kunne loade en masse billeder, og så "skifte" mellem dem ved visible=true/false, men hvordan skifter man et billede uden at loade det?
Private Type POINTAPI X As Long Y As Long End Type
Dim pts(2) As POINTAPI Dim currentpoint%
Private Declare Function PlgBlt Lib "gdi32" (ByVal hdcDest As Long, lpPoint As POINTAPI, ByVal hdcSrc As Long, ByVal nXSrc As Long, ByVal nYSrc As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hbmMask As Long, ByVal xMask As Long, ByVal yMask As Long) As Long
Private Sub picRotate_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim di& pts(currentpoint).X = X pts(currentpoint).Y = Y Select Case currentpoint Case 0 picRotate.Cls picRotate.Circle (X, Y), 2, 0 Case 1 picRotate.Circle (X, Y), 2, 0 Case 2 picRotate.Cls di = PlgBlt(picRotate.hDC, pts(0), picSource.hDC, 0, 0, picSource.ScaleWidth, picSource.ScaleHeight, 0, 0, 0) End Select currentpoint = currentpoint + 1 If currentpoint = 3 Then currentpoint = 0 End Sub
martin_moth > Jo, du kan lave nogle nye pictureboxes som ikke er synlige, en er nok, så giver du den index 0.
Så laver du et array med filnavne i..
Derefter er koden noget i stil med
for x = 0 to antalpictureboxes if x > 0 then ' Index 0 er initialiseret, og vi gider ikke ha' fejl. load picturebox(x) ' Initialiser pictureboxen. end if picturebox(x).picture = loadpicture(picturefiles(x)) ' Hent filen in i picture boxen. next
Så kan du rotere med noget der ligner denne kode:
for x = 0 to antalbilleder billedeboxderskalroteres.picture = picturebox(x).picture next
Det vil være hurtigere da du læser alle billederne ind i ram fra starten, istedet for at lave diskaktivitet hvergang du skal skifte billede.. Om der er synligt kommer meget an på hvorstore hvert billede er og hvor hurtig harddisken er.
rynke10 > Tager den ikke bare og rotere billedet pixel for pixel? Det er da vidst for langsomt til en animation...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.