Frage von Saramolo, 77

Wie kann ich ein bestimmtes objekt aktivieren indem ich es ansehe und die taste E drücke?

Ich hab eine ähnliche Frage schon mal gestellt, habe aber ein neues Problem. ich habe eines Ray sensor auf meine Spielfigur gesetzt, der ein Signal abgibt wen er auf ein Objekt mit der Property objekt gerichtet ist. Wen das der Fall ist sendet er die Message "ak", wodurch bei dem objekt (in diesem Fall eine Tür) eine Animation ausgeführt wird. Aber da ich nicht nur ein objekt habe das ich aktivieren kann sondern mehrere, wird die aktion bei allen objekten ausgeführt, aber sie soll nur bei dem ausgeführt werden auf das der raysensor gerichtet ist.

Ich will nicht für jedes Objekt eine eigene Message erstellen, da das zu viel Arbeit währe

Danke im vorraus für eure Antworten

Antwort
von Prisonofmind1, 46

Da wirst du um ein Script nicht herumkommen.
Am besten schaust du mal nach Tutorials, wie man mit Ray Sensoren in einem Script umgeht aber im Prinzip musst du es nur so machen:

if ray.positive
message.propName = ray.hitObject

"message" ist dabei der Message Actuator und "ray" der Ray Sensor. Du setzt
also immer, wenn der Ray-Sensor etwas trifft den Empfänger des
Message-Actuators auf dieses Objekt.

Kommentar von Saramolo ,

Ich bin mit den Scripts nicht sehr gut vertraut, ist das schon der ganze Code? Nach meinen Kenntnissen mus man doch noch die passenden Kompenenten Importieren? Wen der Script nicht sehr aufwändig ist könntest du in mir bitte schicken?

Kommentar von Prisonofmind1 ,

Ich denke, das sollte es sein, aber ich hab es noch nicht getestet (diese Variante einfach dann ausführen, wenn der Sensor positiv ist, sprich durch den Ray-Sensor und hinten Message-Actuator anschließen):

import bge

def main():
# Get Controller and owner
cont = bge.logic.getCurrentController()
player = cont.owner

# Define Sensors and Actuators
ray = player.sensors["Ray"]
messager = player.actuators["Messager"]

# Assign Messager
messager.propName = ray.hitObject

main()
Kommentar von Saramolo ,

ich hab es ausprobiert, aber es funktioniert leider nicht, habe auch überprüft ob sensor und actuator richtig benannt sind

Kommentar von Prisonofmind1 ,

Was steht in der Console?

Kommentar von Saramolo ,

Wen du die python console meinst



PYTHON INTERACTIVE CONSOLE 3.4.2 (default, Dec 8 2014, 22:52:33) [MSC v.1800 32 bit (Intel)]

Command History: Up/Down Arrow
Cursor: Left/Right Home/End
Remove: Backspace/Delete
Execute: Enter
Autocomplete: Ctrl-Space
Zoom: Ctrl +/-, Ctrl-Wheel
Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bpy.utils, bgl, blf, mathutils
Convenience Imports: from mathutils import *; from math import *
Convenience Variables: C = bpy.context, D = bpy.data

Kommentar von Prisonofmind1 ,

Nein, ich meine, wenn du das Spiel startest, dann müsste etwas in der Console stehen, also irgendeine Fehlermeldung. Die muss ich wissen.

Kommentar von Saramolo ,

Tut mir leid, ich verstehe nicht was du meinst, ich kenn mich bei Blender bisher nur mit dem erstellen von objekten materialien und animationen aus

Kommentar von Saramolo ,

Meinst du das hir?

IndentationError: expected an indented block
Error Totblock: 1
WM_OT_context_toggle
WM_OT_context_toggle_enum
WM_OT_context_cycle_int
WM_OT_context_cycle_enum
WM_OT_context_cycle_array
WM_OT_context_menu_enum
WM_OT_context_toggle
WM_OT_context_toggle_enum
WM_OT_context_cycle_int
WM_OT_context_cycle_enum
WM_OT_context_cycle_array
WM_OT_context_menu_enum
Detected GL_ARB_texture_env_combine
Detected GL_ARB_texture_cube_map
Detected GL_ARB_multitexture
Detected GL_ARB_shader_objects
Detected GL_ARB_vertex_shader
Detected GL_ARB_fragment_shader
Detected GL_ARB_vertex_program
Detected GL_ARB_depth_texture
Detected GL_EXT_separate_specular_color
AL lib: (EE) UpdateDeviceParams: Failed to set 44100hz, got 48000hz instead
found bundled python: C:\Program Files (x86)\Blender Foundation\Blender\2.76\python
Python error compiling script - object 'Camera', controller 'And.001':
File "ak", line 5
cont = bge.logic.getCurrentController()
^
IndentationError: expected an indented block
Error Totblock: 1

Kommentar von Prisonofmind1 ,
import bge

def main():
# Get Controller and owner
cont = bge.logic.getCurrentController()
player = cont.owner

# Define Sensors and Actuators
ray = player.sensors["Ray"]
messager = player.actuators["Messager"]

# Assign Messager
messager.propName = ray.hitObject.name

main()
Kommentar von Prisonofmind1 ,

Versuche es einmal hiermit. "propName" braucht scheinbar eine String und kein Object. Das sollte so aber funktionieren, zumindest hoffe ich das.

Kommentar von Saramolo ,

Es funktioniert immer noch nicht. Aber seh das schon richtig, das die Spielfigur "player",  der Messager "Messager" und der Ray  sensor "Ray" heißen muss oder?

Kommentar von Prisonofmind1 ,

Ja, es solle eigentlich funktionieren, zumindest tut es das bei mir.
Kannst du mir die blendfile schicken? Dann schaue ich mir das einmal an.

Kommentar von Saramolo ,

wie kann ich sie dir schicken?

Kommentar von Prisonofmind1 ,

In eine Zip komprimieren und hier hochladen: http://www.file-upload.net/

Kommentar von Saramolo ,

Sorry, das das so lang gedauert hat, ich hab die datei hochgeladen, und wen ich das richtig versteanden habe ist das der link zum download

http://www.file-upload.net/download-11851106/versuch.blend.html

Kommentar von Prisonofmind1 ,

Es bietet sich eventuell an, den Message Actuator zu aktivieren, damit die Nachricht auch gesendet wird? ^^

Bei mir funktioniert es prima.

Kommentar von Saramolo ,

Was meinst du mit aktivieren? Ich hatte den Physik Controller nur deaktiviert weil ich zum ausprobieren einen and Controller angeschlossen hatte.

Kommentar von Prisonofmind1 ,

Naja, das Script legt nur fest, welches Objekt das Zielobjekt ist und mehr nicht. Den Actuator aktivieren und somit die Message verschicken musst du aber noch selbst tun, z.B. über eine Taste.

Kommentar von Saramolo ,

Wie muss ich den Keyboard sensor dan anschließen? Wen ich in an dem phyton Controller anschließe funktioniert es trotzdem nicht

Kommentar von Prisonofmind1 ,

Den verbindest du einfach über "and" mit dem Message Actuator. Man kann an Actuators beliebig viele Sachen anschließen und der Effekt bleibt gleich, also er wird immer einfach nur aktiviert.

Bei deiner Version bietet es sich an, auch den Ray-Sensor mit anzuschließen, damit das Öffnen nur funktioniert, wenn du die Tür ansiehst.

Kommentar von Saramolo ,

Jetzt weiß ich was ich falsch gemacht hatte :)    Vielen dank für deine Hilfe, ich hoffe ich bin dir nicht zu sehr auf die Nerven gegangen

Kommentar von Prisonofmind1 ,

Kein Problem ^^
Für solche Fragen ist diese Seite ja da und da man sowas nicht einfach ergoogeln kann, helfe ich gerne.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten