精灵没有向下移动
sprite is not moving down
我不知道如何通过鼠标点击创建新精灵并为所有新精灵添加动作。
我创建了一个简单的游戏:
- 钻石:移动 left/right 与
K_LEFT
、K_RIGHT
- Pad:用鼠标移动left/right
如果你点击鼠标,你会根据鼠标点击次数添加红心并绘制精灵 heart0、heart1 等。
如果您单击鼠标,您会绘制一个心形精灵,它会掉落在钻石所在的位置,并且心形应该向下移动...
问题:心脏没有向下移动。我无法画出多颗心。
目前我只能在有钻石的地方画一颗心,然后贴上心。
你知道我的代码有什么问题所以我无法获得所需的功能吗?
import pygame, sys
from pygame.locals import *
pygame.init()
pygame.mouse.set_visible(1)
clock = pygame.time.Clock()
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
myfont = pygame.font.SysFont("Arial", 15)
hearts = []
clicks = []
class HeartSprite(object):
def __init__(self, pozx, pozy):
self.image = pygame.image.load("heart.png")
self.posx = pozx
self.posy = pozy
self.rect = self.image.get_rect()
self.going_down = True
self.next_update_time = 0
def update(self, current_time, bottom):
if self.next_update_time < current_time:
### bounce back
#if self.rect.bottom >= bottom - 1:
# self.going_down = False
### kill it
if self.posy > screen_height:
del hearts[0]
elif self.posy <= 85:
self.going_down = True
if self.going_down:
self.posy += 2
else:
self.posy -= 2
self.next_update_time = current_time + 10
def draw(self, surface):
surface.blit(self.image, (self.posx, self.posy))
class Diamond(object):
def __init__(self):
self.image = pygame.image.load("diamond.png").convert()
self.rect = self.image.get_rect()
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 3
if key[pygame.K_LEFT]:
self.rect[0] -= dist
elif key[pygame.K_RIGHT]:
self.rect[0] += dist
def draw(self, surface):
surface.blit(self.image, (self.rect[0], self.rect[1]+18))
class Pad(object):
def __init__(self):
self.image = pygame.image.load("pad.png")
self.rect = self.image.get_rect()
self.top = screen.get_height() - self.rect[1]
self.shoot_y = 0
self.shoot_x = 0
def draw(self, surface, posx, posy):
surface.blit(self.image, (posx, posy))
class DisplayText(object):
def __init__(self):
self.myfont = pygame.font.SysFont("Tahoma", 15)
self.heartsleft = 10 - len(hearts)
self.label = self.myfont.render("hearts left : %d" % self.heartsleft, 1, (0,0,0))
def draw(self, surface):
surface.blit(self.label, (3, 1))
def main():
diamond = Diamond()
pad = Pad()
while True:
white = (255, 255, 255)
screen.fill(white)
time = pygame.time.get_ticks()
x, y = pygame.mouse.get_pos()
pad.draw(screen, x - pad.rect[2]/2, screen_height - pad.rect[2]/2 )
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
diamondy = diamond.rect[1]+18
diamondx = diamond.rect[0]
count = "clicks"
clicks.append(count)
myvar = len(clicks)
for i in range(myvar):
ii = "heart" + str(i)
hearts.append(ii)
for myfigure in hearts:
myfigure = HeartSprite(diamondx , diamondy)
myfigure.update(time, 480)
myfigure.draw(screen)
diamond.draw(screen)
diamond.handle_keys()
displaytext = DisplayText()
displaytext.draw(screen)
pygame.display.update()
clock.tick(100)
pygame.quit()
main()
问题是这个循环:
for myfigure in hearts:
myfigure = HeartSprite(diamondx , diamondy)
myfigure.update(time, 480)
myfigure.draw(screen)
停下来想一想这个循环的真正作用。它为 hearts 中的每个元素创建一个 HeartSprite
的新实例,其中包含 diamondx
和 diamondy
;每次循环都是运行.
您真正想要做的是在您点击屏幕后创建 HeartSprite
个实例,并将这些实例保存在列表中(这样每颗心都会保持其状态):
...
elif event.type == MOUSEBUTTONDOWN:
diamondy = diamond.rect[1]+18
diamondx = diamond.rect[0]
hearts.append(diamondx, diamondy)
...
for myfigure in hearts:
myfigure.update(time, 480)
myfigure.draw(screen)
...
此代码还有一些问题,但这超出了本答案的范围。
我不知道如何通过鼠标点击创建新精灵并为所有新精灵添加动作。
我创建了一个简单的游戏:
- 钻石:移动 left/right 与
K_LEFT
、K_RIGHT
- Pad:用鼠标移动left/right
如果你点击鼠标,你会根据鼠标点击次数添加红心并绘制精灵 heart0、heart1 等。
如果您单击鼠标,您会绘制一个心形精灵,它会掉落在钻石所在的位置,并且心形应该向下移动...
问题:心脏没有向下移动。我无法画出多颗心。 目前我只能在有钻石的地方画一颗心,然后贴上心。
你知道我的代码有什么问题所以我无法获得所需的功能吗?
import pygame, sys
from pygame.locals import *
pygame.init()
pygame.mouse.set_visible(1)
clock = pygame.time.Clock()
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
myfont = pygame.font.SysFont("Arial", 15)
hearts = []
clicks = []
class HeartSprite(object):
def __init__(self, pozx, pozy):
self.image = pygame.image.load("heart.png")
self.posx = pozx
self.posy = pozy
self.rect = self.image.get_rect()
self.going_down = True
self.next_update_time = 0
def update(self, current_time, bottom):
if self.next_update_time < current_time:
### bounce back
#if self.rect.bottom >= bottom - 1:
# self.going_down = False
### kill it
if self.posy > screen_height:
del hearts[0]
elif self.posy <= 85:
self.going_down = True
if self.going_down:
self.posy += 2
else:
self.posy -= 2
self.next_update_time = current_time + 10
def draw(self, surface):
surface.blit(self.image, (self.posx, self.posy))
class Diamond(object):
def __init__(self):
self.image = pygame.image.load("diamond.png").convert()
self.rect = self.image.get_rect()
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 3
if key[pygame.K_LEFT]:
self.rect[0] -= dist
elif key[pygame.K_RIGHT]:
self.rect[0] += dist
def draw(self, surface):
surface.blit(self.image, (self.rect[0], self.rect[1]+18))
class Pad(object):
def __init__(self):
self.image = pygame.image.load("pad.png")
self.rect = self.image.get_rect()
self.top = screen.get_height() - self.rect[1]
self.shoot_y = 0
self.shoot_x = 0
def draw(self, surface, posx, posy):
surface.blit(self.image, (posx, posy))
class DisplayText(object):
def __init__(self):
self.myfont = pygame.font.SysFont("Tahoma", 15)
self.heartsleft = 10 - len(hearts)
self.label = self.myfont.render("hearts left : %d" % self.heartsleft, 1, (0,0,0))
def draw(self, surface):
surface.blit(self.label, (3, 1))
def main():
diamond = Diamond()
pad = Pad()
while True:
white = (255, 255, 255)
screen.fill(white)
time = pygame.time.get_ticks()
x, y = pygame.mouse.get_pos()
pad.draw(screen, x - pad.rect[2]/2, screen_height - pad.rect[2]/2 )
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
diamondy = diamond.rect[1]+18
diamondx = diamond.rect[0]
count = "clicks"
clicks.append(count)
myvar = len(clicks)
for i in range(myvar):
ii = "heart" + str(i)
hearts.append(ii)
for myfigure in hearts:
myfigure = HeartSprite(diamondx , diamondy)
myfigure.update(time, 480)
myfigure.draw(screen)
diamond.draw(screen)
diamond.handle_keys()
displaytext = DisplayText()
displaytext.draw(screen)
pygame.display.update()
clock.tick(100)
pygame.quit()
main()
问题是这个循环:
for myfigure in hearts:
myfigure = HeartSprite(diamondx , diamondy)
myfigure.update(time, 480)
myfigure.draw(screen)
停下来想一想这个循环的真正作用。它为 hearts 中的每个元素创建一个 HeartSprite
的新实例,其中包含 diamondx
和 diamondy
;每次循环都是运行.
您真正想要做的是在您点击屏幕后创建 HeartSprite
个实例,并将这些实例保存在列表中(这样每颗心都会保持其状态):
...
elif event.type == MOUSEBUTTONDOWN:
diamondy = diamond.rect[1]+18
diamondx = diamond.rect[0]
hearts.append(diamondx, diamondy)
...
for myfigure in hearts:
myfigure.update(time, 480)
myfigure.draw(screen)
...
此代码还有一些问题,但这超出了本答案的范围。