#1
|
|||
|
|||
OO programing in vizard?
I tried to create a class to put an icon on the screen. When the icon is clicked, the music will be truned on or off.
In the class, I used callback viz.MOUSEDOWN_EVENT to capture the mouse clicked event. The class works fine. The problem is: I can not use viz.MOUSEDOWN_EVENT in main program or in other classes anymore once this class is used. That is a disaster. How to solve this problem while keeping the OO programing structure? Is there any other way to encapsulate the event operation in the class? Thanks so much if anyone can help. My class like this: |
#2
|
|||
|
|||
Here is the code of the class (same with the previous attachement)
Code:
class MusicOnOff: def __init__(self,musicObj): self. Obj = musicObj self.musicIcon = viz.addTexQuad() self.musicIcon.texture(viz.add((‘musicOff.png'))) self.musicOn = True viz.callback( viz.MOUSEDOWN_EVENT, self.onMouseDown ) def onMouseDown(self, button): if button == viz.MOUSEBUTTON_LEFT: object = viz.pick() if object.valid() == False: return if object == self.musicIcon: if self.musicOn == True: self.musicOn = False self.musicIcon.texture(viz.add((‘musicOn.png'))) self.Obj.pause() else: self.musicOn = True self.musicIcon.texture(viz.add((‘musicOff.png'))) self.Obj.play() Last edited by renama; 06-27-2010 at 12:52 AM. |
#3
|
|||
|
|||
From my experience, you can register events only once.
For example: Class A registers a viz.MOUSEDOWN_EVENT Class B registers a viz.MOUSEDOWN_EVENT Then if I recall correctly the last register will overwrite the first. What I did to resolve this, is to put all the registers in one of the main, or container, classes. Whenever an event is triggered there, the main class redirects the event to the appropiate classes or objects. In your case, I guess your main class creates an instance of the MusicOnOff class (a button), and saves it under a variable. Change to: Code:
class MusicOnOff: def __init__(self,musicObj): self.Obj = musicObj self.musicIcon = viz.addTexQuad() self.pictures = [viz.add(‘musicOff.png'), viz.add('musicOn.png')] self.musicIcon.texture(self.pictures[1]) self.musicOn = True def click(self): self.musicOn = not self.musicOn self.musicIcon.texture(self.pictures[self.musicOn]) if not self.musicOn: self.Obj.pause() else: self.Obj.play() |
#4
|
|||
|
|||
Thanks, IGoudt. You gave me a good idea for OO programming. I appreciate your help. It is your support that makes me keep searching and trying to work on it. Today I found vizact.onpick(object,fun,arg) can be used in this case. It can be called multiple times. Hope this found can help somebody who has the same coding problem in this situation
|
#5
|
|||
|
|||
I highly suggest you read the section in the documentation about events, especially the Event Basics page. It describes how to register multiple callbacks for an event using viz.EventClass.
|
#6
|
|||
|
|||
Thanks farshizzo, that is great. I need register other events,like mouse move in my class and creating Event Class solved my problem completely.
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Realistic Light and Shadows Using Vizard and 3DS Max | jde | Vizard | 4 | 07-13-2012 10:58 AM |
.3DS importing in Vizard and 3D Studio | jde | Vizard | 1 | 08-28-2009 03:14 PM |
Vizard tech tip: Using the Python Imaging Library (PIL) | Jeff | Vizard | 0 | 03-23-2009 11:13 AM |
Vizard tech tip: Text to Speech | Jeff | Vizard | 1 | 01-15-2009 09:39 PM |
Vizard and Augmented Reality | realvision | Vizard | 4 | 04-04-2008 10:59 AM |