pygame - How could my 'super jump' be implemented in a better way? -


i need have sprite 'super jump' if space bar held down. under these circumstances y velocity set -12.0 opposed -8.0 in regular jump (a tap of space bar).

the code i've written using 'pygame.key.set_repeat' works know there must superior method 1 i've arrived at? starters, have 2 nested 'if' statements :/

specific code blocks:

# player jump player_jumping = false jump_vel = 0.0 player_start_y = player.y  # set key repeat pygame.key.set_repeat(50, 0)  # high jump space_held = 0 super_jump = false  # event loop while true:     ticks = pygame.time.get_ticks() # n.o ms since pygame.init() called     event in pygame.event.get():         if event.type == quit:             pygame.quit()             sys.exit()         if event.type == keydown:             if event.key == k_space , space_held <2:                 space_held += 1                 if not player_jumping:                     player_jumping = true                     jump_vel = -8.0             elif event.key == k_space , space_held == 2:                 if player_jumping , not super_jump:                     jump_vel = -12.0                     super_jump = true         if event.type == keyup:             if event.key == k_space:                 space_held = 0                 super_jump = true  # player jumping?     if player_jumping:         player.y += jump_vel         jump_vel += 0.5         if player.y > player_start_y:             player_jumping = false             player.y = player_start_y             jump_vel = 0.0             super_jump = false             space_held = 0 

full working code:

import math import time import sys import random import pygame pygame.locals import *  class mysprite(pygame.sprite.sprite):     """my sprite"""     def __init__(self, target):         super(mysprite, self).__init__()         self.frame = 0         self.old_frame = -1         self.master_image = none         self.frame_width = 1         self.frame_height = 1         self.first_frame = 0         self.last_frame = 0         self.columns = 1         self.last_time = 0      # x property     def _getx(self): return self.rect.x     def _setx(self, value): self.rect.x = value     x = property(_getx, _setx)              # y property     def _gety(self): return self.rect.y     def _sety(self, value): self.rect.y = value     y = property(_gety, _sety)      # position property     def _getpos(self): return self.rect.topleft     def _setpos(self, pos): self.rect.topleft = pos     position = property(_getpos, _setpos)      def load(self, filename, width, height, columns):         self.master_image = pygame.image.load(filename).convert_alpha()         self.frame_width = width         self.frame_height = height         self.columns = columns         self.rect = rect(0,0, width, height)         # try auto-calc frames         rect = self.master_image.get_rect()         self.last_frame = (rect.height//height) * (rect.width/width) -1       def update(self, current_time, rate = 30):         if current_time > self.last_time + rate:             self.frame += 1             if self.frame > self.last_frame:                 self.frame = self.first_frame             self.last_time = current_time          # build current frame if changed         if self.frame != self.old_frame:             frame_x = (self.frame % self.columns) * self.frame_width             frame_y = (self.frame // self.columns) * self.frame_height             rect = rect(frame_x, frame_y, self.frame_width, self.frame_height)             self.image = self.master_image.subsurface(rect)             self.old_frame = self.frame      def __str__(self):         rep = str(self.frame) + ", " + str(self.first_frame) + ", " +\               str(self.last_frame) + ", " + str(self.frame_width) +\               ", " + str(self.frame_height) + ", " + str(self.columns) +\               ", " + str(self.rect)         return rep  def print_text(font, x, y, text, color = (255,255,255)):     textimage = font.render(text, true, color)     displaysurf.blit(textimage, (x,y))  def reset_arrow():     y = random.randint(250, 350)     arrow.position = (800, y)   pygame.init()  displaysurf = pygame.display.set_mode((800, 600)) pygame.display.set_caption("escape dragon") font = pygame.font.sysfont(none, 18) font1 = pygame.font.sysfont("trebuchet ms", 40) fps = 30 fpsclock = pygame.time.clock()  # load bitmaps background  = pygame.image.load("background.png").convert()  # create sprite group group = pygame.sprite.group()  # create dragon sprite dragon = mysprite(displaysurf) dragon.load("dragon.png", 260, 150, 3) dragon.position = (100, 230) group.add(dragon)  # create player sprite player = mysprite(displaysurf) player.load("caveman.png", 50, 64, 8) player.first_frame = 1 player.last_frame = 7 player.position = 400, 303 group.add(player)  # create arrow sprite arrow = mysprite(displaysurf) arrow.load("flame.png", 40, 16, 1) arrow.position = (800,320) group.add(arrow)  arrow_vel = 8.0 game_over = false you_win = false player_jumping = false jump_vel = 0.0 player_start_y = player.y score = 0  # set key repeat pygame.key.set_repeat(50, 0)  # high jump space_held = 0 super_jump = false  # event loop while true:     ticks = pygame.time.get_ticks() # n.o ms since pygame.init() called     event in pygame.event.get():         if event.type == quit:             pygame.quit()             sys.exit()         if event.type == keydown:             if event.key == k_space , space_held <2:                 space_held += 1                 if not player_jumping:                     player_jumping = true                     jump_vel = -8.0             elif event.key == k_space , space_held == 2:                 if player_jumping , not super_jump:                     jump_vel = -12.0                     super_jump = true         if event.type == keyup:             if event.key == k_space:                 space_held = 0                 super_jump = true      # keyboard polling     keys = pygame.key.get_pressed()     if keys[k_escape]:         pygame.quit()         sys.exit() ##    if keys[k_space]: ##        if not player_jumping: ##             ##            player_jumping  = true ##            jump_vel = -8.0      # update arrow     if not game_over:         arrow.x -= arrow_vel         if arrow.x < -40:             reset_arrow()      # did arrow hit player?     if pygame.sprite.collide_rect(arrow, player):         player.x -=10         reset_arrow()      # did arrow hit dragon?     if pygame.sprite.collide_rect(arrow, dragon):         dragon.x -= 10         reset_arrow()         score += 10      # did dragon eat player?     if pygame.sprite.collide_rect(player, dragon):         game_over = true      # dragon defeated?     if dragon.x < -100   :         game_over = true         you_win = true      # player jumping?     if player_jumping:         player.y += jump_vel         jump_vel += 0.5         if player.y > player_start_y:             player_jumping = false             player.y = player_start_y             jump_vel = 0.0             super_jump = false             space_held = 0      # draw background     displaysurf.blit(background, (0,0))      # update sprites     if not game_over:         group.update(ticks, 50)      # draw sprites     group.draw(displaysurf)      print_text(font1, 325, 0, "score: " + str(score))     print_text(font, 350, 560, "press space jump!")     if game_over:         score = 0         if you_win:             print_text(font, 330, 130, "you beat dragon!")         else:             print_text(font, 330, 130, "the dragon ate you!!!")        pygame.display.update()     fpsclock.tick(fps) 


Comments