Seite 2 von 16

Re: Project_17 (Arbeitstitel)

Verfasst: 19.07.2019 19:14
von darius676
OK. Der erste Post muss angepasst werden. Leider kann ich hier veralteten Inhalt nicht ausblenden. Der Download ist über die angeführten links möglich. Da ich noch wie beschrieben in der inhaltlichen Findungsphase bin, kann sich Inhalt und Art des Spieles noch ändern. Ansonsten bitte ich untertänigst um Nachsicht.

Ach ja: Wir wollen ein bisschen locker bleiben.
In diesem forum wird egal was zum Thema purebasic gepostet. Schön. Schön, daß Programmiersprachen neben c, visualxxxx usw. BASIC Dialekte verwendet werden. Die Community ist sicher nicht so groß und aktiv um hier Hobby Programmierer gleich zu attackieren (HEXOR) und sich hier mit elitäre Forenverhaltensweisen zu profilieren.

Dank an André und die anderen purebasic Entwickler,
die mehr ideologisch und mit Herzblut an dem Projekt arbeiten haben wir die Möglichkeit mit geringen finanziellen Aufwand unserem Hobby nachkommen. Also : danke für den Hinweis, aber mit : hallo darius, danke für deinen Beitrag, aber leider ist dieser inhaltlich bzw. wie du ihn gepostet hast nicht optimal zu lesen. Bitte berücksichtige folgendes.....funktioniert bei mir.....


Ps: die bastelkelkeller Website ist nicht erreichbar.

Re: Project_17 (Arbeitstitel)

Verfasst: 19.07.2019 22:57
von NicTheQuick
Du kannst mir oder RSBasic gerne sagen, wenn wir für dich etwas aufräumen sollen. Und keine Sorge, ich bin locker, war wohl nur zu sparsam mit den Smileys. :wink:
Ja, die Webseite ist bewusst offline, der YouTube-Kanal ist aber nach wie vor verfügbar.

Re: Project_17 (Arbeitstitel)

Verfasst: 07.08.2019 20:50
von darius676
Project17
Version 201908072017:

folgende Änderungen gibt es:

Da die Ladezeiten der ersten großen Map doch recht lang waren, wurde die Engine um die Möglichkeit
die Map zu streamen ergänzt.
Erhebliche Ladezeitverkürzung
Es gibt neue Objekte in der Map, damit diese nicht so "tot" wirkt.
Im Debugmodus (Standardeinstellung) wurde die hintergrundfarbe von Rot nach Grün geändert. Wesentlich netter für die Augen. :)
Zum Testen kann zwischen streaming oder konventionelles laden umgeschalten werden.
Welche Tasten was bewirken wird im Debugmodus angezeigt.

Spielereingaben/Steuerung von Refreshrate des Bildschirmes entkoppelt.
Alle Spieler - Steurerung - Aktionen sollten nun gleich schnell oder auch langsam ablaufen, egal welche Leistung des ausführende System zu Verfügung stellt.


Inhaltlich bewegt sich das Spiel immer näher in Richtung Dungeon Crawler.
Ziel (bis jetzt): Alle Schatzkisten finden.

Die aktuelle Version überprüft noch nicht die Gesamtzahl der in der Map verbauten Schatzkisten.
Das System wurde universeller gestaltet, somit können in Zukunft andere Questaufgaben auf den Spieler warten.

Systemvoraussetzungen:
getestet auf verschiedenen Systemen Intel I3, Atom, Intel I5, Intel HD 610/620 , nVidia 1050TI (ab Windows 7 64Bit, bis Windows 10 64Bit) 32 Bit wird aktuell nicht unterstüzt.
mindest (verschiedene getestet) Bildschirmauflösung: 1024 x 768, maximal ?

Bekannte Probleme:
Performance abhängig von der Desktopauflösung und Refreshrate.

LG.
Walter

Downloadlink findet sich im ersten Post.

Re: Project_17 (Arbeitstitel)

Verfasst: 09.08.2019 10:40
von darius676
Kleines aber feines Update:

Project_17 Changelog:
Version Alpha: 201908091024

Performanceverbresserung:
indexer arbeitet nun korrekt.

Leichter Slowdown beim Streamen der Umgebung möglich.

Neue Funktionen:
Verzeichnis "PROJECT17" inclusive einer Testdatei wird , falls nicht vorhanden, beim Start im UserDirectory von Windows angelegt.
Vorbereitung für Accountbezogene Spielstände usw.

Downloadlink für die aktuellste Version, wie immer im ersten Post.

Re: Project_17 (Arbeitstitel)

Verfasst: 09.08.2019 10:42
von RSBasic
Wenn ich auf deinen Downloadlink klicke, erhalte ich folgende Meldung:
dropbox hat geschrieben:404
Diese Datei befindet sich nicht mehr an diesem Speicherort
\\Edit:
Jetzt haste den Link angepasst und Download geht wieder.

Re: Project_17 (Arbeitstitel)

Verfasst: 09.08.2019 10:55
von darius676
RSBasic hat geschrieben:Wenn ich auf deinen Downloadlink klicke, erhalte ich folgende Meldung:
dropbox hat geschrieben:404
Diese Datei befindet sich nicht mehr an diesem Speicherort
\\Edit:
Jetzt haste den Link angepasst und Download geht wieder.
:bounce:

Re: Project_17 (Arbeitstitel)

Verfasst: 09.08.2019 15:39
von Mijikai
Da du auch an einer Engine arbeitest würde mich interessieren:
1. Was genau passiert wenn die Map gestreamt wird?
2. Welche Vor- und Nachteile hat das Verfahren?

Re: Project_17 (Arbeitstitel)

Verfasst: 09.08.2019 17:59
von darius676
Hi,



Da ich mehr dieser "Open World" , Spieler bin, ist es für mich eine Herausforderung, selbst Open World Spiele(Konzepte) zu entwickeln.

Problem dabei ist: Die gigantische Menge an Daten die dabei zusammenkommen, inklusive der vielen Fehler und Abhängigkeitsprobleme unter den Dateien.

Aber zu deiner Frage:
Die gigantische Datenmenge macht folgendes Problem:
Stell dir vor du willst eine große Stadt, Insel, was auch immer digital bauen.
Ich verwende Bitmapgrafiken und simple 2D Technik dazu.
nun hat die erste "große" Map um die 6000 Objekte, welche alle Eigenschaften haben wie: Sound, verknüpfte Grafikdatei, Interaktionsmöglichkeiten usw...
du kannst die Map komplett in den Speicher laden, dauert halt so 20 bis 30 Sekunden.

oder du lädts nur den Bereich der sichtbar ist, und bei bedarf weitere objekte nach: Ladegeschwindigkeit ca. 2 Sekunden

Vorteil: schneller Level/Map Ladevorgang.

Nachteil: Etwas aufwändiger zu Programmieren, bzw. treten Fehler auf die bei "Lade komplett alles" nicht passieren, bzw. gewisse Dinge müssen der Engine vorher mitgeteilt werden.
ein weiterer Nachteil: Beim Nachladen kommt es mal mehr mal weniger zu Frameeinbrüchen.


Code Auszug aus meiner Engine:

Code: Alles auswählen

 Procedure  E_STREAM_TERRA_START()
    Define _dummy.b=#False
    Define _thread.l=0

    ;********************  this routine supports  mapstreaming, so loading times are very short and fast ***************** we can build so much bigger maps now *****************
    ;this is the main and key routine for the final GFX output
    ;this routine manipulates all posteffects and GFX and SFX , calls routines for SFX  & GFX
    ;the final display "catch" routine can take this screen and use it for display output
    
    e_object_in_screen.l=0 ;counter used for debugging a
    
   ResetList(world_object())
   E_PERFORMANCE_ADAPTER(#RESET_INDEXER)  ; for interactive objects in viewable area, first start each frame we reset the index (list) and remove all entries
    
    ForEach world_object()  ;here we will load/hold the sprites for the gfx presentation of the game
      
      E_OBJECT_BLINK()
        
     If world_object()\object_full_screen<>0
        ;fullscreen objects are shown 
       E_STREAM_LOAD_SPRITE(#False)
        DisplayTransparentSprite(world_object()\object_gfx_id_default_frame,0,0,world_object()\object_transparency)
       EndIf
        
        
        If world_object()\object_full_screen=0
        
        world_object()\object_is_in_area=#False ;default we are not in area, used for visble area only interactions we must not calculate all of the mess
        world_object()\object_is_in_area_shadow=#False;no shadows in area, we use  the performanceguard routine to handle the field of view, this is used for variuos perfomrance tweaks (shadows, spritequality...)
        
        If  world_object()\object_is_active=#True And world_object()\object_blink_object_show=#True  
          
          If (world_object()\object_x+e_world_offset_x.f+world_object()\object_w) >-1 And  (world_object()\object_x+e_world_offset_x.f)<(v_screen_w.f+1)
            
            If (world_object()\object_y+e_world_offset_y.f +world_object()\object_h)> -1 And ( world_object()\object_y+e_world_offset_y.f)<(v_screen_h.f+1)
              
              world_object()\object_is_in_area=#True 
              world_object()\object_is_in_area_shadow=#True  
                        
            EndIf
            
          EndIf
          
                    
          
          If   world_object()\object_is_in_area=#True 
            
            
            E_STREAM_LOAD_SPRITE(#False)  ;here we jump to the big loading routine
            E_PERFORMANCE_ADAPTER(#ADD_TO_INDEXER)  ;here we add objects to indexer if the have an indexer flag 
            E_LIFE_TIMER()
            E_RANDOM_OBJECT_CHANGE()
            E_STREAM_DEBUG_GFX()  ;for debugging
                            
                  If world_object()\object_do_not_show=1    ;show me.... if 0, do not show me
                world_object()\object_transparency=0    ;we do not show it....
              EndIf
          
          e_object_in_screen.l+1  ;count the objects in screen (for debugging/developement)
          
          If world_object()\object_use_shadow<>0 And world_object()\object_is_anim=0 And world_object()\object_is_in_area_shadow=#True 
            DisplayTransparentSprite(world_object()\object_gfx_id_default_frame,world_object()\object_x+e_world_offset_x.f+world_object()\object_shadow_offset_x,world_object()\object_y+e_world_offset_y.f+world_object()\object_shadow_offset_y,world_object()\object_shadow_intense,RGB(0,0,0))
          EndIf
                   
          If world_object()\object_is_anim=0
            DisplayTransparentSprite(world_object()\object_gfx_id_default_frame,world_object()\object_x+e_world_offset_x.f,world_object()\object_y+e_world_offset_y.f,world_object()\object_transparency)
          Else
            E_ANIM_SPRITE_ID()
          EndIf
          
          If world_object()\object_light_on=1 
            ;show light? is  light?
            DisplayTransparentSprite(world_object()\object_gfx_id_default_frame,world_object()\object_x+e_world_offset_x.f+world_object()\object_shadow_offset_x,world_object()\object_y+e_world_offset_y.f+e_shadow_y_offset.f,world_object()\object_shadow_intense)
          EndIf

        EndIf
        
      
    EndIf
    
EndIf

E_CHECK_MAP_FOR_QUEST_STATUS()
      E_CLEAN_UP_SGFX()
    Next
  EndProcedure
  


Hier ist die Routine zum Laden der Grafik, bzw. der Objekte mit all ihren Eigenschaften:
diese wird in E_STREAM_TERRA_START() für jedes sichtbare (im Bild befindliche) Objekt aufgerufen, wenn das Objekt noch nicht geladen wurde geschiet dies, ansonsten wird die Routine sofort wieder verlassen.
Damit die Engine weiss welche Objekte geladen werden müssen, wurde im Vorfeld durch den "worldcreator" die Breite und Höhe des Sprites mit in die Mapdatei gespeichert. Sobald mathematisch eine Überschneidung mit dem Blickfeld stattfinded wird die E_STREAM_LOAD_SPRITE() aufgerufen.

Code: Alles auswählen

 Procedure E_STREAM_LOAD_SPRITE(_mode.l)
  ;***************************************************
  ;here we read all object relevant infos
  ;
  ;****************************************************

   
   If world_object()\object_stream_gfx_loaded=#True  ;already loaded.....
           ProcedureReturn
    EndIf
        
  Define _dummy.s=""
  Define _sprt.l=0
  Define _ok.l=0
  Define _key.s=""
  Define _help_path.s=""
  Define _dummy_x.f=0
  Define _dummy_y.f=0
  Define _dummy_layer.l=0
  Define _dumy_last_list_element.l=0
  
   SpriteQuality(#PB_Sprite_BilinearFiltering) ; maximum spritequality
   
   Select _mode.l
       
     Case #E_ADD_ELEMENT_TO_MAP   ;add single object to map
       
       ;default initialising:
       _dummy.s=GetPathPart(world_object()\object_ai_path)+world_object()\object_alternative_gfx_ai
       _dummy_x.f=world_object()\object_x
       _dummy_y.f=world_object()\object_y
       _dummy_layer.l=world_object()\object_layer
       
       
       LastElement(world_object())  ;go for the last element in the list, so we can add the element to the end of the list!!!
       
       If AddElement(world_object())
         ;here we call a check routine for layer position....so we can place some special objects on right layer
         E_DNA_CHECK(_dummy_layer.l)
         world_object()\object_x+_dummy_x.f
         world_object()\object_y+_dummy_y.f
         world_object()\object_layer=_dummy_layer.l
         world_object()\object_ai_path=_dummy.s
            e_global_dummy_debug_output_string.s= world_object()\object_ai_path
        LastElement(world_object())
       SelectElement(world_object(),ListSize(world_object())-2)  ;attention! here we have a hardcoded offset, to get the right alternative gfx , if the mapsystem is changed be aware to check for this
         Else
         ProcedureReturn ;we can not add an element  anymore
       EndIf
       
     Default
   ;    ResetList(world_object())  ;standard  map load methode of the system  ;not needed for stream system
   EndSelect

  
    ;some basic setting for startup for each element which is added
    world_object()\object_gfx_is_valid=#False  ; first setting is all gfx is nit loaded
    world_object()\object_emitter_is_in_use=#False
    world_object()\object_move_direction=#NO_DIRECTION
    world_object()\object_last_move_direction=#NO_DIRECTION
    world_object()\object_can_change=#True ;for some gfx changiong and effects
     ;for the alternative element (on collsion we can change a chest to fire... or what esle...)
    ;dummy... = 0 if default map creation, dummy <> 0 if add object to mapmode
        ;-------------------------------------------------------------------------------------------------------------------------------------------
    
    _ok.l=ReadFile(#PB_Any,world_object()\object_ai_path)
    
    If IsFile(_ok.l)
      
      While Not Eof(_ok.l)
        
            _key.s=Trim(ReadString(_ok.l)," ")  ;remove " " from the string, our keywords do not use  any " " on the begining or on the end or anywhere in the string
        
        Select _key.s
            
          Case "object_file#"
            world_object()\object_gfx_path=ReadString(_ok.l)
            
          Case "object_type#"
            _dummy.s=ReadString(_ok.l)
            world_object()\object_gfx_path=world_object()\object_gfx_path+"."+_dummy.s
            world_object()\ object_gfx_type=_dummy.s
       
            ;-----------------for shadow map path------------------------------------
            _help_path.s=world_object()\object_gfx_path
            ;------------------------------------------------------------------------
            
            world_object()\object_gfx_path=v_engine_gfx_path+world_object()\object_gfx_path
            
            ;here we go for  sprite  and collisions data:
            
              world_object()\object_gfx_id_default_frame=LoadSprite(#PB_Any,world_object()\object_gfx_path,#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending )
        
            If IsSprite(world_object()\object_gfx_id_default_frame)
                ;---------------------------- automatic shadow position for all objects --------------------------- this is used if no shadow offset information is in the ai42 file, but shadow is #true
              world_object()\object_shadow_offset_x=SpriteWidth(world_object()\object_gfx_id_default_frame)/8
              world_object()\object_shadow_offset_y=SpriteHeight(world_object()\object_gfx_id_default_frame)/8
              ;------------------------------------------------------------
               world_object()\object_w=SpriteWidth(world_object()\object_gfx_id_default_frame)
               world_object()\object_h=SpriteHeight(world_object()\object_gfx_id_default_frame)
               world_object()\object_gfx_is_valid=#True
               world_object()\object_stream_gfx_loaded=#True
               e_object_streamed.i+1
               Else
              
              e_log_gfx_source.s=world_object()\object_gfx_path   ;log the gfx errors
              E_DEFAULT_ERROR_HANDLING(#E_ERROR_CAN_NOT_READ_MAP_OBJECT,"CAN NOT ADD MAP ELEMENT TO WORLD")  
            EndIf
            
          Case "object_full_screen.b"
             If Val(ReadString(_ok.l))=1
              world_object()\object_full_screen=#True  ;make it fullscreen
              world_object()\object_w=v_screen_w.f
              world_object()\object_h=v_screen_h.f
              ZoomSprite(world_object()\object_gfx_id_default_frame, world_object()\object_w, world_object()\object_h)
            EndIf
            
          Case "object_transparency.l"
            
            world_object()\object_transparency=255-Val(ReadString(_ok.l))
            world_object()\object_transparency_back_up=world_object()\object_transparency
            
            
          Case "object_touch_collision.b"
            world_object()\object_touch_collision=Val(ReadString(_ok.l))
            
            
          Case "object_use_shadow.b"
            world_object()\object_use_shadow=Val(ReadString(_ok.l))
         
          Case "object_shadow_intense.l"
            
            world_object()\object_shadow_intense=Val(ReadString(_ok.l))
            
          Case "object_shadow_offset_x.f"
            world_object()\object_shadow_offset_x=ValF(ReadString(_ok.l))
            
          Case "object_shadow_offset_y.f"
             world_object()\object_shadow_offset_y=ValF(ReadString(_ok.l))
         
          Case "object_do_not_show.b"
            
            _dummy.s=ReadString(_ok.l)
            
            If Len(_dummy.s)=0
              world_object()\object_do_not_show=0
            Else
              world_object()\object_do_not_show.b=Val(_dummy.s)
            EndIf
            
        
            
          Case "object_is_active.b"
            
            _dummy.s=ReadString(_ok.l)
            
            If Len(_dummy.s)<1
                            ;fall back if status is not defined (NULL STRING), we use 1 as value = active, compatibility  for older versions
              world_object()\object_is_active=#True
              
                          Else
              
              Select Val(_dummy.s)
                  
                  Case 1 
                    world_object()\object_is_active=#True
                    
                  Case 0
                    
              world_object()\object_is_active=#False
                  
              EndSelect
                            
            EndIf
                   
            
          Case "object_is_player.b"
            

            world_object()\object_is_player=Val(ReadString(_ok.l))
            
            If world_object()\object_is_player<>0
            
              e_player_list_object_id.l=ListIndex(world_object())
              e_internal_sprite_id.i= LoadSprite(#PB_Any,world_object()\object_gfx_path,#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending )
              e_internal_sprite_valid.b=#True
          
          EndIf

            
          Case "object_move_x.f"
            world_object()\object_move_x=ValF(ReadString(_ok.l))
  
            
          Case "object_move_y.f"
            world_object()\object_move_y=ValF(ReadString(_ok.l))
 
          Case "object_collision.b"
            world_object()\object_collision=Val(ReadString(_ok.l))
            
          Case "object_internal_name.s"
            world_object()\object_internal_name=Trim(ReadString(_ok.l)," ")
            E_ACTION_ON_INTERNAL_NAME()
            
            If world_object()\object_is_anim=1
              
              E_LOAD_ANIM_SPRITE()
              
            EndIf
            
          Case "object_alpha_blend.l"
            E_DEFINE_BLENDING_MODE(ReadString(_ok.l))
            
          Case "object_is_enemy.b"
            world_object()\object_is_enemy=Val(ReadString(_ok.l))
            
          Case "object_use_ai.s"
            E_SETUP_AI(ReadString(_ok.l))
          
            
          Case "object_is_anim.b"
            world_object()\object_is_anim=Val(ReadString(_ok.l))
            
          Case "object_is_light.b"
            world_object()\object_is_light=Val(ReadString(_ok.l))
            
          Case "object_light_on.b"
            world_object()\object_light_on=Val(ReadString(_ok.l))
            
          Case "object_spritequality.b"
             world_object()\object_spritequality=Val(ReadString(_ok.l))
             
           Case "object_collision_pixel.b"
             world_object()\object_collision_pixel=Val(ReadString(_ok.l))
             
          Case "object_use_random_angle.f"
            world_object()\object_use_random_angle=ValF(ReadString(_ok.l))
            
            If IsSprite(world_object()\object_gfx_id_default_frame)
              RotateSprite(world_object()\object_gfx_id_default_frame,Random(world_object()\object_use_random_angle), #PB_Absolute)
            EndIf
            
          Case "object_random_transparency.l"
            world_object()\object_random_transparency.l=Val(ReadString(_ok.l))
            
          Case "object_random_rotate.f"
            world_object()\object_random_rotate=ValF(ReadString(_ok.l))
            
          Case "object_manual_rotate.f"
            world_object()\object_manual_rotate=ValF(ReadString(_ok.l))
            
          Case "object_auto_rotate.f"
            world_object()\object_auto_rotate=ValF(ReadString(_ok.l))
            
          Case "object_is_emitter.b"
            world_object()\ object_is_emitter=Val(ReadString(_ok.l))
            
          Case "object_is_emitter_type.s"

            Select  Trim(ReadString(_ok.l)," ")
                
                Case "#ENGINE_EMITTER_TYPE_ON_KILL"
                  world_object()\object_is_emitter_type=#ENGINE_EMITTER_TYPE_ON_KILL
            
                Case "#ENGINE_EMITTER_TYPE_RANDOM"
                  world_object()\object_is_emitter_type=#ENGINE_EMITTER_TYPE_RANDOM
                
            EndSelect
            
          Case "object_blink_timer.l"
            world_object()\object_blink_timer=Val(ReadString(_ok.l))
            
          Case "object_max_emitter.l"
            world_object()\object_max_emitter=Val(ReadString(_ok.l))
            
          Case "object_emitter_random_start.l"
            world_object()\object_emitter_random_start=Val(ReadString(_ok.l))
            
          Case "object_emitter_lifetime.l"
            world_object()\object_emitter_lifetime=Val(ReadString(_ok.l))
            
          Case "object_autotransport_x.f"
            world_object()\object_autotransport_x=ValF(ReadString(_ok.l))
            
          Case "object_autotransport_y.f"
            world_object()\object_autotransport_y=ValF(ReadString(_ok.l))
            
          Case "object_is_auto_scroll_x.f"
            world_object()\object_is_auto_scroll_x=ValF(ReadString(_ok.l))
            If  world_object()\object_is_auto_scroll_x<>0
              e_world_auto_scroll_x.f=world_object()\object_is_auto_scroll_x
            EndIf
            
            
            
          Case "object_is_auto_scroll_y.f"
         
            world_object()\object_is_auto_scroll_y=ValF(ReadString(_ok.l))
              If   world_object()\object_is_auto_scroll_y<>0
                e_world_auto_scroll_y.f=world_object()\object_is_auto_scroll_y
                EndIf
            
          Case "object_create_new.s"
            world_object()\object_create_new=ReadString(_ok.l)
            
            Case "object_emitter_random_x.f"
           ;--------------sound system load sprite   (default sound, no special trigger) its in here for compatibility reason of engine with older code/object
            
            Case "object_sound_path.s"
              
            _dummy.s=ReadString(_ok.l)
              
           If Len(_dummy.s)>0
            
            world_object()\object_sound_id=LoadSound( #PB_Any, v_engine_sound_path.s+_dummy.s)
            
            If IsSound(world_object()\object_sound_id)
              world_object()\object_is_sound=1  ;marker we can use for dynamic and automatic soundhandling
            Else
              world_object()\object_is_sound=0  ;no sound file found(no sound file?) so object is no sound object, we prevent engine to exit with error and do not need to check it in the mapruntime 
            EndIf
            
          EndIf
          
          Case "object_play_sound_on_rotate.b"
            world_object()\object_play_sound_on_rotate=Val(ReadString(_ok.l))
            
          Case "object_sound_on_random_path.s"
            
            _dummy.s=ReadString(_ok.l)
            
            If Len(Trim(_dummy.s," "))>0
              world_object()\object_sound_on_random_id=LoadSound( #PB_Any, v_engine_sound_path.s+_dummy.s)
            EndIf
            
          Case "object_sound_on_create_path.s"
            
            _dummy.s=ReadString(_ok.l)
            If Len(Trim(_dummy.s," "))>0
              world_object()\object_sound_on_create_id=LoadSound(#PB_Any, v_engine_sound_path.s+_dummy.s)
              E_HANDLE_SOUND(#ENGINE_SOUND_ON_CREATE)
            EndIf
            
                             
            
          Case "object_sound_play_random.l"
            world_object()\object_sound_play_random.l=Val(ReadString(_ok.l))
            
          Case "object_sound_time.l"
            world_object()\object_sound_time=Val(ReadString(_ok.l)) ;get milliseconds out of seconds
           world_object()\object_sound_timer_start=ElapsedMilliseconds()
            ;world_object()\object_sound_timer_end=world_object()\object_sound_timer_start+world_object()\object_sound_time
          
            ;this must be on last position of the select/case because it corrects wrong settings to a valid state -> switch of the not valid switch
          Case "object_sound_volume.l"
            world_object()\object_sound_volume=Val(ReadString(_ok.l))
            
            If world_object()\object_sound_volume>100 
              world_object()\object_is_sound=100
            EndIf
            
            If  world_object()\object_sound_volume<0
                world_object()\object_is_sound=0
            EndIf
            
          Case "object_collision_transparency.l"
            world_object()\object_collision_transparency=Val(ReadString(_ok.l))
            
            
          Case "object_play_sound_on_move_path.s"
            
            
              _dummy.s=ReadString(_ok.l)
            
                        If Len(Trim(_dummy.s," "))>0
                          world_object()\object_sound_on_move_id=LoadSound( #PB_Any, v_engine_sound_path.s+_dummy.s)
                       EndIf
            
        
            
          Case "object_collision_tractor_object.b"
            world_object()\object_collision_tractor_object=Val(ReadString(_ok.l))
        
          Case "object_sound_on_remove_path.s"
         
            _dummy.s=ReadString(_ok.l)
            
                        If Len(Trim(_dummy.s," "))>0
                          world_object()\object_sound_on_remove_id=LoadSound( #PB_Any, v_engine_sound_path.s+_dummy.s)
                        EndIf
                        
                       
                     Case "object_use_random_alternative_gfx.b"
                       world_object()\object_use_random_alternative_gfx=Random(Val(ReadString(_ok.l)))   ;we fix this here, not changed in realtime... :)  , maximum: 0....3 !!!!
                       
                     Case "object_alternative_gfx_ai.s"
                       world_object()\object_alternative_gfx_ai=ReadString(_ok.l)
                       
                        Case "object_alternative_random_gfx_ai0.s"
                          world_object()\object_alternative_random_gfx_ai0=ReadString(_ok.l)
                          
                          Case "object_alternative_random_gfx_ai1.s"
                            world_object()\object_alternative_random_gfx_ai1=ReadString(_ok.l)
                            
                            Case "object_alternative_random_gfx_ai2.s"
                              world_object()\object_alternative_random_gfx_ai2=ReadString(_ok.l)
                              
                              Case "object_alternative_random_gfx_ai3.s"
                              world_object()\object_alternative_random_gfx_ai3=ReadString(_ok.l)
                       
                     Case "object_change_on_collision.b"
                       world_object()\object_change_on_collision=Val(ReadString(_ok.l))
                       
                     Case "object_auto_layer.b"
                       world_object()\object_auto_layer=Val(ReadString(_ok.l))
                       
                     Case "object_change_on_random.l"
                       world_object()\object_change_on_random=Val(ReadString(_ok.l))
                       ;value>0 will use this, trigger is 1, 
          
          
          Case "object_sound_on_collision_path.s"
         
            _dummy.s=ReadString(_ok.l)
                        If Len(Trim(_dummy.s," "))>0
                                            world_object()\object_sound_on_collision_id=LoadSound( #PB_Any, v_engine_sound_path.s+_dummy.s)
                                                    ;value <>0 = sound, value =0 no sound!
                        EndIf
                        
                        
                         Case "object_sound_on_rotate_path.s"
         
            _dummy.s=ReadString(_ok.l)
                        If Len(Trim(_dummy.s," "))>0
                           world_object()\object_sound_on_rotate_id=LoadSound( #PB_Any, v_engine_sound_path.s+_dummy.s)
                          ;value <>0 = sound, value =0 no sound!
                         EndIf
                         
                         
                             
                         Case "object_sound_on_move_path.s"
         
            _dummy.s=ReadString(_ok.l)
                        If Len(Trim(_dummy.s," "))>0
                           world_object()\object_sound_on_move_id=LoadSound( #PB_Any, v_engine_sound_path.s+_dummy.s)
                          ;value <>0 = sound, value =0 no sound!
                        EndIf
                        
                           
                      Case "object_auto_move_x.f"
                     world_object()\object_auto_move_x=ValF(ReadString(_ok.l))
            
          Case "object_auto_move_y.f"
            world_object()\object_auto_move_y=ValF(ReadString(_ok.l))
            
          Case "object_add_to_quest.b"
           world_object()\object_add_to_quest=Val(ReadString(_ok.l))
                 
                  Case "object_life_time.l"  ;used for objects with limited lifetime, used for just in time created objects(because of the timer)
                    world_object()\object_life_time=Val(ReadString(_ok.l))
                    world_object()\object_end_of_life_time=ElapsedMilliseconds()+   world_object()\object_life_time
                    
                    
                    ;here we put some code for correction:
                    If _mode.l=#E_ADD_ELEMENT_TO_MAP
                    world_object()\object_layer=world_object()\object_auto_layer   
                    EndIf
                    
        
                    EndSelect

                    ;some defaults:
                  ;  world_object()\object_move_direction=#NO_DIRECTION  ;default start value
                    world_object()\object_blink_object_show=#True       ;default we show all objects....

             Wend
             

         
             CloseFile(_ok.l)
             
             E_SETUP_ALTERNATIVE_GFX()   
             E_PERFORMANCE_ADAPTER_BASE()

      
    Else
      
      e_log_ai_source.s=world_object()\object_ai_path
      
      E_DEFAULT_ERROR_HANDLING(#E_ERROR_CAN_NOT_READ_MAP_OBJECT,"CAN NOT ADD MAP ELEMENT TO WORLD")  
      
    EndIf
    
     
EndProcedure

LG
Walter

Re: Project_17 (Arbeitstitel)

Verfasst: 09.08.2019 18:19
von Mijikai
Danke für die Info.
Ich pers. lade immer alles zuerst und render dann nur was die Kamera sieht.

Re: Project_17 (Arbeitstitel)

Verfasst: 12.08.2019 14:43
von darius676
Update für die geplante Openworld: Dungeons, Shops, andere Gebiete usw:

die neue Version unterstützt map respawn. Suche in map 0 einen aktiven (alle ausser der erste sichtbare) teleporter/dungeon durchgang.
Der Spieler wird in in die endofworld.worldmap teleportiert.
verlässt man die map wieder durch den Teleporter/dungeondurchgang, befindet man sich genau an der Stelle an der man worldmap 0 verlassen hat, wieder in world map 0. Besonderheit: die Map befindet sich in dem zustand in dem diese verlassen wurde: Kisten geöffnet, Spiders, Blut usw. nur die Spideregg Schalen sind nicht mehr da, dies ist ein "Fehler".

die respawnfunktion , funktioniert aktuell nur im laufenden Spiel, nicht nach einem Neustart

Optimierungen im Bereich der Emitter.

Aktueller build wie immer im ersten Post.