SpriteCollision und DrawText - Problem

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Engine3D braucht man auch für die Window3D-Lib... :wink:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Kaeru Gaman hat geschrieben:Engine3D braucht man auch für die Window3D-Lib... :wink:
Aber man braucht sie doch nich für ein 2D-Game :freak: ?
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

*SOIFZ*

wenn du die CEGUI elemente verwenden willst, und das sind die einzigen Gadgets die über nem Fullscreen funzen,
dann musst du InitEngine3D() ausführen, und wenn dein Game nur ein PONG mit drei Farben ist.

... ich hab das schon ein paar mal angesprochen, dass man das vielleicht outsourcen sollte, in zwei verschiedene Inits trennen,
aber es interessiert ja zu wenige solange sie nicht selber auf das Problem stoßen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

OK, überredet, fakt is aber wie ich schon schrieb, das im Code so etwas "abgehobenes" nicht vorkommt...
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

in den zwei snippets nicht... wie gesagt, ich kenn nicht das ganze projekt, war mir jetz zu müßig das runterzuladen...

aber wenn du dir das ganze angeschaut hast, dann haste ja gesehen, ob es läuft wenn du's richtig korrigierst,
und nur er nen typo reingehaun hat beim umsetzen des tipps..
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Hab jetzt ewig nach dem Fehler gesucht, er lag nich im Code sondern im Subsystem: Er hat OpenGL benutzt, damit kenn ich mich leider nich aus, is damit kein ScreenDrawing möglich?

EDIT: Hab jetz mal ein paar Sachen im Code gefixt, er läuft jetz auf jeden Fall, ich emfpehle das DX9 Subsystem zu nehmen, da es die AlphaBlending Qualitäten von OpenGL besitzt aber das Drawing funktioniert:

Code: Alles auswählen

; Win
; Engine
; Copyright (C) Tur0k

; Fixes by KeyKon

UsePNGImageDecoder()

; WindowMouseX(0)

;ohne Screen immer GetAsyncKeyState_(#Button) verwenden.
;(Linke Maustaste: #VK_LBUTTON, rechte: #VK_RBUTTON) 

If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
  End
EndIf

PlayerX = 1
PlayerY = 1
WandX = 50
WandY = 50
menubox = 0

Enumeration ;Sprites
  #Sp_Map
  #Sp_Wand
  #Sp_Cursor
  #Sp_MiniBox
  
EndEnumeration

Structure sp
  sid.l
  s3did.l
  
EndStructure

Dim Figur.sp(3)

If OpenWindow(0, 0, 0, 400, 400, "Turoks Engine", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  If OpenWindowedScreen(WindowID(0), 0, 0, 400, 400, 0, 0, 0)
  
    Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
    
    LoadSprite(#Sp_MiniBox, "mini_box.png", #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
    CreateSprite3D(#Sp_MiniBox, #Sp_MiniBox)
    
    LoadSprite(#Sp_Cursor, "cursor.png", #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
    CreateSprite3D(#Sp_Cursor, #Sp_Cursor)
    
    
    LoadSprite(#Sp_Map, "map_01.png", #PB_Sprite_Texture)
    CreateSprite3D(#Sp_Map, #Sp_Map)
    
    LoadSprite(#Sp_Wand, "wand.png", #PB_Sprite_Texture)
    CreateSprite3D(#Sp_Wand, #Sp_Wand)
    
    For x = 0 To 3
      Figur(x)\sid = LoadSprite(#PB_Any,"person"+Str(x+1)+".png",#PB_Sprite_Texture)
      Figur(x)\s3did = CreateSprite3D(#PB_Any,Figur(x)\sid)
    Next
    
  EndIf
  
Else
  MessageRequester("Error", "Can't open windowed screen!", 0)
  End
EndIf

Repeat

  Repeat

    Event = WindowEvent()
   
    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
   
  Until Event = 0

  ExamineKeyboard()
  
  If GetAsyncKeyState_(#VK_RBUTTON)
   DispBox = 1
  Else
   DispBox = 0  
  EndIf
  
  Delay(5)
    
  ; ------------------------------------------------
  ClearScreen(RGB(0,0,0))
  ; ------------------------------------------------
    
    If Start3D()
    
      DisplaySprite3D(#Sp_Map, 0, 0)
    
      DisplaySprite3D(#Sp_Wand, WandX, WandY)
    
      DisplaySprite3D(Figur(way)\s3did, PlayerX, PlayerY)
      
      If WindowMouseX(0) > -1
        DisplaySprite3D(#Sp_Cursor, WindowMouseX(0)-12, WindowMouseY(0)-12)
      EndIf
      
      If DispBox
        DisplaySprite3D(#Sp_MiniBox, WindowMouseX(0)-55, WindowMouseY(0)+15)
      EndIf
      
      Stop3D()
    EndIf
   
        
    ; ------------------------------------------------
    If KeyboardPushed(#PB_Key_W) And PlayerY > 0 
      PlayerY-1
      way = 3
      If SpriteCollision(Figur(way)\sid,PlayerX,PlayerY,#Sp_Wand,WandX,WandY)
        PlayerY+1
      EndIf
      
    EndIf
    ; ------------------------------------------------
    If KeyboardPushed(#PB_Key_S) And PlayerY < 356
      PlayerY +1
      way = 0
      If SpriteCollision(Figur(way)\sid,PlayerX,PlayerY,#Sp_Wand,WandX,WandY)
        PlayerY-1
      EndIf
      
    EndIf
    ; ------------------------------------------------
    If KeyboardPushed(#PB_Key_A) And PlayerX > 0   
      PlayerX -1
      way = 2
      If SpriteCollision(Figur(way)\sid,PlayerX,PlayerY,#Sp_Wand,WandX,WandY)
        PlayerX+1
      EndIf
      
    EndIf
    ; ------------------------------------------------
    If KeyboardPushed(#PB_Key_D) And PlayerX < 379
      PlayerX +1
      way = 1
      If SpriteCollision(Figur(way)\sid,PlayerX,PlayerY,#Sp_Wand,WandX,WandY)
        PlayerX-1
      EndIf
      
    EndIf
    
    SetWindowTitle(0, "Spieler Position: " +  "X: " + Str(PlayerX) +  "      " + " Y: " + Str(PlayerY) +  "     " + "Mouse X: " + Str(WindowMouseX(0)) +  "      " + " Mouse Y: " + Str(WindowMouseY(0)))  
    
    If StartDrawing(ScreenOutput())
     
      DrawingMode(#PB_2DDrawing_Transparent)
      BackColor(RGB(0,155,155)) ; Change the text back and front colour
      FrontColor(RGB(255,255,255))
      If DispBox
        DrawText(WindowMouseX(0)-44, WindowMouseY(0)+23,"This is a test")
      EndIf
      StopDrawing()
    EndIf
    
    FlipBuffers()
    ; ------------------------------------------------
    
Until  Quit Or KeyboardPushed(#PB_Key_Escape) 
Abschließend sollte ich noch sagen das das ganze nur eine Verbresserung deines Codes is, die Struktur hab ich nich groß verändert und du wirst dir das Genick brechen wenn du versuchst daraus eine größere Sache zu machen, ich leg dir wirklich nochmal die Tile-Technik ans Herz, das is glaubich für dich genau das richtige...
(\/) (°,,,°) (\/)
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

Danke KeyKon für deine Tipps!

Ich werde von neu beginnen, und auch mit TileArray usw. arbeiten.
So wäre es viel leichter für mich.
Auf den Code werde ich auch natürlich achten.

Edit:
Vielen Dank für den Codefix! :D

Kleiner Fehler, wenn man die Taste S klickt, wird die Map (Bild) bewegt.
Versuch ich mal zu fixen...
Und den Code zu verstehen.

Mfg. Tur0k
buuh* :D
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Tur0k hat geschrieben:Kleiner Fehler, wenn man die Taste S klickt, wird die Map (Bild) bewegt.
Hä? Also bei mir nich... :freak:

EDIT: Ich weis was bei dir falsch is, nach meinem Code muss "person.png" in "person1.png" umbenannt werden, da ich das ganze in einer Schleife lade...
(\/) (°,,,°) (\/)
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

Ok, jetzt stimmts! :D

Thx und Mfg. Tur0k

Edit:

KeyKon, hast du den Code alles selber eingerückt oder ein spezielles Tool verwendet?
buuh* :D
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das Einrücken geht einfacher als man denkt, wenn man den zweiten teil eines doppelbefehls gleich mit dem autocomplete mit einsetzt.

außerdem hilft es beim strukturieren.
ich könnte nicht halb so effektiv coden, wenn ich jede zeile ganz vorne anfangen würde.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten