Сделал еще один маленький пример, на этот раз вроде даже понятно, зачем такое нужно, в отличии от предыдущего, про который я до сих пор понять не могу, нафига я его делал. Как понятно из названия, пример читов, точнее изменения какого-либо проперти в зависимости от последовательности нажатых клавиш. Как оно работает: у объекта, должного реагировать на читы, есть строка, в конец которой при нажатии на клавишу добавляется буква, соответствующая нажатой клавише, то есть, нажали "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.
Комментариев нет:
Отправить комментарий