python and pygame shooting

若如初见. 提交于 2020-01-01 14:44:52

问题


I am working on a game in pygame, so far the player can walk around, 50 blue blocks spawn randomly on the screen and the player can walk around and shoot them, but there is one problem the player can only shoot up, I want the player to shoot towards the mouse but am having some trouble getting it to do this.

this is my code

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()

so there the code, any help is much appreciated


回答1:


here is what i came up with, I changed some code from an RPG me and a friend are making

Change your bullet class code to this:

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]

now it takes the players pos and the mouse click pos as arguments for the class

the math is a bit confusing but it basically take the vector from the two points and gets a direction and sends the bullet that way

when you create a new bullet instance call it like this:

 bullet = Bullet(pygame.mouse.get_pos(), [player.rect.x, player.rect.y])

that way the class gets the two points when the mouse button is clicked!

when you run it you may notice that the bullet goes in the opposite direction of the mouse click thought that would add some challenge. You can change it if you need

P.S. the speed variable can be adjusted! Oh, and the math module needs to be imported



来源:https://stackoverflow.com/questions/19888478/python-and-pygame-shooting

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!