From f8fe40c5ef3db759a5eff31691ce57a1850054ac Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sat, 16 Jun 2018 20:21:42 -0700 Subject: [PATCH] Add global tick counter for debugging, fix unclick state errors --- doodle.go | 5 ++++- events/events.go | 58 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/doodle.go b/doodle.go index 15d650d..0966273 100644 --- a/doodle.go +++ b/doodle.go @@ -28,6 +28,7 @@ type Doodle struct { startTime time.Time running bool + ticks uint64 events *events.State width int32 height int32 @@ -106,6 +107,7 @@ func (d *Doodle) Run() error { // Draw a frame and log how long it took. start := time.Now() err = d.Loop() + d.ticks++ elapsed := time.Now().Sub(start) tmp := elapsed / time.Millisecond @@ -146,7 +148,7 @@ var pixelHistory []Pixel // Loop runs one loop of the game engine. func (d *Doodle) Loop() error { // Poll for events. - ev, err := d.events.Poll() + ev, err := d.events.Poll(d.ticks) if err != nil { log.Error("event poll error: %s", err) return err @@ -166,6 +168,7 @@ func (d *Doodle) Loop() error { dy: ev.CursorY.Last, } + // Append unique new pixels. if len(pixelHistory) == 0 || pixelHistory[len(pixelHistory)-1] != pixel { pixelHistory = append(pixelHistory, pixel) } diff --git a/events/events.go b/events/events.go index 46517f4..dd138a2 100644 --- a/events/events.go +++ b/events/events.go @@ -10,29 +10,34 @@ import ( // State keeps track of event states. type State struct { // Mouse buttons. - Button1 BoolFrameState - Button2 BoolFrameState + Button1 *BoolFrameState + Button2 *BoolFrameState // Cursor positions. - CursorX Int32FrameState - CursorY Int32FrameState + CursorX *Int32FrameState + CursorY *Int32FrameState } // New creates a new event state manager. func New() *State { - return &State{} + return &State{ + Button1: &BoolFrameState{}, + Button2: &BoolFrameState{}, + CursorX: &Int32FrameState{}, + CursorY: &Int32FrameState{}, + } } // Poll for events. -func (s *State) Poll() (*State, error) { +func (s *State) Poll(ticks uint64) (*State, error) { for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() { switch t := event.(type) { case *sdl.QuitEvent: return s, errors.New("quit") case *sdl.MouseMotionEvent: if DebugMouseEvents { - log.Debug("[%d ms] MouseMotion type:%d id:%d x:%d y:%d xrel:%d yrel:%d", - t.Timestamp, t.Type, t.Which, t.X, t.Y, t.XRel, t.YRel, + log.Debug("[%d ms] tick:%d MouseMotion type:%d id:%d x:%d y:%d xrel:%d yrel:%d", + t.Timestamp, ticks, t.Type, t.Which, t.X, t.Y, t.XRel, t.YRel, ) } @@ -42,8 +47,8 @@ func (s *State) Poll() (*State, error) { s.Button1.Push(t.State == 1) case *sdl.MouseButtonEvent: if DebugClickEvents { - log.Debug("[%d ms] MouseButton type:%d id:%d x:%d y:%d button:%d state:%d", - t.Timestamp, t.Type, t.Which, t.X, t.Y, t.Button, t.State, + log.Debug("[%d ms] tick:%d MouseButton type:%d id:%d x:%d y:%d button:%d state:%d", + t.Timestamp, ticks, t.Type, t.Which, t.X, t.Y, t.Button, t.State, ) } @@ -53,26 +58,43 @@ func (s *State) Poll() (*State, error) { // Is a mouse button pressed down? if t.Button == 1 { + var eventName string if DebugClickEvents { if t.State == 1 && s.Button1.Now == false { - log.Debug("Mouse Button1 DOWN") + eventName = "DOWN" } else if t.State == 0 && s.Button1.Now == true { - log.Debug("Mouse Button1 UP") + eventName = "UP" } } - s.Button1.Push(t.State == 1) + + if eventName != "" { + log.Debug("tick:%d Mouse Button1 %s BEFORE: %+v", + ticks, + eventName, + s.Button1, + ) + s.Button1.Push(eventName == "DOWN") + log.Debug("tick:%d Mouse Button1 %s AFTER: %+v", + ticks, + eventName, + s.Button1, + ) + + // Return the event immediately. + return s, nil + } } - s.Button2.Push(t.Button == 3 && t.State == 1) + // s.Button2.Push(t.Button == 3 && t.State == 1) case *sdl.MouseWheelEvent: if DebugMouseEvents { - log.Debug("[%d ms] MouseWheel type:%d id:%d x:%d y:%d", - t.Timestamp, t.Type, t.Which, t.X, t.Y, + log.Debug("[%d ms] tick:%d MouseWheel type:%d id:%d x:%d y:%d", + t.Timestamp, ticks, t.Type, t.Which, t.X, t.Y, ) } case *sdl.KeyboardEvent: - log.Debug("[%d ms] Keyboard type:%d sym:%c modifiers:%d state:%d repeat:%d\n", - t.Timestamp, t.Type, t.Keysym.Sym, t.Keysym.Mod, t.State, t.Repeat, + log.Debug("[%d ms] tick:%d Keyboard type:%d sym:%c modifiers:%d state:%d repeat:%d\n", + t.Timestamp, ticks, t.Type, t.Keysym.Sym, t.Keysym.Mod, t.State, t.Repeat, ) } }