第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

我怎樣才能讓敵人向玩家移動(dòng)并在pygame中預(yù)測它的路徑

我怎樣才能讓敵人向玩家移動(dòng)并在pygame中預(yù)測它的路徑

翻翻過去那場雪 2022-12-20 16:40:47
我正在制作一個(gè) pygame 游戲,我希望我的敵人跟隨玩家并預(yù)測它的路徑。我不只是想縮短玩家和敵人之間的距離。敵人的數(shù)量會(huì)根據(jù)等級而定,每升3級就會(huì)增加一個(gè)新的敵人。我附上了我的整個(gè)代碼和一張截圖,顯示我的敵人目前正在直線移動(dòng)。
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊

為此你需要一些矢量數(shù)學(xué),所以我建議重構(gòu)你的代碼并學(xué)習(xí)如何使用Sprites;你可以在這里找到一個(gè)例子。

要找到問題的答案(“預(yù)測路徑”),您可以在 google 上搜索intercept vectoror pursuit vector。那應(yīng)該會(huì)產(chǎn)生一些結(jié)果,例如如何計(jì)算截距的向量?計(jì)算攔截矢量。

例如,我翻譯了第二個(gè)問題的最后一個(gè)答案并將其復(fù)制/粘貼到我的一個(gè)答案中,因?yàn)?a) 我懶得再寫一遍 b) 有一個(gè)代碼點(diǎn)我必須更改才能實(shí)現(xiàn)攔截邏輯(EnemyController類)。

import pygame

import random

import math

from pygame import Vector2


SPRITE_SHEET = None


GREEN_SHIP  = pygame.Rect(0, 292, 32, 32)

RED_SHIP    = pygame.Rect(0, 324, 32, 32)

BLUE_SHIP   = pygame.Rect(0, 356, 32, 32)

YELLOW_SHIP = pygame.Rect(0, 388, 32, 32)



class EnemyController:


    def __init__(self, target):

        self.direction = Vector2(1, 0)

        self.target = target


    def update(self, sprite, events, dt):

        k = self.target.vel.magnitude() / sprite.speed;


        distance_to_target = (sprite.pos - self.target.pos).magnitude()


        b_hat = self.target.vel

        c_hat = sprite.pos - self.target.pos


        CAB = b_hat.angle_to(c_hat)

        ABC = math.asin(math.sin(CAB) * k)

        ACB = math.pi - (CAB + ABC)


        j = distance_to_target / math.sin(ACB)

        a = j * math.sin(CAB)

        b = j * math.sin(ABC)


        time_to_collision = b / self.target.vel.magnitude() if self.target.vel.magnitude() > 0 else 1

        collision_pos = self.target.pos + (self.target.vel * time_to_collision)


        v = sprite.pos - collision_pos

        if v.length() > 0:

            sprite.direction = -v.normalize()


        if v.length() <= 10:

            sprite.pos = pygame.Vector2(400, 100)


class PlayerController:


    movement = {

        pygame.K_UP:    Vector2( 0, -1),

        pygame.K_DOWN:  Vector2( 0,  1),

        pygame.K_LEFT:  Vector2(-1,  0),

        pygame.K_RIGHT: Vector2( 1,  0)

    }


    def update(self, sprite, events, dt):

        pressed = pygame.key.get_pressed()

        v = Vector2(0, 0)

        for key in PlayerController.movement:

            if pressed[key]:

                v += PlayerController.movement[key]


        sprite.direction = v


        for e in events:

            if e.type == pygame.KEYDOWN:

                if e.key == pygame.K_SPACE:

                    sprite.groups()[0].add(Explosion(sprite.pos))


class Animation:

    def __init__(self, frames, speed, sprite):

        self.sprite = sprite

        self.speed = speed

        self.ticks = 0

        self.frames = frames

        self.running = 0

        self.start()


    def cycle_func(self, iterable):

        saved = []

        for element in iterable:

            yield element

            saved.append(element)

        if hasattr(self.sprite, 'on_animation_end'):

            self.sprite.on_animation_end()

        while saved:

            for element in saved:

                yield element

            if hasattr(self.sprite, 'on_animation_end'):

                self.sprite.on_animation_end()

    def stop(self):

        self.running = 0

        if self.idle_image:

            self.sprite.image = self.idle_image


    def start(self):

        if not self.running:

            self.running = 1

            self.cycle = self.cycle_func(self.frames)

            self.sprite.image = next(self.cycle)


    def update(self, dt):

        self.ticks += dt

        if self.ticks >= self.speed:

            self.ticks = self.ticks % self.speed

            if self.running:

                self.sprite.image = next(self.cycle)


class AnimatedSprite(pygame.sprite.Sprite):


    def __init__(self, pos, frames, speed):

        super().__init__()

        self.animation = Animation(frames, speed, self)

        self.rect = self.image.get_rect(center=pos)

        self.pos = Vector2(pos)

        self.animation.start()


    def update(self, events, dt):

        self.animation.update(dt)


class Explosion(AnimatedSprite):


    frames = None


    def __init__(self, pos):

        if not Explosion.frames:

            Explosion.frames = parse_sprite_sheet(SPRITE_SHEET, pygame.Rect(0, 890, 64, 64), 6, 4)


        super().__init__(pos, Explosion.frames, 50)


    def on_animation_end(self):

        self.kill()


class DirectionalImageSprite(pygame.sprite.Sprite):


    directions = [(1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1),(0,1),(1,1),(0,0)]


    def __init__(self, pos, directional_images_rect):

        super().__init__()

        images = parse_sprite_sheet(SPRITE_SHEET, directional_images_rect, 9, 1)

        self.images = { x: img for (x, img) in zip(DirectionalImageSprite.directions, images) }

        self.direction = Vector2(0, 0)

        self.image = self.images[(self.direction.x, self.direction.y)]

        self.rect = self.image.get_rect(center=pos)

        self.pos = pygame.Vector2(pos)


class SpaceShip(DirectionalImageSprite):


    def __init__(self, pos, controller, directional_images_rect):

        super().__init__(pos, directional_images_rect)

        self.controller = controller

        self.speed = 2

        self.vel = pygame.Vector2(0, 0)


    def update(self, events, dt):

        super().update(events, dt)


        if self.controller:

            self.controller.update(self, events, dt)


        self.vel = Vector2(0, 0)

        if (self.direction.x, self.direction.y) in self.images:

            self.image = self.images[(self.direction.x, self.direction.y)]

        if self.direction.length():

            self.vel = self.direction.normalize() * self.speed

            self.pos += self.vel


        self.rect.center = int(self.pos[0]), int(self.pos[1])


def parse_sprite_sheet(sheet, start_rect, frames_in_row, lines):

    frames = []

    rect = start_rect.copy()

    for _ in range(lines):

        for _ in range(frames_in_row):

            frame = sheet.subsurface(rect)

            frames.append(frame)

            rect.move_ip(rect.width, 0)

        rect.move_ip(0, rect.height)

        rect.x = start_rect.x

    return frames


def main():

    screen = pygame.display.set_mode((800, 600))

    global SPRITE_SHEET

    SPRITE_SHEET = pygame.image.load("ipLRR.png").convert_alpha()

    clock = pygame.time.Clock()

    dt = 0

    player = SpaceShip((400, 300), PlayerController(), YELLOW_SHIP)

    enemy = SpaceShip((400, 100), EnemyController(player), GREEN_SHIP)

    enemy.speed = 4

    all_sprites = pygame.sprite.Group(

        player,

        enemy

    )


    while True:

        events = pygame.event.get()


        for e in events:

            if e.type == pygame.QUIT:

                return


        all_sprites.update(events, dt)


        screen.fill((0, 0, 0))

        all_sprites.draw(screen)

        pygame.display.flip()

        dt = clock.tick(120)


main()


https://i.stack.imgur.com/lapWw.gif


查看完整回答
反對 回復(fù) 2022-12-20
  • 1 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)