Pygame的直接对象'延伸'而不是移动

时间:2017-09-24 06:59:53

标签: python pygame

我目前正在使用pygame创建我的第一个Python游戏,现在遇到了令我感到困惑的东西,所以我将非常感谢你的帮助。

在目前的游戏状态中,屏幕上显示的是太空船在白色背景上的图像(gameDisplay.fill(白色)),只能上下移动,位于左侧的屏幕。当点击空格键时,太空船会射出两束激光束(或者基本上会产生两个从左到右移动的薄片,改变x位置但保持y位置,使得移动只是水平)。

我遇到的问题是,不是从左向右移动,而是看起来像是激光器。向右伸展,使得矩形的左侧靠近屏幕左侧的太空船图像,而右侧的右侧移动到屏幕的右侧。

如下图所示:

Laser stretching out

在解决了这个问题之后,我发现如果我使用图像作为背景而不是用白色填充背景,那么一切都可以正常工作。

在下面的图片中,您可以看到当我使用纯白色图片作为背景图片时的外观(使用bg = pygame.image.load(" img \ white_background.png"然后blitting它)在所有其他图纸之前的游戏循环中):

Laser working fine

我目前有4个组成游戏的文件:

1 main.py:

import time
import pygame
from first_game.game_loop import game_loop
from first_game.space_ship import space_ship

pygame.init()

display_width = 800
display_height = 600

colors = {
'black':(0, 0, 0),
'white':(255, 255, 255),
'red':(255, 0, 0)
}

gameDisplay = pygame.display.set_mode((display_width, display_height))

pygame.display.set_caption('First game')

clock = pygame.time.Clock()

gameDisplay.fill(colors['white'])

player = space_ship("img\\space_ship.png","player",103,103)

game_loop(gameDisplay,display_width,display_height,clock, player, bg)

2 game_loop.py:

import pygame
import first_game.methods

def game_loop(gameDisplay, display_width, display_height, clock, space_ship, bg):
    space_ship_x = (display_width * 0.05)
    space_ship_y = (display_height * 0.45)

    space_ship_y_change = 0

    both_laser_x = 0
    top_laser_y = 0
    bottom_laser_y = 0
    both_laser_width = 50
    both_laser_height = 5
    laser_speed = 15

    laser_adjustment_x = 70
    laser_adjustment_y = 18

    laser_fired = False

    while True:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_UP:
                    space_ship_y_change = -5

                if event.key == pygame.K_DOWN:
                    space_ship_y_change = 5

                if event.key == pygame.K_SPACE:
                    top_laser_y = space_ship_y + laser_adjustment_y
                    bottom_laser_y = space_ship_y + space_ship.height - laser_adjustment_y
                    both_laser_x = space_ship_x + space_ship.width - laser_adjustment_x
                    laser_fired = True

            if event.type == pygame.KEYUP:

                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    space_ship_y_change = 0

        if both_laser_x>display_width:
            laser_fired=False

        first_game.methods.space_ship(space_ship.img_location, space_ship_x, space_ship_y, gameDisplay)

        if laser_fired == True:
            first_game.methods.laser(gameDisplay,both_laser_x, top_laser_y,bottom_laser_y,both_laser_width,both_laser_height)
            both_laser_x += laser_speed

        if space_ship_y == -20:
            if space_ship_y_change<0:
                space_ship_y_change=0

        if space_ship_y+space_ship.height>=display_height+20:
            if space_ship_y_change>0:
                space_ship_y_change=0

        space_ship_y = space_ship_y + space_ship_y_change

        pygame.display.update()

        clock.tick(60)

3 methods.py:

def space_ship(space_ship_location, x, y, gameDisplay):
    space_ship_img = pygame.image.load(space_ship_location)
    gameDisplay.blit(space_ship_img, (x, y))

def laser(gameDisplay,x,y1,y2,w,h):
    pygame.draw.rect(gameDisplay, (255,0,0), [x, y1, w, h])
    pygame.draw.rect(gameDisplay, (255,0,0), [x, y2, w, h])

4 space_ship.py

class space_ship():
    def __init__(self,img_location, type, width, height):
        self.img_location = img_location
        self.type = type
        self.width = width
        self.height = height

0 个答案:

没有答案