[miniB3D]CameraPick mit eigenen Types

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

skey-z

Betreff: [miniB3D]CameraPick mit eigenen Types

BeitragDi, Jan 10, 2012 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich weiß nicht, vielleicht stehe ich irgendwie auf dem Schlauch, aber ich komme bei folgendem Problem nicht weiter.

Ich benutze die Si-Design MiniB3D 0.53, die neue 0.54 scheint noch nicht released zu sein, so wie ich es bei github.com rauslese

Ich habe ein selbst erstelltes Object TGameObject(Abstract), wovon sich wiederum mehrere Object ableite
TOrbit(extends TGameObject), etc.

Beim erstellen von Instanzen gebe ich dem Entity einen Namen, somit weiß ich schon einmal, um was für eine Art von 'Objekt' es sich handelt, also "Orbit" oder "Sun" oder "Planet"

Möchte ich nun einen Wert aus dem Objekt TOrbit auslesen zB TOrbit._orbitZone(davon gibt es 3), funktioniert das nicht, da TEntity ja TOrbit nicht kennt und somit kann ich darauf nicht direkt zugreifen.

Ah ok, gerade kam mir noch ein Einfall, ich rufe eine Funktion auf TOrbit.Check(objPicked) und prüfe alle vorhandenen Instanzen ob TOrbit._objMesh(Feld von TGameObject) mit dem gepickten Objekt übereinstimmt.
Und voila, ich kann auf die Einträge in TOrbit zugreifen, aber scheint ein wenig umständlich.

Noch ein wenig weiter gedacht und Print TOrbit.Check(objPicked)._orbitZone liefert mir die Richtige Instanz mit dem richtigen Eintrag.


Nachdem sich meine eigentliche Frage nun eigentlich erledigt hat, würde ich noch gerne folgendes Wissen:

Kennt jemand von euch einen schnelleren Weg, womit ich die Hilfsfunktion umgehen kann?
So in etwa Pseudo-Code: TOrbit(TEntity(objPicked))._orbitZone, führt natürlich zu:
Code: [AUSKLAPPEN]

Unable to convert from "sidesign.minib3d.TEntity" to "<unknown>"
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
  • Zuletzt bearbeitet von skey-z am Di, Jan 10, 2012 22:45, insgesamt einmal bearbeitet

ZEVS

BeitragDi, Jan 10, 2012 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Du bearbeitest sidesign.mod/minib3d.mod/inc/TEntity.bmx und fügst ein Feld wie "data:Object" oder "associated:Object" an. Das ist meiner Meinung nach sehr sinnvoll, da oftmals ein konkreter Zusammenhang besteht. Danach kannst du einfach über TOrbit(TEntity(objPicked).associated)._orbitZone zugreifen.

ZEVS

skey-z

BeitragDi, Jan 10, 2012 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, an etwas ähnliches habe ich auch schon gedacht, aber wenn ich den Code weitergeben würde, käme keiner damit klar und ich müsste immer den passenden Code mitliefern.

Und dann noch mal zum Verständnis, wie ich es einsetze:

BlitzMax: [AUSKLAPPEN]

Function Create:TOrbit()
Local orbit:TOrbit = New TOrbit
orbit._objMesh(:TMesh) = CreateSphere() 'TGameObject, da TOrbit Extends TGameObject
orbit._objMesh.data(:Object) = orbit._objMesh 'aus TEntity, da TMesh Extends TEntity
End Function


Bevor ich da an TEntity.bmx rumspiele und alles verhunze
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

ZEVS

BeitragDi, Jan 10, 2012 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
In diesem Fall kannst du das gepickte Entity gleich nach TMesh casten, da brauchst du keine data-Felder.
Wenn du aber z.B. auf TOrbit._orbitZone zurückgreifen willst, musst du (wenn es kein Mesh ist) über TEntity.data gehen. Des weiteren kannst du den gesamten Orbit als data speichern (orbit._objMesh.data = orbit), aber beim Löschen daran denken, die zyklische Verbindung aufzulösen (sonst droht ein Memoryleak).

ZEVS

skey-z

BeitragDi, Jan 10, 2012 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha danke, das hilft schon mal weiter, muss es mir vielleicht noch 2-3 mal durchlesen um es zu verinnerlichen

[Edit]
Naja das Memoryleak ist bei diesem konkreten Fall eher zu vernachlässigen, da TOrbit nur ein Platzhalter für die Umlaufbahnen ist und nur einmal erstellt und am Ende wieder gelöscht wird und dann gehe ich alle Instanzen vom Typ TEntity durch und lösche diese.

Aber für die Planeten ist es dan interessant, da diese auch zur Laufzeit erstellt und gelöscht werden können
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

PhillipK

BeitragMi, Jan 11, 2012 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal ein kleiner einwurf.
In vielen Engines wird "name" als Objekt angenommen. Was sowohl String sein kann, allerdings auch anderes: Wenn du glück hast Smile
In einem solchen fall würde ich statt dem namen das zu assoziierende objekt reinhaun.
Über erfolgreiches casten könntest du nun feststellen, was du vor dir hast.

aber: ich weiß nicht wirklich was "Si-Design MiniB3D 0.53" ist. Ich kenne nur Minib3d ^^

Ansonsten gäbe es vielleicht einen weiteren umweg: Du zählst irgendwo einen int mit, wieviele instanzen du von etwas erstellt hast. Zb TOrbit.count. Als name wird für TOrbit nun immer "Orbit_"+TOrbit.count verwendet. TOrbit hat ausserdem eine TMap - so kannst du über den namen einen Key schaffen, welchen du auch wieder eindeutig findest.
Leider sind das alles wohl eher vage ideen, da ich nicht wirklich mitkomme, wie dein problem aussieht :< (ausserdem bin ich TMap fanatiker ^^)

skey-z

BeitragMi, Jan 11, 2012 1:15
Antworten mit Zitat
Benutzer-Profile anzeigen
@PhillipK du TMap-schlampe Wink

Ok, Spaß bei seite, Ich habe nur Si-Design geschrieben, da es ja auch eine Erweiterung der Erweiterung von klepto2 gibt und es ist die Version 0.53 die ich nutze, als hinweis, ob jemand Antwortet, dass ich vlt. irgendwo schon die neue 0.54 runterladen kann, weil bei github hat simonH vor kurzem diese schon erwähnt hat, aber es ist kein Download verfügbar.

Der Name war ja nie das Problem, da ich es über
Code: [AUSKLAPPEN]
orbit._objMesh.Nameentity("Orbit")
-> objName:String = objPicked.Entityname()

ganz einfach herausbekomme, um welche Art von TEntity es sich handelt.
Da muss ich nicht umständlich hin und her casten oder irgendwelche Listen/Maps durchgehen.

Das Problem was ich hatte, welches aber schon (etwas umständlich wie ich finde) durch mich selber behoben wurde, ist dass ich eine möglichst einfache Variante suche um direkt auf Eigenschaften von TOrbit zuzugreifen, wenn ich ein TEntity erfolgreich gepickt habe.

Die Struktur sieht ja wie folgt aus
Code: [AUSKLAPPEN]

sidesign.miniB3D
TEntity
TMesh Extends TEntity

meine Objekte
TGameObject Abstract
-> _objMesh:TMesh

TOrbit Extends TGameObject
-> _objMesh = createMesh()
-> _orbitZone = (1-3)


Mit objPicked:TEntity = CameraPick(cam, x, y) bekomme ich ja nur die Identität des gepickten TEntity heraus, da TEntity aber TOrbit nicht kennt, kann ich ja nicht per objPicked._orbitZone auf Eigenschaften des TOrbit zugreifen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

ZEVS

BeitragMi, Jan 11, 2012 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es dir nur um die Orbit-Zone geht und du keine Kollisionen mit dem Orbit-Mesh haben möchtest, kannst du auch einfach EntityType / GetEntityType missbrauchen. Du kannst auch einfach casten, wenn du TGameObject als Extends TEntity definierst. Wenn das zu deiner anderen Struktur passt, wäre das wohl am besten.

ZEVS

skey-z

BeitragMi, Jan 11, 2012 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal danke für die Hilfe ZEVS, ja, dieses Spiel wird ganz ohne Kollisionen auskommen, soweit ich es bisher absehen kann.

Das mit dem Vererbung von TEntity habe ich mir auch schon überlegt, aber dann eher über TMesh, somit habe ich gleich beide drin.

Werde es jetzt erst mal so lassen, aber die Überlegeung beim späteren optimieren mit einbeziehen.

Du hast dir auf jeden Fall einen Eintrag in den Credits verdient Wink
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group