Seite 2 von 3

Verfasst: 10.06.2009 00:09
von Kaeru Gaman
Engine3D braucht man auch für die Window3D-Lib... :wink:

Verfasst: 10.06.2009 00:26
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: ?

Verfasst: 10.06.2009 00:30
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.

Verfasst: 10.06.2009 00:33
von KeyKon
OK, überredet, fakt is aber wie ich schon schrieb, das im Code so etwas "abgehobenes" nicht vorkommt...

Verfasst: 10.06.2009 00:36
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..

Verfasst: 10.06.2009 01:16
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...

Verfasst: 10.06.2009 13:56
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

Verfasst: 10.06.2009 17:08
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...

Verfasst: 10.06.2009 17:40
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?

Verfasst: 10.06.2009 19:14
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.