<p>我能发现其中的两个。首先,函数和类的定义应该在主循环之外,因为在一个循环中一遍又一遍地定义相同的东西没有任何意义。其次,您要调用<code>pygame.display.flip</code>两次,这是不需要的。翻转只能调用一次,否则会导致闪烁。第三,您正在使用<code>__init__</code>方法进行绘制,并在每一帧创建一个新实例。通常,一个实例只生成一次,并且该实例的一些方法可以对该实例执行某些操作。因此,与其在<code>__init__</code>中绘制,不如创建一个名为draw的新方法</p>
<p>现在回答你的问题,它分块移动,因为:</p>
<ol>
<li>您一次移动它25帧,因此它一次跳过25像素,并在新位置再次绘制</李>
<li>您正在使用<code>pygame.MOUSEBUTTONDOWN</code>。此函数每次单击仅返回一次true。因此,如果按住鼠标按钮,它将不起作用,因为它在第一帧返回<code>True</code>,然后返回<code>None</code>。要持续更新鼠标状态,需要使用<code>pygame.mouse.get_pressed()</code></李>
</ol>
<p>实现了上面提到的所有内容的新代码(注意:我将图像更改为曲面以使其正常工作,所以您可能希望再次将其更改为图像):</p>
<pre><code>from typing import Tuple
import pygame
from PIL import ImageGrab
# finding the height of the screen by taking a screenshot.
img = ImageGrab.grab()
(WIDTH, HEIGHT) = (img.size)
x = WIDTH / 2 - 470
y = HEIGHT / 2 - 400
fistx1 = x - 80
fistx2 = fistx1;
fisty1 = y + 40
fisty2 = y - 50
pygame.init()
clock = pygame.time.Clock()
RESOLUTION = (WIDTH, HEIGHT)
BACKGROUND_COLOR: Tuple[int, int, int] = (79, 205, 109)
MOVESPEED = 5
# window stuff
window = pygame.display.set_mode(RESOLUTION, flags=pygame.RESIZABLE, depth=32)
pygame.display.set_caption("The Connection")
window.fill(BACKGROUND_COLOR)
running = True
# all images for the game here
player_image = pygame.Surface((50, 50)).convert()
player_fist1_image = pygame.Surface((10, 10)).convert()
player_fist2_image = player_fist1_image
class Player():
def __init__(self, hp, image, fist1image, fist2image):
global fisty1, fistx1, fisty2
self.hp = hp
self.image = image
self.fist1image = fist1image
self.fist2image = fist2image
def move(self, movespeed):
global x, y, fistx1, fisty1, fisty2
if pressed[pygame.K_a]:
x -= movespeed
fistx1 -= movespeed
elif pressed[pygame.K_d]:
x += movespeed
fistx1 += movespeed
elif pressed[pygame.K_w]:
y -= movespeed
fisty1 -= movespeed
fisty2 -= movespeed
elif pressed[pygame.K_s]:
y += movespeed
fisty1 += movespeed
fisty2 += movespeed
def draw(self):
window.blit(self.image, (x, y))
window.blit(self.fist1image, (fistx1, fisty1))
window.blit(self.fist2image, (fistx2, fisty2))
def deal_damage(self, damage):
global x, y, fistx1, fisty1
mousePressed = pygame.mouse.get_pressed()
if mousePressed[0]:
fistx1 -= 1
window.fill(BACKGROUND_COLOR);
window.blit(self.fist1image, (fistx1, fisty1));
#pygame.display.flip();
main_player = Player(100, player_image, fist1image=player_fist1_image, fist2image=player_fist2_image)
# this is the function we use to actually call it. This is more helpful and less confusing for an idiot like me
def actual_deal():
main_player.deal_damage(25);
while running:
pressed = pygame.key.get_pressed()
clicked = pygame.mouse.get_pressed();
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
try:
pygame.quit()
except pygame.error:
pass
window.fill(BACKGROUND_COLOR)
main_player.move(movespeed=MOVESPEED)
main_player.deal_damage(50)
main_player.draw()
pygame.display.flip()
clock.tick(60);
</code></pre>
<p>Edit:忘记提到这个,但是您在<code>deal_damage</code>方法中使用了<code>damage</code>参数,但没有使用它</p>