Entity drehungen und platzierungen auf pseudotilemap

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Inso

Betreff: Entity drehungen und platzierungen auf pseudotilemap

BeitragSa, Nov 26, 2011 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Ich hab jetzt das Thema Tilemap erstmal aufgegeben um mich an etwas einfacheres zu wagen, was in etwa meiner bisherigen Spielidee entspricht, nur mit weniger Freiheiten.

Also ich hab eine große map(b3d format), die absolut eben ist.
Die breite und länge der map kann man durch 32 teilen, was im endeffekt dann ein "tile" ist, also 32x32.
Der spieler soll items aus seinem inventar(z.B. ein Zaun(32x[y]x32) in diesem Beispiel) aufstellen können.
Also, soll er erst das Item auswählen, dann klicken, dann erscheint es durchsichtig vor dem Spieler, soll sich aber nicht mit drehen, dieser Zaun soll sich jetzt quasi genau auf eines dieser pseudotiles begeben, und wenn sich der spieler dreht, nicht mit drehen, sonder starr immer in die selbe richtung schauen, bis der spieler den zaun von hand um je 45° weiter dreht.

nun hab ich mir einen kleinen code geschrieben um erstmal den Zaun frei in der welt platzieren zu können, aber so richtig funktionieren.. will das ganze nicht.

Ich hoffe ihr könnt mir helfen, mir meine Fehler zeigen und vielleicht ein Paar Denkanstöße geben Smile
Code: [AUSKLAPPEN]
Function bauen()

CameraPick camera_player,MouseX(),MouseY()
If zaunbauen1= 0
If MouseHit(1)


zaun.Tobjekte = New Tobjekte
zaun\mesh = LoadMesh("data/meshes/fence.b3d")
zaun\id = id



PositionEntity zaun\mesh,PickedX(),1,EntityZ(player)+32
EntityParent zaun\mesh,player
EntityAlpha zaun\mesh,0.4
zaunbauen1=1
EndIf

For zaun.Tobjekte = Each Tobjekte
If zaun\id = id


PositionEntity zaun\mesh,PickedX(),1,EntityZ(player)+32
EndIf
Next


EndIf
If zaunbauen1=1
If MouseHit(1)
zaunbauen1=0

For zaun.Tobjekte = Each Tobjekte
If zaun\id = id
FreeEntity zaun\mesh

zaun.Tobjekte=New Tobjekte
zaun\mesh = LoadMesh("data/meshes/fence.b3d")
zaun\id = id
id = id +1

CameraPick camera_player,MouseX(),MouseY()
PositionEntity zaun\mesh,PickedX(),1,EntityZ(player)+32
EndIf
Next
EndIf
EndIf

ZEVS

BeitragSo, Nov 27, 2011 11:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso hast du nicht ein globales Zaun-Mesh, das du dann immer wieder mit CopyEntity? Das sollte das ganze Spiel beschleunigen, wenn er nicht immer neu den Mesh laden soll.
Hilft natürlich nicht, ist aber wichtig zu beachten.
Außerdem sehe ich es so, dass du den noch zu bauenden Zaun anhand einer id identifizierst (wohl eine globale Variable - besser als Parameter). Diese Suchschleifen kannst du umgehen, wenn du einfach den zu bauenden Zaun in einer globalen Variable speicherst.
Eine Frage: Was genau willst du bewirken, wenn zaunbauen=1 und MouseHit(1)?
So wie ich das sehe, löschst du erst den Mesh, lässt das Objekt aber leben (kein Delete), erzeugst dann eine neue Instanz und schreibst die Werte wieder rein. Was hat das für einen Sinn?

ZEVS
 

Inso

BeitragSo, Nov 27, 2011 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, danke dir erstmal fürs Antworten =)



ZEVS hat Folgendes geschrieben:
Wieso hast du nicht ein globales Zaun-Mesh, das du dann immer wieder mit CopyEntity?


Weil die komplette Funktion nur irgendwie dahin "geschustert" wurde, und 100mal verändert wurde, im endeffekt gehts mir in bei der Funktion nur darum, wie ich am besten meine zu bauenden objekte in der map platzieren kann, die funktion wird dann bis auf die platzierung der objekte verworfen und komplett neu geschrieben, weil ich ja nicht nur zäune bauen können will Smile

ZEVS hat Folgendes geschrieben:

Außerdem sehe ich es so, dass du den noch zu bauenden Zaun anhand einer id identifizierst (wohl eine globale Variable - besser als Parameter). Diese Suchschleifen kannst du umgehen, wenn du einfach den zu bauenden Zaun in einer globalen Variable speicherst.

Wie genau meinst du das?
Momentan ist es halt so, dass ich wie du schon sagst, eine globale variable hab "id", die sich mit jedem gebauten objekt erhöht, beim bauen des objektes wird dem field id im typ Tobjekte die jeweilige id zugewiesen, damit ich die gebauten objekte irgendwie wieder identifizieren kann(wird dann noch erweitert auf oId(objekt ID, was für eine Art objekt ist es?)

ZEVS hat Folgendes geschrieben:

Eine Frage: Was genau willst du bewirken, wenn zaunbauen=1 und MouseHit(1)?
So wie ich das sehe, löschst du erst den Mesh, lässt das Objekt aber leben (kein Delete), erzeugst dann eine neue Instanz und schreibst die Werte wieder rein. Was hat das für einen Sinn?

Das liegt daran dass vorher beim ersten mousehit der playerpivot dem zaun als parent zugewiesen wurde und ich leider keine ahnung habe wie ich diese parent verbindung wieder auflöse, aber wie oben gesagt, die funktion ist nur provisorisch, geht mir nur um die platzierung von objekten auf meiner pseudotilemap Smile

ZEVS

BeitragSo, Nov 27, 2011 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit der globalen Variable stelle ich mir so vor:
BlitzBasic: [AUSKLAPPEN]
Global buildFence.Tobjekte

Beim Erzeugen des Zaunes setzt du die Variable einfach hier ein; beim Verarbeiten des Bauens liest du hier wieder aus. Das spart diese Suchschleifen. Wenn der zu bauende Zaun aber sowieso an letzter Stelle steht, sollte es auch Last Tobjekte tun.

Ein wertvoller Link: EntityParent

ZEVS
 

Inso

BeitragSo, Nov 27, 2011 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
hey nochmal, hab das ganze jetzt erstmal so gelöst:

CameraPick camera_player,MouseX(),MouseY()
zwischenspeicherx = PickedX() / 32
zwischenspeicherz = (PickedZ() / 32)

die beiden variablen sind als INT deklariert, danach wird das ganze nochmal * 32 genommen und schon hab ich mein "tile".
funktioniert^^

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group