StartDrawing(TextureOutput(#Texture))
- mpz
- Beiträge: 505
- Registriert: 14.06.2005 15:53
- Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
- Wohnort: Berlin, Tempelhof
Hi,
ich habe das Problem bei meiner Engine umgangen indem ich einen Befehl MP_ImageToTexture (Image.l) geschrieben habe. Dazu wurde einfach der DX9 Befehl D3DXCreateTextureFromFileInMemory benutzt. So kann man weiter mit Images arbeiten und diese schnell in eine Textur umwandeln.
Es ist natürlich auch möglich im Speicherbereich der Textur die Farbe reinzumalen:
rect.D3DLOCKED_RECT
D3DTexture\LockRect(0, @rect, #Null, #Null)
...
PokeL(*dest+(x + (pitch * y)) * bpp, color)
...
Warum man diesen Vorgang nicht in einen "TextureOutput()" umwandeln können soll, ist mir leider nicht klar...
Vieleicht hat ja mal jemand Lust so ein ImagetoTexur für PB -> Ogre umzusetzen...
Gruß Michael
ich habe das Problem bei meiner Engine umgangen indem ich einen Befehl MP_ImageToTexture (Image.l) geschrieben habe. Dazu wurde einfach der DX9 Befehl D3DXCreateTextureFromFileInMemory benutzt. So kann man weiter mit Images arbeiten und diese schnell in eine Textur umwandeln.
Es ist natürlich auch möglich im Speicherbereich der Textur die Farbe reinzumalen:
rect.D3DLOCKED_RECT
D3DTexture\LockRect(0, @rect, #Null, #Null)
...
PokeL(*dest+(x + (pitch * y)) * bpp, color)
...
Warum man diesen Vorgang nicht in einen "TextureOutput()" umwandeln können soll, ist mir leider nicht klar...
Vieleicht hat ja mal jemand Lust so ein ImagetoTexur für PB -> Ogre umzusetzen...
Gruß Michael
Working on
- LibSGD - MP3D Engine - 
- tft
- Beiträge: 650
- Registriert: 08.09.2004 20:18
- Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
- Wohnort: Dachsen
- Kontaktdaten:
Hallo..
wenn ich so die Texte lese. Muss ich mal fragen ob ich mich so schlecht ausgedrückt habe.
ICH WEIS DAS DER BEFEHL NICHT MER EXISTIERT. ABER WENN ICH FÜR DEN BEFEHL MITHILFE DER TASTE F1 DIE HILFE AUFRUFE WIRD DER HILFSTEXT AUFGERUFEN. AUSSERDEM SUCHE ICH NACH EINEM FUNKTIONIERENDEN WEG DIESEN DOCH OFFT GENUTZTEN BEFEHL ANDERS UMZUSETZUTEN.
kann es sein das ich bei der installation von PB 4.30 erst alles löschen muss ? Oder hat die Deutsche hilfe noch kein Update erfahren.
Gruss TFT
wenn ich so die Texte lese. Muss ich mal fragen ob ich mich so schlecht ausgedrückt habe.
ICH WEIS DAS DER BEFEHL NICHT MER EXISTIERT. ABER WENN ICH FÜR DEN BEFEHL MITHILFE DER TASTE F1 DIE HILFE AUFRUFE WIRD DER HILFSTEXT AUFGERUFEN. AUSSERDEM SUCHE ICH NACH EINEM FUNKTIONIERENDEN WEG DIESEN DOCH OFFT GENUTZTEN BEFEHL ANDERS UMZUSETZUTEN.
kann es sein das ich bei der installation von PB 4.30 erst alles löschen muss ? Oder hat die Deutsche hilfe noch kein Update erfahren.
Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
- tft
- Beiträge: 650
- Registriert: 08.09.2004 20:18
- Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
- Wohnort: Dachsen
- Kontaktdaten:
Hallo ....
habe mich jetzt mal rangesetzt und das Problem umgangen. Hir eine Modivizierte Demoaus dem Code Archiv.
Demo_Collision3D.pb
es leuft bei mir ...... fiel spass
Gruss TFT
habe mich jetzt mal rangesetzt und das Problem umgangen. Hir eine Modivizierte Demoaus dem Code Archiv.
Demo_Collision3D.pb
Code: Alles auswählen
; English forum: http://www.purebasic.fr/english/viewtopic.php?t=8454&highlight=
; Author: Comtois (updated for PB 4.00 by Comtois + Andre)
; Date: 22. November 2003
; OS: Windows
; Demo: Yes
;
; Modify for PB 4.30 and Ogre by TFT 2009
;
; http://perso.wanadoo.fr/comtois/codesforum/DemoCollisionV0.1.htm
; *******************************************
; * Comtois : 22/11/03 : DémoCollisionV0.1 *
; *******************************************
; [F1]/[F2]/[F3] => Changement Vue Caméra
; [F4] => Nombre d'images / seconde et positions du perso
; [PAgeUp]/[PageDown] => Lcve / Baisse la caméra
; [Fin] => Position par défaut de la caméra
; [Espace] => Saut du perso
;-Initialisation
;#ScreenWidth = 800 : #ScreenHeight = 600 : #ScreenDepth = 16
ExamineDesktops()
If InitEngine3D() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
End
EndIf
If OpenWindow(0,0,0,800,600,"3D Mesh Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)=0
MessageRequester("Error", "Cant OpenWindow",0) : End
EndIf
If OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)=0
MessageRequester("Error", "Cant OpenWindowedSreen",0) : End
EndIf
;-Declare procedures
Declare MakeBoxCollision( No.l , X.f , Y.f , Z.f , Longueur.f , Hauteur.f , Largeur.f , AngleX.f , Type.l )
Declare.f WrapValue( Angle.f )
;-Structures
Structure BoxCollision
No.l ; Si le type est 1 alors ce Numéro correspond obligatoirement r l'entity , sinon c'est un numéro différent des entitys existantes
X.f ; Position en X de la Box
Y.f ; Position en Y de la Box
Z.f ; Position en Z de la Box
AngleX.f ; Angle de la Box sur le Plan XZ
MinX.f ; Dimension de la Box
MinY.f ; Dimension de la Box
MinZ.f ; Dimension de la Box
MaxX.f ; Dimension de la Box
MaxY.f ; Dimension de la Box
MaxZ.f ; Dimension de la Box
Type.l ; Type = 0 => Box Statique ; Type = 1 => Box Dynamique ( presque plus utile avec la nouvelle méthode )
EndStructure
Structure Camera
AngleX.f
AngleY.f
CameraVue.l
CameraDist.f
CameraHaut.f
LookAtY.f
EndStructure
Structure Parametres
AngleX.f
AngleY.f
AngleZ.f
EndStructure
Global Dim entity.Parametres(100)
Global NewList BoxCollision.BoxCollision()
Global Camera.Camera
Camera\CameraVue = 1
;- Variables globales
Global GetCollisionX.f , GetCollisionY.f , GetCollisionZ.f
Global OldPosX.f , OldPosY.f , OldPosZ.f , Pas.f
Global PosX0.f , PosY0.f , PosZ0.f
;-Mesh
CreateMesh(0,100) ; Cube
SetMeshData(0, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?CubePoints , 16)
SetMeshData(0, #PB_Mesh_Face, ?CubeTriangles , 12)
Add3DArchive(GetCurrentDirectory(),#PB_3DArchive_FileSystem )
;- Textures
CreateImage(0,128,128)
StartDrawing(ImageOutput(0))
Box(0,0,128,128,RGB(255,255,255))
Box(2,2,124,124,RGB(200,0,0))
StopDrawing()
If saveImage(0,GetCurrentDirectory()+"test1.bmp")=0
MessageRequester("Error", "Cant save test1.bmp",0) : End
EndIf
CreateImage(0,128,128)
StartDrawing(ImageOutput(0))
Box(0,0,128,128,RGB(255,255,255))
Box(2,2,124,124,RGB(0,0,200))
StopDrawing()
If saveImage(0,GetCurrentDirectory()+"test2.bmp")=0
MessageRequester("Error", "Cant save test2.bmp",0) : End
EndIf
CreateImage(0,128,128)
StartDrawing(ImageOutput(0))
Box(0,0,128,128,RGB(255,255,255))
Box(2,2,124,124,RGB(0,200,0))
For a = 0 To 128 Step 4
For b = 0 To 128 Step 4
Circle(a,b,2,RGB(10,150,10))
Next b
Next a
StopDrawing()
If saveImage(0,GetCurrentDirectory()+"test3.bmp")=0
MessageRequester("Error", "Cant save test3.bmp",0) : End
EndIf
If LoadTexture(1,"test1.bmp")=0
MessageRequester("Error", "Cant load test1.bmp",0) : End
EndIf
If LoadTexture(2,"test2.bmp")=0
MessageRequester("Error", "Cant save test2.bmp",0) : End
EndIf
If LoadTexture(3,"test3.bmp")=0
MessageRequester("Error", "Cant save test3.bmp",0) : End
EndIf
;- Material
For a = 1 To 3
If CreateMaterial(a, TextureID( a )) =0
MessageRequester("Error", "Cant create material"+Str(a),0) : End
Else
MaterialAmbientColor(a, RGB(255,255,255))
EndIf
Next a
;-Entity
Restore Entitys
For a = 0 To 20
If a < 5
Read materialID.l : Read Type.l
Read Longueur.f : Read Hauteur.f : Read Largeur.f
Read X.f : Read Y.f : Read Z.f
Read AngleX.f
EndIf
CreateEntity(a , MeshID(0) ,MaterialID(materialID))
ScaleEntity(a , Longueur , Hauteur , Largeur )
If a<5
EntityLocate(a,X,Y,Z)
Else
EntityLocate(a,X + a * 40,Y + a * 20,Z)
EndIf
entity(a)\AngleX = AngleX
RotateEntity(a,entity(a)\AngleX,0,0)
MakeBoxCollision( a , EntityX(a) , EntityY(a) , EntityZ(a) , Longueur , Hauteur , Largeur , entity(a)\AngleX , Type )
Next a
;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0,0,0,40)
AmbientColor(RGB(255,255,255))
;- Procédures
Procedure.f Cosd( Angle.f )
;calcule le cos d'un angle en degré
a.f = Angle * 0.0174533
ProcedureReturn Cos( a )
EndProcedure
Procedure.f Sind( Angle.f )
;calcule le sin d'un angle en degré
a.f = Angle * 0.0174533
ProcedureReturn Sin( a )
EndProcedure
Procedure.f WrapValue( Angle.f )
;Permet de toujours avoir un angle compris entre 0° et 360°
While Angle < 0
Angle + 360
Wend
While Angle - 360 >= 0
Angle - 360
Wend
ProcedureReturn Angle
EndProcedure
Procedure.f NewXValue( X.f , Angle.f , NbUnite.f )
;r utiliser conjointement avec NewZvalue pour calculer une position de <NbUnite> dans la direction <angle>
Valeur.f = X + Cosd( Angle ) * NbUnite
ProcedureReturn Valeur
EndProcedure
Procedure.f NewZValue( Z.f , Angle.f , NbUnite.f )
;r utiliser conjointement avec NewXvalue pour calculer une position de <NbUnite> dans la direction <angle>
Valeur.f = Z - Sind( Angle ) * NbUnite
ProcedureReturn Valeur
EndProcedure
Procedure.f EcartAngle( angle1.f , angle2.f )
; simplifier tout ça
If angle1 > 180
ecart2.f = 360 - angle1
Else
ecart2.f = angle1
EndIf
If angle2 > 180
ecart1.f = 360 - angle2
Else
ecart1.f = angle2
EndIf
If Abs( WrapValue( angle2 ) - WrapValue( angle1 ) ) > 180
If angle2 < angle1
Delta.f = ( ecart1 + ecart2 )
Else
Delta.f = ( ecart1 + ecart2 ) * -1
EndIf
Else
Delta.f = WrapValue( angle2 ) - WrapValue( angle1 )
EndIf
ProcedureReturn Delta
EndProcedure
Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f )
;Calcule un angle progressif allant de la valeur actuelle r la valeur cible
Delta.f = EcartAngle( Actuelle , Cible )
If P > 1000 : P = 1000 : EndIf
Valeur.f = Actuelle + ( Delta * P / 1000 )
ProcedureReturn WrapValue( Valeur )
EndProcedure
Procedure.f CurveValue( Actuelle.f , Cible.f , P.f )
;Calcule une valeur progressive allant de la valeur actuelle r la valeur cible
Delta.f = Cible - Actuelle
If P > 1000 : P = 1000 : EndIf
Valeur.f = Actuelle + ( Delta * P / 1000 )
ProcedureReturn Valeur
EndProcedure
Procedure MakeBoxCollision( No.l , X.f , Y.f , Z.f , Longueur.f , Hauteur.f , Largeur.f , AngleX.f , Type.l )
; X , Y et Z => Coordonnées de la Box
; Longueur => Longueur de la Box
; Hauteur => Hauteur de la Box
; Largeur => Largeur de la Box
; AngleX => Angle de la Box sur le plan XZ ( je n'ai pas besoin des autres plans pour l'instant )
; Type = 0 => Box statique ( calculée une seule fois , exemple pour un mur , un décor quelconque )
; Type = 1 => Box dynamique ( calculée avant de tester une collision selon la position de l'entity )
; MinZ .........|..........
; . | .
; . | .
; -----------0--------------
; . | .
; . | .
; MaxZ .........|..........
;
; MinX MaxX
; Les paramctres MinX.f , MinY.f , MinZ.f , MaxX.f , MaxY.f , MaxZ.f , correspondent aux dimensions de la box en prenant
; le centre de l'entity comme référence (0) .
; Exemple pour un mur de longueur x = 400 , hauteur y = 100 et largeur z = 30
; ensuite si on veut placer le mur r 45° r la position 1500,50,300
; EntityLocate(#Mur,1500,50,300)
; RotateEntity(#Mur,45,0,0)
; Entity(#Mur)\\AngleX = 45
; et on appelle la Procedure
; MakeBoxCollision( #Mur , EntityX(#Mur) , EntityY(#Mur) , EntityZ(#Mur) , 400 , 100 , 30 , Entity(#Mur)\\AngleX , 0 )
; Pour l'instant je considcre que la Box est centré sur l'entity , si ça devait par la suite se révéler trop contraignant
; il sera toujours possible de modifier légcrement cette procédure ainsi :
; Procedure MakeBoxCollision( No.l, X.f, Y.f, Z.f, MinX.f, MinY.f, MinZ.f, MaxX.f, MaxY.f, MaxZ.f, AngleX.f, Type.l )
AddElement( BoxCollision() )
BoxCollision()\No = No
BoxCollision()\X = X
BoxCollision()\Y = Y
BoxCollision()\Z = Z
BoxCollision()\MinX = -Longueur/2
BoxCollision()\MinY = -Hauteur/2
BoxCollision()\MinZ = -Largeur/2
BoxCollision()\MaxX = Longueur/2
BoxCollision()\MaxY = Hauteur/2
BoxCollision()\MaxZ = Largeur/2
BoxCollision()\AngleX = AngleX
BoxCollision()\Type = Type
EndProcedure
Procedure.l EntityCollision( No1.l , No2.l )
; La procedure renvoit -1 en cas d'erreur de paramctres ( Box inexistante , Box 1 et 2 identiques )
; La procedure renvoit 0 si aucune Collision
; La procedure renvoit 1 si la Box No1 est en Collision avec la Box No2
If No1 = No2 : ProcedureReturn -1 : EndIf
;************************************** Cherche Box *******************************************
Trouve = 0
ResetList( BoxCollision() )
While NextElement( BoxCollision() )
If BoxCollision()\No = No1
; Mise r Jour des caractériques de la Box
If BoxCollision()\Type = 1
BoxCollision()\X = EntityX(No1)
BoxCollision()\Y = EntityY(No1)
BoxCollision()\Z = EntityZ(No1)
BoxCollision()\AngleX = entity(No1)\AngleX
EndIf
; On récupcre les caractéristiques de la Box No1
PosX1.f = BoxCollision()\X
PosY1.f = BoxCollision()\Y
PosZ1.f = BoxCollision()\Z
MinX1.f = BoxCollision()\MinX
MinY1.f = BoxCollision()\MinY
MinZ1.f = BoxCollision()\MinZ
MaxX1.f = BoxCollision()\MaxX
MaxY1.f = BoxCollision()\MaxY
MaxZ1.f = BoxCollision()\MaxZ
AngleX1.f = BoxCollision()\AngleX
Trouve + 1
ElseIf BoxCollision()\No = No2
; Mise r Jour des caractériques de la Box
If BoxCollision()\Type = 1
BoxCollision()\X = EntityX(No2)
BoxCollision()\Y = EntityY(No2)
BoxCollision()\Z = EntityZ(No2)
BoxCollision()\AngleX = entity(No2)\AngleX
EndIf
; On récupcre les caractéristiques de la Box No2
PosX2.f = BoxCollision()\X
PosY2.f = BoxCollision()\Y
PosZ2.f = BoxCollision()\Z
MinX2.f = BoxCollision()\MinX
MinY2.f = BoxCollision()\MinY
MinZ2.f = BoxCollision()\MinZ
MaxX2.f = BoxCollision()\MaxX
MaxY2.f = BoxCollision()\MaxY
MaxZ2.f = BoxCollision()\MaxZ
AngleX2.f = BoxCollision()\AngleX
Trouve + 1
EndIf
If Trouve = 2 : Break : EndIf
Wend
; Il manque au moins une box
If Trouve < 2
ProcedureReturn -1
EndIf
;****************************** Changement de repcres ****************************************
CosA1.f = Cosd( AngleX1 )
SinA1.f = -Sind( AngleX1 )
CosA2.f = Cosd( AngleX2 )
SinA2.f = Sind( AngleX2 )
PosX.f = PosX1 - PosX2
PosY.f = PosY1 - PosY2
PosZ.f = PosZ1 - PosZ2
A1.f = (CosA1 * CosA2 - SinA1 * SinA2)
A2.f = (SinA1 * CosA2 + CosA1 * SinA2)
A3.f = (PosX * CosA2 - PosZ * SinA2)
A4.f = (PosX * SinA2 + PosZ * CosA2)
; Calcul les 4 coins de la Box sur le plan XZ en tenant compte du changement de repcre
;
; MinX1/MinZ1(0) ______ MaxX1/MinZ1(1)
; \ \
; \ \
; \ \
; MinX1/MaxZ1(3) \_____\ MaxX1/MaxZ1(2)
;
; Et ensuite on détermine une Box qui englobe le tout ( pas précis , mais plus simple )
; BoxMinX/BoxMinZ.............BoxMaxX/BoxMinZ
; . ______ .
; . \ \ .
; . \ \ .
; . \ \ .
; . \_____\.
; BoxMinX/BoxMaxZ.............BoxMaxX/BoxMaxZ
;
;MinX1/MinZ1
X0.f = MinX1 * A1 - MinZ1 * A2 + A3
Z0.f = MinX1 * A2 + MinZ1 * A1 + A4
BoxMinX.f = X0
BoxMinZ.f = Z0
BoxMaxX.f = X0
BoxMaxZ.f = Z0
;MaxX1/MinZ1
X1.f = MaxX1 * A1 - MinZ1 * A2 + A3
Z1.f = MaxX1 * A2 + MinZ1 * A1 + A4
If X1 < BoxMinX
BoxMinX = X1
ElseIf X1 > BoxMaxX
BoxMaxX = X1
EndIf
If Z1 < BoxMinZ
BoxMinZ = Z1
ElseIf Z1 > BoxMaxZ
BoxMaxZ = Z1
EndIf
;MaxX1/MaxZ1
X2.f = MaxX1 * A1 - MaxZ1 * A2 + A3
Z2.f = MaxX1 * A2 + MaxZ1 * A1 + A4
If X2 < BoxMinX
BoxMinX = X2
ElseIf X2 > BoxMaxX
BoxMaxX = X2
EndIf
If Z2 < BoxMinZ
BoxMinZ = Z2
ElseIf Z2 > BoxMaxZ
BoxMaxZ = Z2
EndIf
;MinX1/MaxZ1
X3.f = MinX1 * A1 - MaxZ1 * A2 + A3
Z3.f = MinX1 * A2 + MaxZ1 * A1 + A4
If X3 < BoxMinX
BoxMinX = X3
ElseIf X3 > BoxMaxX
BoxMaxX = X3
EndIf
If Z3 < BoxMinZ
BoxMinZ = Z3
ElseIf Z3 > BoxMaxZ
BoxMaxZ = Z3
EndIf
BoxMinY.f = MinY1 + PosY
BoxMaxY.f = MaxY1 + PosY
;**************************** Test si Collision *************************************************
; BoxMinX/BoxMinZ.............BoxMaxX/BoxMinZ MinX2/MinZ2.............MaxX2/MaxZ2
; . ______ . . .
; . \ \ . . .
; . \ \ . . .
; . \ \ . . .
; . \_____\. . .
; BoxMinX/BoxMaxZ.............BoxMaxX/BoxMaxZ MinX2/MaxZ2.............MaxX2/MaxZ2
;Test Collision
CondX = (BoxMaxX >= MinX2 And BoxMinX <= MaxX2)
CondY = (BoxMaxY >= MinY2 And BoxMinY <= MaxY2)
CondZ = (BoxMaxZ >= MinZ2 And BoxMinZ <= MaxZ2)
;Utilisé pour les collisions glissantes
GetCollisionX = 0
GetCollisionY = 0
GetCollisionZ = 0
If CondY And CondX And CondZ
; il serait surement plus judicieux de ne faire ces calculs que s'ils sont demandés
; en effet , dans de nombreux cas , on a seulement besoin de savoir s'il y a une collision
; et pas forcément de calculer une collision glissante !
;Collision en X
If BoxMinX < MaxX2 And BoxMinX > MinX2 And BoxMaxX > MaxX2
GetCollisionXa.f = BoxMinX - MaxX2
ElseIf BoxMaxX < MaxX2 And BoxMaxX > MinX2 And BoxMinX < MinX2
GetCollisionXa.f = BoxMaxX - MinX2
EndIf
; a voir pour traiter ça autrement ! > c'est pour éviter de tomber quand on s'approche trop du bord d'une box !
If Abs(GetCollisionXa) > 3
GetCollisionXa = 0
EndIf
; Collision en Z
If BoxMinZ < MaxZ2 And BoxMaxZ > MaxZ2 And BoxMaxZ > MaxZ2
GetCollisionZa.f = BoxMinZ - MaxZ2
ElseIf BoxMaxZ < MaxZ2 And BoxMaxZ > MinZ2 And BoxMinZ < MinZ2
GetCollisionZa.f = BoxMaxZ - MinZ2
EndIf
; A voir pour traiter ça autrement ! > c'est pour éviter de tomber quand on s'approche trop du bord d'une box !
If Abs(GetCollisionZa) > 3
GetCollisionZa = 0
EndIf
;Collision en Y
If BoxMinY < MaxY2 And BoxMinY > MinY2 And BoxMaxY > MaxY2 And GetCollisionXa = 0 And GetCollisionZa = 0
GetCollisionY = BoxMinY - MaxY2
ElseIf BoxMaxY < MaxY2 And BoxMaxY> MinY2 And BoxMinY < MinY2 And OldPosY < PosY0
GetCollisionY = BoxMaxY - MinY2
EndIf
;Changement de repcre des valeurs Collisions glissantes
CosA2.f = Cosd( -AngleX2 )
SinA2.f = Sind( -AngleX2 )
GetCollisionX = GetCollisionXa * CosA2 - GetCollisionZa * SinA2
GetCollisionZ = GetCollisionXa * SinA2 + GetCollisionZa * CosA2
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure GestionCamera()
; Touches de la Caméra
If KeyboardReleased(#PB_Key_F1) : Camera\CameraVue = 1 : EndIf
If KeyboardReleased(#PB_Key_F2) : Camera\CameraVue = 2 : EndIf
If KeyboardReleased(#PB_Key_F3) : Camera\CameraVue = 3 : EndIf
If KeyboardPushed(#PB_Key_PageUp)
Camera\AngleY + 0.1
EndIf
If KeyboardPushed(#PB_Key_PageDown)
Camera\AngleY - 0.1
EndIf
If KeyboardPushed(#PB_Key_End)
Camera\AngleY = CurveValue(Camera\AngleY,0,20)
EndIf
If Camera\CameraVue = 1
Camera\CameraDist = CurveValue(Camera\CameraDist ,85 , 20)
Camera\CameraHaut = CurveValue(Camera\CameraHaut ,25 , 20)
Camera\LookAtY = CurveValue(Camera\LookAtY ,0 , 20)
Camera\AngleX = CurveAngle(Camera\AngleX , entity(0)\AngleX , 20 )
PosXCamera.f = CurveValue(CameraX(0) , NewXValue(EntityX(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
PosYCamera.f = CurveValue(CameraY(0) , EntityY(0) + Camera\CameraHaut , 30)
PosZCamera.f = CurveValue(CameraZ(0) , NewZValue(EntityZ(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
CameraLookAt(0 , EntityX(0), EntityY(0) + Camera\LookAtY + Camera\AngleY ,EntityZ(0))
ElseIf Camera\CameraVue = 2
Camera\CameraDist = CurveValue(Camera\CameraDist ,45 , 20)
Camera\CameraHaut = CurveValue(Camera\CameraHaut ,25 , 20)
Camera\LookAtY = CurveValue(Camera\LookAtY , 8 , 20)
Camera\AngleX = CurveAngle(Camera\AngleX , entity(0)\AngleX , 20 )
PosXCamera.f = CurveValue(CameraX(0) , NewXValue(EntityX(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
PosYCamera.f = CurveValue(CameraY(0) , EntityY(0) + Camera\CameraHaut , 30)
PosZCamera.f = CurveValue(CameraZ(0) , NewZValue(EntityZ(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
CameraLookAt(0 , EntityX(0), EntityY(0) + Camera\LookAtY + Camera\AngleY ,EntityZ(0))
ElseIf Camera\CameraVue = 3
Camera\CameraDist = CurveValue(Camera\CameraDist ,15 , 20)
Camera\CameraHaut = CurveValue(Camera\CameraHaut ,95 , 20)
Camera\LookAtY = CurveValue(Camera\LookAtY , 0 , 20)
Camera\AngleX = CurveAngle(Camera\AngleX , entity(0)\AngleX , 20 )
PosXCamera.f = CurveValue(CameraX(0) , NewXValue(EntityX(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
PosYCamera.f = CurveValue(CameraY(0) , EntityY(0) + Camera\CameraHaut , 30)
PosZCamera.f = CurveValue(CameraZ(0) , NewZValue(EntityZ(0) , Camera\AngleX + 180 , Camera\CameraDist) , 280)
CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
CameraLookAt(0 , EntityX(0) , EntityY(0) + Camera\LookAtY + Camera\AngleY , EntityZ(0))
EndIf
EndProcedure
Procedure AffAide()
StartDrawing(ScreenOutput())
DrawText(10, 10, "Nombre d'images Minimum = " + StrF(Engine3DFrameRate(#PB_Engine3D_Minimum )) + " / Nombre d'images Maximum = " + StrF(Engine3DFrameRate(#PB_Engine3D_Maximum)))
DrawText(10, 30, "Nombre d'images par seconde = " + StrF(Engine3DFrameRate(#PB_Engine3D_Current)))
DrawText(10, 50, StrF(EntityX(0)) + " / " + StrF(EntityY(0)) + " / " + StrF(EntityZ(0)))
StopDrawing()
EndProcedure
;- Boucle principale
DecAttraction.f = 0.05
Attraction.f = 0
Pas.f = 0
Repeat
;ClearScreen(#Black)
If ExamineKeyboard()
; Touches du joueur r mettre dans une procédure et gérer un fichier préférence pour configurer les touches
If KeyboardPushed(#PB_Key_Left)
entity(0)\AngleX = WrapValue( entity(0)\AngleX + 1 )
ElseIf KeyboardPushed(#PB_Key_Right)
entity(0)\AngleX = WrapValue( entity(0)\AngleX - 1 )
EndIf
RotateEntity(0, entity(0)\AngleX , 0, 0 )
If KeyboardPushed(#PB_Key_Up)
Pas = CurveValue(Pas, 2 , 120)
ElseIf KeyboardPushed(#PB_Key_Down)
Pas = CurveValue(Pas, -2 , 120)
Else
Pas = CurveValue(Pas, 0 , 200)
EndIf
If KeyboardPushed(#PB_Key_Space) And Attraction = 0 And AutoriseSaut
Attraction = 1.6 : DecAttraction = 0.05
EndIf
If KeyboardReleased(#PB_Key_F4) : AfficheAide = 1 - AfficheAide : EndIf
EndIf
; LE perso avant
OldPosY = EntityY(0)
OldPosX = EntityX(0)
OldPosZ = EntityZ(0)
; LE perso pendant
MoveEntity( 0 , Cosd( entity(0)\AngleX ) * Pas , Attraction, -Sind( entity(0)\AngleX ) * Pas )
; LE perso aprcs
PosY0 = EntityY(0)
PosX0 = EntityX(0)
PosZ0 = EntityZ(0)
; Gestion de l'attraction
Attraction - DecAttraction
; Test des collisions
ResetList(BoxCollision())
While NextElement(BoxCollision())
NoBox = BoxCollision()\No
IndexBoxCollision = ListIndex(BoxCollision())
If EntityCollision( 0 , NoBox ) > 0
; Collision glissante
PosY0 - GetCollisionY
PosX0 - GetCollisionX
PosZ0 - GetCollisionZ
If GetCollisionY <> 0
If OldPosY < PosY0 And GetCollisionY > 0; pour ne pas rester coller sous une dalle quand on saute !!
Attraction = -0.1
AutoriseSaut = 0
Else
Attraction = 0
AutoriseSaut = 1
EndIf
EndIf
EndIf
SelectElement(BoxCollision(), IndexBoxCollision)
Wend
; Repositionne le perso
EntityLocate(0,PosX0 ,PosY0 ,PosZ0 )
; Gestion de la caméra
GestionCamera()
RenderWorld()
If AfficheAide : AffAide(): EndIf
FlipBuffers(#PB_Screen_WaitSynchronization )
Until KeyboardPushed(#PB_Key_Escape)
End
;-Datas du Cube
DataSection
Entitys:
; le perso
Data.l 2,1 ; matérial
Data.f 6,6,6 ; Dimension longueur , hauteur , largeur
Data.f 200,30,200,0 ; positions X,Y,Z et angle
; le sol
Data.l 3,0 ; matérial
Data.f 1000,8,1000 ; Dimension longueur , hauteur , largeur
Data.f 500,0,500,0 ; positions X,Y,Z et angle
; Un mur
Data.l 1,0 ; matérial
Data.f 100,25,10 ; Dimension longueur , hauteur , largeur
Data.f 400,16,400,45 ; positions X,Y,Z et angle
; Un autre mur
Data.l 1,0 ; matérial
Data.f 100,25,10 ; Dimension longueur , hauteur , largeur
Data.f 600,16,600,0 ; positions X,Y,Z et angle
; et un escalier
Data.l 1,0 ; matérial
Data.f 35,5,35 ; Dimension longueur , hauteur , largeur
Data.f 200,-80,700,0 ; positions X,Y,Z et angle
CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,0,-0.5
Data.f 0,1
Data.f -0.5,-0.5,0.5
Data.f -0.5,0,0.5
Data.f 1,1
Data.f 0.5,-0.5,0.5
Data.f 0.5,0,0.5
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 0.5,0,-0.5
Data.f 1,1
Data.f -0.5,0.5,-0.5
Data.f -0.5,0,-0.5
Data.f 0,0
Data.f -0.5,0.5,0.5
Data.f -0.5,0,0.5
Data.f 1,0
Data.f 0.5,0.5,0.5
Data.f 0.5,0,0.5
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 0.5,0,-0.5
Data.f 1,0
Data.f -0.5,-0.5,-0.5
Data.f 0,1,0
Data.f 0,0
Data.f -0.5,-0.5,0.5
Data.f 0,1,0
Data.f 1,0
Data.f 0.5,-0.5,0.5
Data.f 0,1,0
Data.f 1,1
Data.f 0.5,-0.5,-0.5
Data.f 0,1,0
Data.f 0,1
Data.f -0.5,0.5,-0.5
Data.f 0,-1,0
Data.f 0,0
Data.f -0.5,0.5,0.5
Data.f 0,-1,0
Data.f 1,0
Data.f 0.5,0.5,0.5
Data.f 0,-1,0
Data.f 1,1
Data.f 0.5,0.5,-0.5
Data.f 0,-1,0
Data.f 0,1
CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15
EndDataSection
Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
- tft
- Beiträge: 650
- Registriert: 08.09.2004 20:18
- Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
- Wohnort: Dachsen
- Kontaktdaten:
Hallo ...
und weils so schön war
Cube3D_MeshExample.pb
fiel spass
und weils so schön war
Cube3D_MeshExample.pb
Code: Alles auswählen
; http://en.games-creators.org/wiki/PureBasic:Mesh_more_complex
; Author: Comtois
; Date: 19. August 2006
; OS: Windows
; Demo: Yes
;
; Modify for PB 4.30 and Ogre by TFT 2009
;
; Cube 3D - a more complex mesh example
;PB4.0 Le 19/08/06
InitEngine3D()
InitSprite()
InitKeyboard()
ExamineDesktops()
If OpenWindow(0,0,0,800,600,"3D Mesh Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)=0
MessageRequester("Error", "Cant OpenWindow",0) : End
EndIf
If OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)=0
MessageRequester("Error", "Cant OpenWindowedSreen",0) : End
EndIf
;OpenScreen(800, 600, 32, "Cube 3D")
Macro RGB_INVERSE(Rouge,Vert,Bleu)
Rouge << 16 + Vert << 8 + Bleu
EndMacro
Structure s_Sommet
px.f
py.f
pz.f
nx.f
ny.f
nz.f
co.l
u.f
v.f
EndStructure
Structure s_Triangle
f1.w
f2.w
f3.w
EndStructure
Structure s_Mesh
No.l
*VBuffer.s_Sommet
*Ibuffer.s_Triangle
EndStructure
Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer
Define.s_Mesh CubeMesh
Procedure CreateMeshCube(*Mesh.s_Mesh)
*Mesh\VBuffer=AllocateMemory(SizeOf(s_Sommet) * 24)
*Mesh\IBuffer=AllocateMemory(SizeOf(s_Triangle) * 12)
CopyMemory(?Sommets, *Mesh\VBuffer, SizeOf(s_Sommet) * 24)
CopyMemory(?Triangles, *Mesh\IBuffer, SizeOf(s_Triangle) * 12)
If CreateMesh(*Mesh\No, 100)
Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
SetMeshData(*Mesh\No, Options , *Mesh\VBuffer, 24)
SetMeshData(*Mesh\No, #PB_Mesh_Face, *Mesh\IBuffer, 12)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure UpColorCube(*Mesh.s_Mesh, Couleur)
*Mem.s_Sommet = *Mesh\VBuffer
For i = 0 To 3
*Mem\co=Couleur
*Mem + SizeOf(s_Sommet)
Next i
EndProcedure
Procedure DownColorCube(*Mesh.s_Mesh, Couleur)
*Mem.s_Sommet = *Mesh\VBuffer + 4 * SizeOf(s_Sommet)
For i = 0 To 3
*Mem\co=Couleur
*Mem + SizeOf(s_Sommet)
Next i
EndProcedure
Procedure FrontColorCube(*Mesh.s_Mesh, Couleur)
*Mem.s_Sommet = *Mesh\VBuffer + 8 * SizeOf(s_Sommet)
For i = 0 To 3
*Mem\co=Couleur
*Mem + SizeOf(s_Sommet)
Next i
EndProcedure
Procedure BackColorCube(*Mesh.s_Mesh, Couleur)
*Mem.s_Sommet = *Mesh\VBuffer + 12 * SizeOf(s_Sommet)
For i = 0 To 3
*Mem\co=Couleur
*Mem + SizeOf(s_Sommet)
Next i
EndProcedure
Procedure LeftColorCube(*Mesh.s_Mesh, Couleur)
*Mem.s_Sommet = *Mesh\VBuffer + 16 * SizeOf(s_Sommet)
For i = 0 To 3
*Mem\co=Couleur
*Mem + SizeOf(s_Sommet)
Next i
EndProcedure
Procedure RightColorCube(*Mesh.s_Mesh, Couleur)
*Mem.s_Sommet = *Mesh\VBuffer + 20 * SizeOf(s_Sommet)
For i = 0 To 3
*Mem\co=Couleur
*Mem + SizeOf(s_Sommet)
Next i
EndProcedure
Procedure UpDateCube(*Mesh.s_Mesh)
Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
SetMeshData(*Mesh\No, Flag , *Mesh\VBuffer, 24)
EndProcedure
;-Mesh
#Mesh = 0
CubeMesh\No = #Mesh
CreateMeshCube(@CubeMesh)
UpColorCube(@CubeMesh, RGB_INVERSE(255,0,0)) ; Change la couleur de la face en haut
DownColorCube(@CubeMesh, RGB_INVERSE(255,255,0)) ; Change la couleur de la face en bas
FrontColorCube(@CubeMesh,RGB_INVERSE(0,255,0)) ; Change la couleur de la face avant
BackColorCube(@CubeMesh, RGB_INVERSE(0,0,255)) ; Change la couleur de la face arrière
LeftColorCube(@CubeMesh, RGB_INVERSE(255,128,0)) ; Change la couleur de la face gauche
RightColorCube(@CubeMesh,RGB_INVERSE(255,255,255)); Change la couleur de la face droite
UpDateCube(@CubeMesh) ; Mise à jour des couleurs, rend le changement effectif
;-Texture
#Texture = 0
CreateImage(#Texture, 128, 128)
;Remplissage de la texture en blanc avec une bordure noire
StartDrawing(ImageOutput(#Texture))
Box(0, 0, 128, 128, 0)
Box(1, 1, 126, 126, $FFFFFF)
StopDrawing()
If saveImage(#Texture,GetCurrentDirectory()+"test4.bmp")=0
MessageRequester("Error", "Cant save test4.bmp",0) : End
EndIf
Add3DArchive(GetCurrentDirectory(),#PB_3DArchive_FileSystem)
If LoadTexture(#Texture,"test4.bmp")=0
MessageRequester("Error", "Cant load test1.bmp",0) : End
EndIf
;-Matière
#Matiere = 0
CreateMaterial(#Matiere, TextureID(#Texture))
MaterialAmbientColor(#Matiere, #PB_Material_AmbientColors)
;-Entity
#Entity = 0
CreateEntity(#Entity, MeshID(#Mesh), MaterialID(#Matiere))
ScaleEntity(#Entity, 90, 90, 90) ; Agrandi l'entity
;-Camera
#Camera = 0
CreateCamera(#Camera, 0, 0 , 100 , 100)
MoveCamera(#Camera, 0, 0, -400)
CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
;-Light
AmbientColor(RGB(255,255,255))
pas = 0.8
Repeat
Angle + Pas
RotateEntity(0,angle,angle/2,-Angle)
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
CameraMode=1-CameraMode
CameraRenderMode(#Camera, CameraMode)
EndIf
EndIf
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
DataSection
Sommets:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,1
Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,1
Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,0
;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,0
Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,0
;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,0
;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,0
;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 1,0
;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 1,0
Triangles:
;Face en Haut
Data.w 2,1,0
Data.w 0,3,2
;Face en Bas
Data.w 6,5,4
Data.w 4,7,6
;Face Avant
Data.w 10,9,8
Data.w 8,11,10
;Face Arrière
Data.w 14,13,12
Data.w 12,15,14
;Face Gauche
Data.w 18,17,16
Data.w 16,19,18
;Face Droite
Data.w 22,21,20
Data.w 20,23,22
EndDataSection
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
Du scheinst ja selber die hälfte nicht glesen zu haben.tft hat geschrieben:ICH WEIS DAS DER BEFEHL NICHT MER EXISTIERT. ABER WENN ICH FÜR DEN BEFEHL MITHILFE DER TASTE F1 DIE HILFE AUFRUFE WIRD DER HILFSTEXT AUFGERUFEN. AUSSERDEM SUCHE ICH NACH EINEM FUNKTIONIERENDEN WEG DIESEN DOCH OFFT GENUTZTEN BEFEHL ANDERS UMZUSETZUTEN.
@mpz
... hast du das schon mal im englischen Forum vorgeschlagen?
MFG PMV
- tft
- Beiträge: 650
- Registriert: 08.09.2004 20:18
- Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
- Wohnort: Dachsen
- Kontaktdaten:
Hallo ..
wie auch immer. Ist das eine Problem gelöst ..... folgt gleich das nächste. Wenn ein Screen mit OpenScreen() geöffnet wird bring StartDrawing(ScreenOutput()) eine fehlermeldung. Irgendwas mit Argument 0 ungültig. Wenn man aber ein WindowedScreen macht. Gehts ......
Jemand ne idee....... oder muss ich den umweg über ein Fenster machen.
Gruss TFT
wie auch immer. Ist das eine Problem gelöst ..... folgt gleich das nächste. Wenn ein Screen mit OpenScreen() geöffnet wird bring StartDrawing(ScreenOutput()) eine fehlermeldung. Irgendwas mit Argument 0 ungültig. Wenn man aber ein WindowedScreen macht. Gehts ......
Jemand ne idee....... oder muss ich den umweg über ein Fenster machen.
Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> Irgendwas mit Argument 0 ungültig.
etwas genauer solltest du die fehlermeldung schon angeben...
ich kann mir vorstellen, dass du "the specified output is 0" meinst.
das tritt wie der Name sagt auf, wenn der Outputchannel nicht korrekt ist.
wenn du wie PMV vermutet einen 3D Screen benutzt, dann wird das ganze etwas komplexer,
da kannst du unter DX9 nicht mehr einfach mal so drauf drawen wie früher.
etwas genauer solltest du die fehlermeldung schon angeben...
ich kann mir vorstellen, dass du "the specified output is 0" meinst.
das tritt wie der Name sagt auf, wenn der Outputchannel nicht korrekt ist.
wenn du wie PMV vermutet einen 3D Screen benutzt, dann wird das ganze etwas komplexer,
da kannst du unter DX9 nicht mehr einfach mal so drauf drawen wie früher.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- tft
- Beiträge: 650
- Registriert: 08.09.2004 20:18
- Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
- Wohnort: Dachsen
- Kontaktdaten:
Hallo ....
ich weis nicht ob ich das Subsystem activ habe. Aber da ich 3D mithilfe der Pure eigenen Mittel mach, denke ich schon. Mir ist nur nicht klar warum Draw Befehle im WindowedSreen funktionieren und im FullScreen nicht. Ausser es verhält sich so. Das im Window Modus immer DX7 verwendet wird und die alten Befehle darauf halt noch funktionieren. Und bei Fullscreen unter DX9 dann halt nicht. Wenn dem so ist kann ich damit leben. Nehme ich halt einen umweg. Aber da nirgens darauf hingewiesen wird. Und die Beispiel in der Hilfe auch nicht darin Unterscheiden. Ist das am Anfang natürlich recht verwirrend. Denn die Hilfe sagt eindeutig folgendes.
Da ist dann auch der ominöse hinweis auf TextureOutput() noch drinn. Also bleibt mir nichts übrig als den WindowedMode zu nehmen und das ganze als Pseudo Fullscreen zu tarnen. Denn dann gehts ja. Allerdings weis ich noch nicht inwieweit die Neuen Ogre anbindung dann leuft. Beziehungsweise welche abstriche ich machen muss.
Gruss TFT
ich weis nicht ob ich das Subsystem activ habe. Aber da ich 3D mithilfe der Pure eigenen Mittel mach, denke ich schon. Mir ist nur nicht klar warum Draw Befehle im WindowedSreen funktionieren und im FullScreen nicht. Ausser es verhält sich so. Das im Window Modus immer DX7 verwendet wird und die alten Befehle darauf halt noch funktionieren. Und bei Fullscreen unter DX9 dann halt nicht. Wenn dem so ist kann ich damit leben. Nehme ich halt einen umweg. Aber da nirgens darauf hingewiesen wird. Und die Beispiel in der Hilfe auch nicht darin Unterscheiden. Ist das am Anfang natürlich recht verwirrend. Denn die Hilfe sagt eindeutig folgendes.
Code: Alles auswählen
StartDrawing()
Syntax
Ergebnis = StartDrawing(OutputID)
Beschreibung
Ändert die aktuelle Ausgabe auf den angegebenen Ausgabekanal. Nach dessen Festlegung werden alle Zeichenoperationen auf diesem ausgegeben. Sobald alle Zeichenoperationen abgeschlossen wurden, muss StopDrawing() aufgerufen werden.
Das 'Ergebnis' sollte immer überprüft werden, bevor Sie mit Zeichenfunktionen fortfahren. Ist das 'Ergebnis' gleich 0, dann kann der Ausgabekanal nicht zum Zeichnen verwendet werden, andernfalls ist alles OK.
Die Hintergrundfarbe wird auf schwarz (d.h. RGB(0,0,0)) und die Vordergrundfarbe auf weiß (d.h. RGB(255,255,255)) gesetzt.
Eine gültige 'OutputID' kann mit den folgenden Befehlen ermittelt werden:
WindowOutput() : Grafiken werden direkt auf dem Fenster gerendert
ScreenOutput() : Grafiken werden direkt auf dem Bildschirm gerendert (für Spiele)
SpriteOutput() : Grafiken werden direkt auf dem Sprite gerendert (für Spiele)
ImageOutput() : Grafiken werden direkt in die Bilddaten gerendert (siehe CreateImage())
PrinterOutput() : Grafiken werden direkt auf die Druckerausgabe gerendert
TextureOutput() : Grafiken werden direkt auf einer Textur gerendert
Für Zeichenoperationen stehen folgende Befehle zur Verfügung:
Box() : rechteckiger Kasten
Circle() : Kreis
Ellipse() : Ellipse
FillArea() : Füllfunktion
Line() : Linie (Breite und Höhe)
LineXY() : Linie (x1,y1 nach x2,y2)
Plot() : Punkt
DrawImage() : Anzeige eines vorhandenen Bildes
DrawText() : Ausgabe von Text
DrawingBuffer() : direkter Zugriff auf den Bildschirmbuffer für schnelle Grafikeffekte (nur auf Windows und Linux)
Hinweis: Unter Windows ist es erforderlich, die mittels WindowOutput() direkt in ein Fenster gezeichneten Grafiken nach jedem Verdecken, Minimieren etc. des Fensters manuell neu zu zeichnen ("zu refreshen"). Es ist daher empfehlenswert, Grafiken über ImageOutput() in ein Bild zu zeichnen und dieses als ImageGadget() im Anwendungsfenster darzustellen sowie ggf. mittels SetGadgetState() upzudaten. Windows erledigt dann das Neuzeichnen der Grafiken automatisch.
Der 'Ergebnis'-Wert ist das DC- (Device Context) Handle, welches ggf. von einigen WindowsAPI-Funktionen benötigt wird.
Unterstützte OS
Alle
<- Point() - 2DDrawing Inhaltsverzeichnis - StopDrawing() ->
Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung
PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler