2017-05-11 15 views
5

W wielu językach można zrobić coś jak następuje:Squeak Smalltalk: pętla Gra

while true: 
    handle events like keyboard input 
    update game world 
    draw screen 
    (optional: delay execution) 

natomiast jest to dalekie od optymalnego powinno wystarczyć do prostych gier.

Jak to zrobić w skrzypieniu Smalltalk?

Potrafię odczytać dane z klawiatury i reagować na nie zgodnie z opisem podanym na wiki.squeak.org. Ale jeśli próbuję wykonać coś

1 to: 10 do: [ :i | game updateAndDraw ] 

wszystkie zdarzenia są tylko kiedykolwiek obsługiwane po pętla została wykonana.

+0

Możesz sprawdzić przykłady gier zaimplementowanych w Morphic, na pewno znajdziesz ich kilka. Myślę, że zwykłym prostym sposobem jest posiadanie pojedynczej Morph dla gry, która przetwarza zdarzenia na klawiaturze (wprowadzanie zmian w modelu), a następnie #updateAndDraw przerysowuje jej podmorfomy, zgodnie z bieżącym stanem modelu (pozycje aktorzy, widoczne oznaki stanu i tak dalej). –

+0

Muszę mieć aktualizację gry nawet bez wprowadzania danych. Jak to zrobiłbyś w swoim podejściu? – Higemaru

Odpowiedz

5

Morphic zapewnia już tę główną pętlę. Jest w MorphicProject class>>spawnNewProcess:

uiProcess := [ 
    [ world doOneCycle. Processor yield ] repeat. 
] newProcess ... 

A jeśli kopać doOneCycle znajdziesz to

  • (opcjonalnie) ma opóźnienie (interCyclePause:)
  • sprawdza ekranie rozmiaru
  • przetwarza zdarzenia
  • procesy step metody
  • re-displa ys the world

Twój kod powinien zostać przechwycony w tych fazach poprzez dodanie procedur obsługi zdarzeń myszy/klawiatury, metody kroków do animacji i metody rysowania w celu ponownego wyświetlenia. Wszystkie te powinny być metodami we własnej metodzie gry. Możesz znaleźć przykłady w całym systemie.

+0

To wygląda obiecująco, dziękuję! – Higemaru

+0

Czy możesz wskazać mi jeden przykład? Nie jest dla mnie jasne, co się dzieje i które klasy mają podklasę. – Higemaru

0

Aby wykonać akcję ustaloną liczbę razy:

10 timesRepeat: [game updateAndDraw] 

Aby korzystać while semantyki:

i := 5 
[i > 0] whileTrue: [ 
    i printNl. 
    i := i - 1. 
] 

Aby utworzyć wieczną pętlę używać podczas semantykę,

[true] whileTrue: [something do] 
+0

Czy to w ogóle odpowiada na moje pytanie? – Higemaru

+0

Moje przeprosiny, może nie rozumiem dokładnie twojego problemu. –