# Outputting content of Variable

8 views

### Christoph Roth

Sep 27, 2020, 8:42:48 PM9/27/20
to cocos2d discuss
Hi all,

I am learning Cocos 2D and Python and have a simple question.

I'd like to output the content of a variable on the screen, so that I can see how it changes during runtime.

I have an actor class like this:

class Actor(cocos.cocosnode.CocosNode):
def __init__(self, x, y):
super(Actor, self).__init__()
w, h = director.get_window_size()
self.position = (x, y)
self.velocity = eu.Vector2(0, 0)
self.speed = 10
self.max_force = 5
self.max_velocity = 200
self.target = None
self.seek = True
self.distance = 10
self.distance_text = self._create_text(w-60, h-40)
self.schedule(self.update)

def update(self, dt):
if self.target is None:
return
self.distance = self.target - eu.Vector2(self.x, self.y)
ramp = 1.0
ramp = min(abs(self.distance) / self.slow_radius, 1.0)
steering = self.distance * self.speed * ramp - self.velocity
steering = truncate(steering, self.max_force)
self.velocity = truncate(self.velocity + steering,
self.max_velocity)
direction = 1 if self.seek else -1
self.position += self.velocity * dt * direction
self.distance_text.element.text = 'Distance: %s' % self.distance

def _create_text(self, x, y):
text = cocos.text.Label(font_size=10, font_name='Verdana',
anchor_x='right', anchor_y='center',
color=(255, 255, 255, 255))
text.position = (x, y)
return text

and I'd like to output the the content of self.distance for example.

I wrote another class called HUD:

class HUD(cocos.layer.Layer):
def __init__(self, distance):
super(HUD, self).__init__()
w, h = director.get_window_size()
self.distance = distance
self.distance_text = self._create_text(w-60, h-40)

self.distance_text.element.text = 'Distance: %s' % self.distance

def _create_text(self, x, y):
text = cocos.text.Label(font_size=10, font_name='Verdana',
anchor_x='right', anchor_y='center',
color=(255, 255, 255, 255))
text.position = (x, y)
return text

and a Main Layer that calls both classes:

class MainLayer(cocos.layer.Layer):
is_event_handler = True

def __init__(self):
super(MainLayer, self).__init__()
self.actor = Actor(320, 240)
self.hud = HUD(self.actor.distance)

def on_mouse_motion(self, x, y, dx, dy):
self.actor.target = eu.Vector2(x, y)

def on_mouse_press(self, x, y, buttons, mod):
self.actor.seek = not self.actor.seek

The output on my screen stays at 10 and doesn't update to the values of the update function.

Any help on this would be appreciated.

Thanks,
Christoph

### claudio canepa

Sep 27, 2020, 10:14:59 PM9/27/20
to cocos2d discuss
You have two different labels
- one in the HUD, which has a text set at the HUD init and nexer updated
- one in the actor, updated which I suspect is not visible because out of screen

If you want to update the HUD label, you can make the actor's update publish a 'distance_updated' event, the HUD listen to that event and updating the label's text. Read about user defined events in the pyglet doc

If you want to make the actor's label visible,   use a small x,y in  _create_text(self, x, y) ; start with 0, 0 and do smal changes to find the desired offset.

--
You received this message because you are subscribed to the Google Groups "cocos2d discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cocos-discus...@googlegroups.com.

### Christoph Roth

Sep 28, 2020, 2:29:25 AM9/28/20
to cocos2d discuss
Hi Claudio,

The actors label is actually visible, but as you said is off screen. My problem with that is that the label moves with the actors layer when it's position gets updated and I'd like to have the output static on the corner of the window.

I'll try to publish an event as you suggested.

Below is the entire code of the script. If you let the sun exit the frame to the lower left, you can see the label of the actor class coming into frame.

import cocos
import cocos.euclid as eu
import cocos.particle_systems as ps

from cocos.director import director

def truncate(vector, m):
magnitude = abs(vector)
if magnitude > m:
vector *= m / magnitude
return vector
class HUD(cocos.layer.Layer):
def __init__(self, distance):
super(HUD, self).__init__()
w, h = director.get_window_size()
self.distance = distance
self.distance_text = self._create_text(w-60, h-40)

self.distance_text.element.text = 'Distance: %s' % self.distance

def _create_text(self, x, y):
text = cocos.text.Label(font_size=10, font_name='Verdana',
anchor_x='right', anchor_y='center',
color=(255, 255, 255, 255))
text.position = (x, y)
return text

class MainLayer(cocos.layer.Layer):
is_event_handler = True

def __init__(self):
super(MainLayer, self).__init__()
self.actor = Actor(320, 240)
self.hud = HUD(self.actor.distance)

def on_mouse_motion(self, x, y, dx, dy):
self.actor.target = eu.Vector2(x, y)

def on_mouse_press(self, x, y, buttons, mod):
self.actor.seek = not self.actor.seek

if __name__ == '__main__':
cocos.director.director.init(caption='Steering Behaviors')
scene = cocos.scene.Scene(MainLayer())
cocos.director.director.run(scene)