func (g *GameEngine) startScrolling(start allegro.MouseButtonDown) { timer := allegro.CreateTimer(float64(1) / 30) mouseEvent := allegro.GetMouseEventSource() defer mouseEvent.StopGetEvents() es := []*allegro.EventSource{mouseEvent, timer.GetEventSource()} timer.Start() defer timer.Destroy() x, y := start.X, start.Y stopped := false for ev := range allegro.GetEvents(es) { switch tev := ev.(type) { case allegro.MouseButtonUp: if tev.Button == start.Button { stopped = true } case allegro.TimerEvent: viewport := g.displayEngine.GetViewport() viewport.Move((x-start.X)/30, (y-start.Y)/30) g.displayEngine.SetViewport(viewport) case allegro.MouseAxesEvent: x, y = tev.X, tev.Y } g.statusLock.RLock() stopped = stopped || g.stopped g.statusLock.RUnlock() if stopped { break } } }
func (ge *GameEngine) MainLoop() { timer := allegro.CreateTimer(1 / float64(ge.tickRate)) es := []*allegro.EventSource{timer.GetEventSource()} queue := allegro.GetEvents(es) stopped := false go ge.eventHandler() ge.statusLock.Lock() ge.stopped = false ge.statusLock.Unlock() tick := 0 for !stopped { ev := <-queue if _, ok := ev.(allegro.TimerEvent); ok { ge.world.Tick(tick) } tick++ ge.statusLock.RLock() stopped = ge.stopped ge.statusLock.RUnlock() } }