0

我一直在从 Pygame 迁移到 Arcade,总的来说它好多了。也就是说,我在 Pygame 中为我的汽车游戏绘制轨迹线的方法在 Arcade 中非常落后。我知道绘制所有线条都会滞后,我只是想知道是否有更好的方法来做到这一点不会造成太多滞后。

import arcade
import os
import math
import numpy as np

SPRITE_SCALING = 0.5

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_TITLE = "Move Sprite by Angle Example"

MOVEMENT_SPEED = 5
ANGLE_SPEED = 5


class Player(arcade.Sprite):
    """ Player class """

    def __init__(self, image, scale):
        """ Set up the player """

        # Call the parent init
        super().__init__(image, scale)

        # Create a variable to hold our speed. 'angle' is created by the parent
        self.speed = 0

    def update(self):
        # Convert angle in degrees to radians.
        angle_rad = math.radians(self.angle)

        # Rotate the ship
        self.angle += self.change_angle

        # Use math to find our change based on our speed and angle
        self.center_x += -self.speed * math.sin(angle_rad)
        self.center_y += self.speed * math.cos(angle_rad)

def upgraded_distance_check(player_sprite, point_arrays, distance_cap):
        center_coord = player_sprite.center
        intersect_array = []
        distance_array = []
        sensor_array = player_sprite.points
        for sensor in sensor_array:
            intersect_array.append([-10000, -10000])
            for point_array in point_arrays:
                for i in range(len(point_array[:-1])):

                    v = line_intersection(
                        [sensor, center_coord], [point_array[i], point_array[i + 1]]
                    )
                    if v == (None, None):
                        continue

                    if (
                        (point_array[i][0] <= v[0] and point_array[i + 1][0] >= v[0])
                        or (point_array[i][0] >= v[0] and point_array[i + 1][0] <= v[0])
                    ) and (
                        (point_array[i][1] <= v[1] and point_array[i + 1][1] >= v[1])
                        or (point_array[i][1] >= v[1] and point_array[i + 1][1] <= v[1])
                    ):
                        if intersect_array[-1] is None or math.sqrt(
                            (intersect_array[-1][0] - center_coord[0]) ** 2
                            + (intersect_array[-1][1] - center_coord[1]) ** 2
                        ) > math.sqrt(
                            (v[0] - center_coord[0]) ** 2
                            + (v[1] - center_coord[1]) ** 2
                        ):
                            if not is_between(sensor, center_coord, v):
                                intersect_array[-1] = v

        for i in range(len(sensor_array)):
            if distance(sensor_array[i], intersect_array[i]) > distance_cap:
                intersect_array[i] = None
                distance_array.append(None)
            else:
                distance_array.append(distance(sensor_array[i], intersect_array[i]))

        return intersect_array

class MyGame(arcade.Window):
    """
    Main application class.
    """

    def __init__(self, width, height, title):
        """
        Initializer
        """

        # Call the parent class initializer
        super().__init__(width, height, title)

        # Set the working directory (where we expect to find files) to the same
        # directory this .py file is in. You can leave this out of your own
        # code, but it is needed to easily run the examples using "python -m"
        # as mentioned at the top of this program.
        file_path = os.path.dirname(os.path.abspath(__file__))
        os.chdir(file_path)

        # Variables that will hold sprite lists
        self.player_list = None

        # Set up the player info
        self.player_sprite = None

        # Set the background color
        arcade.set_background_color(arcade.color.WHITE)

    def setup(self):
        """ Set up the game and initialize the variables. """

        # Sprite lists
        self.player_list = arcade.SpriteList()

        # Set up the player
        self.player_sprite = Player(":resources:images/space_shooter/playerShip1_orange.png", SPRITE_SCALING)
        self.player_sprite.center_x = SCREEN_WIDTH / 2
        self.player_sprite.center_y = SCREEN_HEIGHT / 2
        self.player_list.append(self.player_sprite)

        #Setup all the array BS
        self.track_arrays = []
        self.drawing = False

    def on_draw(self):
        """
        Render the screen.
        """

        # This command has to happen before we start drawing
        arcade.start_render()

        # Draw all the sprites.
        # for i, ele in enumerate(self.player_sprite.points):
        #   arcade.draw_circle_filled(ele[0], ele[1], 7, arcade.color.AO)
        self.player_list.draw()
        if len(self.track_arrays) > 0 and len(self.track_arrays[0]) > 2:
            for track_array in self.track_arrays:
                for i in range(len(track_array[:-1])):
                    arcade.draw_line(track_array[i][0], track_array[i][1], track_array[i+1][0], track_array[i+1][1], arcade.color.BLACK, 1)

    def on_update(self, delta_time):
        """ Movement and game logic """

        # Call update on all sprites (The sprites don't do much in this
        # example though.)
        self.player_list.update()
        # print(self.drawing)



        # print(self.player_sprite.points)

    def on_key_press(self, key, modifiers):
        """Called whenever a key is pressed. """

        # Forward/back
        if key == arcade.key.UP:
            self.player_sprite.speed = MOVEMENT_SPEED
        elif key == arcade.key.DOWN:
            self.player_sprite.speed = -MOVEMENT_SPEED

        # Rotate left/right
        elif key == arcade.key.LEFT:
            self.player_sprite.change_angle = ANGLE_SPEED
        elif key == arcade.key.RIGHT:
            self.player_sprite.change_angle = -ANGLE_SPEED

    def on_key_release(self, key, modifiers):
        """Called when the user releases a key. """

        if key == arcade.key.UP or key == arcade.key.DOWN:
            self.player_sprite.speed = 0
        elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
            self.player_sprite.change_angle = 0

    def on_mouse_press(self, x, y, button, modifiers):
        """
        Called when the user presses a mouse button.
        """
        self.track_arrays.append([])
        self.drawing = True



    def on_mouse_release(self, x, y, button, modifiers):
        """
        Called when a user releases a mouse button.
        """
        self.drawing = False

    def on_mouse_motion(self, x, y, dx, dy):
        """ Called to update our objects. Happens approximately 60 times per second."""
        if self.drawing:
            self.track_arrays[-1].append([x,y])


def main():
    """ Main method """
    window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
    window.setup()
    arcade.run()


if __name__ == "__main__":
    main()
4

0 回答 0