Thorin's Quest
- darius676
- Beiträge: 502
- Registriert: 08.03.2010 22:12
- Computerausstattung: Intel i5 16GB RAM nVidia 1050, Win11
Atari Jaguar, Surface Pro 5,Surface Laptop i5 7200, XBOX ONE X, XBOX Series X - Wohnort: AT
- Kontaktdaten:
Re: Project_17 (Arbeitstitel)
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.
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.
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Project_17 (Arbeitstitel)
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.
Ja, die Webseite ist bewusst offline, der YouTube-Kanal ist aber nach wie vor verfügbar.
Ja, die Webseite ist bewusst offline, der YouTube-Kanal ist aber nach wie vor verfügbar.
- darius676
- Beiträge: 502
- Registriert: 08.03.2010 22:12
- Computerausstattung: Intel i5 16GB RAM nVidia 1050, Win11
Atari Jaguar, Surface Pro 5,Surface Laptop i5 7200, XBOX ONE X, XBOX Series X - Wohnort: AT
- Kontaktdaten:
Re: Project_17 (Arbeitstitel)
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.
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.
- darius676
- Beiträge: 502
- Registriert: 08.03.2010 22:12
- Computerausstattung: Intel i5 16GB RAM nVidia 1050, Win11
Atari Jaguar, Surface Pro 5,Surface Laptop i5 7200, XBOX ONE X, XBOX Series X - Wohnort: AT
- Kontaktdaten:
Re: Project_17 (Arbeitstitel)
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.
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.
Zuletzt geändert von darius676 am 09.08.2019 11:03, insgesamt 1-mal geändert.
Re: Project_17 (Arbeitstitel)
Wenn ich auf deinen Downloadlink klicke, erhalte ich folgende Meldung:
Jetzt haste den Link angepasst und Download geht wieder.
\\Edit:dropbox hat geschrieben:404
Diese Datei befindet sich nicht mehr an diesem Speicherort
Jetzt haste den Link angepasst und Download geht wieder.
- darius676
- Beiträge: 502
- Registriert: 08.03.2010 22:12
- Computerausstattung: Intel i5 16GB RAM nVidia 1050, Win11
Atari Jaguar, Surface Pro 5,Surface Laptop i5 7200, XBOX ONE X, XBOX Series X - Wohnort: AT
- Kontaktdaten:
Re: Project_17 (Arbeitstitel)
RSBasic hat geschrieben:Wenn ich auf deinen Downloadlink klicke, erhalte ich folgende Meldung:\\Edit:dropbox hat geschrieben:404
Diese Datei befindet sich nicht mehr an diesem Speicherort
Jetzt haste den Link angepasst und Download geht wieder.
Re: Project_17 (Arbeitstitel)
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?
1. Was genau passiert wenn die Map gestreamt wird?
2. Welche Vor- und Nachteile hat das Verfahren?
- darius676
- Beiträge: 502
- Registriert: 08.03.2010 22:12
- Computerausstattung: Intel i5 16GB RAM nVidia 1050, Win11
Atari Jaguar, Surface Pro 5,Surface Laptop i5 7200, XBOX ONE X, XBOX Series X - Wohnort: AT
- Kontaktdaten:
Re: Project_17 (Arbeitstitel)
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:
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.
LG
Walter
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
Zuletzt geändert von darius676 am 09.08.2019 18:20, insgesamt 1-mal geändert.
Re: Project_17 (Arbeitstitel)
Danke für die Info.
Ich pers. lade immer alles zuerst und render dann nur was die Kamera sieht.
Ich pers. lade immer alles zuerst und render dann nur was die Kamera sieht.
- darius676
- Beiträge: 502
- Registriert: 08.03.2010 22:12
- Computerausstattung: Intel i5 16GB RAM nVidia 1050, Win11
Atari Jaguar, Surface Pro 5,Surface Laptop i5 7200, XBOX ONE X, XBOX Series X - Wohnort: AT
- Kontaktdaten:
Re: Project_17 (Arbeitstitel)
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.
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.