pygame发射子弹后绘制射线

在这里插入图片描述

import pygame
import sys
import math

pygame.init()

screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Rotate and Shoot Bullets")

# 定义子弹类
class Bullet:
    def __init__(self, x, y, angle):
        self.x = x
        self.y = y
        self.angle = angle
        self.speed = 5

    def update(self):
        rad_angle = math.radians(self.angle)
        self.x =self.x+  math.cos(rad_angle)*5
        self.y = self.y-  math.sin(rad_angle)*5

    def draw(self):
        p=pygame.draw.rect(screen, (255, 0, 0), (int(self.x), int(self.y),6,6))
        if (p.collidelistall(qsz)):  # 碰撞检测
            xiansz.clear()  # 先清空数组,前面有初始化
            # self.endx, self.endy = self.x, self.y
            xiansz.append((self.x, self.y))  # 使用对象外的数组,要是对象自己的变量,在碰撞后会覆盖碰撞位置的x,y

q = [
    [1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1]
     ]
qsz=[]
bullets = []  # 子弹列表
player_x, player_y = 400, 300  # 玩家位置初始值
player_angle = 0  # 玩家初始角度
c=pygame.time.Clock()
xiansz=[(0,0)]
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_angle += 1  # 左箭头键逆时针旋转
    elif keys[pygame.K_RIGHT]:
        player_angle -= 1  # 右箭头键顺时针旋转
    elif keys[pygame.K_SPACE]:
        bullets.append(Bullet(player_x, player_y, player_angle))  # 空格键发射子弹

    screen.fill((255, 255, 255))  # 清空屏幕
    c.tick(70)

    for h in range(len(q)):#画墙
        #print(q[h],"行",h)
        for g in range(len(q[h])):
            if q[h][g]==1:
                #print(q[h][g],"个",g,h)
                pz=pygame.draw.rect(screen, (140, 240, 40), (100+h*60, 100+g*60, 60, 60))
                qsz.append(pz)

    for bullet in bullets:
        bullet.update()
        bullet.draw()

    for i in (bullets):#画射线

        pygame.draw.line(screen, (40, 140, 40), (player_x, player_y), (xiansz[0]))

        p=pygame.math.Vector2(player_x,player_y)#角色位置
        p1=pygame.math.Vector2(xiansz[0])#碰撞点x,y
        juli=p.distance_to(p1)#计算距离,其实有距离后不用再画射线,后面画墙,画射线是为了理解
    pygame.display.flip()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值