func (l *LocalData) thinkAbility(g *Game, abs *personalAbilities, gid Gid) { if abs.activeAbility == nil { return } var mouse linear.Vec2 if l.mode == LocalModeArchitect { mx, my := l.sys.GetCursorPos() mouse.X = float64(mx) mouse.Y = float64(my) mouse = mouse.Sub(l.architect.camera.regionPos) mouse.X /= l.architect.camera.regionDims.X mouse.Y /= l.architect.camera.regionDims.Y mouse.X *= l.architect.camera.current.dims.X mouse.Y *= l.architect.camera.current.dims.Y mouse = mouse.Sub(l.architect.camera.current.dims.Scale(0.5)) mouse = mouse.Add(l.architect.camera.current.mid) } events, die := abs.activeAbility.Think(gid, g, mouse) for _, event := range events { l.engine.ApplyEvent(event) } if die { base.Log().Printf("Deactivate on die") more_events := abs.activeAbility.Deactivate(gid) abs.activeAbility = nil for _, event := range more_events { l.engine.ApplyEvent(event) } } }
func (editor *editorData) getPoly(g *Game) linear.Poly { pos := editor.cursorPosInGameCoords(&g.Level.Room) var offset linear.Vec2 offset.X = pos.X - editor.placeBlock.offset.X offset.X = math.Floor(offset.X/editor.placeBlock.grid+0.5) * editor.placeBlock.grid offset.Y = pos.Y - editor.placeBlock.offset.Y offset.Y = math.Floor(offset.Y/editor.placeBlock.grid+0.5) * editor.placeBlock.grid block := make(linear.Poly, len(editor.placeBlock.block)) for i := range editor.placeBlock.block { block[i] = editor.placeBlock.block[i].Add(offset) } return block }
func (tm *ThunderMenu) Draw(region Region, style StyleStack) { // Set clip planes gl.PushAttrib(gl.TRANSFORM_BIT) defer gl.PopAttrib() var eqs [4][4]gl.Double eqs[0][0], eqs[0][1], eqs[0][2], eqs[0][3] = 1, 0, 0, -gl.Double(region.X) eqs[1][0], eqs[1][1], eqs[1][2], eqs[1][3] = -1, 0, 0, gl.Double(region.X+region.Dx) eqs[2][0], eqs[2][1], eqs[2][2], eqs[2][3] = 0, 1, 0, -gl.Double(region.Y) eqs[3][0], eqs[3][1], eqs[3][2], eqs[3][3] = 0, -1, 0, gl.Double(region.Y+region.Dy) gl.Enable(gl.CLIP_PLANE0) gl.Enable(gl.CLIP_PLANE1) gl.Enable(gl.CLIP_PLANE2) gl.Enable(gl.CLIP_PLANE3) gl.ClipPlane(gl.CLIP_PLANE0, &eqs[0][0]) gl.ClipPlane(gl.CLIP_PLANE1, &eqs[1][0]) gl.ClipPlane(gl.CLIP_PLANE2, &eqs[2][0]) gl.ClipPlane(gl.CLIP_PLANE3, &eqs[3][0]) var start, end int if tm.delta <= 0 { start = tm.current + int(math.Floor(tm.delta)) end = tm.current region.X += int(float64(region.Dx) * (float64(start-tm.current) - tm.delta)) } else { start = tm.current end = tm.current + int(math.Ceil(tm.delta)) region.X += int(float64(region.Dx) * (float64(end-tm.current) - tm.delta - math.Floor(tm.delta) - 1)) } var offset linear.Vec2 offset.X = (float64(tm.current) + tm.delta) * float64(region.Dx) for i := start; i <= end; i++ { style.PushStyle(map[string]interface{}{"offset": offset}) tm.Subs[tm.menuStack[i]].Draw(region, style) style.Pop() region.X += region.Dx } }
func (camera *cameraInfo) FocusRegion(g *Game, side int) { min := linear.Vec2{1e9, 1e9} max := linear.Vec2{-1e9, -1e9} player := g.Ents[g.local.Gid] if player == nil { min.X = 0 min.Y = 0 max.X = float64(g.Level.Room.Dx) max.Y = float64(g.Level.Room.Dy) } else { min.X = player.Pos().X - player.Stats().Vision() min.Y = player.Pos().Y - player.Stats().Vision() if min.X < 0 { min.X = 0 } if min.Y < 0 { min.Y = 0 } max.X = player.Pos().X + player.Stats().Vision() max.Y = player.Pos().Y + player.Stats().Vision() if max.X > float64(g.Level.Room.Dx) { max.X = float64(g.Level.Room.Dx) } if max.Y > float64(g.Level.Room.Dy) { max.Y = float64(g.Level.Room.Dy) } } mid := min.Add(max).Scale(0.5) dims := max.Sub(min) if dims.X/dims.Y < camera.regionDims.X/camera.regionDims.Y { dims.X = dims.Y * camera.regionDims.X / camera.regionDims.Y } else { dims.Y = dims.X * camera.regionDims.Y / camera.regionDims.X } camera.target.dims = dims camera.target.mid = mid camera.approachTarget() }
func (camera *cameraInfo) doInvadersFocusRegion(g *Game, side int) { min := linear.Vec2{1e9, 1e9} max := linear.Vec2{-1e9, -1e9} hits := 0 for _, ent := range g.temp.AllEnts { if ent.Side() != side { continue } if player, ok := ent.(*PlayerEnt); ok { hits++ pos := player.Pos() if pos.X < min.X { min.X = pos.X } if pos.Y < min.Y { min.Y = pos.Y } if pos.X > max.X { max.X = pos.X } if pos.Y > max.Y { max.Y = pos.Y } } } if hits == 0 { min.X = 0 min.Y = 0 max.X = float64(g.Levels[GidInvadersStart].Room.Dx) max.Y = float64(g.Levels[GidInvadersStart].Room.Dy) } else { min.X -= stats.LosPlayerHorizon + 50 min.Y -= stats.LosPlayerHorizon + 50 if min.X < 0 { min.X = 0 } if min.Y < 0 { min.Y = 0 } max.X += stats.LosPlayerHorizon + 50 max.Y += stats.LosPlayerHorizon + 50 if max.X > float64(g.Levels[GidInvadersStart].Room.Dx) { max.X = float64(g.Levels[GidInvadersStart].Room.Dx) } if max.Y > float64(g.Levels[GidInvadersStart].Room.Dy) { max.Y = float64(g.Levels[GidInvadersStart].Room.Dy) } } mid := min.Add(max).Scale(0.5) dims := max.Sub(min) if dims.X/dims.Y < camera.regionDims.X/camera.regionDims.Y { dims.X = dims.Y * camera.regionDims.X / camera.regionDims.Y } else { dims.Y = dims.X * camera.regionDims.Y / camera.regionDims.X } camera.target.dims = dims camera.target.mid = mid if camera.current.mid.X == 0 && camera.current.mid.Y == 0 { // On the very first frame the current midpoint will be (0,0), which should // never happen after the game begins. In this one case we'll immediately // set current to target so we don't start off by approaching it from the // origin. camera.current = camera.target } else { // speed is in (0, 1), the higher it is, the faster current approaches target. speed := 0.1 camera.current.dims = camera.current.dims.Scale(1 - speed).Add(camera.target.dims.Scale(speed)) camera.current.mid = camera.current.mid.Scale(1 - speed).Add(camera.target.mid.Scale(speed)) } }