• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Handling SDL Event for Golang

VPS Starter Arubacloud
0 głosów
294 wizyt
pytanie zadane 23 marca 2016 w C i C++ przez jegor377 Stary wyjadacz (13,230 p.)
zamknięte 23 marca 2016 przez jegor377

Siema,

Mam problem. Próbuję odczytać polę Type z interfejsu Event, który dostaje of metody PollEvent(). Niestety interfejs Event nie posiada pola Type i ogólnie jest pustym interfejsem, stąd też nie mam pojęcia jak odczytać co za eventy dostaje. Funkcja PollEvent, bierze z oryginalnej funkcji języka C SDL_PollEvent() i dostaje jakieś dane typu CEvent, po czym zamiast zwrócić mi rezultaty roboty, wysyła to do funkcji goEvent(), która rzutuje mi te dane na ichne wskaźniki struktur, które się tam różnią trochę polami i zwraca mi wynik w postaci pustego interfacu. Kiedy wrzucam to do Println pokazuje mi, że pod adresem (interface wysyłam) są jakieś dane. Nie pokazuje mi ich nazw, ale wartości. No i teraz chciałbym się odwołać do tych wartości, ale nwm jak.

wycinek powalonego kodu

// PollEvent (https://wiki.libsdl.org/SDL_PollEvent)
func PollEvent() Event {
	var cevent C.SDL_Event
	ret := C.SDL_PollEvent(&cevent)
	if ret == 0 {
		return nil
	}
	return goEvent((*CEvent)(unsafe.Pointer(&cevent)))
}

func goEvent(cevent *CEvent) Event {
	switch cevent.Type {
	case WINDOWEVENT:
		return (*WindowEvent)(unsafe.Pointer(cevent))
	case SYSWMEVENT:
		return (*SysWMEvent)(unsafe.Pointer(cevent))
	case KEYDOWN:
		return (*KeyDownEvent)(unsafe.Pointer(cevent))
	case KEYUP:
		return (*KeyUpEvent)(unsafe.Pointer(cevent))
	case TEXTEDITING:
		return (*TextEditingEvent)(unsafe.Pointer(cevent))
	case TEXTINPUT:
		return (*TextInputEvent)(unsafe.Pointer(cevent))
	case MOUSEMOTION:
		return (*MouseMotionEvent)(unsafe.Pointer(cevent))
	case MOUSEBUTTONDOWN, MOUSEBUTTONUP:
		return (*MouseButtonEvent)(unsafe.Pointer(cevent))
	case MOUSEWHEEL:
		return (*MouseWheelEvent)(unsafe.Pointer(cevent))
	case JOYAXISMOTION:
		return (*JoyAxisEvent)(unsafe.Pointer(cevent))
	case JOYBALLMOTION:
		return (*JoyBallEvent)(unsafe.Pointer(cevent))
	case JOYHATMOTION:
		return (*JoyHatEvent)(unsafe.Pointer(cevent))
	case JOYBUTTONDOWN, JOYBUTTONUP:
		return (*JoyButtonEvent)(unsafe.Pointer(cevent))
	case JOYDEVICEADDED, JOYDEVICEREMOVED:
		return (*JoyDeviceEvent)(unsafe.Pointer(cevent))
	case CONTROLLERAXISMOTION:
		return (*ControllerAxisEvent)(unsafe.Pointer(cevent))
	case CONTROLLERBUTTONDOWN, CONTROLLERBUTTONUP:
		return (*ControllerButtonEvent)(unsafe.Pointer(cevent))
	case CONTROLLERDEVICEADDED, CONTROLLERDEVICEREMOVED, CONTROLLERDEVICEREMAPPED:
		return (*ControllerDeviceEvent)(unsafe.Pointer(cevent))
	case FINGERDOWN, FINGERUP, FINGERMOTION:
		return (*TouchFingerEvent)(unsafe.Pointer(cevent))
	case DOLLARGESTURE, DOLLARRECORD:
		return (*DollarGestureEvent)(unsafe.Pointer(cevent))
	case MULTIGESTURE:
		return (*MultiGestureEvent)(unsafe.Pointer(cevent))
	case DROPFILE:
		return (*DropEvent)(unsafe.Pointer(cevent))
	case RENDER_TARGETS_RESET:
		return (*RenderEvent)(unsafe.Pointer(cevent))
	case QUIT:
		return (*QuitEvent)(unsafe.Pointer(cevent))
	case USEREVENT:
		return (*UserEvent)(unsafe.Pointer(cevent))
	case CLIPBOARDUPDATE:
		return (*ClipboardEvent)(unsafe.Pointer(cevent))
	default:
		return (*CommonEvent)(unsafe.Pointer(cevent))
	}
}

i main.go

package main

import "github.com/veandco/go-sdl2/sdl"
import "github.com/veandco/go-sdl2/sdl_image"
import "GameLogic"
import "fmt"

func main() {
    sdl.Init(sdl.INIT_EVERYTHING)

    game := GameLogic.NewGame("test", sdl.Rect{sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, 800, 600}, sdl.WINDOW_SHOWN)
    defer game.Destroy()

    texture, err := img.LoadTexture(game.Renderer, "head.png")
    dst := sdl.Rect{100, 100, 50, 50}
    src := sdl.Rect{0, 0, 50, 50}

    if err != nil {
        panic(err)
    }

    timerTest := GameLogic.NewTimer(5000)
    exit := false
    var Events sdl.Event
    for !exit {
        game.Renderer.Clear()
        game.Renderer.Copy(texture, &src, &dst)
        game.Renderer.Present()
        Events = sdl.PollEvent()
        if Events != nil {
            fmt.Println()
        }
        //timerTest.Update()
        if timerTest.IsTimeOver() {
            exit = true
        }
    }
    sdl.Quit()
}

i te dziwne struktury

type Event interface{}

type CEvent struct {
	Type uint32
	_    [52]byte // padding
}

type CommonEvent struct {
	Type      uint32
	Timestamp uint32
}

// QuitEvent (https://wiki.libsdl.org/SDL_QuitEvent)
type QuitEvent struct {
	Type      uint32
	Timestamp uint32
}

type OSEvent struct {
	Type      uint32
	Timestamp uint32
}

type ClipboardEvent struct {
	Type      uint32
	Timestamp uint32
}

// UserEvent (https://wiki.libsdl.org/SDL_UserEvent)
type UserEvent struct {
	Type      uint32
	Timestamp uint32
	WindowID  uint32
	Code      int32
	Data1     unsafe.Pointer
	Data2     unsafe.Pointer
}

jest ich więcej, ale maksymalna długość zapytania to 15000 znaków.

komentarz zamknięcia: znalazłem odpowiedź

1 odpowiedź

0 głosów
odpowiedź 23 marca 2016 przez jegor377 Stary wyjadacz (13,230 p.)

dobra już mam. Należy zrobić asercje do typu.

for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
            switch t := event.(type) {
            case *sdl.QuitEvent:
                exit = true
                break
            case *sdl.MouseMotionEvent:
                fmt.Println(t.X, " ", t.Y)
                break
            }
        }

 

Podobne pytania

0 głosów
1 odpowiedź 646 wizyt
0 głosów
0 odpowiedzi 405 wizyt
pytanie zadane 16 września 2019 w Ogłoszenia, zlecenia przez mary.drozd Nowicjusz (140 p.)
+1 głos
0 odpowiedzi 136 wizyt
pytanie zadane 1 maja 2016 w JavaScript przez jegor377 Stary wyjadacz (13,230 p.)

92,762 zapytań

141,687 odpowiedzi

320,499 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...