Example #1
0
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
		}
	}
}
Example #2
0
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()
	}
}