- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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
使用它们的定位而不是离散的对象
x
和
y
,因为这将提供出色的碰撞功能。
关于python - 当我移动鼠标时,所有子弹都在移动,而不仅仅是被击中的子弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63385813/
是否可以用按钮替换 ul 元素符号?我知道您可以使用 CSS 更改为图像,但如果我想要一个实际的元素呢? 最佳答案 这不可能如您所问,但您也许可以效仿它: some button textL
我在让元素符号显示在无序列表中时遇到了一些问题。如果我更改 css 以在内部显示元素符号,它们应该向上,但紧挨着文本。我的伙伴想要的是元素符号显示在框架的最左侧,并且在它和文本之间有几个标签值的空间。
我正在使用 the Orbit component of Foundation 5并想知道是否有办法将出现在幻灯片下方的元素符号移动到幻灯片本身的内容区域中。基本上,将元素符号放在图片上方。 有很多
我有一个从 wordpress 帖子生成的 ul li 边栏。客户为每个 LI 的元素符号使用了不同的图像。与其手动添加单独的元素符号,不如从一组(比如说 10 个)选项中进行选择? 正在考虑 Jqu
我有一个带有方向键和 2 个按钮的游戏 handle 。所有这些都是数字的(不是模拟的)。 我有一个处理他们的事件的程序: -(void)gamepadTick:(float)delta {
稍微注释掉后,我发现当我在 JavaScript 中运行此命令时,我的无序列表中的元素符号消失了(每个“页面”都是我的无序列表中的一个元素。): pages[i].style.display = "b
假设我想存储所有子弹,任何人在我的游戏中射击以计算每帧的新位置等。 如果有 10 名玩家,并且每个人的射击速率为每秒 10 次射击,我们可能需要在 10 秒后跟踪 1000 个物体。 我们确实知道,数
这是我所拥有的: import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt
我正在通过 ant-design (antd) 库开发一个 reactjs 元素。我想在我的元素中使用 Carousel 组件。当我将内容的背景色 - 应显示在轮播内 - 设置为#FFF 时,元素符号
我是一名优秀的程序员,十分优秀!