如何在 pygame 中添加敌人?

我正在用 pygame 制作一个简单的游戏,目标是躲避来袭的敌人。我想要一个领带战士的形象随机下降,xwing 必须躲避他们,否则你会死。我如何在我的脚本中实现随机平局战士?在我的代码中,我收到一个错误,指出 x 未定义。

import pygame
import time
import random
pygame.init()

display_width = 1280
display_height= 800


pygame.display.set_mode((display_width, display_height), pygame.FULLSCREEN)

gameDisplay= pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('X-Wing Game')
clock= pygame.time.Clock()

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


xwing_width = 65
xwing_height = 130

tie_width = 80
tie_height =64

#images
xwingImg = pygame.image.load('X-Wing.bmp')
tieImg= pygame.image.load('tiefighter.png')

def things(thingx, thingy, thingw, thingh, color):
    pygame.draw.rect(gameDisplay, color, [thingx, thingy, thingw, thingh])
    gameDisplay.blit(tieImg,(x,y))

def tieImg (x,y):
    pygame.image.load('tieImg')


def xwing (x,y):
    gameDisplay.blit (xwingImg,(x,y))

def text_objects(text, font):
    textSurface = font.render(text, True, red)
    return textSurface, textSurface.get_rect()

def crash ():
    message_display ('Ouch, You Crashed!')

def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf',25)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width/2), (display_height/2))
    gameDisplay.blit(TextSurf, TextRect)

    pygame.display.update()

    time.sleep(1.3)

    game_loop()


def game_loop():

    x = (display_width * 0.45)
    y = (display_height * .75)

    x_change = 0
    y_change = 0

    thing_startx = random.randrange(0, display_width)
    thing_starty = -600
    thing_speed = 7
    thing_width = 81
    thing_height =65


    gameEXIT = False

    while not gameEXIT:

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

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x_change = -5
                if event.key == pygame.K_UP:
                     y_change= -5
                if event.key == pygame.K_DOWN:
                    y_change =5
                elif event.key == pygame.K_RIGHT:
                    x_change = 5


            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change=0



        x += x_change
        y += y_change

        gameDisplay.fill(black)

        things(thing_startx, thing_starty, thing_width, thing_height, black )
        thing_starty += thing_speed
        xwing (x,y)

        if x > display_width - xwing_width or x < 0:
             x_change=0
        if y>display_height-xwing_height or y<0:
            y_change=0


        pygame.display.update()
        clock.tick(60)


game_loop()
pygame.quit()
quit()
skrx

您可以使用一个列表并将pygame.Rects附加到它来存储敌人的位置和大小,然后在 rect 位置对敌人图像进行 blit。对于碰撞检测,遍历敌人列表并使用该Rect.colliderect方法检查玩家矩形是否与敌人矩形碰撞。

import sys
import random
import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))

XWING_IMG = pg.Surface((25, 38))
XWING_IMG.fill((90, 120, 150))
TIE_IMG = pg.Surface((40, 24))
TIE_IMG.fill((190, 60, 50))
BG_COLOR = pg.Color('gray15')


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 = XWING_IMG.get_rect()
    player_rect.center = (300, 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 == pg.KEYDOWN:
                if event.key == pg.K_d:
                    change_x = 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

        # 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(TIE_IMG.get_rect(topleft=(random.randrange(600), 0)))
            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):
                print('Collision!')

        # Draw everything.
        screen.fill(BG_COLOR)
        for enemy_rect in enemies:
            screen.blit(TIE_IMG, enemy_rect)
        screen.blit(XWING_IMG, player_rect)

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


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

使用spawn_counter变量以这种方式计算帧数意味着游戏将依赖于帧速率(根据帧速率,对象生成得更慢或更快)。为了实现帧速率独立产卵定时器您可以使用返回的时间clock.tickpygame.time.get_ticks为解释在这里

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在pygame中为敌人的攻击增加冷却时间?

来自分类Dev

如何让敌人跟随pygame中的玩家?

来自分类Dev

如何让敌人跟随 Pygame 中的玩家?

来自分类Dev

如何在pygame中添加秒表?

来自分类Dev

我如何在pygame中产生多个敌人

来自分类Dev

我如何让敌人向玩家移动并预测其在pygame中的路径

来自分类Dev

如何在pygame中绕过声音?

来自分类Dev

如何在Pygame中退出全屏模式?

来自分类Dev

如何在pygame中创建项目符号?

来自分类Dev

如何在Pygame中循环图像精灵

来自分类Dev

如何在Pygame中“裁剪”旋转图像

来自分类Dev

如何在PyGame中检查可变按键

来自分类Dev

如何在pygame中单击并拖动对象?

来自分类Dev

如何在pygame中停止执行功能

来自分类Dev

如何在Pygame中检查碰撞

来自分类Dev

如何在pygame中隐藏特定点?

来自分类Dev

如何在Pygame中测试碰撞?

来自分类Dev

如何在Pygame中绘制关闭视图

来自分类Dev

如何在Pygame中降低Sprite FPS?

来自分类Dev

如何在pygame中制作滚动背景?

来自分类Dev

如何在Pygame中制作边框

来自分类Dev

如何在pygame中设置图像的位置?

来自分类Dev

目前如何在Pygame中播放视频?

来自分类Dev

如何在Pygame中按住“键”?

来自分类Dev

如何在pygame中创建Button类

来自分类Dev

如何在Pygame中制作圆形表面

来自分类Dev

如何在PyGame中拖动多个图像?

来自分类Dev

如何在pygame中更改文本的颜色

来自分类Dev

如何在Pygame中克隆Sprite?