gpt4 book ai didi

python - 当我移动鼠标时,所有子弹都在移动,而不仅仅是被击中的子弹

转载 作者:行者123 更新时间:2023-12-04 09:09:22 25 4
gpt4 key购买 nike

我正在尝试使用 Pygame 制作一个基本的自上而下的射击游戏。我刚刚想出了如何让子弹射向我的鼠标所在的位置,但我现在的问题是,即使在被击中后,只要我移动鼠标,它们就会改变方向。此外,当子弹与屏幕的左边缘碰撞时,它们不会像其他边缘一样消失。
主要.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, 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, 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()
类.py:
import pygame
import math
import os

pygame.init()

width, height = (1440, 900)
win = pygame.display.set_mode((width, height), 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, x, y, radius):
self.x = x
self.y = y
self.radius = radius

def draw(self, window):
# pygame.draw.circle(window, self.color, (self.x, self.y), self.radius)
window.blit(BULLETSPRITE, (self.x, 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.x, 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使用它们的定位而不是离散的对象 xy ,因为这将提供出色的碰撞功能。

关于python - 当我移动鼠标时,所有子弹都在移动,而不仅仅是被击中的子弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63385813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com