python - 如何让我的 Sprite 出现在我的窗口中?
问题描述
我在游戏中制作了一个敌人精灵,但它没有显示在屏幕上。我想知道如何才能使它出现?
尝试更新类中的 pygame 显示,但它仍然不会显示图像。我计划让精灵出现,以便让它移动到网格线的末端(水平),然后在到达水平点的末端时垂直向下移动。
import pygame
pygame.init()
window = pygame.display.set_mode((650, 630))
pygame.display.set_caption("PeaShooters")
avatar = pygame.image.load('Sprite 1 Red.png')
background = pygame.image.load('Bg.jpg')
white = (255, 255, 255)
class player(object):
def __init__(self, x, y, width, height, shots):
self.x = 300
self.y = 500
self.width = 40
self.height = 60
self.vel = shots
def drawGrid():
window.blit(background, (0,0))
window.blit(avatar, (av.x, av.y))
pygame.draw.line(window, white, [50,50], [50, 600], 5)
pygame.draw.line(window, white, [50,50], [600, 50], 5)
pygame.draw.line(window, white, [600,600], [600, 50], 5)
pygame.draw.line(window, white, [50,600], [600, 600], 5)
pygame.draw.line(window, white, [50,450], [600, 450], 5)
for bullet in bullets:
bullet.draw(window)
pygame.display.update()
class shots(object):
def __init__(self, x, y, radius, colour):
self.x = x
self.y = y
self.radius = radius
self.colour = colour
self.vel = shots
def draw(self, window):
pygame.draw.circle(window, self.colour, (self.x,self.y), self.radius)
class enemy(object):
enemy = pygame.image.load('Sprite 3 Red.png')
pygame.display.update()
def __init__(self, x, y, width, height, end):
self.x = x
self.y = y
self.width = width
self.height = height
self.end = end
self.path = [self. x, self.end]
self.vel = 4
def draw(self,window):
self.move()
pass
def move(self):
pass
av = player(300, 500, 40, 60, 9)
bullets = []
running = True
while running:
pygame.time.delay(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for bullet in bullets:
if bullet.y < 600 and bullet.y > 70:
bullet.y -= 8
else:
bullets.pop(bullets.index(bullet))
keys = pygame.key.get_pressed()
if keys[pygame.K_w] and av.y > 440:
av.y -= av.vel
if keys[pygame.K_a] and av.x > 65:
av.x -= av.vel
if keys[pygame.K_s] and av.y < 535:
av.y += av.vel
if keys[pygame.K_d] and av.x < 530:
av.x += av.vel
if keys[pygame.K_SPACE]:
if len(bullets) < 5:
bullets.append(shots(round(av.x + av.width//2), round(av.y + av.height//2), 6, (0,0,0)))
drawGrid()
window.blit(avatar, (x,y))
pygame.quit()
我希望头像会出现在屏幕上,这样我就可以让它移动。
解决方案
所有绘图都应在 while 循环中完成。或者您直接在window.blit
各种精灵上调用该函数,或者将其包装在循环期间调用的精灵方法中(我看到您有一个draw()
方法,但现在它什么都不做)。选择一种方式并遵循它。我个人更喜欢第二种,它更面向对象,但这是我的看法。
如果你想给人一种运动感,记得清除之前的位置。
display.update()
每次迭代都应该调用一次,通常在最后,在所有精灵都被 blit 之后。
你的敌人没有出现,因为你从来没有对它的形象进行涂抹。实际上,您永远不会创建敌人,您只定义了类。所以首先创建一个敌人添加一条线,这样en = enemy(ex, ey, w, h, end)
。ex
这里ey
应该是屏幕上敌人的位置,选择你喜欢的。w
以及h
图像的宽度和高度。end
我不知道(你的课,你加的,你应该知道它的目的是什么)。您可以在创建avatar
.
然后从类中删除,并在 while 循环中display.update()
添加一个调用。window.blit(en, (en.x, en.y))
或在 中drawGrid()
,实际上是在绘制所有内容,而不仅仅是网格。
要移动敌人,您应该在 while 循环中编辑其位置 (en.x
和en.y
),就像对头像所做的那样,但不能响应按键。只需设置某种路径。在每次迭代中,敌人的坐标应该改变以遵循这条路径,类似en.x += en.vel
或其他什么。真正的路径可能更复杂,但这取决于你。逻辑是:每次循环迭代改变敌人坐标。
推荐阅读
- php - 对于 HTML 中的下拉菜单,键入值不能按预期工作?
- office-js - 如何在 Office `Dialog API` 中使用`Word.run(function (context) {`
- laravel - 复选框不保存真实值
- bash - 检查 SeLinux 状态
- php - SQL Server:Windows 身份验证从 Management Studio 而非 Apache 工作
- node.js - 从 Knex.js 池中获取当前正在执行的查询
- java - Java中的线程执行
- angular-material - 如何知道Angular 6材料MatTable中选定单元格的索引?
- javascript - 检查数组是否有三个连续的数字
- android-studio - Android Studio 设备文件资源管理器在下载文件时卡住