StartDrawing(TextureOutput(#Texture))

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
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

Beitrag von mpz »

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
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
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:

Beitrag von tft »

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
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 :-)
Benutzeravatar
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:

Beitrag von tft »

Hallo ....

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
es leuft bei mir ...... fiel spass

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 :-)
Benutzeravatar
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:

Beitrag von tft »

Hallo ...

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
fiel spass
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 :-)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

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.
Du scheinst ja selber die hälfte nicht glesen zu haben. :roll:

@mpz
... hast du das schon mal im englischen Forum vorgeschlagen? :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
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:

Beitrag von tft »

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
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 :-)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Du nutzt ja sicher OGRE (also die 3D-Befehle)? Hast du das Subsystem
DirectX9 aktiv?

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
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:

Beitrag von tft »

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.

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() -> 
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
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 :-)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

tft hat geschrieben:Hallo ....

ich weis nicht ob ich das Subsystem activ habe.
Damit Problem gelöst ...
Compiler -> Compiler-Optionen -> unter Library Subsystem "DirectX9" eintragen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten