Стрельба по пигмею к локации - PullRequest
0 голосов
/ 07 февраля 2019

Я пытался реализовать функцию в игре, которую я делаю (на основе Царства Безумного Бога), где вы можете стрелять там, где нажимаете.Чтобы сделать это, я пытался использовать Пифагор и правило треугольников с наклоном или разбегом, чтобы выяснить, как далеко х и у должны проходить каждый раз, чтобы сохранять постоянный темп и оставаться в этом темпе каждый раз, когда я нажимаю.Куда бы я ни посмотрел, люди используют angles и python 2, в то время как сейчас я работаю над python 3, поэтому совместимость кода была более сложной, чем просто вопрос.Мой код использует классы для создания препятствий и текстур.Я использую массивы, чтобы хранить и создавать маркеры внутри игрового шлейфа и рисовать их на экране, используя функцию прямоугольника Pygames.См. Ниже мой код (не весь код включен).

import pygame, random, time
pygame.init()
shoot= []

class Projectiles(object):
    def __init__(self, pos):
        self.rect = pygame.Rect(pos[0], pos[1], 20, 20)
        shoot.append(self)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                quit()

            if event.key == pygame.K_a:
                movement_status = pcharl
                x_change = 5
            if event.key == pygame.K_w:
                movement_status = pcharb
                y_change = 5
            if event.key == pygame.K_s:
                movement_status = pchar
                y_change = -5
            if event.key == pygame.K_d:
                movement_status = pcharr
                x_change = -5
            if event.key == pygame.K_e:
                pygame.display.toggle_fullscreen()

            if event.key == pygame.K_SPACE:
                shooting = True
                if movement_status == pcharl:
                    Projectiles((x, y))
                    direction = "left"
                    bx_change = -8
                    shooting = True
                if movement_status == pcharr:
                    Projectiles((x+30, y))
                    direction = "right"
                    bx_change = 8
                    shooting = True
                if movement_status == pcharb:
                    Projectiles((x + 30, y))
                    direction = "up"
                    by_change = -8
                    shooting = True
                if movement_status == pchar:
                    Projectiles((x + 30, y))
                    direction = "down"
                    by_change = 8
                    shooting = True
        if event.type == pygame.KEYUP:
            x_change = 0
            y_change = 0
        if event.type == pygame.MOUSEBUTTONDOWN:
            xm,ym = pygame.mouse.get_pos()
            shooting_arr = True
            if movement_status == pchar:
                Projectiles((x + 60, y))
                bullx = 560
            if movement_status == pcharb:
                Projectiles((x + 60, y))
                bullx = 560
            if movement_status == pcharr:
                Projectiles((x + 60, y))
                bullx = 560
            if movement_status == pcharl:
                Projectiles((x, y))
                bullx = 500
            for bullet in shoot:
                pygame.draw.rect(screen, (255, 100, 0), bullet.rect)
                xm = xm - bullx
                ym = ym - 500
                if xm % 2 == 0 and ym % 2 == 0:
                    xm = xm / 2
                    ym = ym / 2
                    xm = xm / ym
                    ym = ym / xm
                bx_change = xm
                by_change = ym
                print(str(xm) + " " + str(ym))
                xm = 0
                ym = 0
                shooting = True
    screen.fill((225, 50, 25))

    if shooting:
        for bullet in shoot:
            pygame.draw.rect(screen, (255, 0, 255), bullet.rect)
            bullet.rect.x += bx_change
            bullet.rect.y += by_change
            if bullet.rect.x <= 0:
                shoot.remove(bullet)
            if bullet.rect.x >= 1000:
                shoot.remove(bullet)
            if bullet.rect.y <= 0:
                shoot.remove(bullet)
            if bullet.rect.y >= 1000:
                shoot.remove(bullet)

x и y равны 500, размер экрана 1000x1000

1 Ответ

0 голосов
/ 07 февраля 2019

Создание вектора путем вычитания положения игрока из положения курсора мыши.Затем используйте этот вектор для перемещения ваших снарядов, добавив его в положение снарядов.

Вот простой пример:

import pygame
import math

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.image.fill((0, 0, 0))
        self.image.set_colorkey((0, 0, 0))
        pygame.draw.polygon(self.image, pygame.Color('dodgerblue'), ((0, 0), (16, 32), (32, 0)))
        self.org_image = self.image.copy()
        self.rect = self.image.get_rect(center=(200, 200))
        self.direction = pygame.Vector2(0, 1)

    def update(self, events, dt):
        for e in events:
            if e.type == pygame.MOUSEBUTTONDOWN:
                self.groups()[0].add(Projectile(self.rect.center, self.direction))


        self.direction = pygame.Vector2(pygame.mouse.get_pos()) - self.rect.center
        self.image = pygame.transform.rotate(self.org_image, math.degrees(math.atan2(*self.direction)))
        self.rect = self.image.get_rect(center=self.rect.center)

class Projectile(pygame.sprite.Sprite):
    def __init__(self, pos, direction):
        super().__init__()
        self.image = pygame.Surface((8, 8))
        self.image.fill((0, 0, 0))
        self.image.set_colorkey((0, 0, 0))
        pygame.draw.circle(self.image, pygame.Color('orange'), (4, 4), 4)
        self.rect = self.image.get_rect(center=pos)
        self.direction = direction.normalize()
        self.pos = pygame.Vector2(self.rect.center)

    def update(self, events, dt):
        self.pos += self.direction * dt
        self.rect.center = self.pos
        if not pygame.display.get_surface().get_rect().contains(self.rect):
            self.kill()

def main():
    pygame.init()
    screen = pygame.display.set_mode((500, 500))
    sprites = pygame.sprite.Group(Player())
    clock = pygame.time.Clock()
    dt = 0

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        sprites.update(events, dt)
        screen.fill((30, 30, 30))
        sprites.draw(screen)
        pygame.display.update()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()

enter image description here

...