Italia
Foro

Hallo IF, Drehung einer Grafik mit XPSE nicht auf den Screen...Native nProc..

 

funkheld
Hallo, Frohe Ostern.
Ich brauche bitte einmal Aiuto per die Drehung einer Grafik.

Ich möchte die gedrehte Grafik hier rein bringen:
bpic1& = create("hNewPic", 128,128,rgb(0,0,0))
und nicht auf den Bildschirm .

Wie geht das ?

Danke.

Gruss
declare bpic&,ende&,hWin&,winkel&,hDCWin&
ende&=1
bpic& = create("hPic",-1,"auto.bmp")
Window 20,20-400,400
Cls RGB(220,220,220)
hWin& = @Create("text", %hWnd, "", 10,10, 300,300)
hDCWin& = ~GetDC(hWin&)

WHILE ende&

    if isKey(81)

        winkel&=winkel&-100
        cls
        drawhPicRotated(bpic&,hDCWin&,100,100,128,128,winkel&,50)

    endif

    if isKey(69)

        winkel&=winkel&+100
        cls
        drawhPicRotated(bpic&,hDCWin&,100,100,128,128,winkel&,50)

    endif

ENDWHILE

end

nProc getCircP(long r,w)

    return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))

endproc

nProc angleByLine(long x,y,xx,yy)

    sub y,yy
    sub x,xx

    if x

        xx=int(57295.77951 * arctan(float(y)/float(x)))
        case x>0 : return 270000 + xx
        return 90000 + xx

    endif

    case y<0 : return 180000
    return 0

endproc

nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)

    long hDCBits=createCompatibleDC(hDC)
    selectObject(hDCBits, hPic)
    long pts=dim(24)
    long 	w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
    casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
    long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
    plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
    deleteDC(hDCBits)
    dispose(pts)

endproc

 
07.04.2012  
 



Wenn man einen Trick nutzt das %hDC nach StartPaint auf ein hPic den DC des "hPics" zurückgibt dann so:
 {$cleq}
 {$compiler c:\xprofan11\}
 {$runtime c:\xprofan11\}
declare bpic&,ende&,winkel&
ende&=1
bpic& = create("hPic",-1,"c:\\auto.bmp")
Window 20,20-400,400
Cls RGB(220,220,220)
var bpic1& = create("hNewPic", 128,128,rgb(0,0,0))

WHILE ende&

    waitinput 10
    startpaint bpic1&
    drawhPicRotated(bpic&,hDC,64,64,128,128,winkel&,50)
    endpaint
    drawpic bpic1&,0,0;0
    winkel&=rnd(360000)

ENDWHILE

end

nProc getCircP(long r,w)

    return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))

endproc

nProc angleByLine(long x,y,xx,yy)

    sub y,yy
    sub x,xx

    if x

        xx=int(57295.77951 * arctan(float(y)/float(x)))
        case x>0 : return 270000 + xx
        return 90000 + xx

    endif

    case y<0 : return 180000
    return 0

endproc

nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)

    long hDCBits=createCompatibleDC(hDC)
    selectObject(hDCBits, hPic)
    long pts=dim(24)
    long 	w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
    casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
    long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
    plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
    deleteDC(hDCBits)
    dispose(pts)

endproc

 
09.04.2012  
 




funkheld
Jup, danke. Das ist Klasse.

Gruss
 
09.04.2012  
 




funkheld
Jup, es klappt wunderbar diese Native nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r) mit XPSE die du erstellst hast.

Mit den Tasten Q/E kann man ein Sprite rotieren und mit den Tasten W/S kann man es bewegen.

In wieweit werden unten die Routinen vom XPSE beschleunigt?

Wie kann man mit der Routine nProc drawhPicRotated eine Drehung machen um einen verlegten Rotate-XY-Punkt? Jetzt dreht es sich ja immer um den Mittelpunkt.

Mit der Variablen "r" in der nProc habe ich jetzt die grösse eingestellt vom Sprite. Aber mir ist noch nicht klar, ob es etwas mit der Grössenveränderung zu tun hat? So ganz habe den Zusammenhang dazu nicht verstanden.

Danke.

Gruss
 {$cleq}
 {$compiler d:\xprofan11\}
 {$runtime d:\xprofan11\}
declare bpic&, bpic1&,ende&,winkel!,hintergrpic&,vordergrpic&
declare x1!,y1!,dx!,dy!
ende&=1
bpic& = create("hPic",-1,"data\\auto.bmp")
Window 20,20-800,600
Cls RGB(220,220,220)
bpic1& = create("hNewPic", 64,64,rgb(0,0,0))
hintergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
vordergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
startpaint hintergrpic&
usebrush 1,rgb(0,128,255)
ellipse 200,200-250,250
endpaint

WHILE ende&

    if isKey(87)

        y1!=Sin((winkel!/1000)/180.0*pi())*0.2
        x1!=Cos((winkel!/1000)/180.0*pi())*0.2
        dx!=dx!-x1!
        dy!=dy!-y1!

    endif

    if isKey(83)

        y1!=Sin((winkel!/1000)/180.0*pi())*0.2
        x1!=Cos((winkel!/1000)/180.0*pi())*0.2
        dx!=dx!+x1!
        dy!=dy!+y1!

    endif

    if isKey(81)

        winkel!=winkel!-500
        startpaint bpic1&
        drawhPicRotated(bpic&,hDC,32,32,128,128,winkel!,30)
        endpaint

    endif

    if isKey(69)

        winkel!=winkel!+500
        startpaint bpic1&
        drawhPicRotated(bpic&,hDC,32,32,128,128,winkel!,30)
        endpaint

    endif

    startpaint vordergrpic&
    drawpic hintergrpic&,0,0;0
    drawpic bpic1&,100+dx!,100+dy!;-1
    endpaint
    drawpic vordergrpic&,10,10;0

ENDWHILE

end

nProc getCircP(long r,w)

    return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))

endproc

nProc angleByLine(long x,y,xx,yy)

    sub y,yy
    sub x,xx

    if x

        xx=int(57295.77951 * arctan(float(y)/float(x)))
        case x>0 : return 270000 + xx
        return 90000 + xx

    endif

    case y<0 : return 180000
    return 0

endproc

nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)

    long hDCBits=createCompatibleDC(hDC)
    selectObject(hDCBits, hPic)
    long pts=dim(24)
    long 	w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
    casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
    long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
    plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
    deleteDC(hDCBits)
    dispose(pts)

endproc


49 kB
Hochgeladen:10.04.2012
Downloadcounter192
Download
 
10.04.2012  
 



Hi!

funkheld (10.04.12)
Jup, es klappt wunderbar diese Native nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r) mit XPSE die du erstellst hast.


Ja, danke!

funkheld (10.04.12)
In wieweit werden unten die Routinen vom XPSE beschleunigt?


Meinst Du dies hier (  [...]  ) ?

"NProc-Funktionen werden in Assembler umgewandelt, um Hooks, Subclassing,

Threads, Callbacks und all die Dinge zu programmieren, bei denen es auf

Threadsicherheit und hohe Geschwindigkeit ankommt."

Zudem werden die Funktionsaufrufe von XPSE in direkte Calls konvertiert -

diese Funktionsaufrufe sind imho die schnellsten überhaupt.

funkheld (10.04.12)
Wie kann man mit der Routine nProc drawhPicRotated eine Drehung machen um einen verlegten Rotate-XY-Punkt? Jetzt dreht es sich ja immer um den Mittelpunkt.


Dies ist bewusst nicht die Aufgabe dieser Funktion da sie sonst um einige

Operationen größer (und damit auch weniger schnell) würde, die wiederum

nicht immer verwendet würden. Deshalb dreht diese Funktion immer genau um

den Mittelpunkt. Dadurch wiederum aber erst kann man den Punkt um den

gedreht werden soll selbst bestimmen z.B. circa 2 Wege:

a) das Bild gleich so anlegen das der Drehpunkt der richtige ist z.B. durch

Platzlassen bzw. Randhinzufügen

b) die Ausgabeposition (3. und 4. Parameter (x,y)) selbst bestimmen und versetzen

z.B. mit der Funktion getCircP.

funkheld (10.04.12)
Mit der Variablen "r" in der nProc habe ich jetzt die grösse eingestellt vom Sprite. Aber mir ist noch nicht klar, ob es etwas mit der Grössenveränderung zu tun hat? So ganz habe den Zusammenhang dazu nicht verstanden.


Du kannst damit den Radius bzw. die Ausgabegröße des gedrehten Bildes

bestimmen und damit ist die Funktion quasi auch gleich drawhPicRotatedAndSized.

Wenn Du il valore 0 übergibst dann ermittelt die Funktion die Ausgabegröße

die per dieses Bild normal wäre bzw. die "Originalgröße".
 
10.04.2012  
 



Mach doch eher so:
'URL: https://xprofan.com/intl/de/forum/hallo-if-drehung-einer-grafik-mit-xpse-nicht-auf-den-screen-native-nproc/#n
 {$cleq}
 {$compiler c:\xprofan11\}
 {$runtime c:\xprofan11\}
declare bpic&, ende&,winkel!,hintergrpic&,vordergrpic&
declare x1!,y1!,dx!,dy!,spd!
ende&=1
bpic& = create("hPic",-1,"data\\auto.bmp")
Window 20,20-800,600
Cls RGB(220,220,220)
hintergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
vordergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
startpaint hintergrpic&
usebrush 1,rgb(0,128,255)
ellipse 200,200-250,250
endpaint
dx!=100
dy!=100
spd!=1

WHILE ende&

    sleep 16

    if isKey(38)

        spd!=spd!+0.1

    endif

    if isKey(40)

        spd!=spd!-0.1

    endif

    if isKey(37)

        winkel!=winkel!-5000

    endif

    if isKey(39)

        winkel!=winkel!+5000

    endif

    y1!=Sin((winkel!/1000)/180.0*pi())*spd!
    x1!=Cos((winkel!/1000)/180.0*pi())*spd!
    dx!=dx!-x1!
    dy!=dy!-y1!
    startpaint vordergrpic&
    drawpic hintergrpic&,0,0;0
    drawhPicRotatedTransparent(bpic&,hDC,int(dx!)-getCircP(15,int(winkel!)+90000),int(dy!)+getCircP(15,int(-winkel!)),128,128,winkel!,30,0)
    endpaint
    drawpic vordergrpic&,10,10;0

ENDWHILE

end

nProc getCircP(long r,w)

    return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))

endproc

nProc angleByLine(long x,y,xx,yy)

    sub y,yy
    sub x,xx

    if x

        xx=int(57295.77951 * arctan(float(y)/float(x)))
        case x>0 : return 270000 + xx
        return 90000 + xx

    endif

    case y<0 : return 180000
    return 0

endproc

nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)

    long hDCBits=createCompatibleDC(hDC)
    selectObject(hDCBits, hPic)
    long pts=dim(24)
    long 	w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
    casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
    long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
    plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
    deleteDC(hDCBits)
    dispose(pts)

endproc

nProc drawhPicRotatedTransparent(long hPic,dc,x,y,xx,yy,w,r,col){

    long hDCBits=createCompatibleDC(hDC)
    selectObject(hDCBits, hPic)
    long pts=dim(24)
    long 	w1=angleByLine(xx,yy,0,0),\
    w2=abs(w1-360000),\
    w3=abs(w1-540000)
    casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
    long r2=r*2
    long pts&,0=	r+getcircp(r,w1+w),r+getcircp(r,w1-90000+w),\
    r+getcircp(r,w2+w),r+getcircp(r,w2-90000+w),\
    r+getcircp(r,w3+w),r+getcircp(r,w3-90000+w)
    long mDC=CreateCompatibleDC(hDC)
    long memBM=CreateCompatibleBitmap(hDC,r2,r2)
    long oldSel=SelectObject(mDC,memBM)
    plgBlt(mDC,pts,hDCBits,0,0,xx,yy,0,0,0)
    selectobject(dc,memBM)
    transparentBlt(dc,x-r,y-r,r2,r2,mDC,0,0,r2,r2,col)
    selectObject(mDC,oldSel)
    deleteObject(memBM)
    deleteDC(mDC)
    deleteDC(hDCBits)
    dispose(pts)

}

 
10.04.2012  
 




funkheld
Jup, danke per dein Vorschlag. Klappt vorzüglich.

Gruss
 
10.04.2012  
 



Die Lenkung vielleicht ansatzweise so:
'URL: https://xprofan.com/intl/de/forum/hallo-if-drehung-einer-grafik-mit-xpse-nicht-auf-den-screen-native-nproc/#n
 {$cleq}
 {$compiler c:\xprofan11\}
 {$runtime c:\xprofan11\}
declare bpic&, ende&,winkel!,hintergrpic&,vordergrpic&
declare x1!,y1!,dx!,dy!,spd!,steerspd!
ende&=1
bpic& = create("hPic",-1,"data\\auto.bmp")
Window 20,20-800,600
Cls RGB(220,220,220)
hintergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
vordergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
startpaint hintergrpic&
usebrush 1,rgb(0,128,255)
ellipse 200,200-250,250
endpaint
dx!=100
dy!=100
spd!=1
steerspd!=0
winkel!=180000

WHILE ende&

    sleep 16

    if isKey(38)

        spd!=spd!+0.1

    endif

    if isKey(40)

        spd!=spd!-0.1

    endif

    if isKey(37)

        steerspd!=steerspd!-0.1
        case steerspd!<-2 : steerspd!=-2

    endif

    if isKey(39)

        steerspd!=steerspd!+0.1
        case steerspd!>2 : steerspd!=2

    endif

    winkel!=winkel!+steerspd!*spd!*450
    steerspd!=steerspd!*0.95
    y1!=Sin((winkel!/1000)/180.0*pi())*spd!
    x1!=Cos((winkel!/1000)/180.0*pi())*spd!
    dx!=dx!-x1!
    dy!=dy!-y1!
    startpaint vordergrpic&
    drawpic hintergrpic&,0,0;0
    drawhPicRotatedTransparent(bpic&,hDC,int(dx!)-getCircP(15,int(winkel!)+90000),int(dy!)+getCircP(15,int(-winkel!)),128,128,winkel!,30,0)
    endpaint
    drawpic vordergrpic&,10,10;0

ENDWHILE

end

nProc getCircP(long r,w)

    return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))

endproc

nProc angleByLine(long x,y,xx,yy)

    sub y,yy
    sub x,xx

    if x

        xx=int(57295.77951 * arctan(float(y)/float(x)))
        case x>0 : return 270000 + xx
        return 90000 + xx

    endif

    case y<0 : return 180000
    return 0

endproc

nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)

    long hDCBits=createCompatibleDC(hDC)
    selectObject(hDCBits, hPic)
    long pts=dim(24)
    long 	w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
    casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
    long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
    plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
    deleteDC(hDCBits)
    dispose(pts)

endproc

nProc drawhPicRotatedTransparent(long hPic,dc,x,y,xx,yy,w,r,col){

    long hDCBits=createCompatibleDC(hDC)
    selectObject(hDCBits, hPic)
    long pts=dim(24)
    long 	w1=angleByLine(xx,yy,0,0),\
    w2=abs(w1-360000),\
    w3=abs(w1-540000)
    casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
    long r2=r*2
    long pts&,0=	r+getcircp(r,w1+w),r+getcircp(r,w1-90000+w),\
    r+getcircp(r,w2+w),r+getcircp(r,w2-90000+w),\
    r+getcircp(r,w3+w),r+getcircp(r,w3-90000+w)
    long mDC=CreateCompatibleDC(hDC)
    long memBM=CreateCompatibleBitmap(hDC,r2,r2)
    long oldSel=SelectObject(mDC,memBM)
    plgBlt(mDC,pts,hDCBits,0,0,xx,yy,0,0,0)
    selectobject(dc,memBM)
    transparentBlt(dc,x-r,y-r,r2,r2,mDC,0,0,r2,r2,col)
    selectObject(mDC,oldSel)
    deleteObject(memBM)
    deleteDC(mDC)
    deleteDC(hDCBits)
    dispose(pts)

}


Fliehkraft fehlt da aber auch noch.
 
10.04.2012  
 




funkheld
Jup, das schaut gut aus und ohne viel Aufwand, nur mit deinen nativen Proceduren.
In der Bewegung sieht man die Mächtigkeit der Proceduren...

Danke.

Gruss
 
10.04.2012  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

10.467 Views

Untitledvor 0 min.
Thomas Freier16.02.2024
funkheld21.04.2023
Jochen Roxlau29.11.2018
Langer08.10.2018
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

funkheld (5x)
iF (4x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie