Python 如何在pygame中拍摄角色?

Python 如何在pygame中拍摄角色?,python,pygame,Python,Pygame,我正在尝试创建一个游戏,在这个游戏中,我的X翼机射杀了战机。当我按下空格键时,我无法使拍摄图像从xwing中显示出来。我知道以前有人问过这个问题,但我就是不明白。我对python和pygame有点陌生。谢谢 import sys import random import pygame as pg pg.init() screen = pg.display.set_mode((1280, 800)) display_width = 1280 display_height= 800 black

我正在尝试创建一个游戏,在这个游戏中,我的X翼机射杀了战机。当我按下空格键时,我无法使拍摄图像从xwing中显示出来。我知道以前有人问过这个问题,但我就是不明白。我对python和pygame有点陌生。谢谢

import sys
import random
import pygame as pg


pg.init()
screen = pg.display.set_mode((1280, 800))
display_width = 1280
display_height= 800

black= (0,0,0)
white= (255,255,255)
red = (255,0,0)
blue_violet = (138,43,226)

bullets= []

xwingImg = pg.image.load('X-Wing.bmp').convert()
tieImg= pg.image.load('tiefighter.png').convert()
space=pg.image.load('space.jpg').convert()
xbullet = pg.image.load('bullet.png').convert()

BG_image = pg.image.load('space.jpg').convert()

def rot_center(image, angle):
    """rotate a Surface, maintaining position."""
    loc = image.get_rect().center  #rot_image is not defined 
    rot_sprite = pg.transform.rotate(image, angle)
    rot_sprite.get_rect().center = loc
    return rot_sprite

    # or return tuple: (Surface, Rect)
        # return rot_sprite, rot_sprite.get_rect()

def main():
    clock = pg.time.Clock()
    # Surfaces/images have a `get_rect` method which 
    # returns a rect with the dimensions of the image.
    player_rect = xwingImg.get_rect()
    player_rect.center = ( 640,400 )
    change_x = 0
    change_y = 0
    enemies = []
    spawn_counter = 30


    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            if event.type == space:
                shot.play()
            for b in range(len(bullets)) :
                bullets [b] [0] -=10
            for bullet in bullets:
                if bullet [0] <0:
                    bullet.remove(bullet) 
                bullets.append ([event.pos[0], 500])

            if event.type == pg.KEYDOWN:
                if event.key == pg.K_d:
                    change_x = 5
                if event.key == pg.K_w:
                    change_y = -5
                if event.key == pg.K_s:
                    change_y= 5
                if event.key == pg.K_a:
                    change_x = -5
            if event.type == pg.KEYUP:
                if event.key == pg.K_d and change_x > 0:
                    change_x = 0
                if event.key == pg.K_a and change_x < 0:
                    change_x = 0
                if event.key == pg.K_w and change_y<0:
                    change_y=0
                if event.key == pg.K_s and change_y>0:
                    change_y=0



        # Spawn enemies if counter <= 0 then reset it.
        spawn_counter -= 1
        if spawn_counter <= 0:
            # Append an enemy rect. You can pass the position directly as an argument.
            enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -800 )))
            spawn_counter =  30


        # Update player_rect and enemies.
        player_rect.x += change_x
        player_rect.y += change_y
        for enemy_rect in enemies:
            enemy_rect.y += 5
            # Collision detection with pygame.Rect.colliderect.
            if player_rect.colliderect(enemy_rect):
                done = True

        # Draw everything.
        screen.blit(BG_image, (0,0))
        for bullet in bullets:
            screen.blit(xbullet, pg.Rect (bullet[0], bullet [1], 0, 0))

        for enemy_rect in enemies:
            screen.blit(tieImg, enemy_rect)
        screen.blit(xwingImg, player_rect)
        if player_rect.x >display_width:
            player_rect.x = 0
        if player_rect.x < 0:
            player_rect.x= 1280
        if player_rect.y>display_height:
            player_rect.y = 0
        if player_rect.y < 0:
            player_rect.y= 800


        pg.display.flip()
        clock.tick(40)


if __name__ == '__main__':
    main()
    pg.quit()
    sys.exit()
导入系统 随机输入 导入pygame作为pg 第init页() 屏幕=pg.display.set_模式((1280800)) 显示宽度=1280 显示高度=800 黑色=(0,0,0) 白色=(255255) 红色=(255,0,0) 蓝紫=(138,43226) 项目符号=[] xwingImg=pg.image.load('X-Wing.bmp').convert() tieImg=pg.image.load('tiefighter.png').convert() space=pg.image.load('space.jpg').convert() xbullet=pg.image.load('bullet.png').convert() BG_image=pg.image.load('space.jpg').convert() def旋转中心(图像、角度): “”“旋转曲面,保持位置。”“” loc=image.get_rect()。未定义中心#rot_图像 旋转精灵=pg.transform.rotate(图像、角度) rot_sprite.get_rect().center=loc 返回腐烂精灵 #或返回元组:(Surface,Rect) #返回rot_sprite,rot_sprite.get_rect() def main(): 时钟=pg.time.clock() #曲面/图像具有“get_rect”方法,该方法 #返回一个包含图像尺寸的矩形。 player_rect=xwingImg.get_rect() 玩家右中锋=(640400) 改变x=0 改变y=0 敌人=[] 产卵计数器=30 完成=错误 虽然没有这样做: 对于pg.event.get()中的事件: 如果event.type==pg.QUIT: 完成=正确 如果event.type==空格: shot.play() 对于射程内的b(镜头(子弹)): 项目符号[b][0]-=10 对于子弹中的子弹: 如果项目符号[0]0: 改变x=0 如果event.key==pg.K_a且change_x<0: 改变x=0 如果event.key==pg.K_w并更改_y0: 改变y=0 #如果计数器显示高度,则繁殖敌人: 游戏者右y=0 如果玩家右y<0: 游戏者右y=800 pg.display.flip() 时钟滴答(40) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main() 第页退出 sys.exit() 您正在测试此功能

if event.type == space:
但是

因此,
事件.type
将永远不会与之匹配

你需要这样的东西:

if event.type == pg.KEYUP:
    if event.key == pg.K_SPACE:
就像你在测试其他钥匙一样


你的下一个问题是你没有在任何地方分配
快照
我认为最好使用和精灵组,而不是矩形列表。(第12章解释了类是如何工作的。)要用rect拍摄东西,你需要自己多做一些

首先按空格键发射单子弹矩形(将其附加到
子弹列表中)。将以下三行添加到事件循环中:

if event.type == pg.KEYDOWN:
    if event.key == pg.K_SPACE:
        bullets.append(xbullet.get_rect(center=player_rect.midtop))
移动while循环中的项目符号:

for bullet in bullets:
    bullet.y -= 4
并提醒他们:

for bullet in bullets:
    screen.blit(xbullet, bullet)
现在是困难的部分。我们必须检查哪个敌人与子弹相撞,然后过滤
敌人
列表,以便它只包含幸存的敌人

# We'll use the hit_enemies list to check which enemy has survived.
hit_enemies = []
for enemy_rect in enemies:
    enemy_rect.y += 5
    # Collision detection with player.
    if player_rect.colliderect(enemy_rect):
        done = True
    # Collision detection with bullets.
    for bullet in bullets:
        if bullet.colliderect(enemy_rect):
            hit_enemies.append(enemy_rect)

# Filter the destroyed enemies out. We create a new list and
# append the surviving enemies to it.
survivors = []
for enemy in enemies:
    if enemy not in hit_enemies:
        survivors.append(enemy)
enemies = survivors  # Now `enemies` is the list of survivors.
# You can also do it in one line with a list comprehension.
# enemies = [enemy for enemy in enemies if enemy not in hit_enemies]
您必须对子弹执行相同的操作才能移除它们。此外,如果敌人和子弹离开屏幕,它们应该被过滤掉,否则列表会一直增长

以下是完整的示例:

import sys
import random
import pygame as pg


pg.init()
screen = pg.display.set_mode((1280, 800))
display_width = 1280
display_height = 800

xwingImg = pg.image.load('X-Wing.bmp').convert()
tieImg= pg.image.load('tiefighter.png').convert()
space=pg.image.load('space.jpg').convert()
xbullet = pg.image.load('bullet.png').convert()
BG_image = pg.image.load('space.jpg').convert()


def main():
    clock = pg.time.Clock()
    player_rect = xwingImg.get_rect()
    player_rect.center = (640, 400)
    change_x = 0
    change_y = 0
    enemies = []
    bullets = []
    spawn_counter = 30

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_SPACE:
                    bullets.append(xbullet.get_rect(center=player_rect.midtop))
                if event.key == pg.K_d:
                    change_x = 5
                if event.key == pg.K_w:
                    change_y = -5
                if event.key == pg.K_s:
                    change_y= 5
                if event.key == pg.K_a:
                    change_x = -5
            if event.type == pg.KEYUP:
                if event.key == pg.K_d and change_x > 0:
                    change_x = 0
                if event.key == pg.K_a and change_x < 0:
                    change_x = 0
                if event.key == pg.K_w and change_y<0:
                    change_y=0
                if event.key == pg.K_s and change_y>0:
                    change_y=0

        # Spawn enemies if counter <= 0 then reset it.
        spawn_counter -= 1
        if spawn_counter <= 0:
            # Append an enemy rect. You can pass the position directly as an argument.
            enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -100)))
            spawn_counter =  30

        # Update player_rect.
        player_rect.x += change_x
        player_rect.y += change_y

        # Update bullets.
        for bullet in bullets:
            bullet.y -= 4

        # Detect collisions and move the enemies.
        hit_enemies = []
        for enemy_rect in enemies:
            enemy_rect.y += 5
            # Collision detection with pygame.Rect.colliderect.
            if player_rect.colliderect(enemy_rect):
                done = True
            # Collision detection with bullets.
            for bullet in bullets:
                if bullet.colliderect(enemy_rect):
                    hit_enemies.append(enemy_rect)

        # Filter the destroyed enemies out.
        survivors = []
        for enemy in enemies:
            if enemy not in hit_enemies:
                survivors.append(enemy)
        enemies = survivors  # Now `enemies` is the list of survivors.

        # Draw everything.
        screen.blit(BG_image, (0,0))
        for bullet in bullets:
            screen.blit(xbullet, bullet)

        for enemy_rect in enemies:
            screen.blit(tieImg, enemy_rect)
        screen.blit(xwingImg, player_rect)
        if player_rect.x >display_width:
            player_rect.x = 0
        if player_rect.x < 0:
            player_rect.x= 1280
        if player_rect.y>display_height:
            player_rect.y = 0
        if player_rect.y < 0:
            player_rect.y= 800

        pg.display.flip()
        clock.tick(40)


if __name__ == '__main__':
    main()
    pg.quit()
    sys.exit()
导入系统 随机输入 导入pygame作为pg 第init页() 屏幕=pg.display.set_模式((1280800)) 显示宽度=1280 显示高度=800 xwingImg=pg.image.load('X-Wing.bmp').convert() tieImg=pg.image.load('tiefighter.png').convert() space=pg.image.load('space.jpg').convert() xbullet=pg.image.load('bullet.png').convert() BG_image=pg.image.load('space.jpg').convert() def main(): 时钟=pg.time.clock() player_rect=xwingImg.get_rect() 玩家右中锋=(640400) 改变x=0 改变y=0 敌人=[] 项目符号=[] 产卵计数器=30 完成=错误 虽然没有这样做: 对于pg.event.get()中的事件: 如果event.type==pg.QUIT: 完成=正确 如果event.type==pg.KEYDOWN: 如果event.key==pg.K_空格: bullets.append(xbullet.get_rect(center=player_rect.midtop)) 如果event.key==pg.K\u d: 变化x=5 如果event.key==pg.K_w: 改变y=-5 如果event.key==pg.K_s: 改变y=5 如果event.key==pg.K_a: 变化x=-5 如果event.type==pg.KEYUP: 如果event.key==pg.K_d且change_x>0: 改变x=0 如果event.key==pg.K_a且change_x<0: 改变x=0 如果event.key==pg.K_w并更改_y0: 改变y=0 #如果计数器显示高度,则繁殖敌人: 游戏者右y=0 如果玩家右y<0: 游戏者右y=800 pg.display.flip() 时钟滴答(40) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main() 第页退出 sys.exit()
我做到了这一点,但我对python和pygame非常陌生。我不知道该怎么办。你能给我举个例子说明怎么做吗?
import sys
import random
import pygame as pg


pg.init()
screen = pg.display.set_mode((1280, 800))
display_width = 1280
display_height = 800

xwingImg = pg.image.load('X-Wing.bmp').convert()
tieImg= pg.image.load('tiefighter.png').convert()
space=pg.image.load('space.jpg').convert()
xbullet = pg.image.load('bullet.png').convert()
BG_image = pg.image.load('space.jpg').convert()


def main():
    clock = pg.time.Clock()
    player_rect = xwingImg.get_rect()
    player_rect.center = (640, 400)
    change_x = 0
    change_y = 0
    enemies = []
    bullets = []
    spawn_counter = 30

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_SPACE:
                    bullets.append(xbullet.get_rect(center=player_rect.midtop))
                if event.key == pg.K_d:
                    change_x = 5
                if event.key == pg.K_w:
                    change_y = -5
                if event.key == pg.K_s:
                    change_y= 5
                if event.key == pg.K_a:
                    change_x = -5
            if event.type == pg.KEYUP:
                if event.key == pg.K_d and change_x > 0:
                    change_x = 0
                if event.key == pg.K_a and change_x < 0:
                    change_x = 0
                if event.key == pg.K_w and change_y<0:
                    change_y=0
                if event.key == pg.K_s and change_y>0:
                    change_y=0

        # Spawn enemies if counter <= 0 then reset it.
        spawn_counter -= 1
        if spawn_counter <= 0:
            # Append an enemy rect. You can pass the position directly as an argument.
            enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -100)))
            spawn_counter =  30

        # Update player_rect.
        player_rect.x += change_x
        player_rect.y += change_y

        # Update bullets.
        for bullet in bullets:
            bullet.y -= 4

        # Detect collisions and move the enemies.
        hit_enemies = []
        for enemy_rect in enemies:
            enemy_rect.y += 5
            # Collision detection with pygame.Rect.colliderect.
            if player_rect.colliderect(enemy_rect):
                done = True
            # Collision detection with bullets.
            for bullet in bullets:
                if bullet.colliderect(enemy_rect):
                    hit_enemies.append(enemy_rect)

        # Filter the destroyed enemies out.
        survivors = []
        for enemy in enemies:
            if enemy not in hit_enemies:
                survivors.append(enemy)
        enemies = survivors  # Now `enemies` is the list of survivors.

        # Draw everything.
        screen.blit(BG_image, (0,0))
        for bullet in bullets:
            screen.blit(xbullet, bullet)

        for enemy_rect in enemies:
            screen.blit(tieImg, enemy_rect)
        screen.blit(xwingImg, player_rect)
        if player_rect.x >display_width:
            player_rect.x = 0
        if player_rect.x < 0:
            player_rect.x= 1280
        if player_rect.y>display_height:
            player_rect.y = 0
        if player_rect.y < 0:
            player_rect.y= 800

        pg.display.flip()
        clock.tick(40)


if __name__ == '__main__':
    main()
    pg.quit()
    sys.exit()