PDA

View Full Version : OO programing in vizard?


renama
06-27-2010, 12:12 AM
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:

renama
06-27-2010, 12:47 AM
Here is the code of the class (same with the previous attachement)

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()

IGoudt
06-27-2010, 10:34 AM
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:

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()

renama
06-27-2010, 10:03 PM
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

farshizzo
06-28-2010, 09:30 AM
I highly suggest you read the section in the documentation about events, especially the Event Basics (http://www.worldviz.com/vizhelp/Event_Basics.htm) page. It describes how to register multiple callbacks for an event using viz.EventClass.

renama
06-28-2010, 02:33 PM
Thanks farshizzo, that is great. I need register other events,like mouse move in my class and creating Event Class solved my problem completely.