如何解决如何让我的角色移动,同时让子弹在他们上方生成?
我一直在尝试用 Python 制作一个子弹地狱 (dankamu) 游戏,当我尝试用子弹为角色的动作设置动画时,我遇到了一些问题。根据我放置 redrawGameWindow()
函数的位置,要么无法生成子弹,要么我的游戏角色根本无法移动。我认为这可能是因为我的运动功能与我用于子弹的 for 循环是分开的?如果是这样,我不知道如何将它们合并在一起以同时运行。
class mc(object):
def __init__(self,x,y,width,height):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = 5
self.hitBox = (self.x,self.y,30,30)
def draw(self,win):
win.blit(char,(self.x,self.y))
self.hitBox = (self.x,30)
pygame.draw.rect(win,(255,0),self.hitBox,2)
def hit(self):
print("Hit")
def redrawGameWindow(mainchar,bullet,bullets):
win.blit(bg,(0,0))
mainchar.draw(win)
pygame.display.update()
for bullet in bullets:
bullet.draw(win)
class projectile(object):
def __init__(self,radius,color,facing):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.facing = facing
self.vel = 8 * facing
def draw(self,win):
pygame.draw.circle(win,self.color,self.y),self.radius)
def dankamu(enemy):
mainchar = mc(200,410,64,64)
run = True
bullets = []
while run:
pygame.time.delay(10)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and mainchar.x > 0:
mainchar.x -= mainchar.vel
if keys[pygame.K_RIGHT] and mainchar.x < 470:
mainchar.x += mainchar.vel
if keys[pygame.K_DOWN] and mainchar.y < 470:
mainchar.y += mainchar.vel
if keys[pygame.K_UP] and mainchar.y > 0:
mainchar.y -= mainchar.vel
if keys[pygame.K_LSHIFT] and mainchar.vel > 0:
mainchar.vel = 3
if keys[pygame.K_RSHIFT]:
mainchar.vel = 5
win.fill((255,255,255))
if enemy == "skeleton":
for i in range (30):
bullets.append(projectile(250,250,6,1))
for bullet in bullets:
if bullet.y - bullet.radius < mainchar.hitBox[1] + mainchar.hitBox[3] and bullet.y + bullet.radius > mainchar.hitBox[1]:
if bullet.x + bullet.radius > mainchar.hitBox[0] and bullet.x - bullet.radius < mainchar.hitBox[0] + mainchar.hitBox[2]:
mainchar.hit()
bullets.pop(bullets.index(bullet))
elif bullet.x < 500 and bullet.x > 0:
bullet.x += bullet.vel
else:
bullets.pop(bullets.index(bullet))
redrawGameWindow(mainchar,bullets)
run = False
pygame.quit()
#Actual Running
dankamu("skeleton")
print("Dankamu success")
解决方法
生成子弹时,必须在玩家所在位置上方生成子弹:
bullets.append(projectile(250,250,6,(0,0),1))
bullets.append(projectile(mainchar.x,1))
由于子弹必须从底部移动到顶部,所以你必须增加子弹的 y 坐标:
bullet.x += bullet.vel
bullet.y += bullet.vel
在更新显示之前绘制项目符号:
def redrawGameWindow(mainchar,bullet,bullets):
win.blit(bg,0))
mainchar.draw(win)
for bullet in bullets:
bullet.draw(win)
pygame.display.update()
不要一次添加所有的项目符号:
if bullet_frame_count == 0:
bullet_frame_count = 10
if len(bullets) < 30:
bullets.append(projectile(mainchar.x,1))
else:
bullet_frame_count -= 1
使用 pygame.Rect.colliderect
进行碰撞测试:
bullet_rect = pygame.Rect(bullet.x-bullet.radius,bullet.y-bullet.radius,bullet.radius*2,bullet.radius*2)
if bullet_rect.colliderect(mainchar.hitbox):
mainchar.hit()
bullets.pop(bullets.index(bullet))
请阅读How to remove items from a list while iterating?
完整的dankamu
函数:
def dankamu(enemy):
mainchar = mc(200,410,64,64)
run = True
bullets = []
count = 0
while run:
pygame.time.delay(10)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
mainchar.x = mainchar.x + (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * mainchar.vel
mainchar.y = mainchar.y + (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * mainchar.vel
mainchar.x = max(0,min(470,mainchar.x))
mainchar.y = max(0,mainchar.y))
if keys[pygame.K_LSHIFT] and mainchar.vel > 0:
mainchar.vel = 3
if keys[pygame.K_RSHIFT]:
mainchar.vel = 5
if enemy == "skeleton":
if count == 0:
count = 10
if len(bullets) < 30:
bullets.append(projectile(mainchar.x,1))
else:
count -= 1
for bullet in bullets[:]:
bullet_rect = pygame.Rect(bullet.x-bullet.radius,bullet.radius*2)
if bullet_rect.colliderect(mainchar.hitbox):
mainchar.hit()
bullets.pop(bullets.index(bullet))
elif bullet.y < 500:
bullet.y += bullet.vel
else:
bullets.pop(bullets.index(bullet))
redrawGameWindow(mainchar,bullets)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。