使程序同时执行两项操作并命令崩溃游戏

时间:2014-12-15 23:34:30

标签: python-2.7 pygame

我正在尝试使用python 2.7创建“重力”的替代方法。我需要游戏将球的x位置向右移动25个像素,将球的y位置向上移动25个像素。所以这是我目前的一个程序:

    def jump(self):
        false = 0
        global false
        while self.rect.top < 750 and false == 0:
            self.rect.top += 50
            self.rect.left += 50
        while self.rect.top <= 750:
            false = 1
            self.rect.top -= 50
            self.rect.left += 50

首先,如何让程序同时执行第5行,第6/9行和第10行?我的下一个问题需要这个源代码:

import pygame, sys
import time
pygame.init()
screen = pygame.display.set_mode([1500,750])
background = pygame.Surface(screen.get_size())
background.fill([255, 255, 255])


class Attacker(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

    def jump(self):
        false = 0
        global false
        while self.rect.top < 750 and false == 0:
            self.rect.top += 50
            self.rect.left += 50
        while self.rect.top <= 750:
            false = 1
            self.rect.top -= 50
            self.rect.left += 50

my_ball = Attacker('wackyball.bmp', [300, 300])

running = True
while running:
    screen.fill([255, 255, 255])
    screen.blit(my_ball.image, my_ball.rect)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP:
            my_ball.rect.top = my_ball.rect.top - 200
        elif event.key == pygame.K_DOWN:
            my_ball.rect.top = my_ball.rect.top + 125
        elif event.key == pygame.K_RIGHT:
            my_ball.rect.left += 175
        elif event.key == pygame.K_LEFT:
            my_ball.rect.left -= 125
        elif event.key == pygame.K_SPACE:
            my_ball.jump()




screen.blit(background, (0, 0))
screen.blit(my_ball.image, my_ball.rect)
pygame.display.flip()
pygame.quit()

当我按下空格键以便我的家伙“跳”(跳跃功能)时,我的游戏崩溃了。为什么会这样?

1 个答案:

答案 0 :(得分:1)

你的游戏崩溃了,因为它进入了while循环并且没有返回。(在第二个while循环中)

如果你想模拟重力,你需要每帧移动一点点,你做的方式你会一直向上移动,然后在一个帧中一直向下移动,这意味着它赢了# 39; t似乎移动了。

这里有一些可能对你有帮助的想法。

import pygame, sys
import time
pygame.init()
screen = pygame.display.set_mode([1500,750])
background = pygame.Surface(screen.get_size())
background.fill([255, 255, 255])

class Attacker(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.x_pos, self.y_pos = location
        self.rect.x, self.rect.y = location
        self.jumping = False
        self.falling = False
        self.direction = 1

    def jump(self):
        if self.y_pos > CEILING:
            self.x_pos += 1*self.direction
            self.y_pos -= 5
        else:
            self.jumping = False
            self.falling = True

        self.update_pos()

    def fall(self):
        if self.y_pos < FLOOR:
            self.x_pos += 1*self.direction
            self.y_pos += 5
        else:
            self.falling = False

        self.update_pos()

    def update_pos(self):
        self.rect.x = self.x_pos
        self.rect.y = self.y_pos

FLOOR = 700
CEILING = 300

my_ball = Attacker('wackyball.bmp',[300, FLOOR])


running = True
while running:
    if my_ball.jumping:
        my_ball.jump()
    if my_ball.falling:
        my_ball.fall()

    screen.blit(my_ball.image, my_ball.rect)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                my_ball.y_pos -= 5
            elif event.key == pygame.K_DOWN:
                my_ball.y_pos += 5
            elif event.key == pygame.K_RIGHT:
                my_ball.direction = 1
                my_ball.x_pos += 5
            elif event.key == pygame.K_LEFT:
                my_ball.direction = -1
                my_ball.x_pos -= 5
            elif event.key == pygame.K_SPACE:
                if not my_ball.falling:
                    my_ball.jumping = True
            my_ball.update_pos()
    screen.blit(background, (0, 0))
    screen.blit(my_ball.image, my_ball.rect)
    pygame.display.flip()

pygame.quit()