--- a/general.py +++ b/general.py @@ -29,12 +29,12 @@ fullname = name try: image = pygame.image.load(fullname) - except pygame.error, message: - print 'Cannot load image:', fullname - raise SystemExit, message + except pygame.error as message: + print('Cannot load image:', fullname) + raise SystemExit(message) image = image.convert_alpha() if colorkey is not None: - if colorkey is -1: + if colorkey == -1: colorkey = image.get_at((0,0)) image.set_colorkey(colorkey, RLEACCEL) return image, image.get_rect() --- a/menu.py +++ b/menu.py @@ -100,7 +100,7 @@ txt = Settings.menu_font.render(self.name, 1, (255,255,255)) rect = txt.get_rect() - rect.midtop = (w / 2, Settings.MENU_LINEFEED) + rect.midtop = (w // 2, Settings.MENU_LINEFEED) result.blit(txt, rect.topleft) n = self.items.__len__() @@ -198,7 +198,7 @@ txt = Settings.menu_font.render(self.name, 1, (255,255,255)) rect = txt.get_rect() - rect.midtop = (w / 2, Settings.MENU_LINEFEED) + rect.midtop = (w // 2, Settings.MENU_LINEFEED) result.blit(txt, rect.topleft) if self.val == 0: @@ -206,7 +206,7 @@ else: txt = Settings.menu_font.render("%d" %(self.val), 1, (255,255,255)) rect = txt.get_rect() - rect.midtop = (w / 2, 2.5 * Settings.MENU_LINEFEED) + rect.midtop = (w // 2, 2.5 * Settings.MENU_LINEFEED) result.blit(txt, rect.topleft) pygame.draw.rect(result, (0,0,200), pygame.Rect(0, 0, w, h), 1) @@ -233,21 +233,21 @@ txt = Settings.menu_font.render(self.txt1, 1, (255,255,255)) rect = txt.get_rect() - rect.midtop = (w / 2, Settings.MENU_LINEFEED) + rect.midtop = (w // 2, Settings.MENU_LINEFEED) result.blit(txt, rect.topleft) if self.txt2 != "": offset += Settings.MENU_LINEFEED txt = Settings.menu_font.render(self.txt2, 1, (255,255,255)) rect = txt.get_rect() - rect.midtop = (w / 2, Settings.MENU_LINEFEED + offset) + rect.midtop = (w // 2, Settings.MENU_LINEFEED + offset) result.blit(txt, rect.topleft) if self.txt3 != "": offset += Settings.MENU_LINEFEED txt = Settings.menu_font.render(self.txt3, 1, (255,255,255)) rect = txt.get_rect() - rect.midtop = (w / 2, Settings.MENU_LINEFEED + offset) + rect.midtop = (w // 2, Settings.MENU_LINEFEED + offset) result.blit(txt, rect.topleft) for i in range(0, 2): @@ -258,9 +258,9 @@ txt = Settings.menu_font.render(self.items[i][0], 1, color) rect = txt.get_rect() if i == 0: - rect.topright = (w / 2 - Settings.MENU_LINEFEED, 3 * Settings.MENU_LINEFEED + offset) + rect.topright = (w // 2 - Settings.MENU_LINEFEED, 3 * Settings.MENU_LINEFEED + offset) else: - rect.topleft = (w / 2 + Settings.MENU_LINEFEED, 3 * Settings.MENU_LINEFEED + offset) + rect.topleft = (w // 2 + Settings.MENU_LINEFEED, 3 * Settings.MENU_LINEFEED + offset) result.blit(txt, rect.topleft) pygame.draw.rect(result, (0,0,200), pygame.Rect(0, 0, w, h), 1) --- a/player.py +++ b/player.py @@ -203,11 +203,6 @@ # if img2 == 7: # f = f - 8.0 - print - print img1 - print img2 - print f - rect1 = pygame.Rect(img1 * 40, 0, 40, 33) rect2 = pygame.Rect(img2 * 40, 0, 40, 33) image1 = self.orig.subsurface(rect1) --- a/slingshot.py +++ b/slingshot.py @@ -30,9 +30,11 @@ import pygame from pygame.locals import * +import asyncio import math import os import sys +import time from random import randint from settings import * @@ -112,7 +114,6 @@ self.main_menu.add("New game") self.main_menu.add("Settings") self.main_menu.add("Help") - self.main_menu.add("Quit") self.confirm_menu1 = Confirm("Starting a new game", "will apply new settings", "and reset the scores") self.confirm_menu1.add("Yes") @@ -292,7 +293,7 @@ def create_particlesystem(self, pos, n, size): if Settings.PARTICLES: if Settings.BOUNCE: - nn = n / 2 + nn = n // 2 else: nn = n for i in range(nn): @@ -342,9 +343,9 @@ zoom_screen.blit(normal_screen, (200,150)) missilesprite = self.missile.get_image() - missilesprite = pygame.transform.scale(missilesprite, (missilesprite.get_size()[0] / 3, missilesprite.get_size()[1] / 3)) + missilesprite = pygame.transform.scale(missilesprite, (missilesprite.get_size()[0] // 3, missilesprite.get_size()[1] // 3)) pos = self.missile.get_pos() - pos = (200 + pos[0] / 4 - missilesprite.get_width() / 2, 150 + pos[1] / 4- missilesprite.get_height() / 2) + pos = (200 + pos[0] // 4 - missilesprite.get_width() // 2, 150 + pos[1] // 4- missilesprite.get_height() // 2) zoom_screen.blit(missilesprite, pos) pygame.draw.rect(zoom_screen, (255,255,255), pygame.Rect(0, 0, 600, 450), 1) @@ -403,7 +404,7 @@ tmp = tmp.convert_alpha() rect = tmp.get_rect() s = (100 - self.show_round) * rect.h / 15 - tmp = pygame.transform.scale(tmp, (rect.w / rect.h * s, s )) + tmp = pygame.transform.scale(tmp, (int(rect.w // rect.h * s), int(s))) rect = tmp.get_rect() rect.center = (399,299) self.screen.blit(tmp, rect.topleft) @@ -442,7 +443,7 @@ tmp = tmp.convert_alpha() rect = tmp.get_rect() s = (100 - self.show_round) * rect.h / 25 - tmp = pygame.transform.scale(tmp, (rect.w / rect.h * s, s )) + tmp = pygame.transform.scale(tmp, (int(rect.w // rect.h * s), int(s))) rect = tmp.get_rect() rect.center = (399,299) self.screen.blit(tmp, rect.topleft) @@ -709,9 +710,15 @@ pygame.draw.rect(self.end_round_msg, (150,150,150), self.end_round_msg.get_rect(), 1) - def run(self): + async def run(self): + next_frame = time.monotonic() while not self.q: - self.clock.tick(Settings.FPS) + # one frame every 1/FPS seconds, yielding to the browser in between + next_frame += 1.0 / Settings.FPS + now = time.monotonic() + if next_frame < now - 0.25: + next_frame = now + await asyncio.sleep(max(0.0, next_frame - now)) # print clock.get_fps() for event in pygame.event.get(): @@ -774,7 +781,7 @@ self.timeout = Settings.MAX_FLIGHT self.max_rounds = Settings.MAX_ROUNDS - path = os.path.expanduser("~") + "/.slingshot/settings" + path = settings_dir() + "/settings" if os.path.exists(path): f=open(path, 'r') @@ -805,11 +812,11 @@ f.close() def save_settings(self): - path = os.path.expanduser("~") + "/.slingshot" + path = settings_dir() if not os.path.exists(path): os.mkdir(path) path += "/settings" - f = file(path, 'wt') + f = open(path, 'wt') if self.bounce: f.write("Bounce: 1\n") else: @@ -836,17 +843,15 @@ f.close() +def settings_dir(): + if os.path.isdir("/saves"): + # on the web the page keeps the /saves folder in the browser + return "/saves" + return os.path.expanduser("~") + "/.slingshot" + + def main(): - - #sys.stdout = Blackhole() - #sys.stderr = Blackhole() - path = os.path.expanduser("~") + "/.slingshot" - if not os.path.exists(path): - os.mkdir(path) - path += "/logfile.txt" - sys.stderr = open(path,"w") - sys.stdout = sys.stderr game = Game() - game.run() + asyncio.run(game.run()) if __name__ == '__main__': main()