вторник, 14 августа 2018 г.

IDDQD

    Сделал еще один маленький пример, на этот раз вроде даже понятно, зачем такое нужно, в отличии от предыдущего, про который я до сих пор понять не могу, нафига я его делал. Как понятно из названия, пример читов, точнее изменения какого-либо проперти в зависимости от последовательности нажатых клавиш. Как оно работает: у объекта, должного реагировать на читы, есть строка, в конец которой при нажатии на клавишу добавляется буква, соответствующая нажатой клавише, то есть, нажали "W", значит добавляется "W". А дальше идет поиск вхождения имени специального проперти в эту строку, правда специальность эта отмечена символом, указывающим тип проперти, которое при поиске вхождения опускается. Объясняю, имя проперти-читов начинается с "_" или "$", например _IDDT или &MONEY. Первое булевое и при обнаружение последовательности "IDDT" значение проперти "_IDDT" будет изменено на TRUE. Практически так же будет вести себя и $MONEY, с той лишь разницей, что к её значению будет добавлено +100. Ну и после обнаружения последовательности строка нажатых клавиш создается заново , чтобы избежать повторного срабатывания чита. Ниже КДПВ, код и ссылка на пример:

                                                           


import bge


def findCheats(obj, char):
    """
    Функция ищет в списке нажатых клавиш подстроку, совпадающую
    с именем проперти объекта, которое начинается символом "_" и
    если находит, меняет его значение на истинное
    """
    
    # добавляем полученный символ к списку нажатых клавиш
    obj['keyList'] = obj['keyList'] + char
    # если длинна строки больше, чем нам хочется
    if len(obj['keyList']) > 10:
        # то убираем из строки первый символ
        obj['keyList'] = obj['keyList'][1:]
    # получаем список имен свойств объекта
    propertyNames = obj.getPropertyNames() 
    # и проходим его циклом 
    for propName in propertyNames:
        # если первый символ имени проперти - "_"
        if propName[0] == '_':
            # то это имя булевого чита, соответственно, если это
            # имя находится в списке нажатых клавиш (естественно
            # без символа "_")
            if obj['keyList'].find(propName[1:]) != -1:
                # то делаем его равным Истине
                obj[propName] = True
                # и сбрасываем список клавиш до первоначального состояния
                obj['keyList'] = 'B' * 10
        if propName[0] == '$':
            # то это имя целочисленного чита, дальше аналогично
            if obj['keyList'].find(propName[1:]) != -1:
                # то добавляем какое-то нужное нам значение
                obj[propName] = obj[propName] + 100
                # и сбрасываем список клавиш до первоначального состояния
                obj['keyList'] = 'B' * 10
                         
    return 0   



def main():
    # контроллер, на котором запущен скрипт
    cont = bge.logic.getCurrentController()
    # объект, которому принадлежит контроллер
    own = cont.owner
    # присоединенный сенсор клавиатуры
    keyboard = cont.sensors['Keyboard']
    if keyboard.positive:
        # проверяем, есть ли у объекта проперти со списком нажатых
        # клавиш, правда сделано оно в виде строки, и если нет, то
        # добавляем и инициализируем буквой, которой не должно быть 
        # в читах       
        if not 'keyList' in own:
            own['keyList'] = 'B'*10 
        # циклом извлекаем код клавиши и состояние - нажата, или отпущена               
        for key, status in keyboard.events:
            # если клавиша только-только нажата
            if status == bge.logic.KX_INPUT_JUST_ACTIVATED:
                # вызываем функцию поиска чита и передаем ей объект и
                # символ нажатой кнопки в виде строки из одного символа
                findCheats(own, bge.events.EventToCharacter(key, True))
    return 0
                
main()  

Ссылка:

Управление: стучать по клавишам, время от времени пытаясь, набрать чит-код. Список чит-кодов: IDDQD, IDKFA, IDDT, IDCLIP, MONEY.

Комментариев нет:

Отправить комментарий