diff --git a/engine/area.go b/engine/area.go new file mode 100644 index 0000000..61944cf --- /dev/null +++ b/engine/area.go @@ -0,0 +1,43 @@ +package engine + +type CollisionArea struct { + position Position + size Size + gob *GameObject + sc *Scene + onCollision func(*CollisionArea, *GameObject, *GameObjectEvent) + debugColor *Color +} + +func (p *CollisionArea) Scene() *Scene { + return p.sc +} +func (p *CollisionArea) Size() Size { + return p.size +} +func (p *CollisionArea) Position() Position { + return p.position +} +func NewCollisionArea(scene *Scene, pos Position, siz Size) *CollisionArea { + p := &CollisionArea{ + position: pos, + size: siz, + gob: _newGameObjectUnregister(pos, siz, SHAPE_RECTANGLE, len(scene.GameObjectsObjects())+1), + sc: scene, + onCollision: func(coll *CollisionArea, g *GameObject, goe *GameObjectEvent) { + + }, + debugColor: nil, + } + scene.areas = append(scene.areas, p) + return p +} +func (p *CollisionArea) SetDebugColor(color Color) { + p.debugColor = &color +} +func (p *CollisionArea) QuitDebugColor() { + p.debugColor = nil +} +func (p *CollisionArea) SetOnCollision(c func(*CollisionArea, *GameObject, *GameObjectEvent)) { + p.onCollision = c +} diff --git a/engine/scene.go b/engine/scene.go index 3f8fcca..b066a2f 100644 --- a/engine/scene.go +++ b/engine/scene.go @@ -11,6 +11,7 @@ type Scene struct { //button ui_button []*UiButton camera *Camera + areas []*CollisionArea } func (s *Scene) IsCurrent() bool { @@ -80,7 +81,9 @@ func (s *Scene) Camera() *Camera { func (s *Scene) SetCamera(c *Camera) { s.camera = c } - +func (s *Scene) CollisionsAreas() []*CollisionArea { + return s.areas +} func NewScene() *Scene { return &Scene{ instancesGameObjects: []*GameObject{}, @@ -88,6 +91,7 @@ func NewScene() *Scene { ui_colorZone: []*UiColorZone{}, ui_button: []*UiButton{}, camera: nil, + areas: []*CollisionArea{}, } } func SetScene(s *Scene) { @@ -97,6 +101,7 @@ func GetCurrentScene() *Scene { return scene_32445 } func (s *Scene) Draw() { + if s.camera != nil { rl.ClearBackground(ConvertColor(colorBackColor)) //rl.DrawText("ano", 30, 100, 29, rl.Brown) @@ -117,15 +122,38 @@ func (s *Scene) Draw() { } rl.BeginMode2D(s.camera.camera) - + for i := 0; i < len(s.areas); i++ { + p5 := s.areas[i].gob.collision.OnCollision() + var xbsx *GameObjectEvent = nil + if p5 != nil { + xbsx = NewGameObjectEvent(p5) + } + s.areas[i].onCollision(s.areas[i], p5, xbsx) + if s.areas[i].debugColor != nil { + rl.DrawRectangle(int32(s.areas[i].position.X), int32(s.areas[i].position.Y), int32(s.areas[i].size.W), int32(s.areas[i].size.H), ConvertColor(*s.areas[i].debugColor)) + } + } _update() + } else { rl.ClearBackground(ConvertColor(colorBackColor)) + for i := 0; i < len(s.ui_colorZone); i++ { //fmt.Println(rl.IsK) s.ui_colorZone[i].Draw() } + for i := 0; i < len(s.areas); i++ { + p5 := s.areas[i].gob.collision.OnCollision() + var xbsx *GameObjectEvent = nil + if p5 != nil { + xbsx = NewGameObjectEvent(p5) + } + s.areas[i].onCollision(s.areas[i], p5, xbsx) + if s.areas[i].debugColor != nil { + rl.DrawRectangle(int32(s.areas[i].position.X), int32(s.areas[i].position.Y), int32(s.areas[i].size.W), int32(s.areas[i].size.H), ConvertColor(*s.areas[i].debugColor)) + } + } _update() for i := 0; i < len(s.ui_text); i++ { //fmt.Println(rl.IsK) diff --git a/examples/collArea.go b/examples/collArea.go new file mode 100644 index 0000000..621f287 --- /dev/null +++ b/examples/collArea.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + + e "github.com/Troxsoft/Furia2D-Engine/engine" +) + +var obj *e.GameObject +var area *e.CollisionArea + +func main() { + e.InitGame("welcome to Furia2D-Engine :)", e.NewSize(500, 400), func(ge *e.GameEvent) { + area = e.NewCollisionArea(e.GetCurrentScene(), e.NewPos(100, 100), e.NewSize(200, 200)) + area.SetDebugColor(e.BROWN) + area.SetOnCollision(func(a *e.CollisionArea, g *e.GameObject, goe *e.GameObjectEvent) { + if g != nil { + fmt.Println("aña") + } + }) + obj, _ = e.CreateGameObject("you", e.SHAPE_RECTANGLE, e.NewSize(100, 100), e.NewPosition(0, 0)) + e.NewCamera(e.NewPosition(0, 0), e.NewPosition(0, 0)) + h, _ := e.CreateGameObject("j", e.SHAPE_RECTANGLE, e.NewSize(20, 20), e.NewPosition(240, 100)) + h.Instance(e.GetCurrentScene(), nil) + obj = obj.Instance(e.GetCurrentScene(), nil) + e.GetCurrentScene().SetCamera(e.NewCamera(e.NewPosition(0, 0), e.NewPosition(0, 0))) + + }, + func(ge *e.GameEvent) { + e.GetCurrentScene().Camera().SetTarget(e.NewPosition(obj.Position().X-250, obj.Position().Y-200)) + if ge.IsKeyDown(ge.KeyRight) { + obj.MoveTo(e.NewPosition(obj.Position().X+5, obj.Position().Y)) + } + if ge.IsKeyDown(ge.KeyDown) { + obj.MoveTo(e.NewPosition(obj.Position().X, obj.Position().Y+5)) + } + if ge.IsKeyDown(ge.KeyUp) { + obj.MoveTo(e.NewPosition(obj.Position().X, obj.Position().Y-5)) + } + if ge.IsKeyDown(ge.KeyLeft) { + obj.MoveTo(e.NewPosition(obj.Position().X-5, obj.Position().Y)) + } + }) +}