• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
362 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ź 827 wizyt
0 głosów
0 odpowiedzi 430 wizyt
pytanie zadane 16 września 2019 w Ogłoszenia, zlecenia przez mary.drozd Nowicjusz (140 p.)
+1 głos
0 odpowiedzi 190 wizyt
pytanie zadane 1 maja 2016 w JavaScript przez jegor377 Stary wyjadacz (13,230 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,654 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...