ecs icon indicating copy to clipboard operation
ecs copied to clipboard

Unable to get data of different Entities using GetInterestedComponents

Open cchandel opened this issue 3 years ago • 2 comments

Hi, I've setup a world and added 3 Entities with movement component.

collection.go:34: collection Add:{"Speed":0.008888888888888889,"Course":145}
collection.go:34: collection Add:{"Speed":0.0033333333333333335,"Course":120}
collection.go:34: collection Add:{"Speed":0.0033333333333333335,"Course":45}

I'm trying to use an Input system similar to your example to get and change speed for an entity.

type MoveChange struct {
	ecs.FreeDisposableComponent[MoveChange]
}
import (
	"github.com/zllangct/ecs"
	"astt-server/components"
)

type MoveChangeSystem struct {
	ecs.System[MoveChangeSystem]
}

func (mc *MoveChangeSystem) Init() {
	ecs.AddRequireComponent2[components.Movement, components.MoveChange](mc)
}

func (mc *MoveChangeSystem) PreUpdate(event ecs.Event) {

	iterMovement := ecs.GetInterestedComponents[components.Movement](mc)
	if iterMovement == nil {
		return
	}
	for mov := iterMovement.Begin(); !iterMovement.End(); iterMovement.Next() {
		println(mov.Speed, mov.Course)
		println(mov.Owner().Entity())
	}
}

I get 3 values printed - but they're all the same.

+8.888889e-003 +1.450000e+002 -7673762469411480564

+8.888889e-003 +1.450000e+002 -7673762469411480564

+8.888889e-003 +1.450000e+002 -7673762469411480564

How do I get the data for each separate entity?

Thanks.

cchandel avatar Nov 30 '21 02:11 cchandel

        // mov should be reset every loop
	for mov := iterMovement.Begin(); !iterMovement.End(); mov = iterMovement.Next() {
		println(mov.Speed, mov.Course)
		println(mov.Owner().Entity())
	}
	//style 1:
	for iter := NewIterator(c); !iter.End(); iter.Next() {
		v := iter.Val()
		fmt.Printf("style 1: %+v\n", v)
	}

	//style 2:
	iter := NewIterator(c)
	for c := iter.Begin(); !iter.End(); c = iter.Next() {
		fmt.Printf("style 2: %+v\n", c)
	}

zllangct avatar Dec 01 '21 14:12 zllangct

This works.

for mov := iterMovement.Begin(); !iterMovement.End(); mov = iterMovement.Next()

However, changing the value

mov.Course = 140

does not change the value of course.

movementSystem.go:170: unit id:5 refresh:1s co:45
collection.go:34: collection Add:{"Speed":0,"Course":140}
moveChangeSystem.go:59: unit: 5 course changed: 140
movementSystem.go:170: unit id:5 refresh:1s co:45

cchandel avatar Dec 01 '21 15:12 cchandel