Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2019, 13:09   #1
Shypz
Новичок
Джуниор
 
Регистрация: 04.08.2019
Сообщений: 1
По умолчанию Реализация стрельбы в Pygame

Нужно, чтобы при нажатии лкм появлялась пуля рядом с игроком и летела в точку нажатия. Однако пуля летит то выше, то ниже точки нажатия, а иногда туда, куда нужно. Помогите, пожалуйста.
Код:
import pygame
import random
import time
import math

w = 1200
h = 600
fps = 60
a = -10
b = 15
bulletspeedx = 5
bulletspeedy = 5
wp = 25
hp = 50
wb = 10
hb = 10
fixspeed = 20




WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, speedx, speedy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((wb, hb))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speedx = speedx
        self.speedy = speedy

    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.bottom < 0 or self.rect.right < 0 or self.rect.top > h or self.rect.left > w:
            self.kill()



class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((20, 40))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(w/2, w)
        self.rect.y = random.randrange(10, h)
        self.speedy = 0
        self.speedx = 0

    def update(self):
        self.rect.y += self.speedy
        self.rect.x += self.speedx
        if self.rect.top > h+10 or self.rect.left < -10 or self.rect.right > w + 10:
            self.rect.x = random.randrange(w - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(5, 8)



class Player(pygame.sprite.Sprite):
    def __init__(self):
        key = pygame.key.get_pressed()
        mouse = pygame.mouse.get_pressed()
        pos = pygame.mouse.get_pos()
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((wp, hp))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.left = 0
        self.rect.bottom = h - (hp/2)
        self.speedy = 0
        self.i = 0
        self.isjump = False
        self.a = 0
        self.b = 0
        self.t = 0
        self.c = 0



    def update(self):
        key = pygame.key.get_pressed()
        mouse = pygame.mouse.get_pressed()
        pos = pygame.mouse.get_pos()
        self.speedx = 0
        if self.isjump == False:
            self.speedy = b
        if key[pygame.K_LEFT] and key[pygame.K_LSHIFT]:
            self.speedx = -12
        elif key[pygame.K_LEFT]:
            self.speedx = -10
        if key[pygame.K_RIGHT] and key[pygame.K_LSHIFT]:
            self.speedx = 12
        elif key[pygame.K_RIGHT]:
            self.speedx = 10

        if self.rect.right > w-40:
            self.rect.right = w-40
        if self.rect.left < 0+40:
            self.rect.left = 0+40
        if self.rect.bottom > h-40:
            self.rect.bottom = h-40
            player.i = 0   

        self.rect.x += self.speedx
        self.rect.y += self.speedy

        if self.speedy == a:
            self.i += 1
        if self.i == 15:
            self.isjump = False
            self.i -= 3
        if self.i == 0:
            self.isjump = True

    def Shoot(self):
        posx = pygame.mouse.get_pos()[0]
        posy = pygame.mouse.get_pos()[1]
    
        if posx > self.rect.centerx:
            self.a = posx - self.rect.right
            self.b = self.rect.centery - posy
            self.c = math.hypot(self.a, self.b)
            self.t = self.c/fixspeed
            speedx = self.a/self.t 
            speedy = -self.b/self.t 
            bullet = Bullet(self.rect.right, self.rect.centery, speedx, speedy)
            sprites.add(bullet)
            bullets.add(bullet)
            
        else:
            bullet = Bullet(self.rect.left, self.rect.centery)
            sprites.add(bullet)
            bullets.add(bullet)





# Создаем игру и окно
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((w, h))
pygame.display.set_caption("Game")
clock = pygame.time.Clock()

bullets = pygame.sprite.Group()
mobs = pygame.sprite.Group()
sprites = pygame.sprite.Group()
player = Player()
sprites.add(player)

for i in range(2):
    mob = Mob()
    sprites.add(mob)
    mobs.add(mob)








# Цикл игры
running = True
while running:

    clock.tick(fps)

    # Ввод процесса (события)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                player.Shoot()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if player.isjump:
                    player.speedy = a
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                player.speedy = b
                player.isjump = False



    # Обновление
    sprites.update()

    playerhits = pygame.sprite.spritecollide(player, mobs, False)
    bullethits = pygame.sprite.groupcollide(bullets, mobs, True, True)
    if playerhits:
        running = False
    for hit in bullethits:
        mob = Mob()
        sprites.add(mob)
        mobs.add(mob)

    # Рендеринг
    screen.fill(GREEN)
    sprites.draw(screen)
    pygame.display.flip()

pygame.quit()
Shypz вне форума Ответить с цитированием
Старый 12.01.2021, 19:10   #2
kaFoc
Новичок
Джуниор
 
Регистрация: 12.01.2021
Сообщений: 1
По умолчанию

Код:
def Shoot (self):
        pos_x = pygame.mouse.get_pos()[0]
        pos_y = pygame.mouse.get_pos()[1]

        if pos_x != self.rect.centerx or pos_y != self.rect.centery:
            self.a = pos_x - self.rect.centerx
            self.b = self.rect.centery - pos_y
            self.c = math.hypot(self.a, self.b)
            self.t = self.c/self.speed
            speed_x = self.a/self.t
            speed_y = -self.b/self.t
            bullet = Bullet(self.rect.centerx, self.rect.centery, speed_x, speed_y)
            sprites.add(bullet)
            bullets.add(bullet)

        else:
            bullet = Bullet(self.rect.centerx, self.rect.centery, 0, 50)
            sprites.add(bullet)
            bullets.add(bullet)
kaFoc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
игра Python pygame РезедаМуратова Python 5 28.05.2018 12:32
Реализация стрельбы в шутерах. ShiroAkuma Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 11.09.2015 09:26
Вопрос: Параллельные алгоритмы. Реализация стрельбы. MooNDeaR Gamedev - cоздание игр: Unity, OpenGL, DirectX 23 06.08.2011 16:04