Outputting content of Variable

7 views
Skip to first unread message

Christoph Roth

unread,
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.slow_radius = 200
        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.add(ps.Sun())
        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)
        self.add(text)
        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)
        self.add(text)
        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.add(self.actor)
        self.hud = HUD(self.actor.distance)
        self.add(self.hud)

    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

unread,
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/cocos-discuss/698bb178-95f6-4830-b4b0-4b4e8f30abc2n%40googlegroups.com.

Christoph Roth

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

thanks for the advice.

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)
        self.add(text)
        return text

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

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

    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)
Reply all
Reply to author
Forward
0 new messages