• 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

0 głosów
429 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ź 895 wizyt
0 głosów
0 odpowiedzi 473 wizyt
pytanie zadane 16 września 2019 w Ogłoszenia, zlecenia przez mary.drozd Nowicjusz (140 p.)
+1 głos
0 odpowiedzi 253 wizyt
pytanie zadane 1 maja 2016 w JavaScript przez jegor377 Stary wyjadacz (13,230 p.)

93,667 zapytań

142,586 odpowiedzi

323,125 komentarzy

63,190 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...