sad
sad

Reputation: 137

Why my enemy doesn't move when moving it? (Ursina)

I have this code. [enemy.py].

# Enemy behaviour.

# Entities.
from ursina import Entity

# Colors.
from ursina.color import red

# 3D Vectors.
from ursina import Vec3

# Capsule model.
from ursina import Capsule

# Random.
from random import randint, choice

# Sequences and tools for it.
from ursina.sequence import Sequence, Wait, Func


# Some enemy constants.
ENEMY_MODEL = Capsule() # NOTE (TODO): Maybe later can be replaced on new enemy 3D model.
ENEMY_SCALE = (2, 2, 2)

ENEMY_COLLIDER = 'mesh'
ENEMY_COLLISION = True

ENEMY_COLOR = red

ENEMY_SPAWN_POS = (16.328, 1.500, 16.773) # XXX: Generated by console.

# Enemy class.
class Enemy(Entity):
    def __init__(self) -> None:
        """Enemy class."""
        super().__init__(
            model=ENEMY_MODEL,
            scale=Vec3(ENEMY_SCALE),
            collider=ENEMY_COLLIDER,
            collision=ENEMY_COLLISION,
            color=ENEMY_COLOR,
            position=ENEMY_SPAWN_POS
        )

        self.ai_enabled = False

        self.friendly = False

        self.move_every_secs = 5

        self.sequences = [
            Sequence(
                Func(self.simulate_moving),
                Wait(self.move_every_secs),

                loop=True
            )
        ]

        self.sequences_started = False

    # Enemy update function.
    def update(self):
        if self.ai_enabled:
            if not self.sequences_started:
                for sequence in self.sequences:
                    sequence.start()

                self.sequences_started = True

        elif not self.ai_enabled:
            if self.sequences_started:
                for sequence in self.sequences:
                    sequence.pause()

                self.sequences_started = False

    def simulate_moving(self):
        """Simulate enemy moving."""
        move_by = ['x', 'z']

        move_by_random = choice(move_by)

        move_on = randint(5, 10)

        if move_by_random == 'x':
            for _ in range(int(self.position.x + move_on)):
                self.position.x += 1

        elif move_by_random == 'z':
            for _ in range(int(self.position.z + move_on)):
                self.position.z += 1

        self.ai_log('Moved.')

    def enable_ai(self) -> None:
        """Enable enemy AI."""
        self.ai_enabled = True

    def disable_ai(self) -> None:
        """Disable enemy AI."""
        self.ai_enabled = False

    def set_friendly(self) -> None:
        """Make enemy friendly."""
        self.friendly = True

    def set_not_friendly(self) -> None:
        """Make enemy not friendly."""
        self.friendly = False

    def update_moving_per_secs(self, new_val: int) -> None:
        """Update moving activity per seconds."""
        self.move_every_secs = new_val

    def ai_log(self, message) -> None:
        """Create AI log into console."""
        print(f'AI (Core) : {message}')

[game.py] (Not full code, but anyway that's what we need to know).

from enemy import Enemy

enemy = Enemy()

enemy.enable_ai()

And every 5 seconds it must move, but it's doesn't move at all. Note, that function get called.

What to do? ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

Upvotes: 0

Views: 108

Answers (1)

sad
sad

Reputation: 137

Oh, i solved it. We need to use self.x, not self.position.x.

Upvotes: 1

Related Questions