Ваш игрок начинает с направления в touchesBegan
и останавливает его на touchesEnded
. Проблема в том, что вы не обрабатываете изменения направления на touchesMoves
.
Давайте создадим глобальную переменную, которая сообщит нам, если мы изменили направление.
var previous_direction : Int = -1 // idle state
В функции касаний добавьте поведение previous_direction
.
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in (touches as! Set<UITouch>) {
// we start with previous_direction being the start direction
if upRect.contains(location) {
previous_direction = 0 // up
} else if rightRect.contains(location) {
previous_direction = 1 // right
} else if downRect.contains(location) {
previous_direction = 2 // down
} else if leftRect.contains(location) {
previous_direction = 3 // left
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in (touches as! Set<UITouch>) {
// we create a current_direction also
var current_direction : Int = -1
// get current_direction
if upRect.contains(location) {
current_direction = 0 // up
} else if rightRect.contains(location) {
current_direction = 1 // right
} else if downRect.contains(location) {
current_direction = 2 // down
} else if leftRect.contains(location) {
current_direction = 0 // left
}
// now we compare if the current_direction is different from previous_direction
if current_direction != previous_direction
{
player.removeAllActions()
// attribute new direction
if current_direction == 0 {
playerSprite.walkUpPlayer()
} else if current_direction == 1 {
walkLRPlayer.walkLRPlayer()
} else if current_direction == 2 {
walkLRPlayer.walkDownPlayer()
} else if current_direction == 3 {
walkLRPlayer.walkLRPlayer() }
// we prepare previous_direction for the next time he enters this function
previous_direction = current_direction
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// reset previous_direction
previous_direction = - 1 // idle state
}
Я еще не сделал этого, но я использовал inspectdb для генерации models.py файла от существующего DB, который делает точно, что - это - то, что inspectdb отбросил назад, таким образом, он должен работать:
creator = models.ForeignKey(Users, null=True, related_name='creator')
assignee = models.ForeignKey(Users, null=True, related_name='assignee')
Hope, которая работает на Вас - если это не, я собираюсь иметь проблему также.
Из сообщения об ошибке это кажется, что Вы пытаетесь поместить два внешних ключа в тот же объект на посреднической таблице, используемой через through
аргумент ManyToManyField
, документация для который состояния :
при установке посреднической модели Вы явно определяете внешние ключи к моделям, которые вовлечены в отношение ManyToMany. Это явное объявление определяет, как эти две модели связаны.
существует несколько ограничений на промежуточную модель:
- Ваша промежуточная модель должна содержать один - и только один - внешний ключ к целевой модели (это было бы Человеком в нашем примере). Если у Вас будет больше чем один внешний ключ, то ошибка проверки будет повышена.
- Ваша промежуточная модель должна содержать один - и только один - внешний ключ к исходной модели (это было бы Группой в нашем примере). Если у Вас будет больше чем один внешний ключ, то ошибка проверки будет повышена.
Я думаю, что Вы ищете, related_name свойство на ForeignKeyFields. Это позволит Вам ссылаться на ту же таблицу, но давать django специальные названия отношений.
[еще 117] Информация:
То, что два столбца являются частью одной таблицы, подразумевает, что эти два поля связаны, для этого для ссылки на них индивидуально не идеально. ForeignKey Вашей модели должен быть первичным ключом таблицы, на которую Вы ссылаетесь:
event = models.ForeignKey('event')
Вы тогда сослались бы на столбцы как таковые:
foo.event.actor
foo.event.receiver
, При необходимости Вы могли бы также изменить путь Ваш класс/ссылки на модель внешние атрибуты со свойствами. В Вашем классе Вы сделали бы следующее:
@property
def actor(self):
return self.event.actor
@property
def receiver(self):
return self.event.receiver
Это позволило бы Вам тогда называть foo.actor и foo.receiver, но я верю дольше, foo.event.actor был бы большим количеством pythonic