[...] пока вы удерживаете клавиши перемещения, pygame не может проверить координаты x и y вашего игрока, [...]
blockquote>Нет.
Пока вы удерживаете клавиши перемещения, никаких событий не происходит. Существует одно событие
pygame.KEYDOWN
, когда клавиша нажата, и одно событиеpygame.KEYUP
, когда клавиша отпущена.
Но нет непрерывных событий, когда клавиша нажата.Идеально подходит для получения нажатой клавиши в цикле событий с помощью (
pygame.key.get_pressed()
) и для изменения состояния управляющих переменныхmovingUP
,movingDOWN
, [116 ]movingRIGHT
. Значения, возвращаемыеpygame.key.get_pressed()
, обновляются, когда событие обрабатываетсяpygame.event.get()
.Но проверка границ должна выполняться в каждом кадре, каждый раз, когда позиция (
x
,y
) была изменена. Это должно быть сделано в основном игровом цикле, а не в цикле событий:maxX = # screenWidth - playerWidth maxY = # screenHeight - playerHeight while loop: if eventHandler == "LEVEL1": # SEE IF PLAYER QUIT AND PROCEED TO QUIT for event in pygame.event.get(): if event.type == pygame.QUIT: loop = False if event.type == pygame.KEYDOWN: keys = pygame.key.get_pressed() if keys[pygame.K_UP]: movingUP = True # [...] if movingUP == True: y_change -= 5 # [...] x += x_change y += y_change if x < 0: x = 0 x_change = 0 elif x > maxX x = maxX x_change = 0 if y < 0: y = 0 y_change = 0 elif y > maxY y = maxY y_change = 0
Все у Вас есть довольно стандартные взгляды - единственная вещь, которую я изменил бы, - то, что имя события было бы Something
вместо onSomething
. В соответствии с конвенцией Microsofts Вы закончили бы с чем-то больше как это:
delegate void SomethingHandler();
event SomethingHandler Something;
protected void OnSomething()
{
if (this.Something != null)
this.Something();
}
И как прохладный прием можно добавить пустого делегата в Вашем Something
событие так, чтобы Вы не проверяли событие на пустой указатель перед повышением его:
delegate void SomethingHandler();
event SomethingHandler Something = delegate {};
protected void OnSomething()
{
this.Something();
}
События всегда относятся к некоторому действию, или то, которое происходит или тот, который произошел. Поэтому как с методами, события называют с глаголами, и время глагола используется для указывания времени, когда событие генерируется.
√ ДЕЙСТВИТЕЛЬНО назовите события с глаголом или глагольной группой.
В качестве примера можно привести
Clicked
,Painting
,DroppedDown
, и так далее.√ ДЕЙСТВИТЕЛЬНО дайте имена событий с понятием того, прежде чем и после, с помощью настоящего и прошлого напряжется.
Например, близкое событие, которое генерируется перед окном, закрывается, был бы назван
Closing
, и тот, который повышен после окна, закрывается, был бы названClosed
.X НЕ используют "Прежде" или "После" префиксов или постфиксов для указания пред - и постсобытия. Настоящее и прошлое использования напрягается, как просто описано.
√ ДЕЙСТВИТЕЛЬНО назовите обработчики событий (делегаты используемый в качестве типов событий) с суффиксом "EventHandler", как показано в следующем примере:
public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);
√ ДЕЙСТВИТЕЛЬНО используйте два параметра, названные отправителем и e в обработчиках событий.
Параметр отправителя представляет объект, который сгенерировал событие. Параметр отправителя обычно имеет тип
object
, даже если возможно использовать более определенный тип.√ ДЕЙСТВИТЕЛЬНО назовите классы аргумента события с суффиксом "EventArgs".
Так, события нужно назвать с глагольной или глагольной группой. Вместо OnSomething
, использовать Something
, принятие этого Something
на самом деле глагол, как Close
, Click
, или ManagedPiplelineAbandoning
и ManagedPiplelineAbandoned
.
Делегата к событию нужно назвать с EventHandler
суффикс, давая CloseEventHandler
, ClickEventHandler
, ManagedPiplelineAbandoningHandler
, и т.д.
Для делегатов, которые не связаны с событием, используйте существительное, как EventProcessor
или ItemRetriever
, в то время как экземпляр того делегата является глаголом, как processEvent
или retrieveItem
.
Преобразование регистра Вашей ссылки делегата должно быть верблюдом, если ссылка не является частной. Я не могу думать о случае, где у Вас было бы нечастное поле делегата, все же.
Однако, так как предлагается использовать стандартную подпись обработчика событий (т.е. object sender, EventArgs e)
), необходимо использовать универсальный обработчик событий вместо того, чтобы определить собственное. Таким образом, Ваше событие было бы определено как что-то вроде этого:
event EventHandler<SomethingEventArgs> Something;