我正在尝试使用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, 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()
classes.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()
现在计算方向vecotor〜
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))
当您更改这些内容时。使用PyGame Rect
对象的位置而不是离散的x
和来研究PyGame对象可能是值得的y
,因为这将提供出色的碰撞功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句