Quelltexte/ Codesnippets | | | | | Eine kleine Demo zum Direkten einlesen von BMP-Dateien für Texturen mit ASM-Befehlen/XPIA und dem Befehl "GetDIBits" für OpenGL. Die Farbe "schwarz" wird durchsichtig gezeichnet. Um das Programm zu benutzen, müssen noch 2 Muster-BMP-Dateien erstellt werden. Durch die gute Hilfe im Forum konnte ich das umsetzen. Durch die 2D vorraussetzungen mit Opengl kann man sehr schön Sprites erzeugen und damit arbeiten. Mit den Tasten "Q,W,E,S" kann man ein bisschen speilen.
Diese Demo kann jeder für sich neu umsetzen und auch in eigene Programme Teile davon übernehmen. KompilierenMarkierenSeparieren $H Windows.ph
{$iq}
declare bild1$
declare x1!,y1!,dx!,dy!,winkel!
declare hWin&
If 0
AsmStart rgb_umwandlung
Parameters bildxy#,a
LOCAL r :BYTE
LOCAL g :BYTE
LOCAL b :BYTE
LOCAL w :DWORD
mov eax,para2
mov w,eax
mov ecx,0
mov ebx,para1
.while ecx<=w
mov al,[ebx+ecx]
mov b,al
mov al,[ebx+ecx+1]
mov g,al
mov al,[ebx+ecx+2]
mov r,al
and b,255
and g,255
and r,255
mov al,b
.if al>0
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
.endif
mov al,g
.if al>0
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
.endif
mov al,r
.if al>0
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
.endif
mov al,0
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
weiter:
add ecx,4
.endw
AsmEnd
EndIf
Window 20,20-600,450
Cls @RGB(220,220,220)
oGL("Init", %hWnd, 0,0, 0, 0)
oGL("PosMode", 1)
bild1$="muster.bmp"
var tex.auto%=erzeugetex(bild1$)
var tex.grund%=OGL("loadtexturebmp","muster1.bmp",3)
var ende%=1
WHILE ende%
sleep 1
if isKey(65)
ende% = 0
endif
if isKey(81)
winkel!=winkel!+0.4
endif
if isKey(69)
winkel!=winkel!-0.4
endif
if isKey(87)
y1!=Sin(winkel!/180.0*pi())*0.02
x1!=Cos(winkel!/180.0*pi())*0.02
dx!=dx!-x1!
dy!=dy!-y1!
endif
if isKey(83)
y1!=Sin(winkel!/180.0*pi())*0.02
x1!=Cos(winkel!/180.0*pi())*0.02
dx!=dx!+x1!
dy!=dy!+y1!
endif
drawglscene()
ENDWHILE
proc drawglscene
OGL("Clear")
OGL("glEnable",~GL_BLEND)
OGL("glBlendFunc",~GL_SRC_ALPHA, ~GL_ONE_MINUS_SRC_ALPHA)
OGL("move",0,0,-3)
OGL("texture",tex.grund%,10)
OGL("move",0,0,0)
OGL("quad",8,8)
OGL("origin",dx!,dy!,-3)
OGL("texture",tex.auto%,1)
OGL("rotate",0,0,winkel!+90)
OGL("quad",0.7,0.7)
OGL("show")
endproc
proc erzeugetex
parameters namebild$
declare width%,height%
declare Handle&,a&
declare bmi#,bildxy#
var texid%=0
mcls 0,0,0
startpaint -1
mloadbmp namebild$,0,0
endpaint
height%=%bmpx
width%=%bmpy
def &BI_RGB 0
def &DIB_RGB_COLORS 0
struct BITMAPINFOHEADER =
biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&,
biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
dim bmi#,BITMAPINFOHEADER
clear bmi#
with bmi#
.biSize& = sizeof(bmi#)
.biWidth& = width%
.biHeight& = height%
.biPlanes% = 1
.biBitCount% = 32
.biCompression& = &BI_RGB
.biSizeImage& = ((.biWidth& * .biBitCount% 8 - 1) | 3 + 1) * abs(.biHeight&)
endwith
Handle& = Create("hPic", -1, namebild$)
a&=bmi#.biSizeImage&
dim bildxy#,a&
~GetDIBits(%hdc,Handle&,0,bmi#.biHeight&,bildxy#,bmi#,0)
Call(xpia_getprocaddressm(xpia_hmodule&,"rgb_umwandlung"),bildxy#,a&)
OGL("glGenTextures",1,ADDR(texid%))
OGL("glBindTexture",~GL_TEXTURE_2D,texid%)
OGL("glEnable",~GL_ALPHA_TEST)
OGL("glAlphaFunc",~GL_GREATER, 0.1)
OGL("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
OGL("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR)
OGL("gluBuild2DMipmaps",~GL_TEXTURE_2D, ~GL_RGBA, height%, width%, ~GL_RGBA, ~GL_UNSIGNED_BYTE, bildxy#)
dispose bmi#
dispose bildxy#
RETURN texid%
endproc
|
| | | | |
| | Jörg Sellmeyer | Bei mir wird das erste Bild um 90° gegen den Uhrzeigersinn gedreht. Wenns Absicht ist, kann ich das zumindest in dem Code nicht finden. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 19.08.2008 ▲ |
| |
| | | Weil er die Achsen (nicht) vertauscht. |
| | | | |
| | | Das war in meinem Vorhaben absicht , weil es die Grafikform erforderte.
OGL("rotate",0,0,winkel!+90) setze : OGL("rotate",0,0,winkel! )
Kannst auch noch die SINUS und COSINUS verändern nach belieben.
mfg |
| | | | |
| | Jörg Sellmeyer | Ok, das hatte ich nicht gesehen. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 19.08.2008 ▲ |
| |
| | | Der ASM-Code ist ein bisschen gekürzt mit : "jmp wandle". Und so kann man sich dann am Code noch austoben mit besseren Routinen.
Wenn man die DLL nimmt, kann man auch dieses reinsetzen :
DEF rgb_umwandlung(2) ! "muster.dll","rgb_umwandlung" und so aufrufen: rgb_umwandlung(bildxy#,a&) KompilierenMarkierenSeparieren
If 0
AsmStart rgb_umwandlung
Parameters bildxy#,a
LOCAL r :BYTE
LOCAL g :BYTE
LOCAL b :BYTE
LOCAL w :DWORD
mov eax,para2
mov w,eax
mov ecx,0
mov ebx,para1
.while ecx<=w
mov al,[ebx+ecx]
mov b,al
mov al,[ebx+ecx+1]
mov g,al
mov al,[ebx+ecx+2]
mov r,al
and b,255
and g,255
and r,255
mov al,b
.if al>0
jmp wandle
.endif
mov al,g
.if al>0
jmp wandle
.endif
mov al,r
.if al>0
jmp wandle
.endif
mov al,0
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
wandle:
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
weiter:
add ecx,4
.endw
AsmEnd
EndIf
|
| | | | |
|
Zum QuelltextThemenoptionen | 7.038 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |