Avatar billede shadowdance Nybegynder
29. oktober 2002 - 16:45 Der 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...
Avatar billede martin_moth Mester
29. oktober 2002 - 17:58 #1
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:

Picture1.Picture = LoadPicture("c:\billed90grader.jpg")

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)
Avatar billede Noone Nybegynder
29. oktober 2002 - 19:19 #2
Jeg ville nok loade billederne i forvejen for at mindske den tid det tager at skifte.
Avatar billede jens_nuuk Nybegynder
29. oktober 2002 - 21:10 #3
Hvis du vil investere i en ActiveX component kan du prøve iocomp
de har netop det du søger, den findes i en shareware version.
Avatar billede martin_moth Mester
29. oktober 2002 - 22:47 #4
> 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?
Avatar billede martin_moth Mester
29. oktober 2002 - 22:49 #5
Øhh - ovenstående blev vist lidt knudret - håber du fangede det. Jeg mener, hvordan vil du skifte en picturebox's billede uden at bruge loadpicture..?
Avatar billede martin_moth Mester
29. oktober 2002 - 22:50 #6
> jens_nuuk: jeg går ud fra at du bor i Nuuk - kender du nogen der arbejder i Inuplan? (sorry - ved godt det ikke er en chat - "fy" til mig!)
Avatar billede jens_nuuk Nybegynder
30. oktober 2002 - 00:02 #7
Du har ret det er ikke en chat. men Ja det gør jeg.
Her er en stump fra Extreme vb forum.

Option Explicit
' Copyright © 1997 by Desaware Inc. All Rights Reserved

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
Avatar billede Noone Nybegynder
30. oktober 2002 - 00:12 #8
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.
Avatar billede martin_moth Mester
30. oktober 2002 - 08:19 #9
Yep - enig med at det er klart det smarteste at loade alle billederne først - vidste bare ikke hvordan - det ved jeg nu ;o) Tak
Avatar billede Noone Nybegynder
30. oktober 2002 - 10:23 #10
martin_moth > No problem... Den med at lave et element og sætte index til 0 for derefter at loade flere runtime, er faktisk ret fedt at kende til.
Avatar billede shadowdance Nybegynder
30. oktober 2002 - 11:30 #11
Det var en spandfuld må jeg sige. Perfekt. Nu skal jeg bare forsøge mig lidt frem, og så kan det jo være jeg voldbrokker mig igen!
Avatar billede rynke10 Novice
30. oktober 2002 - 14:54 #12
Måske var der lige noget her du kan bruge
http://216.26.168.92/tips/tip140.html
/Flemming
Avatar billede Noone Nybegynder
30. oktober 2002 - 15:23 #13
rynke10 > Tager den ikke bare og rotere billedet pixel for pixel? Det er da vidst for langsomt til en animation...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester