Python,PyGame图像不显示

2024-04-23 07:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我是pygame新手,刚学会了什么是类

我想让玩家发射子弹,但子弹没有画在屏幕上。在

有4个python文件

  1. 在游戏.py:主文件。获取输入、更新和绘制屏幕
  2. 在背景.py:背景类
  3. 在播放器.py:为player初始化并具有player操作
  4. 在ect.py公司:项目符号类。子弹目标的初始化。在

所以我的想法是先加载图像并为每个子弹做表面处理, 第二次更新位置,然后在曲面上绘制图像。如果子弹在目的地附近,删除它。 每次我按空格键调用shoot函数时,这个警告就会出现“libpng warning:iCCP:known incorrect sRGB profile”。我相信我可以忽略不管怎样,这个我不知道为什么子弹图像没有出现。 有人能帮我吗?谢谢。欢迎任何建议!在

游戏.py

import pygame as pyg
from pygame.locals import *
import sys
import player
import background, ect

#Screen size
s_width = 1280
s_height = 720
screen_size = (s_width,s_height)

#Player
p_speed = 5

#Initialization
pyg.init()
screen = pyg.display.set_mode(screen_size)
pyg.display.set_caption("Shoot")


#Set background
Background = background.Background("forest2.jpeg",(0,0))

#Set Player
Player= player.Player("Crab.png",100,100,640,360)

#Input
keys = {"right":False , "left":False ,  "up":False , "down":False , "bullet":False }
bullets = []

#Main Loop
running = True
while running:

    #Get inputs
    for event in pyg.event.get():
        if event.type == QUIT:
            pyg.quit()
            sys.exit()

        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                keys['left'] = True
            elif event.key == K_RIGHT:
                keys['right'] = True
            elif event.key == K_UP:
                keys['up'] = True
            elif event.key == K_DOWN:
                keys['down'] = True
            elif event.key == K_SPACE:
                keys['bullet'] = True
            elif event.key == K_q:
                pyg.quit()
                sys.exit()


        elif event.type == KEYUP:
            if event.key == K_LEFT:
                keys['left'] = False
            elif event.key == K_RIGHT:
                keys['right'] = False
            elif event.key == K_UP:
                keys['up'] = False
            elif event.key == K_DOWN:
                keys['down'] = False
            elif event.key == K_SPACE:
                keys['bullet'] = False

    #Get time
    Player.clock.tick(60)
    dt = Player.clock.get_time()
    dt *= 0.001

    #Update values
    if keys['right']:
        Player.x += p_speed
    if keys['left']:
        Player.x -= p_speed
    if (keys['up'] and Player.on_ground):
        Player.jump()
    if keys['bullet']:
        Player.shoot(bullets)

    if Player.on_ground == False: #Gravity
        Player.give_force(0,-750)

    Player.update_pos(dt)

    if Player.y >= 500:
        Player.y = 500
        Player.y_vel = 0
        Player.y_accel = 0

        Player.on_ground = True

    for bullet in bullets:
        bullet.update(dt)
        if (bullet.desx - bullet.x)<0.3:
            del bullet


    #Draw
    screen.fill([255,255,255])
    screen.blit(Background.image,Background.rect)
    screen.blit(Player.player_sprite,(Player.x,Player.y))

    for bullet in bullets:
        bullet.draw_bullet()

    #Update game state
    pyg.display.flip()
    pyg.display.update()

播放器.py

^{pr2}$

ect.py公司

#Imports
import random, math, pygame as pyg
from pygame.locals import *


class Bullet(pyg.sprite.Sprite):
    """
    This class represents bullets
    """

    def __init__(self,x,y,desx, desy):
        pyg.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.desx = desx
        self.desy = desy
        h = math.sqrt(math.pow(desx-x,2) + math.pow(desy-y,2))
        self.speed = 1 + random.randrange(-1,1)
        self.speedx = self.speed*math.acos((desx - x)/h)
        self.speedy = self.speed*math.asin((desy - y)/h)

        self.surface = pyg.Surface((128,128))
        self.image = pyg.image.load("bullet.png")
        self.image = pyg.transform.scale(self.image, (128, 128))
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = x + 64, y -64

    def update(self,dt):
        self.x += (self.speedx*dt)
        self.y -= (self.speedy*dt)

    def draw_bullet(self):
        self.surface.blit(self.image,(self.x -64,self.y + 64))

Tags: keypyimageimportselfeventfalsetrue
1条回答
网友
1楼 · 发布于 2024-04-23 07:22:04

您只需将项目符号的self.imageblit到self.surface上,而不是屏幕表面。将screen传递给draw_bullet方法,然后将self.imageblit到它上面。在

# In the main while loop.
for bullet in bullets:
    bullet.draw_bullet(screen)

#          -
# In the Bullet class.
def draw_bullet(self, screen):
    screen.blit(self.image, (self.x -64, self.y + 64))

相关问题 更多 >