敌人的射击玩家2次而不是1次。但是我只想要1颗子弹而不是2颗

2024-05-14 17:09:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python/pygame的初学者,这里是新的页面。我有以下问题: 我的玩家等级达到敌人等级的探测半径! 每2秒向玩家射击一次,但不是一颗子弹,而是一次两颗,或者偏移0.1秒! 但我只想要一颗子弹而不是两颗! 我从创建者那里得到的代码:Kidscancode(https://www.youtube.com/channel/UCNaPQ5uLX5iIEHUCLmfAgKg)! 不幸的是,他没有回复我一个月前发的邮件! 你能看看我的密码告诉我哪里出错了吗? (来自德国,有翻译)

敌人克拉斯:

import pygame as pg
from settings import *
from sprites import *
from random import randint, uniform
vec = pg.math.Vector2

class Mob(pg.sprite.Sprite):
    def __init__(self, game, x, y):
        self.groups = game.all_sprites, game.mobs
        pg.sprite.Sprite.__init__(self, self.groups)
        self.game = game
        self.image = pg.Surface((140, 20))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)
        self.pos = vec(x, y) * TILESIZE
        self.rect.x = x * TILESIZE
        self.rect.y = y * TILESIZE
        self.rotate_time = pg.time.get_ticks()

        self.target = game.player
        self.health = MOB_HEALTH

        self.last_shot = 0

    def shoot(self):
        Mob_bullet(self.game)

    def rotate(self,angle):
        now = pg.time.get_ticks()
        if now - self.rotate_time > 50:
            self.rotate_time = pg.time.get_ticks()
            newimage = pg.transform.rotate(self.image, angle)
            oldcenter = self.rect.center
            self.image = newimage
            self.rect = self.image.get_rect()
            self.rect.center = oldcenter

    def update(self):
         target_dist = self.target.pos - self.pos
         if target_dist.length_squared() < DETECT_RADIUS ** 2:
             now = pg.time.get_ticks()
             if now - self.last_shot > MOB_BULLET_RATE:
                 self.last_shot = now
                 self.shoot()


class Mob_bullet(pg.sprite.Sprite):
    def __init__(self, game):
        self.groups = game.all_sprites
        pg.sprite.Sprite.__init__(self, self.groups)
        self.game = game
        self.image = pg.Surface((10, 10))
        self.image.fill(ORANGE)
        self.rect = self.image.get_rect()
        self.pos = vec(800, 400)
        self.vel = vec(MAX_SPEED, 0).rotate(uniform(0, 180))
        self.acc = vec(0, 0)
        self.rect.center = self.pos

        "'spawntime ist wichtig für Lifetime der Bullets!'"
        self.spawn_time = pg.time.get_ticks()



    def seek(self, target):
        self.desired = (target - self.pos).normalize() * MAX_SPEED
        steer = (self.desired - self.vel)
        if steer.length() > SEEK_FORCE:
            steer.scale_to_length(SEEK_FORCE)
        return steer


    def update(self):
        "'Geschwindigkeit = suche nach(Target)'"
        self.acc = self.seek(self.game.player.pos)

        "'Bewegungsgleichung'"
        self.vel += self.acc
        if self.vel.length() > MAX_SPEED:
            self.vel.scale_to_length(MAX_SPEED)
        self.pos += self.vel

        self.rect.center = self.pos

        "'Kollission mit Walls'"
        if pg.sprite.spritecollideany(self, self.game.walls):
            self.kill()

        "'Lebenszeit von Bullets'"
        if pg.time.get_ticks() - self.spawn_time > MOB_BULLET_LIFETIME:
            self.kill()

主文件的一部分:

 class Game:
        def new(self):
        self.all_sprites = pg.sprite.Group()
        .......
        self.Mob_bullets = pg.sprite.Group()

设置文件的一部分:

 "'Bullet-Settings'"
 MOB_BULLET_LIFETIME = 5000
 MOB_BULLET_RATE = 2000
 MOB_BULLET_DMG = 20
 MAX_SPEED = 5
 SEEK_FORCE = 3

我无法传递错误消息,因为游戏正常。 我学习python(我的第一种编程语言)才3个月。请不要使用太多的技术术语;)!你知道吗

还有一件事,这不是一个显示错误,有2个子弹(矩形)出来,这是计数!你知道吗


Tags: posrectimageselfgametargetgetif
2条回答

我建议在触发事件时将信息打印到控制台。如果你每次发射子弹时都打印环境变量,那可能会给你一些线索。当满足某些条件时,您还可以打印“玩家在范围内”之类的消息。您可能会看到一个与您尝试的模式不匹配的模式,这将缩小代码中有错误的部分。你知道吗

发现一个错误。文件中有打字错误地图.txt文件。 而不是一个敌人,我有两个相邻!所以代码是好的!你知道吗

相关问题 更多 >

    热门问题