Именование, объявление и определение делегатов и [закрытых] конвенций событий

[...] пока вы удерживаете клавиши перемещения, 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
17
задан bdukes 25 March 2009 в 17:46
поделиться

2 ответа

Все у Вас есть довольно стандартные взгляды - единственная вещь, которую я изменил бы, - то, что имя события было бы 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();
}
15
ответ дан 30 November 2019 в 11:52
поделиться

MSDN при именовании событий:

События всегда относятся к некоторому действию, или то, которое происходит или тот, который произошел. Поэтому как с методами, события называют с глаголами, и время глагола используется для указывания времени, когда событие генерируется.

ДЕЙСТВИТЕЛЬНО назовите события с глаголом или глагольной группой.

В качестве примера можно привести 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;
21
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: