У вас есть 2 функции main()
и game_over()
, каждая из которых имеет свой собственный цикл обработки событий и выполняет собственный рисунок.
Создайте 2 переменные состояния. Первое состояние (run
) указывает на необходимость продолжения или прекращения игры.
Второе состояние gameover
указывает, находится ли игра в состоянии «игра окончена» или «игра запущена».
В зависимости от состояния gameover
, либо main()
, либо game_over()
должны вызываться непрерывно в главном цикле. Обе функции могут изменять состояния и должны возвращать текущие значения переменных состояния. Если gameover
изменяется с True
на False
, переменные управления игрой должны быть установлены в их начальное состояние (конечно, вы можете написать функцию для этого и в своем коде): 110]
Функция завершения игры должна рисовать экран «окончена игра» и, конечно, pygame.display.update()
. Функция оценивает изменения состояния и возвращает значения:
def game_over():
screen.fill(LIGHTBLUE)
draw_text("GAME OVER", 48, WHITE, screen_width/2, screen_height/4)
draw_text("Score: " + str(score), 22, WHITE, screen_width / 2, screen_height / 3)
draw_text("Press SPACE to play again or ESC to exit", 22, WHITE, screen_width/2, screen_height / 4)
pygame.display.update()
fps_controller.tick(25)
rungame = True
continuegame = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
rungame = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
continuegame = True
if event.key == pygame.K_ESCAPE:
rungame = False
return rungame, not continuegame
Если змея сталкивается, то main
возвращает измененное состояние:
def main():
global update, direction, snake_pos, snake_speed, apple_spawn, apple_pos
pygame.time.delay(60)
rungame = True
for event in pygame.event.get():
if event.type == pygame.QUIT:
rungame = False
# [...]
collision = False
if snake_pos[0] < 0 or snake_pos[0] > screen_width-20:
collision = True
if snake_pos[1] < 0 or snake_pos[1] > screen_height-20:
collision = True
for block in snake_body[1:]:
if snake_pos[0] == block[0] and snake_pos[1] == block[1]:
collision = True
score(scoreval)
pygame.display.update()
fps_controller.tick(25)
return rungame, collision
Вы загружаете второй контроллер представления из NIB? Если так, Вы захотите проверить, что Вы освобождаете связанную память правильно.
Вот то, на что типичный основанный на NIB контроллер представления похож в моих проектах.
@interface SomeViewController : UIViewController {
UILabel *someLabel;
}
@property (nonatomic, retain) IBOutlet UILabel *someLabel;
@end
@implementation SomeViewController
@synthesize someLabel;
- (void)dealloc {
// Release our retained IBOutlets
self.someLabel = nil;
[super dealloc];
}
@end
Один способ уменьшить Ваше использование памяти состоял бы в том, чтобы изменить размер изображения к любому размеру, который Вы хотите (если, конечно, Вы не хотите 320x480 изображение). Это помогло много в моем случае.
Второй viewcontroller Вы говорите об изменении? В противном случае затем было бы лучше сделать это одиночным элементом и использовать тот же экземпляр. Вы можете любое время изменять значения, используемые viewcontroller. Эта статья объясняет, как можно создать одноэлементные объекты (с кодом)
Другая статья здесь показывает использование singleton-класса (хотя отличающийся от Вашего варианта использования, это разъяснит, как использовать одиночные элементы),
Я предложил бы создать одноэлементный объект для UIImagePickerController также.
У Вас есть какие-либо циклы в Вашей цепочке владения? Что-то как:
@interface FirstViewController: UIViewController {
SecondViewController *secondViewController;
}
@end
@interface SecondViewController: UIViewController {
FirstViewController *firstViewController;
}
@end
Если Вы явно не повредите этот цикл при отбрасывании этих контроллеров представления то они протекут.
Кроме того, я полагаю, что Вы ответственны за выпуск всех объектов верхнего уровня, которые загружаются из файла пера, когда Вам больше не нужны они.
Возможно, вы могли бы сохранить изображение перед переходом в информационное окно. После сохранения отпустите изображение и перейдите в информационное окно. Если пользователь вернется, загрузите изображение из папки.