如何解决当我移动鼠标时,所有子弹都在移动,而不仅仅是被射击了
我正在尝试使用Pygame制作一个基本的自上而下的射击游戏。我只是想出了如何使子弹在鼠标所在的位置射击,但是现在的问题是,即使我在射击后移动鼠标,它们也会改变方向。此外,当子弹与屏幕的左边缘碰撞时,它们不会像其他边缘一样消失。
main.py:
import pygame
import time
import math
import os
import sys
import random
from classes import *
pygame.init()
width,height = (1440,900)
win = pygame.display.set_mode((width,height),pygame.FULLSCREEN)
pygame.display.set_caption("Dungeon")
win.fill((255,255,255))
# Variables to do with player shooting
shotTimer = 0
bullets = []
bulletVel = 9
# Initialize classes
player = Player(50,800,50,PLAYERSPRITE)
def main():
run = True
FPS = 60
clock = pygame.time.Clock()
while run:
clock.tick(FPS)
now = pygame.time.get_ticks()
mousex,mousey = pygame.mouse.get_pos()
# Creates the player's bullets
def shoot():
global shotTimer
if now - shotTimer >= player.cooldown:
bullets.append(Projectile(round(player.x + player.width // 2),round(player.y + player.height // 2),6))
shotTimer = now
def playerBulletUpdates():
for bullet in bullets:
if bullet.x >= 0 and bullet.x <= width:
if bullet.y >= 0 and bullet.y <= height:
global bulletVel
xDiff = mousex - player.x
yDiff = mousey - player.y
angle = math.atan2(yDiff,xDiff)
changeX = math.cos(angle) * bulletVel
changeY = math.sin(angle) * bulletVel
bullet.x += changeX
bullet.y += changeY
else:
bullets.pop(bullets.index(bullet))
def bulletAngle():
global bulletVel
xDiff = mousex - player.x
yDiff = mousey - player.y
angle = math.atan2(yDiff,xDiff)
changeX = int(math.cos(angle) * bulletVel)
changeY = int(math.sin(angle) * bulletVel)
bullet.x += changeX
bullet.y += changeY
def updateScreen():
win.fill((255,255))
player.draw(win)
for bullet in bullets:
bullet.draw(win)
playerBulletUpdates()
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_w] and player.y >= 0: # UP
player.y += -player.walkSpeed
if keys[pygame.K_s] and player.y + player.walkSpeed + player.height <= height: # DOWN
player.y += player.walkSpeed
if keys[pygame.K_a] and player.x >= 0: #LEFT
player.x += -player.walkSpeed
if keys[pygame.K_d] and player.x + player.walkSpeed + player.width <= width: # RIGHT
player.x += player.walkSpeed
if pygame.mouse.get_pressed()[0]:
shoot()
updateScreen()
main()
classes.py:
import pygame
import math
import os
pygame.init()
width,pygame.FULLSCREEN)
# Import Sprites
PLAYERSPRITE = pygame.image.load(os.path.join("assets","gunner_class.png"))
BULLETSPRITE = pygame.image.load(os.path.join("assets","bullet.png"))
class Player:
def __init__(self,x,y,width,height,img):
self.x = x
self.y = y
self.width = width
self.height = height
self.img = img
self.walkSpeed = 5
self.cooldown = 100
def draw(self,window):
window.blit(PLAYERSPRITE,(self.x,self.y))
class Projectile:
def __init__(self,radius):
self.x = x
self.y = y
self.radius = radius
def draw(self,window):
# pygame.draw.circle(window,self.color,self.y),self.radius)
window.blit(BULLETSPRITE,self.y))
解决方法
项目符号通过x=0
时不会被删除,这仅仅是因为您没有将它们选在“ bad-x”上,因为“ else pop”子句仅在“ bad-y”上被调用。很容易解决:
def playerBulletUpdates():
for bullet in bullets:
if bullet.x >= 0 and bullet.x <= width and \
bullet.y >= 0 and bullet.y <= height:
...
else:
# Bullet has gone off-screen
bullets.pop(bullets.index(bullet))
鼠标移动现有项目符号的原因是,在同一循环中,您需要重新计算每项目符号的方向矢量,而不仅仅是重新计算新的项目符号。
您的Projectile
类需要在初始化期间存储其方向向量-每个子弹一个,因为每个子弹可能不同。因此,我将在此处重新构造构造函数,然后添加一个update()
函数来处理继续的运动。
class Projectile:
def __init__(self,x,y,dx,dy,radius):
self.x = x
self.y = y
self.radius = radius
self.dx = dx
self.dy = dy
def draw(self,window):
# pygame.draw.circle(window,self.color,(self.x,self.y),self.radius)
window.blit(BULLETSPRITE,self.y))
def update( self ):
""" Move the projectile along its path """
self.x += self.dx
self.y += self.dy
shoot()
现在计算方向向量〜
def shoot( mousex,mousey,player ):
""" Creates a player's bullets """
global shotTimer
if now - shotTimer >= player.cooldown:
global bulletVel
xDiff = mousex - player.x
yDiff = mousey - player.y
angle = math.atan2(yDiff,xDiff)
# Direction of travel
changeX = math.cos(angle) * bulletVel
changeY = math.sin(angle) * bulletVel
# Start position
new_bullet_x = round(player.x + player.width / 2)
new_bulley_y = round(player.y + player.height / 2)
bullets.append( Projectile( new_bullet_x,new_bulley_y,changeX,changeY,6))
shotTimer = now
使子弹更新功能也更加简单:
def playerBulletUpdates():
for bullet in bullets:
if bullet.x >= 0 and bullet.x <= width and bullet.y >= 0 and bullet.y <= height:
# Move the bullet
bullet.update()
else:
# Bullet has gone off-screen
bullets.pop(bullets.index(bullet))
正在更改这些内容。可能是worthwhile investigating PyGame Rect
个对象使用了它们的定位,而不是离散的x
和y
,因为这样可以访问出色的碰撞函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。