3

私は pygame でゲームに取り組んでいます。これまでのところ、プレイヤーは歩き回ることができ、画面上で 50 個の青いブロックがランダムに生成され、プレイヤーは歩き回ってそれらを撃つことができますが、プレイヤーが撃つことしかできない問題が 1 つあります。プレーヤーはマウスに向かって撃つことができますが、これを行うのに問題があります。

これは私のコードです

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

コードがありますので、どんな助けでも大歓迎です

4

1 に答える 1

3

これが私が思いついたものです。私と友人が作成しているRPGからいくつかのコードを変更しました

bullet クラスのコードを次のように変更します。

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]

プレイヤーの pos とマウス クリックの pos をクラスの引数として受け取るようになりました。

数学は少しややこしいですが、基本的には 2 点からベクトルを取得し、方向を取得して弾丸をその方向に送ります。

新しい弾丸インスタンスを作成するときは、次のように呼び出します。

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

そうすれば、マウス ボタンがクリックされたときに、クラスは 2 つのポイントを取得します。

実行すると、弾丸がマウスのクリックとは反対の方向に進むことに気付くかもしれません。必要に応じて変更できます

PSspeed変数は調整できます!ああ、数学モジュールをインポートする必要があります

于 2013-11-10T10:54:56.473 に答える