Python 为什么我的图像在闪烁?(Pygame)

Python 为什么我的图像在闪烁?(Pygame),python,pygame,Python,Pygame,我试图通过在按住指定的左/右按钮的同时反复加载一组4幅图像来“设置”精灵的动画。它基本上是有效的,只是图像一直在闪烁,并且没有像我预期的那样“切换”。它的速度也大大减慢。作为Pygame/Python的初学者,我的大脑完全崩溃了 import pygame import os from test_menu import drawmenu from game_over import player1wins from game_over import player2wins from game_o

我试图通过在按住指定的左/右按钮的同时反复加载一组4幅图像来“设置”精灵的动画。它基本上是有效的,只是图像一直在闪烁,并且没有像我预期的那样“切换”。它的速度也大大减慢。作为Pygame/Python的初学者,我的大脑完全崩溃了

import pygame
import os

from test_menu import drawmenu
from game_over import player1wins
from game_over import player2wins
from game_over import tie
pygame.init()

while True: 
    screen_size = (1080, 400)
    screen = pygame.display.set_mode(screen_size)

    background = (255,255,255)
    image = pygame.image.load("background(1).png")
    imagerect = image.get_rect()
    wall_left = pygame.Rect(0,0,1,950)
    wall_right = pygame.Rect(1080,0,1,950)

    square1 = pygame.Rect(750, 350, 20, 20)
    square2 = pygame.Rect(330, 350, 20, 20)
    IMAGE = pygame.image.load("player1standright.png").convert_alpha()
    rect = IMAGE.get_rect()
    rect.x = 100
    rect.y = 225

    x_movement = 0
    y_movement = 0
    x2_movement = 0
    y2_movement = 0

    accelx1 = 0
    accely1 = 0
    accelx2 = 0
    accely2 = 0

    jumping = False
    jumping2 = False

    #This is the function that does it
    def player1runright(images1right, IMAGE, image, imagerect):
        i = -1
        while i <= 2:
            pygame.time.delay(0)
            i += 1
            print (i)
            IMAGE = pygame.image.load(images1right[i])
            print (images1right[i])
            screen.blit(IMAGE, rect)

    images1right = ["player1runright-1.png","player1runright-2.png","player1runright-3.png","player1runright-4.png"]

    def health_bars(player1_health, player2_health):
        if player1_health > 75:
            player1_health_color = (62, 219, 41)
        elif player1_health > 50:
            player1_health_color = (239, 212, 9)
        else:
            player1_health_color = (239, 9, 9)

        if player2_health > 75:
            player2_health_color = (62, 219, 41)
        elif player2_health > 50:
            player2_health_color = (239, 212, 9)
        else:
            player2_health_color = (239, 9, 9)

        pygame.draw.rect(screen, player1_health_color, (70, 50, player1_health, 25))
        pygame.draw.rect(screen, player2_health_color, (900, 50, player2_health, 25))

    player1_health = int(100)
    player2_health = int(100)

    drawmenu()

    while True:
        screen.fill(background)
        screen.blit(image, imagerect)
        pygame.draw.rect(screen, (255,0,0), square1)
        pygame.draw.rect(screen, (0,0,255), square2)
        pygame.draw.rect(screen, (0,0,0), wall_left)
        pygame.draw.rect(screen, (0,0,0), wall_right)
        health_bars(player1_health, player2_health)
        pygame.display.update()
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                exit()
        keys_pressed = pygame.key.get_pressed()
        if keys_pressed[pygame.K_d] != 1:
            screen.blit(IMAGE, rect)

        #MOVEMENT P1

        if keys_pressed[pygame.K_LEFT] == 1:
            x_movement += -1
        elif keys_pressed[pygame.K_RIGHT] == 1:
            x_movement += 1
        else:
            x_movement = 0

        #MOVEMENT P2

        if keys_pressed[pygame.K_a] == 1:
            x2_movement += -1
        elif keys_pressed[pygame.K_d] == 1:
            x2_movement += 1
            player1runright(images1right, IMAGE, image, imagerect)
        else:
            x2_movement = 0

        #MAX SPEED P1
        if x_movement < -7:
            x_movement = -7
        if x_movement > 7:
            x_movement = 7
        if y_movement < -7:
            y_movement = -7
        if y_movement > 7:
            y_movement = 7

        #MAX SPEED P2
        if x2_movement < -7:
            x2_movement = -7
        if x2_movement > 7:
            x2_movement = 7
        if y2_movement < -7:
            y2_movement = -7
        if y2_movement > 7: 
            y2_movement = 7

        #COLLISION (WALL) P1

        if square1.colliderect(wall_left):
            player2_health -= 0.5
            x_movement = 0
            y_movement = 0
            if keys_pressed[pygame.K_RIGHT] == 1:
                x_movement += 1

        if square1.colliderect(wall_right):
            player2_health -= 0.5
            x_movement = 0
            y_movement = 0
            if keys_pressed[pygame.K_LEFT] == 1:
                x_movement += -1

        #COLLISION (WALL) P2

        if rect.colliderect(wall_left):
            player1_health -= 0.5
            x2_movement = 0
            y2_movement = 0
            rect.x = 0
            rect.y = 0
            if keys_pressed[pygame.K_d] == 1:
                x2_movement += 1
                rect.x += 1

        if rect.colliderect(wall_right):
            player1_health -= 0.5
            x2_movement = 0
            y2_movement = 0
            rect.x = 0
            rect.y = 0
            if keys_pressed[pygame.K_a] == 1:
                x2_movement += -1
                rect.x += -1


        #COLLISION (ATTACK) P1
        if square1.colliderect(rect) and keys_pressed[pygame.K_g] == 1:
            player2_health -= 1

        #COLLISION (ATTACK) P2
        if rect.colliderect(square1) and keys_pressed[pygame.K_p] == 1:
            player1_health -= 1

        #JUMPING P1
        if keys_pressed[pygame.K_w] == 1:
            if jumping2 == False:
                jumping2 = True

                y2_movement = -30
                accely2 = 1

        rect = rect.move(x2_movement, y2_movement)

        x2_movement += accelx2
        y2_movement += accely2

        if jumping2 == True:
            if rect.y >= 225:
                jumping2 = False

                rect.y = 225
                y2_movement = 0
                accely2 = 0

        #JUMPING P2
        if keys_pressed[pygame.K_UP] == 1:
            if jumping == False:
                jumping = True

                y_movement = -30
                accely1 = 1

        square1 = square1.move(x_movement, y_movement)

        x_movement += accelx1
        y_movement += accely1

        if jumping == True:
            if square1.y >= 350:
                jumping = False

                square1.y = 350
                y_movement = 0
                accely1 = 0

        pygame.display.update()
        pygame.time.delay(20)

        if player2_health == 0 and player1_health !=0:
            pygame.time.delay(400)
            player1wins()
            pygame.time.delay(3000)
            drawmenu()
            break
        elif player1_health == 0 and player2_health !=0:
            pygame.time.delay(400)
            player2wins()
            pygame.time.delay(3000)
            drawmenu()
            break
        if player1_health == 0 and player2_health == 0:
            pygame.time.delay(400)
            tie()
            pygame.time.delay(3000)
            drawmenu()
            break
导入pygame
导入操作系统
从测试菜单导入绘图菜单
从game_到import Player1获胜
从game_到import player2wins
从进口平局开始
pygame.init()
尽管如此:
屏幕大小=(1080400)
screen=pygame.display.set_模式(屏幕大小)
背景=(255255)
image=pygame.image.load(“背景(1.png))
imagerect=image.get_rect()
wall_left=pygame.Rect(0,0,1950)
wall_right=pygame.Rect(1080,0,1950)
square1=pygame.Rect(7503502020)
square2=pygame.Rect(330、350、20、20)
IMAGE=pygame.IMAGE.load(“player1standright.png”).convert_alpha()
rect=IMAGE.get_rect()
矩形x=100
矩形y=225
x_移动=0
y_移动=0
x2_移动=0
y2_移动=0
加速度X1=0
加速度1=0
加速度x2=0
加速度2=0
跳跃=错误
跳转2=错误
#这就是它的功能
def播放器1右键(图像1右键、图像、图像、图像右键):
i=-1
而我75:
玩家1_健康_颜色=(6221941)
elif player1_健康>50:
玩家1_健康_颜色=(239212,9)
其他:
玩家1_健康_颜色=(239,9,9)
如果播放机2_运行状况>75:
玩家2_健康_颜色=(6221941)
elif player2_健康>50:
玩家2_健康_颜色=(239212,9)
其他:
玩家2_健康_颜色=(239,9,9)
pygame.draw.rect(屏幕,玩家1_健康_颜色,(70,50,玩家1_健康,25))
pygame.draw.rect(屏幕,玩家2_health_color,(900,50,玩家2_health,25))
player1_health=int(100)
player2_health=int(100)
drawmenu()
尽管如此:
屏幕填充(背景)
screen.blit(image,imagerect)
pygame.draw.rect(屏幕,(255,0,0),平方1)
pygame.draw.rect(屏幕,(0,0255),平方2)
pygame.draw.rect(屏幕,(0,0,0),左墙)
pygame.draw.rect(屏幕,(0,0,0),右墙)
健康栏(玩家1健康,玩家2健康)
pygame.display.update()
events=pygame.event.get()
对于事件中的事件:
如果event.type==pygame.QUIT:
退出()
keys\u pressed=pygame.key.get\u pressed()
如果按[pygame.K\u d]键!=1:
屏幕。blit(图像,矩形)
#运动P1
如果按[pygame.K_LEFT]键==1:
x_移动+=-1
按elif键[pygame.K_RIGHT]==1:
x_移动+=1
其他:
x_移动=0
#运动P2
如果按[pygame.K_a]==1键:
x2_移动+=-1
elif键按[pygame.K_d]==1:
x2_移动+=1
播放器1右键(图像1右键,图像,图像,图像右键)
其他:
x2_移动=0
#最大速度P1
如果x_移动<-7:
x_移动=-7
如果x_移动>7:
x_移动=7
如果y_移动<-7:
y_移动=-7
如果y_移动>7:
y_移动=7
#最大速度P2
如果x2_移动<-7:
x2_移动=-7
如果x2_移动>7:
x2_移动=7
如果y2_移动<-7:
y2_移动=-7
如果y2_移动>7:
y2_移动=7
#碰撞(墙)P1
如果square1.collide rect(左墙):
玩家2_健康状况-=0.5
x_移动=0
y_移动=0
如果按[pygame.K_RIGHT]键==1:
x_移动+=1
如果square1.collide rect(墙右):
玩家2_健康状况-=0.5
x_移动=0
y_移动=0
如果按[pygame.K_LEFT]键==1:
x_移动+=-1
#碰撞(墙)P2
如果矩形碰撞矩形(墙左):
玩家1_健康状况-=0.5
x2_移动=0
y2_移动=0
矩形x=0
矩形y=0
如果按[pygame.K\u d]==1键:
x2_移动+=1
矩形x+=1
如果矩形碰撞矩形(墙右):
玩家1_健康状况-=0.5
x2_移动=0
y2_移动=0
矩形x=0
矩形y=0
如果按[pygame.K_a]==1键:
x2_移动+=-1
矩形x+=-1
#碰撞(攻击)P1
如果按下square1.Collide rect(rect)和键[pygame.K_g]==1:
玩家2_健康状况-=1
#碰撞(攻击)P2
如果按下rect.collide rect(square1)和键[pygame.K\u p]==1:
玩家1_健康状况-=1
#跳跃P1
如果按[pygame.K\u w]==1键:
如果跳线2==假:
跳转2=真
y2_移动=-30
加速度2=1
rect=rect.move(x2\u移动,y2\u移动)
x2_移动+=加速度x2
y2_移动+=加速度2
如果jumping2==真:
如果矩形y>=225:
跳转2=错误
矩形y=225
y2_移动=0
加速度2=0
#跳跃P2
如果按[pygame.K\u UP]==1键:
如果跳跃==假:
跳跃=正确
y_移动=-30
加速度1=1
square1=square1.移动(x_移动,y_移动)
x_移动+=加速度x1
y_移动+=加速度1
如果跳跃==真:
如果平方1.y>=350:
跳跃=错误
平方1.y=350
y_移动=0
加速度1=0
pygame.display.update()
游戏时间
import sys
import pygame

pygame.init()
clock = pygame.time.Clock()

# Some surfaces which serve as the player images.
PLAYER_IMAGE = pygame.Surface((30, 50))  # Idle player image.
PLAYER_IMAGE.fill((30, 150, 230))
IMAGE1 = pygame.Surface((30, 55))
IMAGE1.fill((60, 150, 180))
IMAGE2 = pygame.Surface((30, 60))
IMAGE2.fill((90, 150, 130))
IMAGE3 = pygame.Surface((30, 65))
IMAGE3.fill((120, 150, 80))
IMAGE4 = pygame.Surface((30, 70))
IMAGE4.fill((150, 150, 30))
PLAYER1_IMAGES_RIGHT = [IMAGE1,IMAGE2,IMAGE3,IMAGE4]

anim_index = 0

while True:
    screen = pygame.display.set_mode((1080, 400))
    background_image = pygame.Surface(screen.get_size())
    background_image.fill((30, 30, 30))
    background_rect = background_image.get_rect()

    player_image = PLAYER_IMAGE
    player_rect = player_image.get_rect(x=100, y=225)

    while True:
        # Handle the events.
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        keys_pressed = pygame.key.get_pressed()
        if keys_pressed[pygame.K_d]:
            # Increment the index and change the player image.
            anim_index += 1
            anim_index %= len(PLAYER1_IMAGES_RIGHT)*4
            # * 4 in the line above and floor div 4 to slow the animation down.
            player_image = PLAYER1_IMAGES_RIGHT[anim_index//4]
        else:  # Switch back to the idle image.
            player_image = PLAYER_IMAGE
            # Reset the index, so that we don't start in the middle of the anim.
            anim_index = 0

        # Draw everything at the end.
        screen.blit(background_image, background_rect)
        # Just blit the current player image at the player_rect's topleft coords.
        screen.blit(player_image, player_rect)

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