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
Post a Comment