python - 子弹在pygame中不会反弹
问题描述
在“def 更新”部分。
根据标记的四个块的放置位置。子弹只是穿过屏幕或停留在屏幕内闪烁(因为它一直将其 x,y 更改为 -x,-y)
与我制作的其他程序不同,Bullet 不会弹跳。我认为问题出在这四个街区的位置上。你能告诉我在哪里修吗?
class Bullet(pygame.sprite.Sprite):
def __init__(self,centerx,centery,c):
...
def update(self):
a= pygame.time.get_ticks()
self.b.append(a)
#point and shoot
if self.point == 1:
self.yspeed = -10
self.xspeed = 0
if self.point == 2:
self.yspeed = 10
self.xspeed = 0
if self.point == 3:
self.yspeed = 0
self.xspeed = -10
if self.point == 4:
self.yspeed = 0
self.xspeed = 10
#bounce
if self.rect.right>=WIDTH or self.rect.left<=0:
self.xspeed = -self.xspeed
if self.rect.top<=0 or self.rect.bottom>=HEIGHT:
self.yspeed = -self.yspeed
#kill after 5 sec
if (a-self.b[0])>=5000:
del self.b[:]
self.kill()
#move according to speed
self.rect.centerx += self.xspeed
self.rect.centery += self.yspeed
我的完整代码在这里-供您尝试
import pygame
import random
from os import path
WIDTH = 800
HEIGHT = 600
FPS = 60
BLACK = (0,0,0)
WHITE = (255,255,255)
GREEN = (0,255,0)
RED = (255,0,0)
light_BLUE = (0,255,255)
pygame.init()
pygame.mixer.init()
screen= pygame.display.set_mode((WIDTH,HEIGHT))
clock = pygame.time.Clock()
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((30,30))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH/2,HEIGHT/2)
self.speed = 0
self.y_speed = 0
def update(self):
self.speed = 0
self.y_speed = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speed = -3
if keystate[pygame.K_RIGHT]:
self.speed = 3
if keystate[pygame.K_UP]:
self.y_speed = -3
if keystate[pygame.K_DOWN]:
self.y_speed = 3
self.rect.x+=self.speed
self.rect.y+=self.y_speed
class Gun(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((10,10))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH/2,HEIGHT/2)
self.a = 0
self.b = 0
self.c = 0
def update(self,player_Cposition):
keystate = pygame.key.get_pressed()
if keystate[pygame.K_UP]:
self.a = player_Cposition[0]
self.b = player_Cposition[1]-2*self.rect.height
self.c = 1
if keystate[pygame.K_DOWN]:
self.a = player_Cposition[0]
self.b = player_Cposition[1]+2*self.rect.height
self.c = 2
if keystate[pygame.K_LEFT]:
self.a = player_Cposition[0]-2*self.rect.width
self.b = player_Cposition[1]
self.c = 3
if keystate[pygame.K_RIGHT]:
self.a = player_Cposition[0]+2*self.rect.width
self.b = player_Cposition[1]
self.c = 4
self.rect.center = [self.a,self.b]
def shoot(self,x,y,c):
bullet = Bullet(x,y,c)
all_sprites.add(bullet)
class Bullet(pygame.sprite.Sprite):
def __init__(self,centerx,centery,c):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((8,8))
self.image.fill(light_BLUE)
self.rect = self.image.get_rect()
self.rect.center = [centerx,centery]
self.point = c
self.xspeed = 0
self.yspeed = 0
self.b = []
def update(self):
a= pygame.time.get_ticks()
self.b.append(a)
#point and shoot
if self.point == 1:
self.yspeed = -10
self.xspeed = 0
if self.point == 2:
self.yspeed = 10
self.xspeed = 0
if self.point == 3:
self.yspeed = 0
self.xspeed = -10
if self.point == 4:
self.yspeed = 0
self.xspeed = 10
#bounce
if self.rect.right>=WIDTH or self.rect.left<=0:
self.xspeed = -self.xspeed
if self.rect.top<=0 or self.rect.bottom>=HEIGHT:
self.yspeed = -self.yspeed
#kill after 5 sec
if (a-self.b[0])>=5000:
del self.b[:]
self.kill()
#move according to speed
self.rect.centerx += self.xspeed
self.rect.centery += self.yspeed
all_sprites = pygame.sprite.Group()
player = Player()
gun = Gun()
all_sprites.add(player)
gun_sprites = pygame.sprite.Group()
gun_sprites.add(gun)
running = True
while running:
#event
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
gun.shoot(gun.a,gun.b,gun.c)
#update
all_sprites.update()
gun_sprites.update(player.rect.center)
#draw
screen.fill(BLACK)
all_sprites.draw(screen)
gun_sprites.draw(screen)
pygame.display.update()
#clock
clock.tick(FPS)
pygame.quit()
解决方案
您正在子弹更新功能中的两个位置更改子弹速度,一种解决方法可能是:
# bounce
if self.rect.right >= WIDTH or self.rect.left <= 0:
self.xspeed = -self.xspeed
self.point = 0
if self.rect.top <= 0 or self.rect.bottom >= HEIGHT:
self.yspeed = -self.yspeed
self.point = 0
推荐阅读
- php - Opencart 的 REST API 生成
- ios - oauth请求中的快速额外参数中的Yahoo Weather API
- java - 我们如何在 MarkLogic 中获取森林数据目录
- java - 如何将用户添加到团队到管理页面
- visual-studio-code - 是否可以通过命令行在 Rider 中打开 C# 解决方案?
- oauth-2.0 - 混合网关环境中的 WSO2 始终路由到沙盒 URL,即使与生产访问令牌一起使用也是如此
- r - 如何查找与我的数据框间接链接的值?
- php - Laravel Policy - 检查实体的状态
- angular - 错误:未捕获(承诺):HttpErrorResponse: {"headers":{"normalizedNames":[],"statusText":"Bad Request"} 仅在 Safari 浏览器上
- vue.js - 无法更改 v-dialog 样式