Python和Pygame射击

3

我正在使用pygame制作一款游戏。目前,玩家可以四处走动,在屏幕上随机生成50个蓝色方块,玩家可以走动并射击它们,但有一个问题是玩家只能向上射击。我想让玩家朝着鼠标射击,但在实现时遇到了一些困难。

以下是我的代码:

import pygame
from pygame import *
import random


black = ( 0, 0, 0)
white = ( 255, 255, 255)
red = ( 255, 0, 0)
blue = ( 0, 0, 255)

player_x, player_y = 0, 0
move_player_x, move_player_y = 0, 0


class Block(pygame.sprite.Sprite):

    def __init__(self, color):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([20, 15])
        self.image.fill(color)

        self.rect = self.image.get_rect()


class Player(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([20,20])
        self.image.fill(red)

        self.rect = self.image.get_rect()
    def update(self):

        pos = pygame.mouse.get_pos()


        self.rect.x = player_x
        self.rect.y = player_y

class Bullet(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([4, 10])
        self.image.fill(black)

        self.rect = self.image.get_rect()
    def update(self):



        self.rect.y -= 5


pygame.init()


screen_width = 700
screen_height = 400
screen = pygame.display.set_mode([screen_width,screen_height])


all_sprites_list = pygame.sprite.Group()


block_list = pygame.sprite.Group()


bullet_list = pygame.sprite.Group()


for i in range(50):

    block = Block(blue)


    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(350)

    block_list.add(block)
    all_sprites_list.add(block)


player = Player()
all_sprites_list.add(player)


done = False


clock = pygame.time.Clock()

score = 0
player.rect.y = 370

# -------- Main Program Loop -----------
while not done:

    # --- Event Processing
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        elif event.type == pygame.MOUSEBUTTONDOWN:

            bullet = Bullet()

            bullet.rect.x = player.rect.x
            bullet.rect.y = player.rect.y

            all_sprites_list.add(bullet)
            bullet_list.add(bullet)

    if event.type== pygame.KEYDOWN:    
        if event.key==K_a:
                move_player_x=-1
        elif event.key==K_d:
                move_player_x=+1
        elif event.key==K_w:
                move_player_y=-1
        elif event.key==K_s:
                move_player_y=+1
    if event.type== pygame.KEYUP:
        if event.key==K_a:
                move_player_x=0
        elif event.key==K_d:
                move_player_x=0
        elif event.key==K_w:
                move_player_y=0
        elif event.key==K_s:
                move_player_y=0

    # --- Game logic




    all_sprites_list.update()

    player_x += move_player_x
    player_y += move_player_y



    for bullet in bullet_list:


        block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)


        for block in block_hit_list:
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            score += 1
            print( score )


        if bullet.rect.y < -10:
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)




    screen.fill(white)


    all_sprites_list.draw(screen)


    pygame.display.flip()


    clock.tick(20)

pygame.quit()

这是代码,请帮忙看一下,非常感谢。


漂亮格式化的代码 - 你应该为pygame.init()、mainloop和其余部分创建Game类 :) - furas
1个回答

3

这是我想出来的,我修改了我和朋友正在制作的角色扮演游戏中的一些代码。

将你的子弹类代码更改为以下内容:

class Bullet(pygame.sprite.Sprite):

    def __init__(self, mouse, player):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([4, 10])
        self.image.fill(black)

        self.mouse_x, self.mouse_y = mouse[0], mouse[1]
        self.player = player

        self.rect = self.image.get_rect()
    def update(self):

        speed = 4.
        range = 200
        distance = [self.mouse_x - self.player[0], self.mouse_y - self.player[1]]
        norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2)
        direction = [distance[0] / norm, distance[1 ] / norm]
        bullet_vector = [direction[0] * speed, direction[1] * speed]


        self.rect.x -= bullet_vector[0]
        self.rect.y -= bullet_vector[1]

现在,它将玩家位置和鼠标点击位置作为类的参数。
这个数学有点复杂,但基本上是从两个点中取向量并得到方向,然后朝那个方向发射子弹。
当你创建一个新的子弹实例时,请像这样调用它:
 bullet = Bullet(pygame.mouse.get_pos(), [player.rect.x, player.rect.y])

当鼠标按钮被点击时,类将获得两个点数!

当您运行它时,您可能会注意到子弹的移动方向与鼠标点击相反,这会增加一些挑战。如果需要,您可以更改它。

P.S. 可以调整speed变量!哦,还有需要导入math模块。


干得好!我也在写同样的答案。但是你可以把大部分计算移到__init__函数中。 - furas
哦,没错!谢谢你! - Serial
1
如果你将速度设置为“-4.0”,它会朝着鼠标点击的方向移动。祝你在游戏的其余部分好运! - Serial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接