[miniB3D]CameraPick mit eigenen Types
Übersicht

![]() |
skey-zBetreff: [miniB3D]CameraPick mit eigenen Types |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
- Zuletzt bearbeitet von skey-z am Di, Jan 10, 2012 22:45, insgesamt einmal bearbeitet
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
Bevor ich da an TEntity.bmx rumspiele und alles verhunze |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@PhillipK du TMap-schlampe ![]() 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 |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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![]() ![]() ZEVS |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group