Example #1
0
func (ai *EnemeyAI) Start() {
	if ai.Target == nil {
		ai.Target = Player
	}

	isPlayerClose := func(distance float32) func() bt.Command {
		return func() bt.Command {
			if ai.GameObject() == nil || ai.Target.GameObject() == nil {
				return bt.Close
			}
			myPos := ai.Transform().WorldPosition()
			targetPos := ai.Target.Transform().WorldPosition()
			if targetPos.Distance(myPos) < distance {
				return bt.Continue
			}
			return bt.Yield
		}
	}

	prepareForAttack := func() bt.Command {
		if ai.GameObject() == nil || ai.Target.GameObject() == nil {
			return bt.Close
		}

		ai.GameObject().Physics.Body.SetTorque(10000)
		return bt.Continue
	}

	attack := func() bt.Command {
		if ai.GameObject() == nil || ai.Target.GameObject() == nil {
			return bt.Close
		}
		myPos := ai.Transform().WorldPosition()
		targetPos := ai.Target.Transform().WorldPosition()

		dir := targetPos.Sub(myPos)
		dir.Normalize()

		rnd := rand.Float32() * 0.5
		if rand.Float32() > 0.5 {
			rnd = -rnd
		}

		attackSpeed := float32(70000)
		minAttackSpeed := float32(20000)

		attackSpeed -= minAttackSpeed

		ai.GameObject().Physics.Body.AddForce((dir.X+rnd)*((attackSpeed*rand.Float32())+minAttackSpeed), (dir.Y+rnd)*((attackSpeed*rand.Float32())+minAttackSpeed))
		return bt.Continue
	}

	randomMove := func() bt.Command {
		if ai.GameObject() == nil || ai.Target.GameObject() == nil {
			return bt.Close
		}
		attackSpeed := float32(40000)
		moveSpeed := float32(20000)
		myPos := ai.Transform().WorldPosition()
		targetPos := ai.Target.Transform().WorldPosition()
		if targetPos.Distance(myPos) < 500 {

			if rand.Float32() > 0.5 {

				dir := targetPos.Sub(myPos)
				dir.Normalize()

				rnd := rand.Float32() * 0.5
				if rand.Float32() > 0.5 {
					rnd = -rnd
				}

				ai.GameObject().Physics.Body.AddForce((-dir.X+rnd)*moveSpeed, (-dir.Y+rnd)*moveSpeed)
			} else {
				dir := targetPos.Sub(myPos)
				dir.Normalize()

				rnd := rand.Float32() * 0.5
				if rand.Float32() > 0.5 {
					rnd = -rnd
				}

				ai.GameObject().Physics.Body.AddForce((dir.X+rnd)*attackSpeed, (dir.Y+rnd)*attackSpeed)
			}
		}

		return bt.Continue
	}

	sendCookies := func() bt.Command {
		if ai.GameObject() == nil || ai.Target.GameObject() == nil {
			return bt.Close
		}
		myPos := ai.Transform().WorldPosition()
		targetPos := ai.Target.Transform().WorldPosition()

		dir := targetPos.Sub(myPos)
		dir.Normalize()

		rnd := rand.Float32() * 0.2
		if rand.Float32() > 0.5 {
			rnd = -rnd
		}

		c := cookie.Clone()
		//c.Tag = CookieTag
		c.Transform().SetParent2(GameSceneGeneral.Layer2)
		size := 50 + rand.Float32()*100
		c.Transform().SetScalef(size, size)

		s := ai.Transform().WorldScale()
		s = s.Add(c.Transform().WorldScale())
		s = s.Mul2(0.5)
		p := myPos.Add(dir.Mul(s))

		c.Transform().SetPosition(p)

		attackSpeed := float32(70000)

		c.GameObject().Physics.Body.AddForce((dir.X+rnd)*attackSpeed, (dir.Y+rnd)*attackSpeed)

		return bt.Continue
	}

	appear := func() bt.Command {
		if ai.GameObject() == nil {
			return bt.Close
		}

		ai.GameObject().SetActive(true)

		return bt.Continue
	}

	prepareForNextAttack := func() bt.Command {
		if ai.GameObject() == nil || ai.Target.GameObject() == nil {
			return bt.Close
		}

		ai.GameObject().Physics.Body.SetTorque(-10)
		ai.GameObject().Physics.Body.SetAngularVelocity(0)

		return bt.Restart
	}

	if ai.Type == Enemey_Cookie {
		bt.Start(bt.SleepRand(5), isPlayerClose(600), prepareForAttack, bt.Sleep(1.5), attack, bt.WaitContinue(prepareForNextAttack, nil, 1.5))
	} else {
		bt.Start(bt.Sleep(60), appear, bt.Sequence(bt.SleepRand(0.5), isPlayerClose(800), randomMove, sendCookies))
		//disable queen until appear
		ai.GameObject().SetActive(false)
	}

}
Example #2
0
func (s *GameScene) Load() {
	ArialFont, err := engine.NewFont("./data/Fonts/arial.ttf", 48)
	if err != nil {
		panic(err)
	}

	ArialFont2, err := engine.NewFont("./data/Fonts/arial.ttf", 24)
	if err != nil {
		panic(err)
	}
	_ = ArialFont2
	_ = ArialFont

	GameSceneGeneral = s

	s.Camera = engine.NewCamera()

	cam := engine.NewGameObject("Camera")
	cam.AddComponent(s.Camera)
	cam.AddComponent(NewCameraCtl(100))

	cam.Transform().SetScalef(1, 1)

	gui := engine.NewGameObject("GUI")

	Layer1 := engine.NewGameObject("Layer1")
	Layer2 := engine.NewGameObject("Layer2")
	Layer3 := engine.NewGameObject("Layer3")

	s.Layer1 = Layer1
	s.Layer2 = Layer2
	s.Layer3 = Layer3

	mouse := engine.NewGameObject("Mouse")
	mouse.AddComponent(NewMouseDebugger())
	mouse.AddComponent(engine.NewMouse())
	mouse.Transform().SetParent2(cam)

	FPSDrawer := engine.NewGameObject("FPS")
	txt := FPSDrawer.AddComponent(components.NewUIText(ArialFont2, "")).(*components.UIText)
	fps := FPSDrawer.AddComponent(engine.NewFPS()).(*engine.FPS)
	txt.SetAlign(engine.AlignLeft)
	fps.SetAction(func(fps float64) {
		txt.SetString("FPS: " + strconv.FormatFloat(fps, 'f', 2, 32))
	})
	FPSDrawer.Transform().SetParent2(cam)
	FPSDrawer.Transform().SetPositionf(-float32(engine.Width)/2+10, +float32(engine.Height)/2-20)
	FPSDrawer.Transform().SetScalef(20, 20)

	{
		FPSDrawer := engine.NewGameObject("Counter")
		txt := FPSDrawer.AddComponent(components.NewUIText(ArialFont2, "")).(*components.UIText)
		txt.SetAlign(engine.AlignLeft)
		bt.Start(func() bt.Command {
			txt.SetString(fmt.Sprintf("Bodies: %d", len(engine.Space.Bodies)))
			return bt.Restart
		})
		FPSDrawer.Transform().SetParent2(cam)
		FPSDrawer.Transform().SetPositionf(-float32(engine.Width)/2+10, +float32(engine.Height)/2-45)
		FPSDrawer.Transform().SetScalef(20, 20)
	}

	//SPACCCEEEEE
	engine.Space.Gravity.Y = -300
	engine.Space.Iterations = 10

	atlas := engine.NewManagedAtlas(512, 512)
	e := atlas.LoadGroup("./data/fire")
	if e != nil {
		fmt.Println(e)
	}
	e = atlas.LoadGroup("./data/Charecter")
	if e != nil {
		fmt.Println(e)
	}
	err, rectID := atlas.LoadImage("./data/rect.png")
	if err != nil {
		panic(err)
	}
	err, circleID := atlas.LoadImage("./data/circle.png")
	if err != nil {
		panic(err)
	}

	atlas.BuildAtlas()

	atlas.BuildMipmaps()
	atlas.SetFiltering(engine.MipMapLinearNearest, engine.Nearest)

	uvsFire, indFire := engine.AnimatedGroupUVs(atlas, "fire")
	_ = uvsFire
	_ = indFire

	clone2 := engine.NewGameObject("Sprite")
	s2 := clone2.AddComponent(engine.NewSprite3(atlas.Texture, uvsFire)).(*engine.Sprite)
	s2.BindAnimations(indFire)
	s2.AnimationSpeed = 6
	clone2.Transform().SetPositionf(775, 300)
	clone2.Transform().SetScalef(58, 58)
	clone2.Transform().SetParent2(Layer1)

	f := clone2.Clone()
	f.Transform().SetPositionf(25, 300)
	f.Transform().SetParent2(Layer1)

	box, _ = engine.LoadTexture("./data/rect.png")
	cir, _ = engine.LoadTexture("./data/circle.png")
	cir.BuildMipmaps()
	cir.SetFiltering(engine.MipMapLinearNearest, engine.Nearest)

	ball := engine.NewGameObject("Ball")
	ball.AddComponent(engine.NewSprite2(atlas.Texture, engine.IndexUV(atlas, circleID)))
	ball.Transform().SetScalef(30, 30)
	ball.AddComponent(engine.NewPhysicsShape(false, chipmunk.NewCircle(vect.Vect{0, 0}, 15)))
	ball.Physics.Body.SetMass(10)
	ball.Physics.Body.SetMoment(ball.Physics.Shape.Moment(10))
	ball.Physics.Shape.SetFriction(0.8)
	ball.Physics.Shape.SetElasticity(0.8)

	for i := 0; i < 0; i++ {
		sprite3 := engine.NewGameObject("Sprite" + fmt.Sprint(i))
		sprite3.AddComponent(engine.NewSprite2(atlas.Texture, engine.IndexUV(atlas, rectID)))
		sprite3.Transform().SetParent2(Layer2)
		sprite3.Transform().SetRotationf(180)
		sprite3.Transform().SetPositionf(160, 120+float32(i*31))
		sprite3.Transform().SetScalef(30, 30)

		phx := sprite3.AddComponent(engine.NewPhysics(false)).(*engine.Physics)
		phx.Shape.SetFriction(1)
		phx.Shape.SetElasticity(0.0)
		phx.Body.SetMass(1)
	}

	for i := 0; i < 200; i++ {
		sprite3 := ball.Clone()
		sprite3.Transform().SetParent2(Layer2)
		sprite3.Transform().SetPositionf(200+float32(i%4)*25, float32(i*30)+120)
	}

	floor := engine.NewGameObject("Floor")
	floor.AddComponent(engine.NewSprite(box))
	floor.AddComponent(engine.NewPhysics(true))
	floor.Transform().SetParent2(Layer2)
	floor.Transform().SetPositionf(100, -20)
	floor.Transform().SetScalef(10000, 100)
	floor.Physics.Shape.SetFriction(1)
	floor.Physics.Shape.SetElasticity(1)

	floor2 := floor.Clone()
	floor2.Transform().SetParent2(Layer2)
	floor2.Transform().SetPositionf(800, -20)
	floor2.Transform().SetRotationf(90)

	floor3 := floor2.Clone()
	floor3.Transform().SetParent2(Layer2)
	floor3.Transform().SetPositionf(0, -20)

	uvs2, ind := engine.AnimatedGroupUVs(atlas, "stand", "walk")
	_ = uvs2
	_ = ind

	sprite4 := engine.NewGameObject("Sprite")
	sprite := sprite4.AddComponent(engine.NewSprite3(atlas.Texture, uvs2)).(*engine.Sprite)
	sprite.BindAnimations(ind)
	//sprite4.AddComponent(NewSprite(sp))
	sprite.AnimationSpeed = 5
	player := sprite4.AddComponent(NewPlayerController()).(*PlayerController)
	//sprite4.AddComponent(NewRotator())
	ph := sprite4.AddComponent(engine.NewPhysics(false)).(*engine.Physics)
	player.Fire = clone2
	sprite4.Transform().SetParent2(Layer1)
	sprite4.Transform().SetPositionf(900, 100)
	sprite4.Transform().SetScalef(100, 100)
	ph.Body.SetMass(100)
	ph.Body.IgnoreGravity = false
	ph.Body.SetMoment(engine.Inf)
	ph.Shape.SetFriction(1)
	ph.Shape.SetElasticity(0)

	/*
		floor = NewGameObject("Box")
		bbBox := NewSprite(box)
		floor.AddComponent(bbBox)
		phx = floor.AddComponent(NewPhysics(true, 500, 500)).(*Physics)
		floor.Transform().SetParent2(Layer2)
		floor.Transform().SetPosition(NewVector2(900, 200))
		floor.Transform().SetScale(NewVector2(500, 500))
		phx.Shape.SetFriction(1)
		phx.Shape.SetElasticity(1)
		phx.Shape.IsSensor = true
		//phx.Shape.Friction = 1
		_ = phx
	*/

	//sShadow.Sprite = bbBox
	//
	{
		sprite3 := ball.Clone()
		sprite3.Transform().SetParent2(Layer2)
		sprite3.Transform().SetPositionf(200, 120)

		joint := chipmunk.NewPivotJoint(mouse.Physics.Body, sprite3.Physics.Body)
		joint.MaxForce = 5000000
		//mouseJoint->errorBias = cpfpow(1.0f - 0.15f, 60.0f);
		engine.Space.AddConstraint(joint)
	}

	cam.Transform().SetWorldPosition(player.Transform().WorldPosition())

	s.AddGameObject(cam)
	s.AddGameObject(gui)
	s.AddGameObject(Layer1)
	s.AddGameObject(Layer2)
	s.AddGameObject(Layer3)
	//s.AddGameObject(shadowShader)

	fmt.Println("Scene loaded")
}