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.