diff --git a/arcade/__init__.py b/arcade/__init__.py
deleted file mode 100644
index c8b31f5..0000000
--- a/arcade/__init__.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-The Arcade Library
-
-A Python simple, easy to use module for creating 2D games.
-"""
-
-# Error out if we import Arcade with an incompatible version of Python.
-import sys
-
-if sys.version_info[0] < 3 or (sys.version_info[0] == 3 and sys.version_info[1] < 6):
- sys.exit("The Arcade Library requires Python 3.6 or higher.")
-
-try:
- import pyglet_ffmpeg2
-except Exception as e:
- print("Unable to load the ffmpeg library. ", e)
-
-import pyglet
-
-pyglet.options['shadow_window'] = False
-
-from arcade import color
-from arcade import csscolor
-from arcade import key
-from arcade.application import *
-from arcade.arcade_types import *
-from arcade.utils import *
-from arcade.draw_commands import *
-from arcade.buffered_draw_commands import *
-from arcade.geometry import *
-from arcade.physics_engines import *
-from arcade.emitter import *
-from arcade.emitter_simple import *
-from arcade.particle import *
-from arcade.sound import *
-from arcade.sprite import *
-from arcade.sprite_list import *
-from arcade.version import *
-from arcade.window_commands import *
-from arcade.joysticks import *
-from arcade.read_tiled_map import *
-from arcade.isometric import *
-from arcade.text import draw_text
-from arcade.text import create_text
-from arcade.text import render_text
-from arcade import tilemap
diff --git a/arcade/application.py b/arcade/application.py
deleted file mode 100644
index e2f031a..0000000
--- a/arcade/application.py
+++ /dev/null
@@ -1,446 +0,0 @@
-"""
-The main window class that all object-oriented applications should
-derive from.
-"""
-from numbers import Number
-from typing import Tuple
-
-import pyglet.gl as gl
-import pyglet
-
-from arcade.window_commands import (get_viewport, set_viewport, set_window)
-
-MOUSE_BUTTON_LEFT = 1
-MOUSE_BUTTON_MIDDLE = 2
-MOUSE_BUTTON_RIGHT = 4
-
-
-class NoOpenGLException(Exception):
- """
- Exception when we can't get an OpenGL 3.3+ context
- """
- pass
-
-
-class Window(pyglet.window.Window):
- """
- The Window class forms the basis of most advanced games that use Arcade.
- It represents a window on the screen, and manages events.
- """
-
- def __init__(self, width: Number = 800, height: Number = 600,
- title: str = 'Arcade Window', fullscreen: bool = False,
- resizable: bool = False, update_rate=1/60,
- antialiasing: bool = True):
- """
- Construct a new window
-
- :param float width: Window width
- :param float height: Window height
- :param str title: Title (appears in title bar)
- :param bool fullscreen: Should this be full screen?
- :param bool resizable: Can the user resize the window?
- :param float update_rate: How frequently to update the window.
- :param bool antialiasing: Should OpenGL's anti-aliasing be enabled?
- """
- if antialiasing:
- config = pyglet.gl.Config(major_version=3,
- minor_version=3,
- double_buffer=True,
- sample_buffers=1,
- samples=4)
- else:
- config = pyglet.gl.Config(major_version=3,
- minor_version=3,
- double_buffer=True)
-
- try:
- super().__init__(width=width, height=height, caption=title,
- resizable=resizable, config=config)
- except pyglet.window.NoSuchConfigException:
- raise NoOpenGLException("Unable to create an OpenGL 3.3+ context. "
- "Check to make sure your system supports OpenGL 3.3 or higher.")
-
- if antialiasing:
- try:
- gl.glEnable(gl.GL_MULTISAMPLE_ARB)
- except pyglet.gl.GLException:
- print("Warning: Anti-aliasing not supported on this computer.")
-
- if update_rate:
- from pyglet import compat_platform
- if compat_platform == 'darwin' or compat_platform == 'linux':
- # Set vsync to false, or we'll be limited to a 1/30 sec update rate possibly
- self.context.set_vsync(False)
- self.set_update_rate(update_rate)
-
- super().set_fullscreen(fullscreen)
- self.invalid = False
- set_window(self)
- set_viewport(0, self.width, 0, self.height)
- self.current_view = None
-
- def update(self, delta_time: float):
- """
- Move everything. For better consistency in naming, use ``on_update`` instead.
-
- :param float delta_time: Time interval since the last time the function was called in seconds.
-
- """
- try:
- self.current_view.update(delta_time)
- except AttributeError:
- pass
-
- def on_update(self, delta_time: float):
- """
- Move everything. Perform collision checks. Do all the game logic here.
-
- :param float delta_time: Time interval since the last time the function was called.
-
- """
- try:
- self.current_view.on_update(delta_time)
- except AttributeError:
- pass
-
- def set_update_rate(self, rate: float):
- """
- Set how often the screen should be updated.
- For example, self.set_update_rate(1 / 60) will set the update rate to 60 fps
-
- :param float rate: Update frequency in seconds
- """
- pyglet.clock.unschedule(self.update)
- pyglet.clock.schedule_interval(self.update, rate)
- pyglet.clock.unschedule(self.on_update)
- pyglet.clock.schedule_interval(self.on_update, rate)
-
- def on_mouse_motion(self, x: float, y: float, dx: float, dy: float):
- """
- Override this function to add mouse functionality.
-
- :param float x: x position of mouse
- :param float y: y position of mouse
- :param float dx: Change in x since the last time this method was called
- :param float dy: Change in y since the last time this method was called
- """
- pass
-
- def on_mouse_press(self, x: float, y: float, button: int, modifiers: int):
- """
- Override this function to add mouse button functionality.
-
- :param float x: x position of the mouse
- :param float y: y position of the mouse
- :param int button: What button was hit. One of:
- arcade.MOUSE_BUTTON_LEFT, arcade.MOUSE_BUTTON_RIGHT,
- arcade.MOUSE_BUTTON_MIDDLE
- :param int modifiers: Shift/click, ctrl/click, etc.
- """
- pass
-
- def on_mouse_drag(self, x: float, y: float, dx: float, dy: float, buttons: int, modifiers: int):
- """
- Override this function to add mouse button functionality.
-
- :param float x: x position of mouse
- :param float y: y position of mouse
- :param float dx: Change in x since the last time this method was called
- :param float dy: Change in y since the last time this method was called
- :param int buttons: Which button is pressed
- :param int modifiers: Ctrl, shift, etc.
- """
- self.on_mouse_motion(x, y, dx, dy)
-
- def on_mouse_release(self, x: float, y: float, button: int,
- modifiers: int):
- """
- Override this function to add mouse button functionality.
-
- :param float x:
- :param float y:
- :param int button:
- :param int modifiers:
- """
-
- pass
-
- def on_mouse_scroll(self, x: int, y: int, scroll_x: int, scroll_y: int):
- """
- User moves the scroll wheel.
-
- :param int x:
- :param int y:
- :param int scroll_x:
- :param int scroll_y:
- """
- pass
-
- def set_mouse_visible(self, visible: bool = True):
- """
- If true, user can see the mouse cursor while it is over the window. Set false,
- the mouse is not visible. Default is true.
-
- :param bool visible:
- """
- super().set_mouse_visible(visible)
-
- def on_key_press(self, symbol: int, modifiers: int):
- """
- Override this function to add key press functionality.
-
- :param int symbol: Key that was hit
- :param int modifiers: If it was shift/ctrl/alt
- """
- pass
-
- def on_key_release(self, symbol: int, modifiers: int):
- """
- Override this function to add key release functionality.
-
- :param int symbol: Key that was hit
- :param int modifiers: If it was shift/ctrl/alt
- """
- pass
-
- def on_draw(self):
- """
- Override this function to add your custom drawing code.
- """
- pass
-
- def on_resize(self, width: float, height: float):
- """
- Override this function to add custom code to be called any time the window
- is resized.
-
- :param float width: New width
- :param float height: New height
- """
- original_viewport = self.get_viewport()
-
- # unscaled_viewport = self.get_viewport_size()
- # scaling = unscaled_viewport[0] / width
-
- self.set_viewport(original_viewport[0],
- original_viewport[0] + width,
- original_viewport[2],
- original_viewport[2] + height)
-
- def set_min_size(self, width: float, height: float):
- """ Wrap the Pyglet window call to set minimum size
-
- :param float width: width in pixels.
- :param float height: height in pixels.
- """
-
- if self._resizable:
- super().set_minimum_size(width, height)
- else:
- raise ValueError('Cannot set min size on non-resizable window')
-
- def set_max_size(self, width: float, height: float):
- """ Wrap the Pyglet window call to set maximum size
-
- :param float width: width in pixels.
- :param float height: height in pixels.
- :Raises ValueError:
-
- """
-
- if self._resizable:
- super().set_maximum_size(width, height)
- else:
- raise ValueError('Cannot set max size on non-resizable window')
-
- def set_size(self, width: float, height: float):
- """
- Ignore the resizable flag and set the size
-
- :param float width:
- :param float height:
- """
-
- super().set_size(width, height)
-
- def get_size(self) -> Tuple[int, int]:
- """
- Get the size of the window.
-
- :returns: (width, height)
- """
-
- return super().get_size()
-
- def get_location(self) -> Tuple[int, int]:
- """
- Return the X/Y coordinates of the window
-
- :returns: x, y of window location
- """
-
- return super().get_location()
-
- def set_visible(self, visible=True):
- """
- Set if the window is visible or not. Normally, a program's window is visible.
-
- :param bool visible:
- """
- super().set_visible(visible)
-
- def set_viewport(self, left: Number, right: Number, bottom: Number, top: Number):
- """
- Set the viewport. (What coordinates we can see.
- Used to scale and/or scroll the screen.)
-
- :param Number left:
- :param Number right:
- :param Number bottom:
- :param Number top:
- """
- set_viewport(left, right, bottom, top)
-
- def get_viewport(self) -> (float, float, float, float):
- """ Get the viewport. (What coordinates we can see.) """
- return get_viewport()
-
- def test(self, frames: int = 10):
- """
- Used by unit test cases. Runs the event loop a few times and stops.
-
- :param int frames:
- """
- for i in range(frames):
- self.switch_to()
- self.dispatch_events()
- self.dispatch_event('on_draw')
- self.flip()
- self.update(1/60)
-
- def show_view(self, new_view: 'View'):
- if not isinstance(new_view, View):
- raise ValueError("Must pass an arcade.View object to "
- "Window.show_view()")
-
- # Store the Window that is showing the "new_view" View.
- if new_view.window is None:
- new_view.window = self
- elif new_view.window != self:
- raise RuntimeError("You are attempting to pass the same view "
- "object between multiple windows. A single "
- "view object can only be used in one window.")
-
- # remove previously shown view's handlers
- if self.current_view is not None:
- self.remove_handlers(self.current_view)
-
- # push new view's handlers
- self.current_view = new_view
- self.push_handlers(self.current_view)
- self.current_view.on_show()
-
- # Note: After the View has been pushed onto pyglet's stack of event handlers (via push_handlers()), pyglet
- # will still call the Window's event handlers. (See pyglet's EventDispatcher.dispatch_event() implementation
- # for details)
-
- def _create(self):
- super()._create()
-
- def _recreate(self, changes):
- super()._recreate(changes)
-
- def flip(self):
- super().flip()
-
- def switch_to(self):
- super().switch_to()
-
- def set_caption(self, caption):
- super().set_caption(caption)
-
- def set_minimum_size(self, width, height):
- super().set_minimum_size(width, height)
-
- def set_maximum_size(self, width, height):
- super().set_maxiumum_size(width, height)
-
- def set_location(self, x, y):
- super().set_location(x, y)
-
- def activate(self):
- super().activate()
-
- def minimize(self):
- super().minimize()
-
- def maximize(self):
- super().maximize()
-
- def set_vsync(self, vsync):
- super().set_vsync(vsync)
-
- def set_mouse_platform_visible(self, platform_visible=None):
- super().set_mouse_platform_visible(platform_visible)
-
- def set_exclusive_mouse(self, exclusive=True):
- super().set_exclusive_mouse(exclusive)
-
- def set_exclusive_keyboard(self, exclusive=True):
- super().set_exclusive_keyboard(exclusive)
-
- def get_system_mouse_cursor(self, name):
- super().get_system_mouse_cursor(name)
-
- def dispatch_events(self):
- super().dispatch_events()
-
-
-def open_window(width: Number, height: Number, window_title: str, resizable: bool = False,
- antialiasing: bool = True) -> Window:
- """
- This function opens a window. For ease-of-use we assume there will only be one window, and the
- programmer does not need to keep a handle to the window. This isn't the best architecture, because
- the window handle is stored in a global, but it makes things easier for programmers if they don't
- have to track a window pointer.
-
- :param Number width: Width of the window.
- :param Number height: Height of the window.
- :param str window_title: Title of the window.
- :param bool resizable: Whether the window can be user-resizable.
- :param bool antialiasing: Smooth the graphics?
-
- :returns: Handle to window
- :rtype arcade.Window:
- """
-
- global _window
- _window = Window(width, height, window_title, resizable, update_rate=None,
- antialiasing=antialiasing)
- return _window
-
-
-class View:
- """
- TODO:Thoughts:
- - is there a need for a close()/on_close() method?
- """
- def __init__(self):
- self.window = None
-
- def update(self, delta_time: float):
- """To be overridden"""
- pass
-
- def on_update(self, delta_time: float):
- """To be overridden"""
- pass
-
- def on_draw(self):
- """Called when this view should draw"""
- pass
-
- def on_show(self):
- """Called when this view is shown"""
- pass
diff --git a/arcade/arcade_types.py b/arcade/arcade_types.py
deleted file mode 100644
index d15f6e9..0000000
--- a/arcade/arcade_types.py
+++ /dev/null
@@ -1,13 +0,0 @@
-"""
-Module specifying data custom types used for type hinting.
-"""
-from typing import Tuple
-from typing import List
-from typing import Union
-
-RGB = Union[Tuple[int, int, int], List[int]]
-RGBA = Union[Tuple[int, int, int, int], List[int]]
-Color = Union[RGB, RGBA]
-Point = Union[Tuple[float, float], List[float]]
-Vector = Point
-PointList = Union[Tuple[Point, ...], List[Point]]
diff --git a/arcade/buffered_draw_commands.py b/arcade/buffered_draw_commands.py
deleted file mode 100644
index 959c5a5..0000000
--- a/arcade/buffered_draw_commands.py
+++ /dev/null
@@ -1,793 +0,0 @@
-"""
-Drawing commands that use vertex buffer objects (VBOs).
-
-This module contains commands for basic graphics drawing commands,
-but uses Vertex Buffer Objects. This keeps the vertices loaded on
-the graphics card for much faster render times.
-"""
-
-import math
-import itertools
-from collections import defaultdict
-import pyglet.gl as gl
-import numpy as np
-
-from typing import Iterable
-from typing import List
-from typing import TypeVar
-from typing import Generic
-
-from arcade.arcade_types import Color
-from arcade.draw_commands import rotate_point
-from arcade.arcade_types import PointList
-from arcade.draw_commands import get_four_byte_color
-from arcade.draw_commands import get_projection
-from arcade.draw_commands import _get_points_for_thick_line
-from arcade import shader
-
-
-class VertexBuffer:
- """
- This class represents a `vertex buffer object`_ for internal library use. Clients
- of the library probably don't need to use this.
-
- Attributes:
- :vbo_id: ID of the vertex buffer as assigned by OpenGL
- :size:
- :width:
- :height:
- :color:
-
-
- .. _vertex buffer object:
- https://en.wikipedia.org/wiki/Vertex_Buffer_Object
-
- """
- def __init__(self, vbo_vertex_id: gl.GLuint, size: float, draw_mode: int, vbo_color_id: gl.GLuint = None):
- self.vbo_vertex_id = vbo_vertex_id
- self.vbo_color_id = vbo_color_id
- self.size = size
- self.draw_mode = draw_mode
- self.color = None
- self.line_width = 0
-
-
-class Shape:
- def __init__(self):
- self.vao = None
- self.vbo = None
- self.program = None
- self.mode = None
- self.line_width = 1
-
- def draw(self):
- # program['Projection'].write(get_projection().tobytes())
-
- with self.vao:
- assert(self.line_width == 1)
- gl.glLineWidth(self.line_width)
-
- gl.glEnable(gl.GL_BLEND)
- gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
- gl.glEnable(gl.GL_LINE_SMOOTH)
- gl.glHint(gl.GL_LINE_SMOOTH_HINT, gl.GL_NICEST)
- gl.glHint(gl.GL_POLYGON_SMOOTH_HINT, gl.GL_NICEST)
- gl.glEnable(gl.GL_PRIMITIVE_RESTART)
- gl.glPrimitiveRestartIndex(2 ** 32 - 1)
-
- self.vao.render(mode=self.mode)
-
-
-def create_line(start_x: float, start_y: float, end_x: float, end_y: float,
- color: Color, line_width: float = 1) -> Shape:
- """
- Create a line to be rendered later. This works faster than draw_line because
- the vertexes are only loaded to the graphics card once, rather than each frame.
-
- :param float start_x:
- :param float start_y:
- :param float end_x:
- :param float end_y:
- :param Color color:
- :param float line_width:
-
- :Returns Shape:
-
- """
-
- points = _get_points_for_thick_line(start_x, start_y, end_x, end_y, line_width)
- color_list = [color, color, color, color]
- triangle_point_list = points[1], points[0], points[2], points[3]
- shape = create_triangles_filled_with_colors(triangle_point_list, color_list)
- return shape
-
-
-def create_line_generic_with_colors(point_list: PointList,
- color_list: Iterable[Color],
- shape_mode: int,
- line_width: float = 1) -> Shape:
- """
- This function is used by ``create_line_strip`` and ``create_line_loop``,
- just changing the OpenGL type for the line drawing.
-
- :param PointList point_list:
- :param Iterable[Color] color_list:
- :param float shape_mode:
- :param float line_width:
-
- :Returns Shape:
- """
- program = shader.program(
- vertex_shader='''
- #version 330
- uniform mat4 Projection;
- in vec2 in_vert;
- in vec4 in_color;
- out vec4 v_color;
- void main() {
- gl_Position = Projection * vec4(in_vert, 0.0, 1.0);
- v_color = in_color;
- }
- ''',
- fragment_shader='''
- #version 330
- in vec4 v_color;
- out vec4 f_color;
- void main() {
- f_color = v_color;
- }
- ''',
- )
-
- buffer_type = np.dtype([('vertex', '2f4'), ('color', '4B')])
- data = np.zeros(len(point_list), dtype=buffer_type)
- data['vertex'] = point_list
- data['color'] = [get_four_byte_color(color) for color in color_list]
-
- vbo = shader.buffer(data.tobytes())
- vao_content = [
- shader.BufferDescription(
- vbo,
- '2f 4B',
- ('in_vert', 'in_color'),
- normalized=['in_color']
- )
- ]
-
- vao = shader.vertex_array(program, vao_content)
- with vao:
- program['Projection'] = get_projection().flatten()
-
- shape = Shape()
- shape.vao = vao
- shape.vbo = vbo
- shape.program = program
- shape.mode = shape_mode
- shape.line_width = line_width
-
- return shape
-
-
-def create_line_generic(point_list: PointList,
- color: Color,
- shape_mode: int, line_width: float = 1) -> Shape:
- """
- This function is used by ``create_line_strip`` and ``create_line_loop``,
- just changing the OpenGL type for the line drawing.
- """
- colors = [get_four_byte_color(color)] * len(point_list)
- shape = create_line_generic_with_colors(
- point_list,
- colors,
- shape_mode,
- line_width)
-
- return shape
-
-
-def create_line_strip(point_list: PointList,
- color: Color, line_width: float = 1):
- """
- Create a multi-point line to be rendered later. This works faster than draw_line because
- the vertexes are only loaded to the graphics card once, rather than each frame.
-
- :param PointList point_list:
- :param Color color:
- :param PointList line_width:
-
- :Returns Shape:
-
- """
- if line_width == 1:
- return create_line_generic(point_list, color, gl.GL_LINE_STRIP, line_width)
- else:
- triangle_point_list = []
- new_color_list = []
- for i in range(1, len(point_list)):
- start_x = point_list[i - 1][0]
- start_y = point_list[i - 1][1]
- end_x = point_list[i][0]
- end_y = point_list[i][1]
- color1 = color
- color2 = color
- points = _get_points_for_thick_line(start_x, start_y, end_x, end_y, line_width)
- new_color_list += color1, color2, color1, color2
- triangle_point_list += points[1], points[0], points[2], points[3]
-
- shape = create_triangles_filled_with_colors(triangle_point_list, new_color_list)
- return shape
-
-
-def create_line_loop(point_list: PointList,
- color: Color, line_width: float = 1):
- """
- Create a multi-point line loop to be rendered later. This works faster than draw_line because
- the vertexes are only loaded to the graphics card once, rather than each frame.
-
- :param PointList point_list:
- :param Color color:
- :param float line_width:
-
- :Returns Shape:
-
- """
- point_list = list(point_list) + [point_list[0]]
- return create_line_generic(point_list, color, gl.GL_LINE_STRIP, line_width)
-
-
-def create_lines(point_list: PointList,
- color: Color, line_width: float = 1):
- """
- Create a multi-point line loop to be rendered later. This works faster than draw_line because
- the vertexes are only loaded to the graphics card once, rather than each frame.
-
- :param PointList point_list:
- :param Color color:
- :param float line_width:
-
- :Returns Shape:
-
- """
- return create_line_generic(point_list, color, gl.GL_LINES, line_width)
-
-
-def create_lines_with_colors(point_list: PointList,
- color_list: List[Color],
- line_width: float = 1):
-
- if line_width == 1:
- return create_line_generic_with_colors(point_list, color_list, gl.GL_LINES, line_width)
- else:
-
- triangle_point_list = []
- new_color_list = []
- for i in range(1, len(point_list), 2):
- start_x = point_list[i-1][0]
- start_y = point_list[i-1][1]
- end_x = point_list[i][0]
- end_y = point_list[i][1]
- color1 = color_list[i-1]
- color2 = color_list[i]
- points = _get_points_for_thick_line(start_x, start_y, end_x, end_y, line_width)
- new_color_list += color1, color1, color2, color2
- triangle_point_list += points[1], points[0], points[2], points[3]
-
- shape = create_triangles_filled_with_colors(triangle_point_list, new_color_list)
- return shape
-
-
-def create_polygon(point_list: PointList,
- color: Color):
- """
- Draw a convex polygon. This will NOT draw a concave polygon.
- Because of this, you might not want to use this function.
-
- :param PointList point_list:
- :param color:
-
- :Returns Shape:
-
- """
- # We assume points were given in order, either clockwise or counter clockwise.
- # Polygon is assumed to be monotone.
- # To fill the polygon, we start by one vertex, and we chain triangle strips
- # alternating with vertices to the left and vertices to the right of the
- # initial vertex.
- half = len(point_list) // 2
- interleaved = itertools.chain.from_iterable(
- itertools.zip_longest(point_list[:half], reversed(point_list[half:]))
- )
- point_list = [p for p in interleaved if p is not None]
- return create_line_generic(point_list, color, gl.GL_TRIANGLE_STRIP, 1)
-
-
-def create_rectangle_filled(center_x: float, center_y: float, width: float,
- height: float, color: Color,
- tilt_angle: float = 0) -> Shape:
- """
- Create a filled rectangle.
-
- :param float center_x:
- :param float center_y:
- :param float width:
- :param float height:
- :param Color color:
- :param float tilt_angle:
-
- :Returns Shape:
-
- """
- return create_rectangle(center_x, center_y, width, height,
- color, tilt_angle=tilt_angle)
-
-
-def create_rectangle_outline(center_x: float, center_y: float, width: float,
- height: float, color: Color,
- border_width: float = 1, tilt_angle: float = 0) -> Shape:
- """
- Create a rectangle outline.
-
- Args:
- center_x:
- center_y:
- width:
- height:
- color:
- border_width:
- tilt_angle:
-
- Returns:
-
- """
- return create_rectangle(center_x, center_y, width, height,
- color, border_width, tilt_angle, filled=False)
-
-
-def get_rectangle_points(center_x: float, center_y: float, width: float,
- height: float, tilt_angle: float = 0) -> PointList:
- """
- Utility function that will return all four coordinate points of a
- rectangle given the x, y center, width, height, and rotation.
-
- Args:
- center_x:
- center_y:
- width:
- height:
- tilt_angle:
-
- Returns:
-
- """
- x1 = -width / 2 + center_x
- y1 = -height / 2 + center_y
-
- x2 = -width / 2 + center_x
- y2 = height / 2 + center_y
-
- x3 = width / 2 + center_x
- y3 = height / 2 + center_y
-
- x4 = width / 2 + center_x
- y4 = -height / 2 + center_y
-
- if tilt_angle:
- x1, y1 = rotate_point(x1, y1, center_x, center_y, tilt_angle)
- x2, y2 = rotate_point(x2, y2, center_x, center_y, tilt_angle)
- x3, y3 = rotate_point(x3, y3, center_x, center_y, tilt_angle)
- x4, y4 = rotate_point(x4, y4, center_x, center_y, tilt_angle)
-
- data = [(x1, y1),
- (x2, y2),
- (x3, y3),
- (x4, y4)]
-
- return data
-
-
-def create_rectangle(center_x: float, center_y: float, width: float,
- height: float, color: Color,
- border_width: float = 1, tilt_angle: float = 0,
- filled=True) -> Shape:
- """
- This function creates a rectangle using a vertex buffer object.
- Creating the rectangle, and then later drawing it with ``render_rectangle``
- is faster than calling ``draw_rectangle``.
-
- Args:
- center_x:
- center_y:
- width:
- height:
- color:
- border_width:
- tilt_angle:
- filled:
-
- Returns:
-
- """
- data = get_rectangle_points(center_x, center_y, width, height, tilt_angle)
-
- if filled:
- shape_mode = gl.GL_TRIANGLE_STRIP
- data[-2:] = reversed(data[-2:])
- else:
-
- i_lb = center_x - width / 2 + border_width / 2, center_y - height / 2 + border_width / 2
- i_rb = center_x + width / 2 - border_width / 2, center_y - height / 2 + border_width / 2
- i_rt = center_x + width / 2 - border_width / 2, center_y + height / 2 - border_width / 2
- i_lt = center_x - width / 2 + border_width / 2, center_y + height / 2 - border_width / 2
-
- o_lb = center_x - width / 2 - border_width / 2, center_y - height / 2 - border_width / 2
- o_rb = center_x + width / 2 + border_width / 2, center_y - height / 2 - border_width / 2
- o_rt = center_x + width / 2 + border_width / 2, center_y + height / 2 + border_width / 2
- o_lt = center_x - width / 2 - border_width / 2, center_y + height / 2 + border_width / 2
-
- data = o_lt, i_lt, o_rt, i_rt, o_rb, i_rb, o_lb, i_lb, o_lt, i_lt
-
- if tilt_angle != 0:
- point_list_2 = []
- for point in data:
- new_point = rotate_point(point[0], point[1], center_x, center_y, tilt_angle)
- point_list_2.append(new_point)
- data = point_list_2
-
- border_width = 1
- shape_mode = gl.GL_TRIANGLE_STRIP
-
- # _generic_draw_line_strip(point_list, color, gl.GL_TRIANGLE_STRIP)
-
- # shape_mode = gl.GL_LINE_STRIP
- # data.append(data[0])
-
- shape = create_line_generic(data, color, shape_mode, border_width)
- return shape
-
-
-def create_rectangle_filled_with_colors(point_list, color_list) -> Shape:
- """
- This function creates one rectangle/quad using a vertex buffer object.
- Creating the rectangles, and then later drawing it with ``render``
- is faster than calling ``draw_rectangle``.
- """
-
- shape_mode = gl.GL_TRIANGLE_STRIP
- new_point_list = [point_list[0], point_list[1], point_list[3], point_list[2]]
- new_color_list = [color_list[0], color_list[1], color_list[3], color_list[2]]
- return create_line_generic_with_colors(new_point_list, new_color_list, shape_mode)
-
-
-def create_rectangles_filled_with_colors(point_list, color_list) -> Shape:
- """
- This function creates multiple rectangle/quads using a vertex buffer object.
- Creating the rectangles, and then later drawing it with ``render``
- is faster than calling ``draw_rectangle``.
- """
-
- shape_mode = gl.GL_TRIANGLES
- new_point_list = []
- new_color_list = []
- for i in range(0, len(point_list), 4):
- new_point_list += [point_list[0 + i], point_list[1 + i], point_list[3 + i]]
- new_point_list += [point_list[1 + i], point_list[3 + i], point_list[2 + i]]
-
- new_color_list += [color_list[0 + i], color_list[1 + i], color_list[3 + i]]
- new_color_list += [color_list[1 + i], color_list[3 + i], color_list[2 + i]]
-
- return create_line_generic_with_colors(new_point_list, new_color_list, shape_mode)
-
-
-def create_triangles_filled_with_colors(point_list, color_list) -> Shape:
- """
- This function creates multiple rectangle/quads using a vertex buffer object.
- Creating the rectangles, and then later drawing it with ``render``
- is faster than calling ``draw_rectangle``.
- """
-
- shape_mode = gl.GL_TRIANGLE_STRIP
- return create_line_generic_with_colors(point_list, color_list, shape_mode)
-
-
-def create_ellipse_filled(center_x: float, center_y: float,
- width: float, height: float, color: Color,
- tilt_angle: float = 0, num_segments: int = 128) -> Shape:
- """
- Create a filled ellipse. Or circle if you use the same width and height.
- """
-
- border_width = 1
- return create_ellipse(center_x, center_y, width, height, color,
- border_width, tilt_angle, num_segments, filled=True)
-
-
-def create_ellipse_outline(center_x: float, center_y: float,
- width: float, height: float, color: Color,
- border_width: float = 1,
- tilt_angle: float = 0, num_segments: int = 128) -> Shape:
- """
- Create an outline of an ellipse.
- """
-
- return create_ellipse(center_x, center_y, width, height, color,
- border_width, tilt_angle, num_segments, filled=False)
-
-
-def create_ellipse(center_x: float, center_y: float,
- width: float, height: float, color: Color,
- border_width: float = 1,
- tilt_angle: float = 0, num_segments: int = 32,
- filled=True) -> Shape:
-
- """
- This creates an ellipse vertex buffer object (VBO). It can later be
- drawn with ``render_ellipse_filled``. This method of drawing an ellipse
- is much faster than calling ``draw_ellipse_filled`` each frame.
-
- Note: This can't be unit tested on Appveyor because its support for OpenGL is
- poor.
- """
- # Create an array with the vertex point_list
- point_list = []
-
- for segment in range(num_segments):
- theta = 2.0 * 3.1415926 * segment / num_segments
-
- x = width * math.cos(theta) + center_x
- y = height * math.sin(theta) + center_y
-
- if tilt_angle:
- x, y = rotate_point(x, y, center_x, center_y, tilt_angle)
-
- point_list.append((x, y))
-
- if filled:
- half = len(point_list) // 2
- interleaved = itertools.chain.from_iterable(
- itertools.zip_longest(point_list[:half], reversed(point_list[half:]))
- )
- point_list = [p for p in interleaved if p is not None]
- shape_mode = gl.GL_TRIANGLE_STRIP
- else:
- point_list.append(point_list[0])
- shape_mode = gl.GL_LINE_STRIP
-
- return create_line_generic(point_list, color, shape_mode, border_width)
-
-
-def create_ellipse_filled_with_colors(center_x: float, center_y: float,
- width: float, height: float,
- outside_color: Color, inside_color: Color,
- tilt_angle: float = 0, num_segments: int = 32) -> Shape:
- """
- Draw an ellipse, and specify inside/outside color. Used for doing gradients.
-
- :param float center_x:
- :param float center_y:
- :param float width:
- :param float height:
- :param Color outside_color:
- :param float inside_color:
- :param float tilt_angle:
- :param int num_segments:
-
- :Returns Shape:
-
- """
-
- # Create an array with the vertex data
- # Create an array with the vertex point_list
- point_list = [(center_x, center_y)]
-
- for segment in range(num_segments):
- theta = 2.0 * 3.1415926 * segment / num_segments
-
- x = width * math.cos(theta) + center_x
- y = height * math.sin(theta) + center_y
-
- if tilt_angle:
- x, y = rotate_point(x, y, center_x, center_y, tilt_angle)
-
- point_list.append((x, y))
- point_list.append(point_list[1])
-
- color_list = [inside_color] + [outside_color] * (num_segments + 1)
- return create_line_generic_with_colors(point_list, color_list, gl.GL_TRIANGLE_FAN)
-
-
-T = TypeVar('T', bound=Shape)
-
-
-class ShapeElementList(Generic[T]):
- """
- A program can put multiple drawing primitives in a ShapeElementList, and then
- move and draw them as one. Do this when you want to create a more complex object
- out of simpler primitives. This also speeds rendering as all objects are drawn
- in one operation.
- """
- def __init__(self):
- """
- Initialize the sprite list
- """
- # List of sprites in the sprite list
- self.shape_list = []
- self.change_x = 0
- self.change_y = 0
- self._center_x = 0
- self._center_y = 0
- self._angle = 0
- self.program = shader.program(
- vertex_shader='''
- #version 330
- uniform mat4 Projection;
- uniform vec2 Position;
- uniform float Angle;
-
- in vec2 in_vert;
- in vec4 in_color;
-
- out vec4 v_color;
- void main() {
- float angle = radians(Angle);
- mat2 rotate = mat2(
- cos(angle), sin(angle),
- -sin(angle), cos(angle)
- );
- gl_Position = Projection * vec4(Position + (rotate * in_vert), 0.0, 1.0);
- v_color = in_color;
- }
- ''',
- fragment_shader='''
- #version 330
- in vec4 v_color;
- out vec4 f_color;
- void main() {
- f_color = v_color;
- }
- ''',
- )
- # Could do much better using just one vbo and glDrawElementsBaseVertex
- self.batches = defaultdict(_Batch)
- self.dirties = set()
-
- def append(self, item: T):
- """
- Add a new shape to the list.
- """
- self.shape_list.append(item)
- group = (item.mode, item.line_width)
- self.batches[group].items.append(item)
- self.dirties.add(group)
-
- def remove(self, item: T):
- """
- Remove a specific shape from the list.
- """
- self.shape_list.remove(item)
- group = (item.mode, item.line_width)
- self.batches[group].items.remove(item)
- self.dirties.add(group)
-
- def _refresh_shape(self, group):
- # Create a buffer large enough to hold all the shapes buffers
- batch = self.batches[group]
- total_vbo_bytes = sum(s.vbo.size for s in batch.items)
- vbo = shader.Buffer.create_with_size(total_vbo_bytes)
- offset = 0
- gl.glBindBuffer(gl.GL_COPY_WRITE_BUFFER, vbo.buffer_id)
- # Copy all the shapes buffer in our own vbo
- for shape in batch.items:
- gl.glBindBuffer(gl.GL_COPY_READ_BUFFER, shape.vbo.buffer_id)
- gl.glCopyBufferSubData(
- gl.GL_COPY_READ_BUFFER,
- gl.GL_COPY_WRITE_BUFFER,
- gl.GLintptr(0),
- gl.GLintptr(offset),
- shape.vbo.size)
- offset += shape.vbo.size
-
- # Create an index buffer object. It should count starting from 0. We need to
- # use a reset_idx to indicate that a new shape will start.
- reset_idx = 2 ** 32 - 1
- indices = []
- counter = itertools.count()
- for shape in batch.items:
- indices.extend(itertools.islice(counter, shape.vao.num_vertices))
- indices.append(reset_idx)
- del indices[-1]
- indices = np.array(indices)
- ibo = shader.Buffer(indices.astype('i4').tobytes())
-
- vao_content = [
- shader.BufferDescription(
- vbo,
- '2f 4B',
- ('in_vert', 'in_color'),
- normalized=['in_color']
- )
- ]
- vao = shader.vertex_array(self.program, vao_content, ibo)
- with self.program:
- self.program['Projection'] = get_projection().flatten()
- self.program['Position'] = [self.center_x, self.center_y]
- self.program['Angle'] = self.angle
-
- batch.shape.vao = vao
- batch.shape.vbo = vbo
- batch.shape.ibo = ibo
- batch.shape.program = self.program
- mode, line_width = group
- batch.shape.mode = mode
- batch.shape.line_width = line_width
-
- def move(self, change_x: float, change_y: float):
- """
- Move all the shapes ion the list
- :param change_x: Amount to move on the x axis
- :param change_y: Amount to move on the y axis
- """
- self.center_x += change_x
- self.center_y += change_y
-
- def __len__(self) -> int:
- """ Return the length of the sprite list. """
- return len(self.shape_list)
-
- def __iter__(self) -> Iterable[T]:
- """ Return an iterable object of sprites. """
- return iter(self.shape_list)
-
- def __getitem__(self, i):
- return self.shape_list[i]
-
- def draw(self):
- """
- Draw everything in the list.
- """
- for group in self.dirties:
- self._refresh_shape(group)
- self.dirties.clear()
- for batch in self.batches.values():
- batch.shape.draw()
-
- def _get_center_x(self) -> float:
- """Get the center x coordinate of the ShapeElementList."""
- return self._center_x
-
- def _set_center_x(self, value: float):
- """Set the center x coordinate of the ShapeElementList."""
- self._center_x = value
- with self.program:
- self.program['Position'] = [self._center_x, self._center_y]
-
- center_x = property(_get_center_x, _set_center_x)
-
- def _get_center_y(self) -> float:
- """Get the center y coordinate of the ShapeElementList."""
- return self._center_y
-
- def _set_center_y(self, value: float):
- """Set the center y coordinate of the ShapeElementList."""
- self._center_y = value
- with self.program:
- self.program['Position'] = [self._center_x, self._center_y]
-
- center_y = property(_get_center_y, _set_center_y)
-
- def _get_angle(self) -> float:
- """Get the angle of the ShapeElementList in degrees."""
- return self._angle
-
- def _set_angle(self, value: float):
- """Set the angle of the ShapeElementList in degrees."""
- self._angle = value
- with self.program:
- self.program['Angle'] = self._angle
-
- angle = property(_get_angle, _set_angle)
-
-
-class _Batch(Generic[T]):
- def __init__(self):
- self.shape = Shape()
- self.items = []
diff --git a/arcade/color/__init__.py b/arcade/color/__init__.py
deleted file mode 100644
index 0538903..0000000
--- a/arcade/color/__init__.py
+++ /dev/null
@@ -1,1006 +0,0 @@
-"""
-This module pre-defines several colors.
-"""
-AERO_BLUE = (201, 255, 229)
-AFRICAN_VIOLET = (178, 132, 190)
-AIR_FORCE_BLUE = (93, 138, 168)
-AIR_SUPERIORITY_BLUE = (114, 160, 193)
-ALABAMA_CRIMSON = (175, 0, 42)
-ALICE_BLUE = (240, 248, 255)
-ALIZARIN_CRIMSON = (227, 38, 54)
-ALLOY_ORANGE = (196, 98, 16)
-ALMOND = (239, 222, 205)
-AMARANTH = (229, 43, 80)
-AMARANTH_PINK = (241, 156, 187)
-AMARANTH_PURPLE = (171, 39, 79)
-AMAZON = (59, 122, 87)
-AMBER = (255, 191, 0)
-SAE = (255, 126, 0)
-AMERICAN_ROSE = (255, 3, 62)
-AMETHYST = (153, 102, 204)
-ANDROID_GREEN = (164, 198, 57)
-ANTI_FLASH_WHITE = (242, 243, 244)
-ANTIQUE_BRASS = (205, 149, 117)
-ANTIQUE_BRONZE = (102, 93, 30)
-ANTIQUE_FUCHSIA = (145, 92, 131)
-ANTIQUE_RUBY = (132, 27, 45)
-ANTIQUE_WHITE = (250, 235, 215)
-AO = (0, 128, 0)
-APPLE_GREEN = (141, 182, 0)
-APRICOT = (251, 206, 177)
-AQUA = (0, 255, 255)
-AQUAMARINE = (127, 255, 212)
-ARMY_GREEN = (75, 83, 32)
-ARSENIC = (59, 68, 75)
-ARTICHOKE = (143, 151, 121)
-ARYLIDE_YELLOW = (233, 214, 107)
-ASH_GREY = (178, 190, 181)
-ASPARAGUS = (135, 169, 107)
-ATOMIC_TANGERINE = (255, 153, 102)
-AUBURN = (165, 42, 42)
-AUREOLIN = (253, 238, 0)
-AUROMETALSAURUS = (110, 127, 128)
-AVOCADO = (86, 130, 3)
-AZURE = (0, 127, 255)
-AZURE_MIST = (240, 255, 255)
-BABY_BLUE = (137, 207, 240)
-BABY_BLUE_EYES = (161, 202, 241)
-BABY_PINK = (244, 194, 194)
-BABY_POWDER = (254, 254, 250)
-BAKER_MILLER_PINK = (255, 145, 175)
-BALL_BLUE = (33, 171, 205)
-BANANA_MANIA = (250, 231, 181)
-BANANA_YELLOW = (255, 225, 53)
-BANGLADESH_GREEN = (0, 106, 78)
-BARBIE_PINK = (224, 33, 138)
-BARN_RED = (124, 10, 2)
-BATTLESHIP_GREY = (132, 132, 130)
-BAZAAR = (152, 119, 123)
-BEAU_BLUE = (188, 212, 230)
-BRIGHT_LILAC = (216, 145, 239)
-BEAVER = (159, 129, 112)
-BEIGE = (245, 245, 220)
-BISQUE = (255, 228, 196)
-BISTRE = (61, 43, 31)
-BISTRE_BROWN = (150, 113, 23)
-BITTER_LEMON = (202, 224, 13)
-BITTER_LIME = (100, 140, 17)
-BITTERSWEET = (254, 111, 94)
-BITTERSWEET_SHIMMER = (191, 79, 81)
-BLACK = (0, 0, 0)
-BLACK_BEAN = (61, 12, 2)
-BLACK_LEATHER_JACKET = (37, 53, 41)
-BLACK_OLIVE = (59, 60, 54)
-BLANCHED_ALMOND = (255, 235, 205)
-BLAST_OFF_BRONZE = (165, 113, 100)
-BLEU_DE_FRANCE = (49, 140, 231)
-BLIZZARD_BLUE = (172, 229, 238)
-BLOND = (250, 240, 190)
-BLUE = (0, 0, 255)
-BLUE_BELL = (162, 162, 208)
-BLUE_GRAY = (102, 153, 204)
-BLUE_GREEN = (13, 152, 186)
-BLUE_SAPPHIRE = (18, 97, 128)
-BLUE_VIOLET = (138, 43, 226)
-BLUE_YONDER = (80, 114, 167)
-BLUEBERRY = (79, 134, 247)
-BLUEBONNET = (28, 28, 240)
-BLUSH = (222, 93, 131)
-BOLE = (121, 68, 59)
-BONDI_BLUE = (0, 149, 182)
-BONE = (227, 218, 201)
-BOSTON_UNIVERSITY_RED = (204, 0, 0)
-BOTTLE_GREEN = (0, 106, 78)
-BOYSENBERRY = (135, 50, 96)
-BRANDEIS_BLUE = (0, 112, 255)
-BRASS = (181, 166, 66)
-BRICK_RED = (203, 65, 84)
-BRIGHT_CERULEAN = (29, 172, 214)
-BRIGHT_GREEN = (102, 255, 0)
-BRIGHT_LAVENDER = (191, 148, 228)
-BRIGHT_MAROON = (195, 33, 72)
-BRIGHT_NAVY_BLUE = (25, 116, 210)
-BRIGHT_PINK = (255, 0, 127)
-BRIGHT_TURQUOISE = (8, 232, 222)
-BRIGHT_UBE = (209, 159, 232)
-BRILLIANT_LAVENDER = (244, 187, 255)
-BRILLIANT_ROSE = (255, 85, 163)
-BRINK_PINK = (251, 96, 127)
-BRITISH_RACING_GREEN = (0, 66, 37)
-BRONZE = (205, 127, 50)
-BRONZE_YELLOW = (115, 112, 0)
-BROWN = (165, 42, 42)
-BROWN_NOSE = (107, 68, 35)
-BRUNSWICK_GREEN = (27, 77, 62)
-BUBBLE_GUM = (255, 193, 204)
-BUBBLES = (231, 254, 255)
-BUD_GREEN = (123, 182, 97)
-BUFF = (240, 220, 130)
-BULGARIAN_ROSE = (72, 6, 7)
-BURGUNDY = (128, 0, 32)
-BURLYWOOD = (222, 184, 135)
-BURNT_ORANGE = (204, 85, 0)
-BURNT_SIENNA = (233, 116, 81)
-BURNT_UMBER = (138, 51, 36)
-BYZANTINE = (189, 51, 164)
-BYZANTIUM = (112, 41, 99)
-CADET = (83, 104, 114)
-CADET_BLUE = (95, 158, 160)
-CADET_GREY = (145, 163, 176)
-CADMIUM_GREEN = (0, 107, 60)
-CADMIUM_ORANGE = (237, 135, 45)
-CADMIUM_RED = (227, 0, 34)
-CADMIUM_YELLOW = (255, 246, 0)
-CAL_POLY_GREEN = (30, 77, 43)
-CAMBRIDGE_BLUE = (163, 193, 173)
-CAMEL = (193, 154, 107)
-CAMEO_PINK = (239, 187, 204)
-CAMOUFLAGE_GREEN = (120, 134, 107)
-CANARY_YELLOW = (255, 239, 0)
-CANDY_APPLE_RED = (255, 8, 0)
-CANDY_PINK = (228, 113, 122)
-CAPRI = (0, 191, 255)
-CAPUT_MORTUUM = (89, 39, 32)
-CARDINAL = (196, 30, 58)
-CARIBBEAN_GREEN = (0, 204, 153)
-CARMINE = (150, 0, 24)
-CARMINE_PINK = (235, 76, 66)
-CARMINE_RED = (255, 0, 56)
-CARNATION_PINK = (255, 166, 201)
-CARNELIAN = (179, 27, 27)
-CAROLINA_BLUE = (153, 186, 221)
-CARROT_ORANGE = (237, 145, 33)
-CASTLETON_GREEN = (0, 86, 63)
-CATALINA_BLUE = (6, 42, 120)
-CATAWBA = (112, 54, 66)
-CEDAR_CHEST = (201, 90, 73)
-CEIL = (146, 161, 207)
-CELADON = (172, 225, 175)
-CELADON_BLUE = (0, 123, 167)
-CELADON_GREEN = (47, 132, 124)
-CELESTE = (178, 255, 255)
-CELESTIAL_BLUE = (73, 151, 208)
-CERISE = (222, 49, 99)
-CERISE_PINK = (236, 59, 131)
-CERULEAN = (0, 123, 167)
-CERULEAN_BLUE = (42, 82, 190)
-CERULEAN_FROST = (109, 155, 195)
-CG_BLUE = (0, 122, 165)
-CG_RED = (224, 60, 49)
-CHAMOISEE = (160, 120, 90)
-CHAMPAGNE = (247, 231, 206)
-CHARCOAL = (54, 69, 79)
-CHARLESTON_GREEN = (35, 43, 43)
-CHARM_PINK = (230, 143, 172)
-CHARTREUSE = (127, 255, 0)
-CHERRY = (222, 49, 99)
-CHERRY_BLOSSOM_PINK = (255, 183, 197)
-CHESTNUT = (149, 69, 53)
-CHINA_PINK = (222, 111, 161)
-CHINA_ROSE = (168, 81, 110)
-CHINESE_RED = (170, 56, 30)
-CHINESE_VIOLET = (133, 96, 136)
-CHOCOLATE = (210, 105, 30)
-CHROME_YELLOW = (255, 167, 0)
-CINEREOUS = (152, 129, 123)
-CINNABAR = (227, 66, 52)
-CINNAMON = (210, 105, 30)
-CITRINE = (228, 208, 10)
-CITRON = (159, 169, 31)
-CLARET = (127, 23, 52)
-CLASSIC_ROSE = (251, 204, 231)
-COAL = (124, 185, 232)
-COBALT = (0, 71, 171)
-COCOA_BROWN = (210, 105, 30)
-COCONUT = (150, 90, 62)
-COFFEE = (111, 78, 55)
-COLUMBIA_BLUE = (155, 221, 255)
-CONGO_PINK = (248, 131, 121)
-COOL_BLACK = (0, 46, 99)
-COOL_GREY = (140, 146, 172)
-COPPER = (184, 115, 51)
-COPPER_PENNY = (173, 111, 105)
-COPPER_RED = (203, 109, 81)
-COPPER_ROSE = (153, 102, 102)
-COQUELICOT = (255, 56, 0)
-CORAL = (255, 127, 80)
-CORAL_PINK = (248, 131, 121)
-CORAL_RED = (255, 64, 64)
-CORDOVAN = (137, 63, 69)
-CORN = (251, 236, 93)
-CORNELL_RED = (179, 27, 27)
-CORNFLOWER_BLUE = (100, 149, 237)
-CORNSILK = (255, 248, 220)
-COSMIC_LATTE = (255, 248, 231)
-COTTON_CANDY = (255, 188, 217)
-CREAM = (255, 253, 208)
-CRIMSON = (220, 20, 60)
-CRIMSON_GLORY = (190, 0, 50)
-CYAN = (0, 255, 255)
-CYBER_GRAPE = (88, 66, 124)
-CYBER_YELLOW = (255, 211, 0)
-DAFFODIL = (255, 255, 49)
-DANDELION = (240, 225, 48)
-DARK_BLUE = (0, 0, 139)
-DARK_BLUE_GRAY = (102, 102, 153)
-DARK_BROWN = (101, 67, 33)
-DARK_BYZANTIUM = (93, 57, 84)
-DARK_CANDY_APPLE_RED = (164, 0, 0)
-DARK_CERULEAN = (8, 69, 126)
-DARK_CHESTNUT = (152, 105, 96)
-DARK_CORAL = (205, 91, 69)
-DARK_CYAN = (0, 139, 139)
-DARK_ELECTRIC_BLUE = (83, 104, 120)
-DARK_GOLDENROD = (184, 134, 11)
-DARK_GRAY = (169, 169, 169)
-DARK_GREEN = (1, 50, 32)
-DARK_IMPERIAL_BLUE = (0, 65, 106)
-DARK_JUNGLE_GREEN = (26, 36, 33)
-DARK_KHAKI = (189, 183, 107)
-DARK_LAVA = (72, 60, 50)
-DARK_LAVENDER = (115, 79, 150)
-DARK_LIVER = (83, 75, 79)
-DARK_MAGENTA = (139, 0, 139)
-DARK_MIDNIGHT_BLUE = (0, 51, 102)
-DARK_MOSS_GREEN = (74, 93, 35)
-DARK_OLIVE_GREEN = (85, 107, 47)
-DARK_ORANGE = (255, 140, 0)
-DARK_ORCHID = (153, 50, 204)
-DARK_PASTEL_BLUE = (119, 158, 203)
-DARK_PASTEL_GREEN = (3, 192, 60)
-DARK_PASTEL_PURPLE = (150, 111, 214)
-DARK_PASTEL_RED = (194, 59, 34)
-DARK_PINK = (231, 84, 128)
-DARK_POWDER_BLUE = (0, 51, 153)
-DARK_PUCE = (79, 58, 60)
-DARK_RASPBERRY = (135, 38, 87)
-DARK_RED = (139, 0, 0)
-DARK_SALMON = (233, 150, 122)
-DARK_SCARLET = (86, 3, 25)
-DARK_SEA_GREEN = (143, 188, 143)
-DARK_SIENNA = (60, 20, 20)
-DARK_SKY_BLUE = (140, 190, 214)
-DARK_SLATE_BLUE = (72, 61, 139)
-DARK_SLATE_GRAY = (47, 79, 79)
-DARK_SPRING_GREEN = (23, 114, 69)
-DARK_TAN = (145, 129, 81)
-DARK_TANGERINE = (255, 168, 18)
-DARK_TAUPE = (72, 60, 50)
-DARK_TERRA_COTTA = (204, 78, 92)
-DARK_TURQUOISE = (0, 206, 209)
-DARK_VANILLA = (209, 190, 168)
-DARK_VIOLET = (148, 0, 211)
-DARK_YELLOW = (155, 135, 12)
-DARTMOUTH_GREEN = (0, 112, 60)
-DAVY_GREY = (85, 85, 85)
-DEBIAN_RED = (215, 10, 83)
-DEEP_CARMINE = (169, 32, 62)
-DEEP_CARMINE_PINK = (239, 48, 56)
-DEEP_CARROT_ORANGE = (233, 105, 44)
-DEEP_CERISE = (218, 50, 135)
-DEEP_CHAMPAGNE = (250, 214, 165)
-DEEP_CHESTNUT = (185, 78, 72)
-DEEP_COFFEE = (112, 66, 65)
-DEEP_FUCHSIA = (193, 84, 193)
-DEEP_JUNGLE_GREEN = (0, 75, 73)
-DEEP_LEMON = (245, 199, 26)
-DEEP_LILAC = (153, 85, 187)
-DEEP_MAGENTA = (204, 0, 204)
-DEEP_MAUVE = (212, 115, 212)
-DEEP_MOSS_GREEN = (53, 94, 59)
-DEEP_PEACH = (255, 203, 164)
-DEEP_PINK = (255, 20, 147)
-DEEP_PUCE = (169, 92, 104)
-DEEP_RUBY = (132, 63, 91)
-DEEP_SAFFRON = (255, 153, 51)
-DEEP_SKY_BLUE = (0, 191, 255)
-DEEP_SPACE_SPARKLE = (74, 100, 108)
-DEEP_TAUPE = (126, 94, 96)
-DEEP_TUSCAN_RED = (102, 66, 77)
-DEER = (186, 135, 89)
-DENIM = (21, 96, 189)
-DESERT = (193, 154, 107)
-DESERT_SAND = (237, 201, 175)
-DESIRE = (234, 60, 83)
-DIAMOND = (185, 242, 255)
-DIM_GRAY = (105, 105, 105)
-DIRT = (155, 118, 83)
-DODGER_BLUE = (30, 144, 255)
-DOGWOOD_ROSE = (215, 24, 104)
-DOLLAR_BILL = (133, 187, 101)
-DONKEY_BROWN = (102, 76, 40)
-DRAB = (150, 113, 23)
-DUKE_BLUE = (0, 0, 156)
-DUST_STORM = (229, 204, 201)
-DUTCH_WHITE = (239, 223, 187)
-EARTH_YELLOW = (225, 169, 95)
-EBONY = (85, 93, 80)
-ECRU = (194, 178, 128)
-EERIE_BLACK = (27, 27, 27)
-EGGPLANT = (97, 64, 81)
-EGGSHELL = (240, 234, 214)
-EGYPTIAN_BLUE = (16, 52, 166)
-ELECTRIC_BLUE = (125, 249, 255)
-ELECTRIC_CRIMSON = (255, 0, 63)
-ELECTRIC_CYAN = (0, 255, 255)
-ELECTRIC_GREEN = (0, 255, 0)
-ELECTRIC_INDIGO = (111, 0, 255)
-ELECTRIC_LAVENDER = (244, 187, 255)
-ELECTRIC_LIME = (204, 255, 0)
-ELECTRIC_PURPLE = (191, 0, 255)
-ELECTRIC_ULTRAMARINE = (63, 0, 255)
-ELECTRIC_VIOLET = (143, 0, 255)
-ELECTRIC_YELLOW = (255, 255, 0)
-EMERALD = (80, 200, 120)
-EMINENCE = (108, 48, 130)
-ENGLISH_GREEN = (27, 77, 62)
-ENGLISH_LAVENDER = (180, 131, 149)
-ENGLISH_RED = (171, 75, 82)
-ENGLISH_VIOLET = (86, 60, 92)
-ETON_BLUE = (150, 200, 162)
-EUCALYPTUS = (68, 215, 168)
-FALLOW = (193, 154, 107)
-FALU_RED = (128, 24, 24)
-FANDANGO = (181, 51, 137)
-FANDANGO_PINK = (222, 82, 133)
-FASHION_FUCHSIA = (244, 0, 161)
-FAWN = (229, 170, 112)
-FELDGRAU = (77, 93, 83)
-FELDSPAR = (253, 213, 177)
-FERN_GREEN = (79, 121, 66)
-FERRARI_RED = (255, 40, 0)
-FIELD_DRAB = (108, 84, 30)
-FIREBRICK = (178, 34, 34)
-FIRE_ENGINE_RED = (206, 32, 41)
-FLAME = (226, 88, 34)
-FLAMINGO_PINK = (252, 142, 172)
-FLATTERY = (107, 68, 35)
-FLAVESCENT = (247, 233, 142)
-FLAX = (238, 220, 130)
-FLIRT = (162, 0, 109)
-FLORAL_WHITE = (255, 250, 240)
-FLUORESCENT_ORANGE = (255, 191, 0)
-FLUORESCENT_PINK = (255, 20, 147)
-FLUORESCENT_YELLOW = (204, 255, 0)
-FOLLY = (255, 0, 79)
-FOREST_GREEN = (34, 139, 34)
-FRENCH_BEIGE = (166, 123, 91)
-FRENCH_BISTRE = (133, 109, 77)
-FRENCH_BLUE = (0, 114, 187)
-FRENCH_FUCHSIA = (253, 63, 146)
-FRENCH_LILAC = (134, 96, 142)
-FRENCH_LIME = (158, 253, 56)
-FRENCH_MAUVE = (212, 115, 212)
-FRENCH_PINK = (253, 108, 158)
-FRENCH_PUCE = (78, 22, 9)
-FRENCH_RASPBERRY = (199, 44, 72)
-FRENCH_ROSE = (246, 74, 138)
-FRENCH_SKY_BLUE = (119, 181, 254)
-FRENCH_WINE = (172, 30, 68)
-FRESH_AIR = (166, 231, 255)
-FUCHSIA = (255, 0, 255)
-FUCHSIA_PINK = (255, 119, 255)
-FUCHSIA_PURPLE = (204, 57, 123)
-FUCHSIA_ROSE = (199, 67, 117)
-FULVOUS = (228, 132, 0)
-FUZZY_WUZZY = (204, 102, 102)
-GAINSBORO = (220, 220, 220)
-GAMBOGE = (228, 155, 15)
-GENERIC_VIRIDIAN = (0, 127, 102)
-GHOST_WHITE = (248, 248, 255)
-GIANTS_ORANGE = (254, 90, 29)
-GINGER = (176, 101, 0)
-GLAUCOUS = (96, 130, 182)
-GLITTER = (230, 232, 250)
-GO_GREEN = (0, 171, 102)
-GOLD = (255, 215, 0)
-GOLD_FUSION = (133, 117, 78)
-GOLDEN_BROWN = (153, 101, 21)
-GOLDEN_POPPY = (252, 194, 0)
-GOLDEN_YELLOW = (255, 223, 0)
-GOLDENROD = (218, 165, 32)
-GRANNY_SMITH_APPLE = (168, 228, 160)
-GRAPE = (111, 45, 168)
-GRAY = (128, 128, 128)
-GRAY_ASPARAGUS = (70, 89, 69)
-GRAY_BLUE = (140, 146, 172)
-GREEN = (0, 255, 0)
-GREEN_YELLOW = (173, 255, 47)
-GRULLO = (169, 154, 134)
-GUPPIE_GREEN = (0, 255, 127)
-HAN_BLUE = (68, 108, 207)
-HAN_PURPLE = (82, 24, 250)
-HANSA_YELLOW = (233, 214, 107)
-HARLEQUIN = (63, 255, 0)
-HARVARD_CRIMSON = (201, 0, 22)
-HARVEST_GOLD = (218, 145, 0)
-HEART_GOLD = (128, 128, 0)
-HELIOTROPE = (223, 115, 255)
-HELIOTROPE_GRAY = (170, 152, 169)
-HOLLYWOOD_CERISE = (244, 0, 161)
-HONEYDEW = (240, 255, 240)
-HONOLULU_BLUE = (0, 109, 176)
-HOOKER_GREEN = (73, 121, 107)
-HOT_MAGENTA = (255, 29, 206)
-HOT_PINK = (255, 105, 180)
-HUNTER_GREEN = (53, 94, 59)
-ICEBERG = (113, 166, 210)
-ICTERINE = (252, 247, 94)
-ILLUMINATING_EMERALD = (49, 145, 119)
-IMPERIAL = (96, 47, 107)
-IMPERIAL_BLUE = (0, 35, 149)
-IMPERIAL_PURPLE = (102, 2, 60)
-IMPERIAL_RED = (237, 41, 57)
-INCHWORM = (178, 236, 93)
-INDEPENDENCE = (76, 81, 109)
-INDIA_GREEN = (19, 136, 8)
-INDIAN_RED = (205, 92, 92)
-INDIAN_YELLOW = (227, 168, 87)
-INDIGO = (75, 0, 130)
-INTERNATIONAL_KLEIN_BLUE = (0, 47, 167)
-INTERNATIONAL_ORANGE = (255, 79, 0)
-IRIS = (90, 79, 207)
-IRRESISTIBLE = (179, 68, 108)
-ISABELLINE = (244, 240, 236)
-ISLAMIC_GREEN = (0, 144, 0)
-ITALIAN_SKY_BLUE = (178, 255, 255)
-IVORY = (255, 255, 240)
-JADE = (0, 168, 107)
-JAPANESE_CARMINE = (157, 41, 51)
-JAPANESE_INDIGO = (38, 67, 72)
-JAPANESE_VIOLET = (91, 50, 86)
-JASMINE = (248, 222, 126)
-JASPER = (215, 59, 62)
-JAZZBERRY_JAM = (165, 11, 94)
-JELLY_BEAN = (218, 97, 78)
-JET = (52, 52, 52)
-JONQUIL = (244, 202, 22)
-JORDY_BLUE = (138, 185, 241)
-JUNE_BUD = (189, 218, 87)
-JUNGLE_GREEN = (41, 171, 135)
-KELLY_GREEN = (76, 187, 23)
-KENYAN_COPPER = (124, 28, 5)
-KEPPEL = (58, 176, 158)
-KHAKI = (195, 176, 145)
-KOBE = (136, 45, 23)
-KOBI = (231, 159, 196)
-KOMBU_GREEN = (53, 66, 48)
-KU_CRIMSON = (232, 0, 13)
-LA_SALLE_GREEN = (8, 120, 48)
-LANGUID_LAVENDER = (214, 202, 221)
-LAPIS_LAZULI = (38, 97, 156)
-LASER_LEMON = (255, 255, 102)
-LAUREL_GREEN = (169, 186, 157)
-LAVA = (207, 16, 32)
-LAVENDER = (230, 230, 250)
-LAVENDER_BLUE = (204, 204, 255)
-LAVENDER_BLUSH = (255, 240, 245)
-LAVENDER_GRAY = (196, 195, 208)
-LAVENDER_INDIGO = (148, 87, 235)
-LAVENDER_MAGENTA = (238, 130, 238)
-LAVENDER_MIST = (230, 230, 250)
-LAVENDER_PINK = (251, 174, 210)
-LAVENDER_PURPLE = (150, 123, 182)
-LAVENDER_ROSE = (251, 160, 227)
-LAWN_GREEN = (124, 252, 0)
-LEMON = (255, 247, 0)
-LEMON_CHIFFON = (255, 250, 205)
-LEMON_CURRY = (204, 160, 29)
-LEMON_GLACIER = (253, 255, 0)
-LEMON_LIME = (227, 255, 0)
-LEMON_MERINGUE = (246, 234, 190)
-LEMON_YELLOW = (255, 244, 79)
-LIBERTY = (84, 90, 167)
-LICORICE = (26, 17, 16)
-LIGHT_APRICOT = (253, 213, 177)
-LIGHT_BLUE = (173, 216, 230)
-LIGHT_BROWN = (181, 101, 29)
-LIGHT_CARMINE_PINK = (230, 103, 113)
-LIGHT_CORAL = (240, 128, 128)
-LIGHT_CORNFLOWER_BLUE = (147, 204, 234)
-LIGHT_CRIMSON = (245, 105, 145)
-LIGHT_CYAN = (224, 255, 255)
-LIGHT_DEEP_PINK = (255, 92, 205)
-LIGHT_FUCHSIA_PINK = (249, 132, 239)
-LIGHT_GOLDENROD_YELLOW = (250, 250, 210)
-LIGHT_GRAY = (211, 211, 211)
-LIGHT_GREEN = (144, 238, 144)
-LIGHT_HOT_PINK = (255, 179, 222)
-LIGHT_KHAKI = (240, 230, 140)
-LIGHT_MEDIUM_ORCHID = (211, 155, 203)
-LIGHT_MOSS_GREEN = (173, 223, 173)
-LIGHT_ORCHID = (230, 168, 215)
-LIGHT_PASTEL_PURPLE = (177, 156, 217)
-LIGHT_PINK = (255, 182, 193)
-LIGHT_RED_OCHRE = (233, 116, 81)
-LIGHT_SALMON = (255, 160, 122)
-LIGHT_SALMON_PINK = (255, 153, 153)
-LIGHT_SEA_GREEN = (32, 178, 170)
-LIGHT_SKY_BLUE = (135, 206, 250)
-LIGHT_SLATE_GRAY = (119, 136, 153)
-LIGHT_STEEL_BLUE = (176, 196, 222)
-LIGHT_TAUPE = (179, 139, 109)
-LIGHT_THULIAN_PINK = (230, 143, 172)
-LIGHT_YELLOW = (255, 255, 224)
-LILAC = (200, 162, 200)
-LIME = (191, 255, 0)
-LIME_GREEN = (50, 205, 50)
-LIMERICK = (157, 194, 9)
-LINCOLN_GREEN = (25, 89, 5)
-LINEN = (250, 240, 230)
-LION = (193, 154, 107)
-LISERAN_PURPLE = (222, 111, 161)
-LITTLE_BOY_BLUE = (108, 160, 220)
-LIVER = (103, 76, 71)
-LIVER_CHESTNUT = (152, 116, 86)
-LIVID = (102, 153, 204)
-LUMBER = (255, 228, 205)
-LUST = (230, 32, 32)
-MAGENTA = (255, 0, 255)
-MAGENTA_HAZE = (159, 69, 118)
-MAGIC_MINT = (170, 240, 209)
-MAGNOLIA = (248, 244, 255)
-MAHOGANY = (192, 64, 0)
-MAIZE = (251, 236, 93)
-MAJORELLE_BLUE = (96, 80, 220)
-MALACHITE = (11, 218, 81)
-MANATEE = (151, 154, 170)
-MANGO_TANGO = (255, 130, 67)
-MANTIS = (116, 195, 101)
-MARDI_GRAS = (136, 0, 133)
-MAROON = (128, 0, 0)
-MAUVE = (224, 176, 255)
-MAUVE_TAUPE = (145, 95, 109)
-MAUVELOUS = (239, 152, 170)
-MAYA_BLUE = (115, 194, 251)
-MEAT_BROWN = (229, 183, 59)
-MEDIUM_AQUAMARINE = (102, 221, 170)
-MEDIUM_BLUE = (0, 0, 205)
-MEDIUM_CANDY_APPLE_RED = (226, 6, 44)
-MEDIUM_CARMINE = (175, 64, 53)
-MEDIUM_CHAMPAGNE = (243, 229, 171)
-MEDIUM_ELECTRIC_BLUE = (3, 80, 150)
-MEDIUM_JUNGLE_GREEN = (28, 53, 45)
-MEDIUM_LAVENDER_MAGENTA = (221, 160, 221)
-MEDIUM_ORCHID = (186, 85, 211)
-MEDIUM_PERSIAN_BLUE = (0, 103, 165)
-MEDIUM_PURPLE = (147, 112, 219)
-MEDIUM_RED_VIOLET = (187, 51, 133)
-MEDIUM_RUBY = (170, 64, 105)
-MEDIUM_SEA_GREEN = (60, 179, 113)
-MEDIUM_SLATE_BLUE = (123, 104, 238)
-MEDIUM_SPRING_BUD = (201, 220, 135)
-MEDIUM_SPRING_GREEN = (0, 250, 154)
-MEDIUM_SKY_BLUE = (128, 218, 235)
-MEDIUM_TAUPE = (103, 76, 71)
-MEDIUM_TURQUOISE = (72, 209, 204)
-MEDIUM_TUSCAN_RED = (121, 68, 59)
-MEDIUM_VERMILION = (217, 96, 59)
-MEDIUM_VIOLET_RED = (199, 21, 133)
-MELLOW_APRICOT = (248, 184, 120)
-MELLOW_YELLOW = (248, 222, 126)
-MELON = (253, 188, 180)
-METALLIC_SEAWEED = (10, 126, 140)
-METALLIC_SUNBURST = (156, 124, 56)
-MEXICAN_PINK = (228, 0, 124)
-MIDNIGHT_BLUE = (25, 25, 112)
-MIDNIGHT_GREEN = (0, 73, 83)
-MIKADO_YELLOW = (255, 196, 12)
-MINDARO = (227, 249, 136)
-MINT = (62, 180, 137)
-MINT_CREAM = (245, 255, 250)
-MINT_GREEN = (152, 255, 152)
-MISTY_ROSE = (255, 228, 225)
-MOCCASIN = (250, 235, 215)
-MODE_BEIGE = (150, 113, 23)
-MOONSTONE_BLUE = (115, 169, 194)
-MORDANT_RED_19 = (174, 12, 0)
-MOSS_GREEN = (138, 154, 91)
-MOUNTAIN_MEADOW = (48, 186, 143)
-MOUNTBATTEN_PINK = (153, 122, 141)
-MSU_GREEN = (24, 69, 59)
-MUGHAL_GREEN = (48, 96, 48)
-MULBERRY = (197, 75, 140)
-MUSTARD = (255, 219, 88)
-MYRTLE_GREEN = (49, 120, 115)
-NADESHIKO_PINK = (246, 173, 198)
-NAPIER_GREEN = (42, 128, 0)
-NAPLES_YELLOW = (250, 218, 94)
-NAVAJO_WHITE = (255, 222, 173)
-NAVY_BLUE = (0, 0, 128)
-NAVY_PURPLE = (148, 87, 235)
-NEON_CARROT = (255, 163, 67)
-NEON_FUCHSIA = (254, 65, 100)
-NEON_GREEN = (57, 255, 20)
-NEW_CAR = (33, 79, 198)
-NEW_YORK_PINK = (215, 131, 127)
-NON_PHOTO_BLUE = (164, 221, 237)
-NYANZA = (233, 255, 219)
-OCEAN_BOAT_BLUE = (0, 119, 190)
-OCHRE = (204, 119, 34)
-OFFICE_GREEN = (0, 128, 0)
-OLD_BURGUNDY = (67, 48, 46)
-OLD_GOLD = (207, 181, 59)
-OLD_HELIOTROPE = (86, 60, 92)
-OLD_LACE = (253, 245, 230)
-OLD_LAVENDER = (121, 104, 120)
-OLD_MAUVE = (103, 49, 71)
-OLD_MOSS_GREEN = (134, 126, 54)
-OLD_ROSE = (192, 128, 129)
-OLD_SILVER = (132, 132, 130)
-OLIVE = (128, 128, 0)
-OLIVE_DRAB = (107, 142, 35)
-OLIVINE = (154, 185, 115)
-ONYX = (53, 56, 57)
-OPERA_MAUVE = (183, 132, 167)
-ORANGE = (255, 165, 0)
-ORANGE_PEEL = (255, 159, 0)
-ORANGE_RED = (255, 69, 0)
-ORCHID = (218, 112, 214)
-ORCHID_PINK = (242, 141, 205)
-ORIOLES_ORANGE = (251, 79, 20)
-OTTER_BROWN = (101, 67, 33)
-OUTER_SPACE = (65, 74, 76)
-OUTRAGEOUS_ORANGE = (255, 110, 74)
-OXFORD_BLUE = (0, 33, 71)
-OU_CRIMSON_RED = (153, 0, 0)
-PAKISTAN_GREEN = (0, 102, 0)
-PALATINATE_BLUE = (39, 59, 226)
-PALATINATE_PURPLE = (104, 40, 96)
-PALE_AQUA = (188, 212, 230)
-PALE_BLUE = (175, 238, 238)
-PALE_BROWN = (152, 118, 84)
-PALE_CARMINE = (175, 64, 53)
-PALE_CERULEAN = (155, 196, 226)
-PALE_CHESTNUT = (221, 173, 175)
-PALE_COPPER = (218, 138, 103)
-PALE_CORNFLOWER_BLUE = (171, 205, 239)
-PALE_GOLD = (230, 190, 138)
-PALE_GOLDENROD = (238, 232, 170)
-PALE_GREEN = (152, 251, 152)
-PALE_LAVENDER = (220, 208, 255)
-PALE_MAGENTA = (249, 132, 229)
-PALE_PINK = (250, 218, 221)
-PALE_PLUM = (221, 160, 221)
-PALE_RED_VIOLET = (219, 112, 147)
-PALE_ROBIN_EGG_BLUE = (150, 222, 209)
-PALE_SILVER = (201, 192, 187)
-PALE_SPRING_BUD = (236, 235, 189)
-PALE_TAUPE = (188, 152, 126)
-PALE_TURQUOISE = (175, 238, 238)
-PALE_VIOLET_RED = (219, 112, 147)
-PANSY_PURPLE = (120, 24, 74)
-PAOLO_VERONESE_GREEN = (0, 155, 125)
-PAPAYA_WHIP = (255, 239, 213)
-PARADISE_PINK = (230, 62, 98)
-PARIS_GREEN = (80, 200, 120)
-PASTEL_BLUE = (174, 198, 207)
-PASTEL_BROWN = (131, 105, 83)
-PASTEL_GRAY = (207, 207, 196)
-PASTEL_GREEN = (119, 221, 119)
-PASTEL_MAGENTA = (244, 154, 194)
-PASTEL_ORANGE = (255, 179, 71)
-PASTEL_PINK = (222, 165, 164)
-PASTEL_PURPLE = (179, 158, 181)
-PASTEL_RED = (255, 105, 97)
-PASTEL_VIOLET = (203, 153, 201)
-PASTEL_YELLOW = (253, 253, 150)
-PATRIARCH = (128, 0, 128)
-PAYNE_GREY = (83, 104, 120)
-PEACH = (255, 229, 180)
-PEACH_ORANGE = (255, 204, 153)
-PEACH_PUFF = (255, 218, 185)
-PEACH_YELLOW = (250, 223, 173)
-PEAR = (209, 226, 49)
-PEARL = (234, 224, 200)
-PEARL_AQUA = (136, 216, 192)
-PEARLY_PURPLE = (183, 104, 162)
-PERIDOT = (230, 226, 0)
-PERIWINKLE = (204, 204, 255)
-PERSIAN_BLUE = (28, 57, 187)
-PERSIAN_GREEN = (0, 166, 147)
-PERSIAN_INDIGO = (50, 18, 122)
-PERSIAN_ORANGE = (217, 144, 88)
-PERSIAN_PINK = (247, 127, 190)
-PERSIAN_PLUM = (112, 28, 28)
-PERSIAN_RED = (204, 51, 51)
-PERSIAN_ROSE = (254, 40, 162)
-PERSIMMON = (236, 88, 0)
-PERU = (205, 133, 63)
-PHLOX = (223, 0, 255)
-PHTHALO_BLUE = (0, 15, 137)
-PHTHALO_GREEN = (18, 53, 36)
-PICTON_BLUE = (69, 177, 232)
-PICTORIAL_CARMINE = (195, 11, 78)
-PIGGY_PINK = (253, 221, 230)
-PINE_GREEN = (1, 121, 111)
-PINK = (255, 192, 203)
-PINK_LACE = (255, 221, 244)
-PINK_LAVENDER = (216, 178, 209)
-PINK_PEARL = (231, 172, 207)
-PINK_SHERBET = (247, 143, 167)
-PISTACHIO = (147, 197, 114)
-PLATINUM = (229, 228, 226)
-PLUM = (221, 160, 221)
-POMP_AND_POWER = (134, 96, 142)
-POPSTAR = (190, 79, 98)
-PORTLAND_ORANGE = (255, 90, 54)
-POWDER_BLUE = (176, 224, 230)
-PRINCETON_ORANGE = (255, 143, 0)
-PRUNE = (112, 28, 28)
-PRUSSIAN_BLUE = (0, 49, 83)
-PSYCHEDELIC_PURPLE = (223, 0, 255)
-PUCE = (204, 136, 153)
-PUCE_RED = (114, 47, 55)
-PULLMAN_BROWN = (100, 65, 23)
-PUMPKIN = (255, 117, 24)
-PURPLE = (128, 0, 128)
-PURPLE_HEART = (105, 53, 156)
-PURPLE_MOUNTAIN_MAJESTY = (150, 120, 182)
-PURPLE_NAVY = (78, 81, 128)
-PURPLE_PIZZAZZ = (254, 78, 218)
-PURPLE_TAUPE = (80, 64, 77)
-PURPUREUS = (154, 78, 174)
-QUARTZ = (81, 72, 79)
-QUEEN_BLUE = (67, 107, 149)
-QUEEN_PINK = (232, 204, 215)
-QUINACRIDONE_MAGENTA = (142, 58, 89)
-RACKLEY = (93, 138, 168)
-RADICAL_RED = (255, 53, 94)
-RAJAH = (251, 171, 96)
-RASPBERRY = (227, 11, 93)
-RASPBERRY_GLACE = (145, 95, 109)
-RASPBERRY_PINK = (226, 80, 152)
-RASPBERRY_ROSE = (179, 68, 108)
-RAW_UMBER = (130, 102, 68)
-RAZZLE_DAZZLE_ROSE = (255, 51, 204)
-RAZZMATAZZ = (227, 37, 107)
-RAZZMIC_BERRY = (141, 78, 133)
-RED = (255, 0, 0)
-RED_BROWN = (165, 42, 42)
-RED_DEVIL = (134, 1, 17)
-RED_ORANGE = (255, 83, 73)
-RED_PURPLE = (228, 0, 120)
-RED_VIOLET = (199, 21, 133)
-REDWOOD = (164, 90, 82)
-REGALIA = (82, 45, 128)
-RESOLUTION_BLUE = (0, 35, 135)
-RHYTHM = (119, 118, 150)
-RICH_BLACK = (0, 64, 64)
-RICH_BRILLIANT_LAVENDER = (241, 167, 254)
-RICH_CARMINE = (215, 0, 64)
-RICH_ELECTRIC_BLUE = (8, 146, 208)
-RICH_LAVENDER = (167, 107, 207)
-RICH_LILAC = (182, 102, 210)
-RICH_MAROON = (176, 48, 96)
-RIFLE_GREEN = (68, 76, 56)
-ROAST_COFFEE = (112, 66, 65)
-ROBIN_EGG_BLUE = (0, 204, 204)
-ROCKET_METALLIC = (138, 127, 128)
-ROMAN_SILVER = (131, 137, 150)
-ROSE = (255, 0, 127)
-ROSE_BONBON = (249, 66, 158)
-ROSE_EBONY = (103, 72, 70)
-ROSE_GOLD = (183, 110, 121)
-ROSE_MADDER = (227, 38, 54)
-ROSE_PINK = (255, 102, 204)
-ROSE_QUARTZ = (170, 152, 169)
-ROSE_RED = (194, 30, 86)
-ROSE_TAUPE = (144, 93, 93)
-ROSE_VALE = (171, 78, 82)
-ROSEWOOD = (101, 0, 11)
-ROSSO_CORSA = (212, 0, 0)
-ROSY_BROWN = (188, 143, 143)
-ROYAL_AZURE = (0, 56, 168)
-ROYAL_BLUE = (65, 105, 225)
-ROYAL_FUCHSIA = (202, 44, 146)
-ROYAL_PURPLE = (120, 81, 169)
-ROYAL_YELLOW = (250, 218, 94)
-RUBER = (206, 70, 118)
-RUBINE_RED = (209, 0, 86)
-RUBY = (224, 17, 95)
-RUBY_RED = (155, 17, 30)
-RUDDY = (255, 0, 40)
-RUDDY_BROWN = (187, 101, 40)
-RUDDY_PINK = (225, 142, 150)
-RUFOUS = (168, 28, 7)
-RUSSET = (128, 70, 27)
-RUSSIAN_GREEN = (103, 146, 103)
-RUSSIAN_VIOLET = (50, 23, 77)
-RUST = (183, 65, 14)
-RUSTY_RED = (218, 44, 67)
-SACRAMENTO_STATE_GREEN = (0, 86, 63)
-SADDLE_BROWN = (139, 69, 19)
-SAFETY_ORANGE = (255, 103, 0)
-SAFETY_YELLOW = (238, 210, 2)
-SAFFRON = (244, 196, 48)
-SAGE = (188, 184, 138)
-ST_PATRICK_BLUE = (35, 41, 122)
-SALMON = (250, 128, 114)
-SALMON_PINK = (255, 145, 164)
-SAND = (194, 178, 128)
-SAND_DUNE = (150, 113, 23)
-SANDSTORM = (236, 213, 64)
-SANDY_BROWN = (244, 164, 96)
-SANDY_TAUPE = (150, 113, 23)
-SANGRIA = (146, 0, 10)
-SAP_GREEN = (80, 125, 42)
-SAPPHIRE = (15, 82, 186)
-SAPPHIRE_BLUE = (0, 103, 165)
-SATIN_SHEEN_GOLD = (203, 161, 53)
-SCARLET = (255, 36, 0)
-SCHAUSS_PINK = (255, 145, 175)
-SCHOOL_BUS_YELLOW = (255, 216, 0)
-SCREAMIN_GREEN = (118, 255, 122)
-SEA_BLUE = (0, 105, 148)
-SEA_GREEN = (46, 255, 139)
-SEAL_BROWN = (50, 20, 20)
-SEASHELL = (255, 245, 238)
-SELECTIVE_YELLOW = (255, 186, 0)
-SEPIA = (112, 66, 20)
-SHADOW = (138, 121, 93)
-SHADOW_BLUE = (119, 139, 165)
-SHAMPOO = (255, 207, 241)
-SHAMROCK_GREEN = (0, 158, 96)
-SHEEN_GREEN = (143, 212, 0)
-SHIMMERING_BLUSH = (217, 134, 149)
-SHOCKING_PINK = (252, 15, 192)
-SIENNA = (136, 45, 23)
-SILVER = (192, 192, 192)
-SILVER_CHALICE = (172, 172, 172)
-SILVER_LAKE_BLUE = (93, 137, 186)
-SILVER_PINK = (196, 174, 173)
-SILVER_SAND = (191, 193, 194)
-SINOPIA = (203, 65, 11)
-SKOBELOFF = (0, 116, 116)
-SKY_BLUE = (135, 206, 235)
-SKY_MAGENTA = (207, 113, 175)
-SLATE_BLUE = (106, 90, 205)
-SLATE_GRAY = (112, 128, 144)
-SMALT = (0, 51, 153)
-SMITTEN = (200, 65, 134)
-SMOKE = (115, 130, 118)
-SMOKEY_TOPAZ = (147, 61, 65)
-SMOKY_BLACK = (16, 12, 8)
-SNOW = (255, 250, 250)
-SOAP = (206, 200, 239)
-SONIC_SILVER = (117, 117, 117)
-SPACE_CADET = (29, 41, 81)
-SPANISH_BISTRE = (128, 117, 90)
-SPANISH_CARMINE = (209, 0, 71)
-SPANISH_CRIMSON = (229, 26, 76)
-SPANISH_BLUE = (0, 112, 184)
-SPANISH_GRAY = (152, 152, 152)
-SPANISH_GREEN = (0, 145, 80)
-SPANISH_ORANGE = (232, 97, 0)
-SPANISH_PINK = (247, 191, 190)
-SPANISH_RED = (230, 0, 38)
-SPANISH_SKY_BLUE = (0, 170, 228)
-SPANISH_VIOLET = (76, 40, 130)
-SPANISH_VIRIDIAN = (0, 127, 92)
-SPIRO_DISCO_BALL = (15, 192, 252)
-SPRING_BUD = (167, 252, 0)
-SPRING_GREEN = (0, 255, 127)
-STAR_COMMAND_BLUE = (0, 123, 184)
-STEEL_BLUE = (70, 130, 180)
-STEEL_PINK = (204, 51, 102)
-STIL_DE_GRAIN_YELLOW = (250, 218, 94)
-STIZZA = (153, 0, 0)
-STORMCLOUD = (79, 102, 106)
-STRAW = (228, 217, 111)
-STRAWBERRY = (252, 90, 141)
-SUNGLOW = (255, 204, 51)
-SUNRAY = (227, 171, 87)
-SUNSET = (250, 214, 165)
-SUNSET_ORANGE = (253, 94, 83)
-SUPER_PINK = (207, 107, 169)
-TAN = (210, 180, 140)
-TANGELO = (249, 77, 0)
-TANGERINE = (242, 133, 0)
-TANGERINE_YELLOW = (255, 204, 0)
-TANGO_PINK = (228, 113, 122)
-TAUPE = (72, 60, 50)
-TAUPE_GRAY = (139, 133, 137)
-TEA_GREEN = (208, 240, 192)
-TEA_ROSE = (244, 194, 194)
-TEAL = (0, 128, 128)
-TEAL_BLUE = (54, 117, 136)
-TEAL_DEER = (153, 230, 179)
-TEAL_GREEN = (0, 130, 127)
-TELEMAGENTA = (207, 52, 118)
-TERRA_COTTA = (226, 114, 91)
-THISTLE = (216, 191, 216)
-THULIAN_PINK = (222, 111, 161)
-TICKLE_ME_PINK = (252, 137, 172)
-TIFFANY_BLUE = (10, 186, 181)
-TIGERS_EYE = (224, 141, 60)
-TIMBERWOLF = (219, 215, 210)
-TITANIUM_YELLOW = (238, 230, 0)
-TOMATO = (255, 99, 71)
-TOOLBOX = (116, 108, 192)
-TOPAZ = (255, 200, 124)
-TRACTOR_RED = (253, 14, 53)
-TROLLEY_GREY = (128, 128, 128)
-TROPICAL_RAIN_FOREST = (0, 117, 94)
-TRUE_BLUE = (0, 115, 207)
-TUFTS_BLUE = (65, 125, 193)
-TULIP = (255, 135, 141)
-TUMBLEWEED = (222, 170, 136)
-TURKISH_ROSE = (181, 114, 129)
-TURQUOISE = (64, 224, 208)
-TURQUOISE_BLUE = (0, 255, 239)
-TURQUOISE_GREEN = (160, 214, 180)
-TUSCAN = (250, 214, 165)
-TUSCAN_BROWN = (111, 78, 55)
-TUSCAN_RED = (124, 72, 72)
-TUSCAN_TAN = (166, 123, 91)
-TUSCANY = (192, 153, 153)
-TWILIGHT_LAVENDER = (138, 73, 107)
-TYRIAN_PURPLE = (102, 2, 60)
-UA_BLUE = (0, 51, 170)
-UA_RED = (217, 0, 76)
-UBE = (136, 120, 195)
-UCLA_BLUE = (83, 104, 149)
-UCLA_GOLD = (255, 179, 0)
-UFO_GREEN = (60, 208, 112)
-ULTRAMARINE = (18, 10, 143)
-ULTRAMARINE_BLUE = (65, 102, 245)
-ULTRA_PINK = (255, 111, 255)
-UMBER = (99, 81, 71)
-UNBLEACHED_SILK = (255, 221, 202)
-UNITED_NATIONS_BLUE = (91, 146, 229)
-UNIVERSITY_OF_CALIFORNIA_GOLD = (183, 135, 39)
-UNMELLOW_YELLOW = (255, 255, 102)
-UP_FOREST_GREEN = (1, 68, 33)
-UP_MAROON = (123, 17, 19)
-UPSDELL_RED = (174, 32, 41)
-UROBILIN = (225, 173, 33)
-USAFA_BLUE = (0, 79, 152)
-USC_CARDINAL = (153, 0, 0)
-USC_GOLD = (255, 204, 0)
-UNIVERSITY_OF_TENNESSEE_ORANGE = (247, 127, 0)
-UTAH_CRIMSON = (211, 0, 63)
-VANILLA = (243, 229, 171)
-VANILLA_ICE = (243, 143, 169)
-VEGAS_GOLD = (197, 179, 88)
-VENETIAN_RED = (200, 8, 21)
-VERDIGRIS = (67, 179, 174)
-VERMILION = (227, 66, 52)
-VERONICA = (160, 32, 240)
-VIOLET = (143, 0, 255)
-VIOLET_BLUE = (50, 74, 178)
-VIOLET_RED = (247, 83, 148)
-VIRIDIAN = (64, 130, 109)
-VIRIDIAN_GREEN = (0, 150, 152)
-VIVID_AUBURN = (146, 39, 36)
-VIVID_BURGUNDY = (159, 29, 53)
-VIVID_CERISE = (218, 29, 129)
-VIVID_ORCHID = (204, 0, 255)
-VIVID_SKY_BLUE = (0, 204, 255)
-VIVID_TANGERINE = (255, 160, 137)
-VIVID_VIOLET = (159, 0, 255)
-WARM_BLACK = (0, 66, 66)
-WATERSPOUT = (164, 244, 249)
-WENGE = (100, 84, 82)
-WHEAT = (245, 222, 179)
-WHITE = (255, 255, 255)
-WHITE_SMOKE = (245, 245, 245)
-WILD_BLUE_YONDER = (162, 173, 208)
-WILD_ORCHID = (212, 112, 162)
-WILD_STRAWBERRY = (255, 67, 164)
-WILD_WATERMELON = (252, 108, 133)
-WILLPOWER_ORANGE = (253, 88, 0)
-WINDSOR_TAN = (167, 85, 2)
-WINE = (114, 47, 55)
-WINE_DREGS = (103, 49, 71)
-WISTERIA = (201, 160, 220)
-WOOD_BROWN = (193, 154, 107)
-XANADU = (115, 134, 120)
-YALE_BLUE = (15, 77, 146)
-YANKEES_BLUE = (28, 40, 65)
-YELLOW = (255, 255, 0)
-YELLOW_GREEN = (154, 205, 50)
-YELLOW_ORANGE = (255, 174, 66)
-YELLOW_ROSE = (255, 240, 0)
-ZAFFRE = (0, 20, 168)
-ZINNWALDITE_BROWN = (44, 22, 8)
diff --git a/arcade/csscolor/__init__.py b/arcade/csscolor/__init__.py
deleted file mode 100644
index 753b5ec..0000000
--- a/arcade/csscolor/__init__.py
+++ /dev/null
@@ -1,152 +0,0 @@
-"""
-This module pre-defines colors as defined by the W3C CSS standard:
-https://www.w3.org/TR/2018/PR-css-color-3-20180315/
-"""
-
-ALICE_BLUE = (240, 248, 255)
-ANTIQUE_WHITE = (250, 235, 215)
-AQUA = (0, 255, 255)
-AQUAMARINE = (127, 255, 212)
-AZURE = (240, 255, 255)
-BEIGE = (245, 245, 220)
-BISQUE = (255, 228, 196)
-BLACK = (0, 0, 0)
-BLANCHED_ALMOND = (255, 235, 205)
-BLUE = (0, 0, 255)
-BLUE_VIOLET = (138, 43, 226)
-BROWN = (165, 42, 42)
-BURLYWOOD = (222, 184, 135)
-CADET_BLUE = (95, 158, 160)
-CHARTREUSE = (127, 255, 0)
-CHOCOLATE = (210, 105, 30)
-CORAL = (255, 127, 80)
-CORNFLOWER_BLUE = (100, 149, 237)
-CORNSILK = (255, 248, 220)
-CRIMSON = (220, 20, 60)
-CYAN = (0, 255, 255)
-DARK_BLUE = (0, 0, 139)
-DARK_CYAN = (0, 139, 139)
-DARK_GOLDENROD = (184, 134, 11)
-DARK_GRAY = (169, 169, 169)
-DARK_GREEN = (0, 100, 0)
-DARK_GREY = (169, 169, 169)
-DARK_KHAKI = (189, 183, 107)
-DARK_MAGENTA = (139, 0, 139)
-DARK_OLIVE_GREEN = (85, 107, 47)
-DARK_ORANGE = (255, 140, 0)
-DARK_ORCHID = (153, 50, 204)
-DARK_RED = (139, 0, 0)
-DARK_SALMON = (233, 150, 122)
-DARK_SEA_GREEN = (143, 188, 143)
-DARK_SLATE_BLUE = (72, 61, 139)
-DARK_SLATE_GRAY = (47, 79, 79)
-DARK_SLATE_GREY = (47, 79, 79)
-DARK_TURQUOISE = (0, 206, 209)
-DARK_VIOLET = (148, 0, 211)
-DEEP_PINK = (255, 20, 147)
-DEEP_SKY_BLUE = (0, 191, 255)
-DIM_GRAY = (105, 105, 105)
-DIM_GREY = (105, 105, 105)
-DODGER_BLUE = (30, 144, 255)
-FIREBRICK = (178, 34, 34)
-FLORAL_WHITE = (255, 250, 240)
-FOREST_GREEN = (34, 139, 34)
-FUCHSIA = (255, 0, 255)
-GAINSBORO = (220, 220, 220)
-GHOST_WHITE = (248, 248, 255)
-GOLD = (255, 215, 0)
-GOLDENROD = (218, 165, 32)
-GRAY = (128, 128, 128)
-GREEN = (0, 128, 0)
-GREENYELLOW = (173, 255, 47)
-GREY = (128, 128, 128)
-HONEYDEW = (240, 255, 240)
-HOTPINK = (255, 105, 180)
-INDIANRED = (205, 92, 92)
-INDIGO = (75, 0, 130)
-IVORY = (255, 255, 240)
-KHAKI = (240, 230, 140)
-LAVENDER = (230, 230, 250)
-LAVENDER_BLUSH = (255, 240, 245)
-LAWNGREEN = (124, 252, 0)
-LEMON_CHIFFON = (255, 250, 205)
-LIGHT_BLUE = (173, 216, 230)
-LIGHT_CORAL = (240, 128, 128)
-LIGHT_CYAN = (224, 255, 255)
-LIGHT_GOLDENROD_YELLOW = (250, 250, 210)
-LIGHT_GRAY = (211, 211, 211)
-LIGHT_GREEN = (144, 238, 144)
-LIGHT_GREY = (211, 211, 211)
-LIGHT_PINK = (255, 182, 193)
-LIGHT_SALMON = (255, 160, 122)
-LIGHT_SEA_GREEN = (32, 178, 170)
-LIGHT_SKY_BLUE = (135, 206, 250)
-LIGHT_SLATE_GRAY = (119, 136, 153)
-LIGHT_SLATE_GREY = (119, 136, 153)
-LIGHT_STEEL_BLUE = (176, 196, 222)
-LIGHT_YELLOW = (255, 255, 224)
-LIME = (0, 255, 0)
-LIME_GREEN = (50, 205, 50)
-LINEN = (250, 240, 230)
-MAGENTA = (255, 0, 255)
-MAROON = (128, 0, 0)
-MEDIUM_AQUAMARINE = (102, 205, 170)
-MEDIUM_BLUE = (0, 0, 205)
-MEDIUM_ORCHID = (186, 85, 211)
-MEDIUM_PURPLE = (147, 112, 219)
-MEDIUM_SEA_GREEN = (60, 179, 113)
-MEDIUM_SLATE_BLUE = (123, 104, 238)
-MEDIUM_SPRING_GREEN = (0, 250, 154)
-MEDIUM_TURQUOISE = (72, 209, 204)
-MEDIUM_VIOLET_RED = (199, 21, 133)
-MIDNIGHT_BLUE = (25, 25, 112)
-MINT_CREAM = (245, 255, 250)
-MISTY_ROSE = (255, 228, 225)
-MOCCASIN = (255, 228, 181)
-NAVAJO_WHITE = (255, 222, 173)
-NAVY = (0, 0, 128)
-OLD_LACE = (253, 245, 230)
-OLIVE = (128, 128, 0)
-OLIVE_DRAB = (107, 142, 35)
-ORANGE = (255, 165, 0)
-ORANGE_RED = (255, 69, 0)
-ORCHID = (218, 112, 214)
-PALE_GOLDENROD = (238, 232, 170)
-PALE_GREEN = (152, 251, 152)
-PALE_TURQUOISE = (175, 238, 238)
-PALE_VIOLET_RED = (219, 112, 147)
-PAPAYA_WHIP = (255, 239, 213)
-PEACH_PUFF = (255, 218, 185)
-PERU = (205, 133, 63)
-PINK = (255, 192, 203)
-PLUM = (221, 160, 221)
-POWDER_BLUE = (176, 224, 230)
-PURPLE = (128, 0, 128)
-RED = (255, 0, 0)
-ROSY_BROWN = (188, 143, 143)
-ROYAL_BLUE = (65, 105, 225)
-SADDLE_BROWN = (139, 69, 19)
-SALMON = (250, 128, 114)
-SANDY_BROWN = (244, 164, 96)
-SEA_GREEN = (46, 139, 87)
-SEASHELL = (255, 245, 238)
-SIENNA = (160, 82, 45)
-SILVER = (192, 192, 192)
-SKY_BLUE = (135, 206, 235)
-SLATE_BLUE = (106, 90, 205)
-SLATE_GRAY = (112, 128, 144)
-SLATE_GREY = (112, 128, 144)
-SNOW = (255, 250, 250)
-SPRING_GREEN = (0, 255, 127)
-STEEL_BLUE = (70, 130, 180)
-TAN = (210, 180, 140)
-TEAL = (0, 128, 128)
-THISTLE = (216, 191, 216)
-TOMATO = (255, 99, 71)
-TURQUOISE = (64, 224, 208)
-VIOLET = (238, 130, 238)
-WHEAT = (245, 222, 179)
-WHITE = (255, 255, 255)
-WHITE_SMOKE = (245, 245, 245)
-YELLOW = (255, 255, 0)
-YELLOW_GREEN = (154, 205)
diff --git a/arcade/draw_commands.py b/arcade/draw_commands.py
deleted file mode 100644
index 5f55a16..0000000
--- a/arcade/draw_commands.py
+++ /dev/null
@@ -1,1342 +0,0 @@
-"""
-This module contains commands for basic graphics drawing commands.
-(Drawing primitives.)
-
-Many of these commands are slow, because they load everything to the
-graphics card each time a shape is drawn. For faster drawing, see the
-Buffered Draw Commands.
-"""
-# pylint: disable=too-many-arguments, too-many-locals, too-few-public-methods
-
-import PIL.Image
-import PIL.ImageOps
-import PIL.ImageDraw
-import numpy as np
-
-import pyglet.gl as gl
-
-from typing import List
-
-from arcade.window_commands import get_projection
-from arcade.window_commands import get_window
-from arcade.arcade_types import Color
-from arcade.arcade_types import PointList
-from arcade import shader
-from arcade.earclip import earclip
-from arcade.utils import *
-
-line_vertex_shader = '''
- #version 330
- uniform mat4 Projection;
- in vec2 in_vert;
- in vec4 in_color;
- out vec4 v_color;
- void main() {
- gl_Position = Projection * vec4(in_vert, 0.0, 1.0);
- v_color = in_color;
- }
-'''
-
-line_fragment_shader = '''
- #version 330
- in vec4 v_color;
- out vec4 f_color;
- void main() {
- f_color = v_color;
- }
-'''
-
-
-def get_four_byte_color(color: Color) -> Color:
- """
- Given a RGB list, it will return RGBA.
- Given a RGBA list, it will return the same RGBA.
-
- :param Color color: Three or four byte tuple
-
- :returns: return: Four byte RGBA tuple
- """
-
- if len(color) == 4:
- return color
- elif len(color) == 3:
- return color[0], color[1], color[2], 255
- else:
- raise ValueError("This isn't a 3 or 4 byte color")
-
-
-def get_four_float_color(color: Color) -> (float, float, float, float):
- """
- Given a 3 or 4 RGB/RGBA color where each color goes 0-255, this
- returns a RGBA list where each item is a scaled float from 0 to 1.
-
- :param Color color: Three or four byte tuple
- :return: Four floats as a RGBA tuple
- """
- if len(color) == 4:
- return color[0] / 255, color[1] / 255, color[2] / 255, color[3] / 255
- elif len(color) == 3:
- return color[0] / 255, color[1] / 255, color[2] / 255, 1.0
- else:
- raise ValueError("This isn't a 3 or 4 byte color")
-
-
-def make_transparent_color(color: Color, transparency: float):
- """
- Given a RGB color, along with an alpha, returns a RGBA color tuple.
-
- :param Color color: Three or four byte RGBA color
- :param float transparency: Transparency
- """
- return color[0], color[1], color[2], transparency
-
-
-def rotate_point(x: float, y: float, cx: float, cy: float,
- angle: float) -> (float, float):
- """
- Rotate a point around a center.
-
- :param x: x value of the point you want to rotate
- :param y: y value of the point you want to rotate
- :param cx: x value of the center point you want to rotate around
- :param cy: y value of the center point you want to rotate around
- :param angle: Angle, in degrees, to rotate
- :return: Return rotated (x, y) pair
- :rtype: (float, float)
- """
- temp_x = x - cx
- temp_y = y - cy
-
- # now apply rotation
- rotated_x = temp_x * math.cos(math.radians(angle)) - temp_y * math.sin(math.radians(angle))
- rotated_y = temp_x * math.sin(math.radians(angle)) + temp_y * math.cos(math.radians(angle))
-
- # translate back
- rounding_precision = 2
- x = round(rotated_x + cx, rounding_precision)
- y = round(rotated_y + cy, rounding_precision)
-
- return x, y
-
-
-class Texture:
- """
- Class that represents a texture.
- Usually created by the ``load_texture`` or ``load_textures`` commands.
-
- Attributes:
- :name:
- :image:
- :scale:
- :width: Width of the texture image in pixels
- :height: Height of the texture image in pixels
-
- """
-
- def __init__(self, name, image=None):
- self.name = name
- self.texture = None
- self.image = image
- self.scale = 1
- if image:
- self.width = image.width
- self.height = image.height
- else:
- self.width = 0
- self.height = 0
-
- self._sprite = None
- self._sprite = None
-
- def draw(self, center_x: float, center_y: float, width: float,
- height: float, angle: float = 0,
- alpha: int = 255, transparent: bool = True,
- repeat_count_x=1, repeat_count_y=1):
- """
-
- Args:
- center_x:
- center_y:
- width:
- height:
- angle:
- alpha: Currently unused.
- transparent: Currently unused.
- repeat_count_x: Currently unused.
- repeat_count_y: Currently unused.
-
- Returns:
-
- """
-
- from arcade.sprite import Sprite
- from arcade.sprite_list import SpriteList
-
- if self._sprite is None:
- self._sprite = Sprite()
- self._sprite._texture = self
- self._sprite.textures = [self]
-
- self._sprite_list = SpriteList()
- self._sprite_list.append(self._sprite)
-
- self._sprite.center_x = center_x
- self._sprite.center_y = center_y
- self._sprite.width = width
- self._sprite.height = height
- self._sprite.angle = angle
- self._sprite.alpha = alpha
-
- self._sprite_list.draw()
-
-
-def load_textures(file_name: str,
- image_location_list: PointList,
- mirrored: bool = False,
- flipped: bool = False,
- scale: float = 1) -> List['Texture']:
- """
- Load a set of textures off of a single image file.
-
- Note, if the code is to load only part of the image, the given x, y
- coordinates will start with the origin (0, 0) in the upper left of the
- image. When drawing, Arcade uses (0, 0)
- in the lower left corner when drawing. Be careful about this reversal.
-
- For a longer explanation of why computers sometimes start in the upper
- left, see:
- http://programarcadegames.com/index.php?chapter=introduction_to_graphics&lang=en#section_5
-
- :param str file_name: Name of the file.
- :param PointList image_location_list: List of image locations. Each location should be
- a list of four floats. ``[x, y, width, height]``.
- :param bool mirrored: If set to true, the image is mirrored left to right.
- :param bool flipped: If set to true, the image is flipped upside down.
- :param float scale: Scale factor to apply on each new texture.
-
-
- :Returns: List of textures loaded.
- :Raises: ValueError
- """
- # See if we already loaded this texture file, and we can just use a cached version.
- cache_file_name = "{}".format(file_name)
- if cache_file_name in load_texture.texture_cache:
- texture = load_texture.texture_cache[cache_file_name]
- source_image = texture.image
- else:
- source_image = PIL.Image.open(file_name)
- result = Texture(cache_file_name, source_image)
- load_texture.texture_cache[cache_file_name] = result
-
- source_image_width, source_image_height = source_image.size
- texture_info_list = []
- for image_location in image_location_list:
- x, y, width, height = image_location
-
- if width <= 0:
- raise ValueError("Texture has a width of {}, must be > 0."
- .format(width))
- if x > source_image_width:
- raise ValueError("Can't load texture starting at an x of {} "
- "when the image is only {} across."
- .format(x, source_image_width))
- if y > source_image_height:
- raise ValueError("Can't load texture starting at an y of {} "
- "when the image is only {} high."
- .format(y, source_image_height))
- if x + width > source_image_width:
- raise ValueError("Can't load texture ending at an x of {} "
- "when the image is only {} wide."
- .format(x + width, source_image_width))
- if y + height > source_image_height:
- raise ValueError("Can't load texture ending at an y of {} "
- "when the image is only {} high."
- .format(y + height, source_image_height))
-
- # See if we already loaded this texture, and we can just use a cached version.
- cache_name = "{}{}{}{}{}{}{}{}".format(file_name, x, y, width, height, scale, flipped, mirrored)
- if cache_name in load_texture.texture_cache:
- result = load_texture.texture_cache[cache_name]
- else:
- image = source_image.crop((x, y, x + width, y + height))
- # image = _trim_image(image)
-
- if mirrored:
- image = PIL.ImageOps.mirror(image)
-
- if flipped:
- image = PIL.ImageOps.flip(image)
- result = Texture(cache_name, image)
- load_texture.texture_cache[cache_name] = result
- result.scale = scale
- texture_info_list.append(result)
-
- return texture_info_list
-
-
-def load_texture(file_name: str, x: float = 0, y: float = 0,
- width: float = 0, height: float = 0,
- mirrored: bool = False,
- flipped: bool = False,
- scale: float = 1) -> Texture:
- """
- Load image from disk and create a texture.
-
- Note, if the code is to load only part of the image, the given x, y
- coordinates will start with the origin (0, 0) in the upper left of the
- image. When drawing, Arcade uses (0, 0)
- in the lower left corner when drawing. Be careful about this reversal.
-
- For a longer explanation of why computers sometimes start in the upper
- left, see:
- http://programarcadegames.com/index.php?chapter=introduction_to_graphics&lang=en#section_5
-
- :param str file_name: Name of the file to that holds the texture.
- :param float x: X position of the crop area of the texture.
- :param float y: Y position of the crop area of the texture.
- :param float width: Width of the crop area of the texture.
- :param float height: Height of the crop area of the texture.
- :param bool mirrored: True if we mirror the image across the y axis
- :param bool flipped: True if we flip the image across the x axis
- :param float scale: Scale factor to apply on the new texture.
-
- :Returns: The new texture.
- :raises: None
-
- """
-
- # See if we already loaded this texture, and we can just use a cached version.
- cache_name = "{}{}{}{}{}{}{}{}".format(file_name, x, y, width, height, scale, flipped, mirrored)
- if cache_name in load_texture.texture_cache:
- return load_texture.texture_cache[cache_name]
-
- # See if we already loaded this texture file, and we can just use a cached version.
- cache_file_name = "{}".format(file_name)
- if cache_file_name in load_texture.texture_cache:
- texture = load_texture.texture_cache[cache_file_name]
- source_image = texture.image
- else:
- source_image = PIL.Image.open(file_name)
- result = Texture(cache_file_name, source_image)
- load_texture.texture_cache[cache_file_name] = result
-
- source_image_width, source_image_height = source_image.size
-
- if x != 0 or y != 0 or width != 0 or height != 0:
- if x > source_image_width:
- raise ValueError("Can't load texture starting at an x of {} "
- "when the image is only {} across."
- .format(x, source_image_width))
- if y > source_image_height:
- raise ValueError("Can't load texture starting at an y of {} "
- "when the image is only {} high."
- .format(y, source_image_height))
- if x + width > source_image_width:
- raise ValueError("Can't load texture ending at an x of {} "
- "when the image is only {} wide."
- .format(x + width, source_image_width))
- if y + height > source_image_height:
- raise ValueError("Can't load texture ending at an y of {} "
- "when the image is only {} high."
- .format(y + height, source_image_height))
-
- image = source_image.crop((x, y, x + width, y + height))
- else:
- image = source_image
-
- # image = _trim_image(image)
- if mirrored:
- image = PIL.ImageOps.mirror(image)
-
- if flipped:
- image = PIL.ImageOps.flip(image)
-
- result = Texture(cache_name, image)
- load_texture.texture_cache[cache_name] = result
- result.scale = scale
- return result
-
-
-def make_circle_texture(diameter: int, color: Color) -> Texture:
- """
- Return a Texture of a circle with given diameter and color
-
- :param int diameter: Diameter of the circle and dimensions of the square Texture returned
- :param Color color: Color of the circle
- :Returns: A Texture object
- :Raises: None
- """
- bg_color = (0, 0, 0, 0) # fully transparent
- img = PIL.Image.new("RGBA", (diameter, diameter), bg_color)
- draw = PIL.ImageDraw.Draw(img)
- draw.ellipse((0, 0, diameter - 1, diameter - 1), fill=color)
- name = "{}:{}:{}".format("circle_texture", diameter, color) # name must be unique for caching
- return Texture(name, img)
-
-
-def make_soft_circle_texture(diameter: int, color: Color, center_alpha: int = 255, outer_alpha: int = 0) -> Texture:
- """
- Return a Texture of a circle with given diameter, color, and alpha values at its center and edges
-
- Args:
- :diameter (int): Diameter of the circle and dimensions of the square Texture returned
- :color (Color): Color of the circle
- :center_alpha (int): alpha value of circle at its center
- :outer_alpha (int): alpha value of circle at its edge
- Returns:
- A Texture object
- Raises:
- None
- """
- # TODO: create a rectangle and circle (and triangle? and arbitrary poly where client passes
- # in list of points?) particle?
- bg_color = (0, 0, 0, 0) # fully transparent
- img = PIL.Image.new("RGBA", (diameter, diameter), bg_color)
- draw = PIL.ImageDraw.Draw(img)
- max_radius = int(diameter // 2)
- center = max_radius # for readability
- for radius in range(max_radius, 0, -1):
- alpha = int(lerp(center_alpha, outer_alpha, radius / max_radius))
- clr = (color[0], color[1], color[2], alpha)
- draw.ellipse((center - radius, center - radius, center + radius - 1, center + radius - 1), fill=clr)
- name = "{}:{}:{}:{}:{}".format("soft_circle_texture", diameter, color, center_alpha,
- outer_alpha) # name must be unique for caching
- return Texture(name, img)
-
-
-def make_soft_square_texture(size: int, color: Color, center_alpha: int = 255, outer_alpha: int = 0) -> Texture:
- """
- Return a Texture of a circle with given diameter and color, fading out at the edges.
-
- Args:
- :diameter (int): Diameter of the circle and dimensions of the square Texture returned
- :color (Color): Color of the circle
- Returns:
- The new texture.
- Raises:
- None
- """
- bg_color = (0, 0, 0, 0) # fully transparent
- img = PIL.Image.new("RGBA", (size, size), bg_color)
- draw = PIL.ImageDraw.Draw(img)
- half_size = int(size // 2)
- for cur_size in range(0, half_size):
- alpha = int(lerp(outer_alpha, center_alpha, cur_size / half_size))
- clr = (color[0], color[1], color[2], alpha)
- # draw.ellipse((center-radius, center-radius, center+radius, center+radius), fill=clr)
- draw.rectangle((cur_size, cur_size, size - cur_size, size - cur_size), clr, None)
- name = "{}:{}:{}:{}".format("gradientsquare", size, color, center_alpha,
- outer_alpha) # name must be unique for caching
- return Texture(name, img)
-
-
-def _lerp_color(start_color: Color, end_color: Color, u: float) -> Color:
- return (
- int(lerp(start_color[0], end_color[0], u)),
- int(lerp(start_color[1], end_color[1], u)),
- int(lerp(start_color[2], end_color[2], u))
- )
-
-
-load_texture.texture_cache = dict()
-
-
-# --- END TEXTURE FUNCTIONS # # #
-
-
-def trim_image(image: PIL.Image) -> PIL.Image:
- """
- Returns an image with extra whitespace cropped out.
- """
- bbox = image.getbbox()
- return image.crop(bbox)
-
-
-# --- BEGIN ARC FUNCTIONS # # #
-
-
-def draw_arc_filled(center_x: float, center_y: float,
- width: float, height: float,
- color: Color,
- start_angle: float, end_angle: float,
- tilt_angle: float = 0,
- num_segments: int = 128):
- """
- Draw a filled in arc. Useful for drawing pie-wedges, or Pac-Man.
-
- :param float center_x: x position that is the center of the arc.
- :param float center_y: y position that is the center of the arc.
- :param float width: width of the arc.
- :param float height: height of the arc.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float start_angle: start angle of the arc in degrees.
- :param float end_angle: end angle of the arc in degrees.
- :param float tilt_angle: angle the arc is tilted.
- :param float num_segments: Number of line segments used to draw arc.
- """
- unrotated_point_list = [[0, 0]]
-
- start_segment = int(start_angle / 360 * num_segments)
- end_segment = int(end_angle / 360 * num_segments)
-
- for segment in range(start_segment, end_segment + 1):
- theta = 2.0 * 3.1415926 * segment / num_segments
-
- x = width * math.cos(theta)
- y = height * math.sin(theta)
-
- unrotated_point_list.append((x, y))
-
- if tilt_angle == 0:
- uncentered_point_list = unrotated_point_list
- else:
- uncentered_point_list = []
- for point in unrotated_point_list:
- uncentered_point_list.append(rotate_point(point[0], point[1], 0, 0, tilt_angle))
-
- point_list = []
- for point in uncentered_point_list:
- point_list.append((point[0] + center_x, point[1] + center_y))
-
- _generic_draw_line_strip(point_list, color, gl.GL_TRIANGLE_FAN)
-
-
-def draw_arc_outline(center_x: float, center_y: float, width: float,
- height: float, color: Color,
- start_angle: float, end_angle: float,
- border_width: float = 1, tilt_angle: float = 0,
- num_segments: int = 128):
- """
- Draw the outside edge of an arc. Useful for drawing curved lines.
-
- :param float center_x: x position that is the center of the arc.
- :param float center_y: y position that is the center of the arc.
- :param float width: width of the arc.
- :param float height: height of the arc.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float start_angle: start angle of the arc in degrees.
- :param float end_angle: end angle of the arc in degrees.
- :param float border_width: width of line in pixels.
- :param float tilt_angle: angle the arc is tilted.
- :param int num_segments: float of triangle segments that make up this
- circle. Higher is better quality, but slower render time.
- """
- unrotated_point_list = []
-
- start_segment = int(start_angle / 360 * num_segments)
- end_segment = int(end_angle / 360 * num_segments)
-
- inside_width = width - border_width / 2
- outside_width = width + border_width / 2
- inside_height = height - border_width / 2
- outside_height = height + border_width / 2
-
- for segment in range(start_segment, end_segment + 1):
- theta = 2.0 * math.pi * segment / num_segments
-
- x1 = inside_width * math.cos(theta)
- y1 = inside_height * math.sin(theta)
-
- x2 = outside_width * math.cos(theta)
- y2 = outside_height * math.sin(theta)
-
- unrotated_point_list.append((x1, y1))
- unrotated_point_list.append((x2, y2))
-
- if tilt_angle == 0:
- uncentered_point_list = unrotated_point_list
- else:
- uncentered_point_list = []
- for point in unrotated_point_list:
- uncentered_point_list.append(rotate_point(point[0], point[1], 0, 0, tilt_angle))
-
- point_list = []
- for point in uncentered_point_list:
- point_list.append((point[0] + center_x, point[1] + center_y))
-
- _generic_draw_line_strip(point_list, color, gl.GL_TRIANGLE_STRIP)
-
-
-# --- END ARC FUNCTIONS # # #
-
-
-# --- BEGIN PARABOLA FUNCTIONS # # #
-
-def draw_parabola_filled(start_x: float, start_y: float, end_x: float,
- height: float, color: Color,
- tilt_angle: float = 0):
- """
- Draws a filled in parabola.
-
- :param float start_x: The starting x position of the parabola
- :param float start_y: The starting y position of the parabola
- :param float end_x: The ending x position of the parabola
- :param float height: The height of the parabola
- :param Color color: The color of the parabola
- :param float tilt_angle: The angle of the tilt of the parabola
-
- """
- center_x = (start_x + end_x) / 2
- center_y = start_y + height
- start_angle = 0
- end_angle = 180
- width = (start_x - end_x)
- draw_arc_filled(center_x, center_y, width, height, color,
- start_angle, end_angle, tilt_angle)
-
-
-def draw_parabola_outline(start_x: float, start_y: float, end_x: float,
- height: float, color: Color,
- border_width: float = 1, tilt_angle: float = 0):
- """
- Draws the outline of a parabola.
-
- :param float start_x: The starting x position of the parabola
- :param float start_y: The starting y position of the parabola
- :param float end_x: The ending x position of the parabola
- :param float height: The height of the parabola
- :param Color color: The color of the parabola
- :param float border_width: The width of the parabola
- :param float tilt_angle: The angle of the tilt of the parabola
- """
- center_x = (start_x + end_x) / 2
- center_y = start_y + height
- start_angle = 0
- end_angle = 180
- width = (start_x - end_x)
- draw_arc_outline(center_x, center_y, width, height, color,
- start_angle, end_angle, border_width, tilt_angle)
-
-
-# --- END PARABOLA FUNCTIONS # # #
-
-
-# --- BEGIN CIRCLE FUNCTIONS # # #
-
-def draw_circle_filled(center_x: float, center_y: float, radius: float,
- color: Color,
- num_segments: int = 128):
- """
- Draw a filled-in circle.
-
- :param float center_x: x position that is the center of the circle.
- :param float center_y: y position that is the center of the circle.
- :param float radius: width of the circle.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param int num_segments: float of triangle segments that make up this
- circle. Higher is better quality, but slower render time.
- """
- width = radius * 2
- height = radius * 2
- draw_ellipse_filled(center_x, center_y, width, height, color, num_segments=num_segments)
-
-
-def draw_circle_outline(center_x: float, center_y: float, radius: float,
- color: Color, border_width: float = 1,
- num_segments: int = 128):
- """
- Draw the outline of a circle.
-
- :param float center_x: x position that is the center of the circle.
- :param float center_y: y position that is the center of the circle.
- :param float radius: width of the circle.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float border_width: Width of the circle outline in pixels.
- :param int num_segments: Int of triangle segments that make up this
- circle. Higher is better quality, but slower render time.
- """
- width = radius * 2
- height = radius * 2
- draw_ellipse_outline(center_x, center_y, width, height,
- color, border_width, num_segments=num_segments)
-
-
-# --- END CIRCLE FUNCTIONS # # #
-
-
-# --- BEGIN ELLIPSE FUNCTIONS # # #
-
-def draw_ellipse_filled(center_x: float, center_y: float,
- width: float, height: float, color: Color,
- tilt_angle: float = 0, num_segments: int = 128):
- """
- Draw a filled in ellipse.
-
- :param float center_x: x position that is the center of the circle.
- :param float center_y: y position that is the center of the circle.
- :param float height: height of the ellipse.
- :param float width: width of the ellipse.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float tilt_angle: Angle in degrees to tilt the ellipse.
- :param int num_segments: float of triangle segments that make up this
- circle. Higher is better quality, but slower render time.
- """
-
- unrotated_point_list = []
-
- for segment in range(num_segments):
- theta = 2.0 * 3.1415926 * segment / num_segments
-
- x = (width / 2) * math.cos(theta)
- y = (height / 2) * math.sin(theta)
-
- unrotated_point_list.append((x, y))
-
- if tilt_angle == 0:
- uncentered_point_list = unrotated_point_list
- else:
- uncentered_point_list = []
- for point in unrotated_point_list:
- uncentered_point_list.append(rotate_point(point[0], point[1], 0, 0, tilt_angle))
-
- point_list = []
- for point in uncentered_point_list:
- point_list.append((point[0] + center_x, point[1] + center_y))
-
- _generic_draw_line_strip(point_list, color, gl.GL_TRIANGLE_FAN)
-
-
-def draw_ellipse_outline(center_x: float, center_y: float, width: float,
- height: float, color: Color,
- border_width: float = 1, tilt_angle: float = 0,
- num_segments=128):
- """
- Draw the outline of an ellipse.
-
- :param float center_x: x position that is the center of the circle.
- :param float center_y: y position that is the center of the circle.
- :param float height: height of the ellipse.
- :param float width: width of the ellipse.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float border_width: Width of the circle outline in pixels.
- :param float tilt_angle: Angle in degrees to tilt the ellipse.
- :param float num_segments: Number of line segments used to make the ellipse
- """
-
- if border_width == 1:
- unrotated_point_list = []
-
- for segment in range(num_segments):
- theta = 2.0 * 3.1415926 * segment / num_segments
-
- x = (width / 2) * math.cos(theta)
- y = (height / 2) * math.sin(theta)
-
- unrotated_point_list.append((x, y))
-
- if tilt_angle == 0:
- uncentered_point_list = unrotated_point_list
- else:
- uncentered_point_list = []
- for point in unrotated_point_list:
- uncentered_point_list.append(rotate_point(point[0], point[1], 0, 0, tilt_angle))
-
- point_list = []
- for point in uncentered_point_list:
- point_list.append((point[0] + center_x, point[1] + center_y))
-
- _generic_draw_line_strip(point_list, color, gl.GL_LINE_LOOP)
- else:
-
- unrotated_point_list = []
-
- start_segment = 0
- end_segment = num_segments
-
- inside_width = (width / 2) - border_width / 2
- outside_width = (width / 2) + border_width / 2
- inside_height = (height / 2) - border_width / 2
- outside_height = (height / 2) + border_width / 2
-
- for segment in range(start_segment, end_segment + 1):
- theta = 2.0 * math.pi * segment / num_segments
-
- x1 = inside_width * math.cos(theta)
- y1 = inside_height * math.sin(theta)
-
- x2 = outside_width * math.cos(theta)
- y2 = outside_height * math.sin(theta)
-
- unrotated_point_list.append((x1, y1))
- unrotated_point_list.append((x2, y2))
-
- if tilt_angle == 0:
- uncentered_point_list = unrotated_point_list
- else:
- uncentered_point_list = []
- for point in unrotated_point_list:
- uncentered_point_list.append(rotate_point(point[0], point[1], 0, 0, tilt_angle))
-
- point_list = []
- for point in uncentered_point_list:
- point_list.append((point[0] + center_x, point[1] + center_y))
-
- _generic_draw_line_strip(point_list, color, gl.GL_TRIANGLE_STRIP)
-
-
-# --- END ELLIPSE FUNCTIONS # # #
-
-
-# --- BEGIN LINE FUNCTIONS # # #
-
-def _generic_draw_line_strip(point_list: PointList,
- color: Color,
- mode: int = gl.GL_LINE_STRIP):
- """
- Draw a line strip. A line strip is a set of continuously connected
- line segments.
-
- :param point_list: List of points making up the line. Each point is
- in a list. So it is a list of lists.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- """
- program = shader.program(
- vertex_shader=line_vertex_shader,
- fragment_shader=line_fragment_shader,
- )
- buffer_type = np.dtype([('vertex', '2f4'), ('color', '4B')])
- data = np.zeros(len(point_list), dtype=buffer_type)
-
- data['vertex'] = point_list
-
- color = get_four_byte_color(color)
- data['color'] = color
-
- vbo = shader.buffer(data.tobytes())
- vbo_desc = shader.BufferDescription(
- vbo,
- '2f 4B',
- ('in_vert', 'in_color'),
- normalized=['in_color']
- )
-
- vao_content = [vbo_desc]
-
- vao = shader.vertex_array(program, vao_content)
- with vao:
- program['Projection'] = get_projection().flatten()
-
- vao.render(mode=mode)
-
-
-def draw_line_strip(point_list: PointList,
- color: Color, line_width: float = 1):
- """
- Draw a multi-point line.
-
- :param PointList point_list: List of x, y points that make up this strip
- :param Color color: Color of line strip
- :param float line_width: Width of the line
- """
- if line_width == 1:
- _generic_draw_line_strip(point_list, color, gl.GL_LINE_STRIP)
- else:
- triangle_point_list = []
- # This needs a lot of improvement
- last_point = None
- for point in point_list:
- if last_point is not None:
- points = _get_points_for_thick_line(last_point[0], last_point[1], point[0], point[1], line_width)
- reordered_points = points[1], points[0], points[2], points[3]
- triangle_point_list.extend(reordered_points)
- last_point = point
- _generic_draw_line_strip(triangle_point_list, color, gl.GL_TRIANGLE_STRIP)
-
-
-def _get_points_for_thick_line(start_x: float, start_y:
- float, end_x: float, end_y: float,
- line_width: float):
- vector_x = start_x - end_x
- vector_y = start_y - end_y
- perpendicular_x = vector_y
- perpendicular_y = -vector_x
- length = math.sqrt(vector_x * vector_x + vector_y * vector_y)
- normal_x = perpendicular_x / length
- normal_y = perpendicular_y / length
- r1_x = start_x + normal_x * line_width / 2
- r1_y = start_y + normal_y * line_width / 2
- r2_x = start_x - normal_x * line_width / 2
- r2_y = start_y - normal_y * line_width / 2
- r3_x = end_x + normal_x * line_width / 2
- r3_y = end_y + normal_y * line_width / 2
- r4_x = end_x - normal_x * line_width / 2
- r4_y = end_y - normal_y * line_width / 2
- points = (r1_x, r1_y), (r2_x, r2_y), (r4_x, r4_y), (r3_x, r3_y)
- return points
-
-
-def draw_line(start_x: float, start_y: float, end_x: float, end_y: float,
- color: Color, line_width: float = 1):
- """
- Draw a line.
-
- :param float start_x: x position of line starting point.
- :param float start_y: y position of line starting point.
- :param float end_x: x position of line ending point.
- :param float end_y: y position of line ending point.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float line_width: Width of the line in pixels.
- """
-
- # points = (start_x, start_y), (end_x, end_y)
- points = _get_points_for_thick_line(start_x, start_y, end_x, end_y, line_width)
- triangle_point_list = points[1], points[0], points[2], points[3]
- _generic_draw_line_strip(triangle_point_list, color, gl.GL_TRIANGLE_STRIP)
-
-
-def draw_lines(point_list: PointList,
- color: Color,
- line_width: float = 1):
- """
- Draw a set of lines.
-
- Draw a line between each pair of points specified.
-
- :param PointList point_list: List of points making up the lines. Each point is
- in a list. So it is a list of lists.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float line_width: Width of the line in pixels.
- """
-
- triangle_point_list = []
- last_point = None
- for point in point_list:
- if last_point is not None:
- points = _get_points_for_thick_line(last_point[0], last_point[1], point[0], point[1], line_width)
- reordered_points = points[1], points[0], points[2], points[0], points[2], points[3]
- triangle_point_list.extend(reordered_points)
- _generic_draw_line_strip(triangle_point_list, color, gl.GL_TRIANGLES)
- last_point = None
- else:
- last_point = point
-
-
-# --- BEGIN POINT FUNCTIONS # # #
-
-
-def draw_point(x: float, y: float, color: Color, size: float):
- """
- Draw a point.
-
- :param float x: x position of point.
- :param float y: y position of point.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float size: Size of the point in pixels.
- """
- draw_rectangle_filled(x, y, size / 2, size / 2, color)
-
-
-def _get_points_for_points(point_list, size):
- new_point_list = []
- hs = size / 2
- for point in point_list:
- x = point[0]
- y = point[1]
- new_point_list.append((x - hs, y - hs))
- new_point_list.append((x + hs, y - hs))
- new_point_list.append((x + hs, y + hs))
-
- new_point_list.append((x + hs, y + hs))
- new_point_list.append((x - hs, y - hs))
- new_point_list.append((x - hs, y + hs))
-
- return new_point_list
-
-
-def draw_points(point_list: PointList,
- color: Color, size: float = 1):
- """
- Draw a set of points.
-
- :param PointList point_list: List of points Each point is
- in a list. So it is a list of lists.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float size: Size of the point in pixels.
- """
- new_point_list = _get_points_for_points(point_list, size)
- _generic_draw_line_strip(new_point_list, color, gl.GL_TRIANGLES)
-
-
-# --- END POINT FUNCTIONS # # #
-
-# --- BEGIN POLYGON FUNCTIONS # # #
-
-
-def draw_polygon_filled(point_list: PointList,
- color: Color):
- """
- Draw a polygon that is filled in.
-
- Args:
- :point_list: List of points making up the lines. Each point is
- in a list. So it is a list of lists.
- :color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- Returns:
- None
- Raises:
- None
- """
-
- triangle_points = earclip(point_list)
- flattened_list = [i for g in triangle_points for i in g]
- _generic_draw_line_strip(flattened_list, color, gl.GL_TRIANGLES)
-
-
-def draw_polygon_outline(point_list: PointList,
- color: Color, line_width: float = 1):
- """
- Draw a polygon outline. Also known as a "line loop."
-
- :param PointList point_list: List of points making up the lines. Each point is
- in a list. So it is a list of lists.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param int line_width: Width of the line in pixels.
- """
- new_point_list = [point for point in point_list]
- new_point_list.append(point_list[0])
-
- triangle_point_list = []
- # This needs a lot of improvement
- last_point = None
- for point in new_point_list:
- if last_point is not None:
- points = _get_points_for_thick_line(last_point[0], last_point[1], point[0], point[1], line_width)
- reordered_points = points[1], points[0], points[2], points[3]
- triangle_point_list.extend(reordered_points)
- last_point = point
-
- points = _get_points_for_thick_line(new_point_list[0][0], new_point_list[0][1], new_point_list[1][0],
- new_point_list[1][1], line_width)
- triangle_point_list.append(points[1])
- _generic_draw_line_strip(triangle_point_list, color, gl.GL_TRIANGLE_STRIP)
-
-
-def draw_triangle_filled(x1: float, y1: float,
- x2: float, y2: float,
- x3: float, y3: float, color: Color):
- """
- Draw a filled in triangle.
-
- :param float x1: x value of first coordinate.
- :param float y1: y value of first coordinate.
- :param float x2: x value of second coordinate.
- :param float y2: y value of second coordinate.
- :param float x3: x value of third coordinate.
- :param float y3: y value of third coordinate.
- :param Color color: Color of triangle.
- """
-
- first_point = (x1, y1)
- second_point = (x2, y2)
- third_point = (x3, y3)
- point_list = (first_point, second_point, third_point)
- _generic_draw_line_strip(point_list, color, gl.GL_TRIANGLES)
-
-
-def draw_triangle_outline(x1: float, y1: float,
- x2: float, y2: float,
- x3: float, y3: float,
- color: Color,
- border_width: float = 1):
- """
- Draw a the outline of a triangle.
-
- :param float x1: x value of first coordinate.
- :param float y1: y value of first coordinate.
- :param float x2: x value of second coordinate.
- :param float y2: y value of second coordinate.
- :param float x3: x value of third coordinate.
- :param float y3: y value of third coordinate.
- :param Color color: Color of triangle.
- :param float border_width: Width of the border in pixels. Defaults to 1.
- """
- first_point = [x1, y1]
- second_point = [x2, y2]
- third_point = [x3, y3]
- point_list = (first_point, second_point, third_point)
- draw_polygon_outline(point_list, color, border_width)
-
-
-# --- END POLYGON FUNCTIONS # # #
-
-
-# --- BEGIN RECTANGLE FUNCTIONS # # #
-
-
-def draw_lrtb_rectangle_outline(left: float, right: float, top: float,
- bottom: float, color: Color,
- border_width: float = 1):
- """
- Draw a rectangle by specifying left, right, top, and bottom edges.
-
- :param float left: The x coordinate of the left edge of the rectangle.
- :param float right: The x coordinate of the right edge of the rectangle.
- :param float top: The y coordinate of the top of the rectangle.
- :param float bottom: The y coordinate of the rectangle bottom.
- :param Color color: The color of the rectangle.
- :param float border_width: The width of the border in pixels. Defaults to one.
- :Raises AttributeError: Raised if left > right or top < bottom.
-
- """
-
- if left > right:
- raise AttributeError("Left coordinate must be less than or equal to "
- "the right coordinate")
-
- if bottom > top:
- raise AttributeError("Bottom coordinate must be less than or equal to "
- "the top coordinate")
-
- center_x = (left + right) / 2
- center_y = (top + bottom) / 2
- width = right - left
- height = top - bottom
- draw_rectangle_outline(center_x, center_y, width, height, color,
- border_width)
-
-
-def draw_xywh_rectangle_outline(bottom_left_x: float, bottom_left_y: float,
- width: float, height: float,
- color: Color,
- border_width: float = 1):
- """
- Draw a rectangle extending from bottom left to top right
-
- :param float bottom_left_x: The x coordinate of the left edge of the rectangle.
- :param float bottom_left_y: The y coordinate of the bottom of the rectangle.
- :param float width: The width of the rectangle.
- :param float height: The height of the rectangle.
- :param Color color: The color of the rectangle.
- :param float border_width: The width of the border in pixels. Defaults to one.
- """
- center_x = bottom_left_x + (width / 2)
- center_y = bottom_left_y + (height / 2)
- draw_rectangle_outline(center_x, center_y, width, height, color,
- border_width)
-
-
-def draw_rectangle_outline(center_x: float, center_y: float, width: float,
- height: float, color: Color,
- border_width: float = 1, tilt_angle: float = 0):
- """
- Draw a rectangle outline.
-
- :param float center_x: x coordinate of top left rectangle point.
- :param float center_y: y coordinate of top left rectangle point.
- :param float width: width of the rectangle.
- :param float height: height of the rectangle.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float border_width: width of the lines, in pixels.
- :param float tilt_angle: rotation of the rectangle. Defaults to zero.
- """
-
- i_lb = center_x - width / 2 + border_width / 2, center_y - height / 2 + border_width / 2
- i_rb = center_x + width / 2 - border_width / 2, center_y - height / 2 + border_width / 2
- i_rt = center_x + width / 2 - border_width / 2, center_y + height / 2 - border_width / 2
- i_lt = center_x - width / 2 + border_width / 2, center_y + height / 2 - border_width / 2
-
- o_lb = center_x - width / 2 - border_width / 2, center_y - height / 2 - border_width / 2
- o_rb = center_x + width / 2 + border_width / 2, center_y - height / 2 - border_width / 2
- o_rt = center_x + width / 2 + border_width / 2, center_y + height / 2 + border_width / 2
- o_lt = center_x - width / 2 - border_width / 2, center_y + height / 2 + border_width / 2
-
- point_list = o_lt, i_lt, o_rt, i_rt, o_rb, i_rb, o_lb, i_lb, o_lt, i_lt
-
- if tilt_angle != 0:
- point_list_2 = []
- for point in point_list:
- new_point = rotate_point(point[0], point[1], center_x, center_y, tilt_angle)
- point_list_2.append(new_point)
- point_list = point_list_2
-
- _generic_draw_line_strip(point_list, color, gl.GL_TRIANGLE_STRIP)
-
-
-def draw_lrtb_rectangle_filled(left: float, right: float, top: float,
- bottom: float, color: Color):
- """
- Draw a rectangle by specifying left, right, top, and bottom edges.
-
- :param float left: The x coordinate of the left edge of the rectangle.
- :param float right: The x coordinate of the right edge of the rectangle.
- :param float top: The y coordinate of the top of the rectangle.
- :param float bottom: The y coordinate of the rectangle bottom.
- :param Color color: The color of the rectangle.
- :Raises AttributeError: Raised if left > right or top < bottom.
-
- """
- if left > right:
- raise AttributeError("Left coordinate {} must be less than or equal "
- "to the right coordinate {}".format(left, right))
-
- if bottom > top:
- raise AttributeError("Bottom coordinate {} must be less than or equal "
- "to the top coordinate {}".format(bottom, top))
-
- center_x = (left + right) / 2
- center_y = (top + bottom) / 2
- width = right - left + 1
- height = top - bottom + 1
- draw_rectangle_filled(center_x, center_y, width, height, color)
-
-
-def draw_xywh_rectangle_filled(bottom_left_x: float, bottom_left_y: float,
- width: float, height: float,
- color: Color):
- """
- Draw a filled rectangle extending from bottom left to top right
-
- :param float bottom_left_x: The x coordinate of the left edge of the rectangle.
- :param float bottom_left_y: The y coordinate of the bottom of the rectangle.
- :param float width: The width of the rectangle.
- :param float height: The height of the rectangle.
- :param Color color: The color of the rectangle.
- """
-
- center_x = bottom_left_x + (width / 2)
- center_y = bottom_left_y + (height / 2)
- draw_rectangle_filled(center_x, center_y, width, height, color)
-
-
-def draw_rectangle_filled(center_x: float, center_y: float, width: float,
- height: float, color: Color,
- tilt_angle: float = 0):
- """
- Draw a filled-in rectangle.
-
- :param float center_x: x coordinate of rectangle center.
- :param float center_y: y coordinate of rectangle center.
- :param float width: width of the rectangle.
- :param float height: height of the rectangle.
- :param Color color: color, specified in a list of 3 or 4 bytes in RGB or
- RGBA format.
- :param float tilt_angle: rotation of the rectangle. Defaults to zero.
- """
- p1 = -width // 2 + center_x, -height // 2 + center_y
- p2 = width // 2 + center_x, -height // 2 + center_y
- p3 = width // 2 + center_x, height // 2 + center_y
- p4 = -width // 2 + center_x, height // 2 + center_y
-
- if tilt_angle != 0:
- p1 = rotate_point(p1[0], p1[1], center_x, center_y, tilt_angle)
- p2 = rotate_point(p2[0], p2[1], center_x, center_y, tilt_angle)
- p3 = rotate_point(p3[0], p3[1], center_x, center_y, tilt_angle)
- p4 = rotate_point(p4[0], p4[1], center_x, center_y, tilt_angle)
-
- _generic_draw_line_strip((p1, p2, p4, p3), color, gl.GL_TRIANGLE_STRIP)
-
-
-def draw_texture_rectangle(center_x: float, center_y: float, width: float,
- height: float, texture: Texture, angle: float = 0,
- alpha: int = 255,
- repeat_count_x: int = 1, repeat_count_y: int = 1):
- """
- Draw a textured rectangle on-screen.
-
- :param float center_x: x coordinate of rectangle center.
- :param float center_y: y coordinate of rectangle center.
- :param float width: width of the rectangle.
- :param float height: height of the rectangle.
- :param int texture: identifier of texture returned from load_texture() call
- :param float angle: rotation of the rectangle. Defaults to zero.
- :param float alpha: Transparency of image. 0 is fully transparent, 255 (default) is visible
- :param int repeat_count_x: Unused for now
- :param int repeat_count_y: Unused for now
- """
-
- texture.draw(center_x, center_y, width,
- height, angle, alpha,
- repeat_count_x, repeat_count_y)
-
-
-def draw_xywh_rectangle_textured(bottom_left_x: float, bottom_left_y: float,
- width: float, height: float,
- texture: Texture, angle: float = 0,
- alpha: int = 255,
- repeat_count_x: int = 1, repeat_count_y: int = 1):
- """
- Draw a texture extending from bottom left to top right.
-
- :param float bottom_left_x: The x coordinate of the left edge of the rectangle.
- :param float bottom_left_y: The y coordinate of the bottom of the rectangle.
- :param float width: The width of the rectangle.
- :param float height: The height of the rectangle.
- :param int texture: identifier of texture returned from load_texture() call
- :param float angle: rotation of the rectangle. Defaults to zero.
- :param int alpha: Transparency of image. 0 is fully transparent, 255 (default) is visible
- :param int repeat_count_x: Unused for now
- :param int repeat_count_y: Unused for now
- """
-
- center_x = bottom_left_x + (width / 2)
- center_y = bottom_left_y + (height / 2)
- draw_texture_rectangle(center_x, center_y,
- width, height,
- texture,
- angle=angle, alpha=alpha)
-
-
-def get_pixel(x: int, y: int):
- """
- Given an x, y, will return RGB color value of that point.
-
- :param int x: x location
- :param int y: y location
- :returns: Color
- """
- a = (gl.GLubyte * 3)(0)
- gl.glReadPixels(x, y, 1, 1, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, a)
- red = a[0]
- green = a[1]
- blue = a[2]
- return red, green, blue
-
-
-def get_image(x: int = 0, y: int = 0, width: int = None, height: int = None):
- """
- Get an image from the screen.
-
- :param int x: Start (left) x location
- :param int y: Start (top) y location
- :param int width: Width of image. Leave blank for grabbing the 'rest' of the image
- :param int height: Height of image. Leave blank for grabbing the 'rest' of the image
-
- You can save the image like:
-
- .. highlight:: python
- .. code-block:: python
-
- image = get_image()
- image.save('screenshot.png', 'PNG')
- """
-
- # Get the dimensions
- window = get_window()
- if width is None:
- width = window.width - x
- if height is None:
- height = window.height - y
-
- # Create an image buffer
- image_buffer = (gl.GLubyte * (4 * width * height))(0)
-
- gl.glReadPixels(x, y, width, height, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, image_buffer)
- image = PIL.Image.frombytes("RGBA", (width, height), image_buffer)
- image = PIL.ImageOps.flip(image)
-
- # image.save('glutout.png', 'PNG')
- return image
diff --git a/arcade/earclip.py b/arcade/earclip.py
deleted file mode 100644
index 4a15a1d..0000000
--- a/arcade/earclip.py
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-
-from: https://github.com/linuxlewis/tripy/blob/master/tripy.py
-"""
-
-from collections import namedtuple
-
-Point = namedtuple('Point', ['x', 'y'])
-
-
-def earclip(polygon):
- """
- Simple earclipping algorithm for a given polygon p.
- polygon is expected to be an array of 2-tuples of the cartesian points of the polygon
- For a polygon with n points it will return n-2 triangles.
- The triangles are returned as an array of 3-tuples where each item in the tuple is a 2-tuple of the cartesian point.
-
- Implementation Reference:
- - https://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
- """
- ear_vertex = []
- triangles = []
-
- polygon = [Point(*point) for point in polygon]
-
- if _is_clockwise(polygon):
- polygon.reverse()
-
- point_count = len(polygon)
- for i in range(point_count):
- prev_index = i - 1
- prev_point = polygon[prev_index]
- point = polygon[i]
- next_index = (i + 1) % point_count
- next_point = polygon[next_index]
-
- if _is_ear(prev_point, point, next_point, polygon):
- ear_vertex.append(point)
-
- while ear_vertex and point_count >= 3:
- ear = ear_vertex.pop(0)
- i = polygon.index(ear)
- prev_index = i - 1
- prev_point = polygon[prev_index]
- next_index = (i + 1) % point_count
- next_point = polygon[next_index]
-
- polygon.remove(ear)
- point_count -= 1
- triangles.append(((prev_point.x, prev_point.y), (ear.x, ear.y), (next_point.x, next_point.y)))
- if point_count > 3:
- prev_prev_point = polygon[prev_index - 1]
- next_next_index = (i + 1) % point_count
- next_next_point = polygon[next_next_index]
-
- groups = [
- (prev_prev_point, prev_point, next_point, polygon),
- (prev_point, next_point, next_next_point, polygon)
- ]
- for group in groups:
- p = group[1]
- if _is_ear(*group):
- if p not in ear_vertex:
- ear_vertex.append(p)
- elif p in ear_vertex:
- ear_vertex.remove(p)
- return triangles
-
-
-def _is_clockwise(polygon):
- s = 0
- polygon_count = len(polygon)
- for i in range(polygon_count):
- point = polygon[i]
- point2 = polygon[(i + 1) % polygon_count]
- s += (point2.x - point.x) * (point2.y + point.y)
- return s > 0
-
-
-def _is_convex(prev, point, next_point):
- return _triangle_sum(prev.x, prev.y, point.x, point.y, next_point.x, next_point.y) < 0
-
-
-def _is_ear(p1, p2, p3, polygon):
- ear = _contains_no_points(p1, p2, p3, polygon) and \
- _is_convex(p1, p2, p3) and \
- _triangle_area(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y) > 0
- return ear
-
-
-def _contains_no_points(p1, p2, p3, polygon):
- for pn in polygon:
- if pn in (p1, p2, p3):
- continue
- elif _is_point_inside(pn, p1, p2, p3):
- return False
- return True
-
-
-def _is_point_inside(p, a, b, c):
- area = _triangle_area(a.x, a.y, b.x, b.y, c.x, c.y)
- area1 = _triangle_area(p.x, p.y, b.x, b.y, c.x, c.y)
- area2 = _triangle_area(p.x, p.y, a.x, a.y, c.x, c.y)
- area3 = _triangle_area(p.x, p.y, a.x, a.y, b.x, b.y)
- return area == sum([area1, area2, area3])
-
-
-def _triangle_area(x1, y1, x2, y2, x3, y3):
- return abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0)
-
-
-def _triangle_sum(x1, y1, x2, y2, x3, y3):
- return x1 * (y3 - y2) + x2 * (y1 - y3) + x3 * (y2 - y1)
diff --git a/arcade/emitter.py b/arcade/emitter.py
deleted file mode 100644
index a47b740..0000000
--- a/arcade/emitter.py
+++ /dev/null
@@ -1,179 +0,0 @@
-"""
-Emitter - Invisible object that determines when Particles are emitted, actually emits them, and manages them
-over their lifetime
-"""
-
-import arcade
-from arcade.particle import Particle
-from typing import Callable, cast
-from arcade.utils import _Vec2
-from arcade.arcade_types import Point, Vector
-
-
-##########
-class EmitController:
- """Base class for how a client configure the rate at which an Emitter emits Particles
-
- Subclasses allow the client to control the rate and duration of emitting"""
- def how_many(self, delta_time: float, current_particle_count: int) -> int:
- raise NotImplemented("EmitterRate.how_many must be implemented")
-
- def is_complete(self) -> bool:
- raise NotImplemented("EmitterRate.is_complete must be implemented")
-
-
-class EmitBurst(EmitController):
- """Used to configure an Emitter to emit particles in one burst"""
- def __init__(self, count: int):
- self._is_complete = False
- self._count = count
-
- def how_many(self, delta_time: float, current_particle_count: int) -> int:
- if not self._is_complete:
- self._is_complete = True
- return self._count
- return 0
-
- def is_complete(self) -> bool:
- return True
-
-
-class EmitMaintainCount(EmitController):
- """Used to configure an Emitter so it emits particles so that the given count is always maintained"""
- def __init__(self, particle_count: int):
- self._target_count = particle_count
-
- def how_many(self, delta_time: float, current_particle_count: int) -> int:
- return self._target_count - current_particle_count
-
- def is_complete(self) -> bool:
- return False
-
-
-class EmitInterval(EmitController):
- """Base class used to configure an Emitter to have a constant rate of emitting. Will emit indefinitely."""
- def __init__(self, emit_interval: float):
- self._emit_interval = emit_interval
- self._carryover_time = 0.0
-
- def how_many(self, delta_time: float, current_particle_count: int) -> int:
- self._carryover_time += delta_time
- emit_count = 0
- while self._carryover_time >= self._emit_interval:
- self._carryover_time -= self._emit_interval
- emit_count += 1
- return emit_count
-
- def is_complete(self) -> bool:
- return False
-
-
-class EmitterIntervalWithCount(EmitInterval):
- """Configure an Emitter to emit particles with given interval, ending after emitting given number of particles"""
- def __init__(self, emit_interval: float, particle_count: int):
- super().__init__(emit_interval)
- self._count_remaining = particle_count
-
- def how_many(self, delta_time: float, current_particle_count: int) -> int:
- proposed_count = super().how_many(delta_time, current_particle_count)
- actual_count = min(proposed_count, self._count_remaining)
- self._count_remaining -= actual_count
- return actual_count
-
- def is_complete(self) -> bool:
- return self._count_remaining <= 0
-
-
-class EmitterIntervalWithTime(EmitInterval):
- """Configure an Emitter to emit particles with given interval, ending after given number of seconds"""
- def __init__(self, emit_interval: float, lifetime: float):
- super().__init__(emit_interval)
- self._lifetime = lifetime
-
- def how_many(self, delta_time: float, current_particle_count: int) -> int:
- if self._lifetime <= 0.0:
- return 0
- self._lifetime -= delta_time
- return super().how_many(delta_time, current_particle_count)
-
- def is_complete(self) -> bool:
- return self._lifetime <= 0
-
-
-# Emitter
-class Emitter:
- """Emits and manages Particles over their lifetime. The foundational class in a particle system."""
- def __init__(
- self,
- center_xy: Point,
- emit_controller: EmitController,
- particle_factory: Callable[["Emitter"], Particle],
- change_xy: Vector = (0.0, 0.0),
- emit_done_cb: Callable[["Emitter"], None] = None,
- reap_cb: Callable[[], None] = None
- ):
- # Note Self-reference with type annotations:
- # https://www.python.org/dev/peps/pep-0484/#the-problem-of-forward-declarations
- self.change_x = change_xy[0]
- self.change_y = change_xy[1]
-
- self.center_x = center_xy[0]
- self.center_y = center_xy[1]
- self.angle = 0.0
- self.change_angle = 0.0
- self.rate_factory = emit_controller
- self.particle_factory = particle_factory
- self._emit_done_cb = emit_done_cb
- self._reap_cb = reap_cb
- self._particles = arcade.SpriteList(use_spatial_hash=False)
-
- def _emit(self):
- """Emit one particle, its initial position and velocity are relative to the position and angle of the emitter"""
- p = self.particle_factory(self)
- p.center_x += self.center_x
- p.center_y += self.center_y
-
- # given the velocity, rotate it by emitter's current angle
- vel = _Vec2(p.change_x, p.change_y).rotated(self.angle)
-
- p.change_x = vel.x
- p.change_y = vel.y
- self._particles.append(p)
-
- def get_count(self):
- return len(self._particles)
-
- def get_pos(self) -> Point:
- """Get position of emitter"""
- # TODO: should this be a property so a method call isn't needed?
- return self.center_x, self.center_y
-
- def update(self):
- # update emitter
- self.center_x += self.change_x
- self.center_y += self.change_y
- self.angle += self.change_angle
-
- # update particles
- emit_count = self.rate_factory.how_many(1 / 60, len(self._particles))
- for _ in range(emit_count):
- self._emit()
- self._particles.update()
- particles_to_reap = [p for p in self._particles if cast(Particle, p).can_reap()]
- for dead_particle in particles_to_reap:
- dead_particle.kill()
-
- def draw(self):
- self._particles.draw()
-
- def can_reap(self):
- """Determine if Emitter can be deleted"""
- is_emit_complete = self.rate_factory.is_complete()
- can_reap = is_emit_complete and len(self._particles) <= 0
- if is_emit_complete and self._emit_done_cb:
- self._emit_done_cb(self)
- self._emit_done_cb = None
- if can_reap and self._reap_cb:
- self._reap_cb()
- self._reap_cb = None
- return can_reap
diff --git a/arcade/emitter_simple.py b/arcade/emitter_simple.py
deleted file mode 100644
index 7efbf1d..0000000
--- a/arcade/emitter_simple.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""
-Convenience functions that provide a much simpler interface to Emitters and Particles.
-
-These trade away some flexibility in favor of simplicity to allow beginners to start using particle systems.
-"""
-
-import arcade
-import random
-from typing import List
-from arcade.arcade_types import Point
-from arcade.particle import FilenameOrTexture
-
-
-def make_burst_emitter(
- center_xy: Point,
- filenames_and_textures: List[FilenameOrTexture],
- particle_count: int,
- particle_speed: float,
- particle_lifetime_min: float,
- particle_lifetime_max: float,
- particle_scale: float = 1.0,
- fade_particles: bool = True):
- """Returns an emitter that emits all of its particles at once"""
- particle_factory = arcade.LifetimeParticle
- if fade_particles:
- particle_factory = arcade.FadeParticle
- return arcade.Emitter(
- center_xy=center_xy,
- emit_controller=arcade.EmitBurst(particle_count),
- particle_factory=lambda emitter: particle_factory(
- filename_or_texture=random.choice(filenames_and_textures),
- change_xy=arcade.rand_in_circle((0.0, 0.0), particle_speed),
- lifetime=random.uniform(particle_lifetime_min, particle_lifetime_max),
- scale=particle_scale
- )
- )
-
-
-def make_interval_emitter(
- center_xy: Point,
- filenames_and_textures: List[FilenameOrTexture],
- emit_interval: float,
- emit_duration: float,
- particle_speed: float,
- particle_lifetime_min: float,
- particle_lifetime_max: float,
- particle_scale: float = 1.0,
- fade_particles: bool = True):
- """Returns an emitter that emits its particles at a constant rate for a given amount of time"""
- particle_factory = arcade.LifetimeParticle
- if fade_particles:
- particle_factory = arcade.FadeParticle
- return arcade.Emitter(
- center_xy=center_xy,
- emit_controller=arcade.EmitterIntervalWithTime(emit_interval, emit_duration),
- particle_factory=lambda emitter: particle_factory(
- filename_or_texture=random.choice(filenames_and_textures),
- change_xy=arcade.rand_on_circle((0.0, 0.0), particle_speed),
- lifetime=random.uniform(particle_lifetime_min, particle_lifetime_max),
- scale=particle_scale
- )
- )
diff --git a/arcade/examples/__init__.py b/arcade/examples/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/arcade/examples/array_backed_grid.py b/arcade/examples/array_backed_grid.py
deleted file mode 100644
index 01b7cdb..0000000
--- a/arcade/examples/array_backed_grid.py
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-Array Backed Grid
-
-Show how to use a two-dimensional list/array to back the display of a
-grid on-screen.
-
-Note: Regular drawing commands are slow. Particularly when drawing a lot of
-items, like the rectangles in this example.
-
-For faster drawing, create the shapes and then draw them as a batch.
-See array_backed_grid_buffered.py
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.array_backed_grid
-"""
-import arcade
-
-# Set how many rows and columns we will have
-ROW_COUNT = 15
-COLUMN_COUNT = 15
-
-# This sets the WIDTH and HEIGHT of each grid location
-WIDTH = 30
-HEIGHT = 30
-
-# This sets the margin between each cell
-# and on the edges of the screen.
-MARGIN = 5
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = (WIDTH + MARGIN) * COLUMN_COUNT + MARGIN
-SCREEN_HEIGHT = (HEIGHT + MARGIN) * ROW_COUNT + MARGIN
-SCREEN_TITLE = "Array Backed Grid Example"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Set up the application.
- """
-
- super().__init__(width, height, title)
-
- # Create a 2 dimensional array. A two dimensional
- # array is simply a list of lists.
- self.grid = []
- for row in range(ROW_COUNT):
- # Add an empty array that will hold each cell
- # in this row
- self.grid.append([])
- for column in range(COLUMN_COUNT):
- self.grid[row].append(0) # Append a cell
-
- arcade.set_background_color(arcade.color.BLACK)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw the grid
- for row in range(ROW_COUNT):
- for column in range(COLUMN_COUNT):
- # Figure out what color to draw the box
- if self.grid[row][column] == 1:
- color = arcade.color.GREEN
- else:
- color = arcade.color.WHITE
-
- # Do the math to figure out where the box is
- x = (MARGIN + WIDTH) * column + MARGIN + WIDTH // 2
- y = (MARGIN + HEIGHT) * row + MARGIN + HEIGHT // 2
-
- # Draw the box
- arcade.draw_rectangle_filled(x, y, WIDTH, HEIGHT, color)
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called when the user presses a mouse button.
- """
-
- # Change the x/y screen coordinates to grid coordinates
- column = x // (WIDTH + MARGIN)
- row = y // (HEIGHT + MARGIN)
-
- print(f"Click coordinates: ({x}, {y}). Grid coordinates: ({row}, {column})")
-
- # Make sure we are on-grid. It is possible to click in the upper right
- # corner in the margin and go to a grid location that doesn't exist
- if row < ROW_COUNT and column < COLUMN_COUNT:
-
- # Flip the location between 1 and 0.
- if self.grid[row][column] == 0:
- self.grid[row][column] = 1
- else:
- self.grid[row][column] = 0
-
-
-def main():
-
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/array_backed_grid_buffered.py b/arcade/examples/array_backed_grid_buffered.py
deleted file mode 100644
index a7a864a..0000000
--- a/arcade/examples/array_backed_grid_buffered.py
+++ /dev/null
@@ -1,111 +0,0 @@
-"""
-Array Backed Grid
-
-Show how to use a two-dimensional list/array to back the display of a
-grid on-screen.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.array_backed_grid_buffered
-"""
-import arcade
-
-# Set how many rows and columns we will have
-ROW_COUNT = 15
-COLUMN_COUNT = 15
-
-# This sets the WIDTH and HEIGHT of each grid location
-WIDTH = 30
-HEIGHT = 30
-
-# This sets the margin between each cell
-# and on the edges of the screen.
-MARGIN = 5
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = (WIDTH + MARGIN) * COLUMN_COUNT + MARGIN
-SCREEN_HEIGHT = (HEIGHT + MARGIN) * ROW_COUNT + MARGIN
-SCREEN_TITLE = "Array Backed Grid Buffered Example"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Set up the application.
- """
- super().__init__(width, height, title)
-
- self.shape_list = None
-
- # Create a 2 dimensional array. A two dimensional
- # array is simply a list of lists.
- self.grid = []
- for row in range(ROW_COUNT):
- # Add an empty array that will hold each cell
- # in this row
- self.grid.append([])
- for column in range(COLUMN_COUNT):
- self.grid[row].append(0) # Append a cell
-
- arcade.set_background_color(arcade.color.BLACK)
- self.recreate_grid()
-
- def recreate_grid(self):
- self.shape_list = arcade.ShapeElementList()
- for row in range(ROW_COUNT):
- for column in range(COLUMN_COUNT):
- if self.grid[row][column] == 0:
- color = arcade.color.WHITE
- else:
- color = arcade.color.GREEN
-
- x = (MARGIN + WIDTH) * column + MARGIN + WIDTH // 2
- y = (MARGIN + HEIGHT) * row + MARGIN + HEIGHT // 2
-
- current_rect = arcade.create_rectangle_filled(x, y, WIDTH, HEIGHT, color)
- self.shape_list.append(current_rect)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- self.shape_list.draw()
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called when the user presses a mouse button.
- """
-
- # Change the x/y screen coordinates to grid coordinates
- column = x // (WIDTH + MARGIN)
- row = y // (HEIGHT + MARGIN)
-
- print(f"Click coordinates: ({x}, {y}). Grid coordinates: ({row}, {column})")
-
- # Make sure we are on-grid. It is possible to click in the upper right
- # corner in the margin and go to a grid location that doesn't exist
- if row < ROW_COUNT and column < COLUMN_COUNT:
-
- # Flip the location between 1 and 0.
- if self.grid[row][column] == 0:
- self.grid[row][column] = 1
- else:
- self.grid[row][column] = 0
-
- self.recreate_grid()
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/asteroid_smasher.py b/arcade/examples/asteroid_smasher.py
deleted file mode 100644
index 25c1c11..0000000
--- a/arcade/examples/asteroid_smasher.py
+++ /dev/null
@@ -1,392 +0,0 @@
-"""
-Asteroid Smasher
-
-Shoot space rocks in this demo program created with
-Python and the Arcade library.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.asteroid_smasher
-"""
-import random
-import math
-import arcade
-import os
-
-STARTING_ASTEROID_COUNT = 3
-SCALE = 0.5
-OFFSCREEN_SPACE = 300
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Asteroid Smasher"
-LEFT_LIMIT = -OFFSCREEN_SPACE
-RIGHT_LIMIT = SCREEN_WIDTH + OFFSCREEN_SPACE
-BOTTOM_LIMIT = -OFFSCREEN_SPACE
-TOP_LIMIT = SCREEN_HEIGHT + OFFSCREEN_SPACE
-
-
-class TurningSprite(arcade.Sprite):
- """ Sprite that sets its angle to the direction it is traveling in. """
- def update(self):
- super().update()
- self.angle = math.degrees(math.atan2(self.change_y, self.change_x))
-
-
-class ShipSprite(arcade.Sprite):
- """
- Sprite that represents our space ship.
-
- Derives from arcade.Sprite.
- """
- def __init__(self, filename, scale):
- """ Set up the space ship. """
-
- # Call the parent Sprite constructor
- super().__init__(filename, scale)
-
- # Info on where we are going.
- # Angle comes in automatically from the parent class.
- self.thrust = 0
- self.speed = 0
- self.max_speed = 4
- self.drag = 0.05
- self.respawning = 0
-
- # Mark that we are respawning.
- self.respawn()
-
- def respawn(self):
- """
- Called when we die and need to make a new ship.
- 'respawning' is an invulnerability timer.
- """
- # If we are in the middle of respawning, this is non-zero.
- self.respawning = 1
- self.center_x = SCREEN_WIDTH / 2
- self.center_y = SCREEN_HEIGHT / 2
- self.angle = 0
-
- def update(self):
- """
- Update our position and other particulars.
- """
- if self.respawning:
- self.respawning += 1
- self.alpha = self.respawning
- if self.respawning > 250:
- self.respawning = 0
- self.alpha = 255
- if self.speed > 0:
- self.speed -= self.drag
- if self.speed < 0:
- self.speed = 0
-
- if self.speed < 0:
- self.speed += self.drag
- if self.speed > 0:
- self.speed = 0
-
- self.speed += self.thrust
- if self.speed > self.max_speed:
- self.speed = self.max_speed
- if self.speed < -self.max_speed:
- self.speed = -self.max_speed
-
- self.change_x = -math.sin(math.radians(self.angle)) * self.speed
- self.change_y = math.cos(math.radians(self.angle)) * self.speed
-
- self.center_x += self.change_x
- self.center_y += self.change_y
-
- """ Call the parent class. """
- super().update()
-
-
-class AsteroidSprite(arcade.Sprite):
- """ Sprite that represents an asteroid. """
-
- def __init__(self, image_file_name, scale):
- super().__init__(image_file_name, scale=scale)
- self.size = 0
-
- def update(self):
- """ Move the asteroid around. """
- super().update()
- if self.center_x < LEFT_LIMIT:
- self.center_x = RIGHT_LIMIT
- if self.center_x > RIGHT_LIMIT:
- self.center_x = LEFT_LIMIT
- if self.center_y > TOP_LIMIT:
- self.center_y = BOTTOM_LIMIT
- if self.center_y < BOTTOM_LIMIT:
- self.center_y = TOP_LIMIT
-
-
-class BulletSprite(TurningSprite):
- """
- Class that represents a bullet.
-
- Derives from arcade.TurningSprite which is just a Sprite
- that aligns to its direction.
- """
-
- def update(self):
- super().update()
- if self.center_x < -100 or self.center_x > 1500 or \
- self.center_y > 1100 or self.center_y < -100:
- self.kill()
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- self.frame_count = 0
-
- self.game_over = False
-
- # Sprite lists
- self.all_sprites_list = None
- self.asteroid_list = None
- self.bullet_list = None
- self.ship_life_list = None
-
- # Set up the player
- self.score = 0
- self.player_sprite = None
- self.lives = 3
-
- # Sounds
- self.laser_sound = arcade.load_sound("sounds/laser1.wav")
-
- def start_new_game(self):
- """ Set up the game and initialize the variables. """
-
- self.frame_count = 0
- self.game_over = False
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
- self.asteroid_list = arcade.SpriteList()
- self.bullet_list = arcade.SpriteList()
- self.ship_life_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
- self.player_sprite = ShipSprite("images/playerShip1_orange.png", SCALE)
- self.all_sprites_list.append(self.player_sprite)
- self.lives = 3
-
- # Set up the little icons that represent the player lives.
- cur_pos = 10
- for i in range(self.lives):
- life = arcade.Sprite("images/playerLife1_orange.png", SCALE)
- life.center_x = cur_pos + life.width
- life.center_y = life.height
- cur_pos += life.width
- self.all_sprites_list.append(life)
- self.ship_life_list.append(life)
-
- # Make the asteroids
- image_list = ("images/meteorGrey_big1.png",
- "images/meteorGrey_big2.png",
- "images/meteorGrey_big3.png",
- "images/meteorGrey_big4.png")
- for i in range(STARTING_ASTEROID_COUNT):
- image_no = random.randrange(4)
- enemy_sprite = AsteroidSprite(image_list[image_no], SCALE)
- enemy_sprite.guid = "Asteroid"
-
- enemy_sprite.center_y = random.randrange(BOTTOM_LIMIT, TOP_LIMIT)
- enemy_sprite.center_x = random.randrange(LEFT_LIMIT, RIGHT_LIMIT)
-
- enemy_sprite.change_x = random.random() * 2 - 1
- enemy_sprite.change_y = random.random() * 2 - 1
-
- enemy_sprite.change_angle = (random.random() - 0.5) * 2
- enemy_sprite.size = 4
- self.all_sprites_list.append(enemy_sprite)
- self.asteroid_list.append(enemy_sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.all_sprites_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 70, arcade.color.WHITE, 13)
-
- output = f"Asteroid Count: {len(self.asteroid_list)}"
- arcade.draw_text(output, 10, 50, arcade.color.WHITE, 13)
-
- def on_key_press(self, symbol, modifiers):
- """ Called whenever a key is pressed. """
- # Shoot if the player hit the space bar and we aren't respawning.
- if not self.player_sprite.respawning and symbol == arcade.key.SPACE:
- bullet_sprite = BulletSprite("images/laserBlue01.png", SCALE)
- bullet_sprite.guid = "Bullet"
-
- bullet_speed = 13
- bullet_sprite.change_y = \
- math.cos(math.radians(self.player_sprite.angle)) * bullet_speed
- bullet_sprite.change_x = \
- -math.sin(math.radians(self.player_sprite.angle)) \
- * bullet_speed
-
- bullet_sprite.center_x = self.player_sprite.center_x
- bullet_sprite.center_y = self.player_sprite.center_y
- bullet_sprite.update()
-
- self.all_sprites_list.append(bullet_sprite)
- self.bullet_list.append(bullet_sprite)
-
- arcade.play_sound(self.laser_sound)
-
- if symbol == arcade.key.LEFT:
- self.player_sprite.change_angle = 3
- elif symbol == arcade.key.RIGHT:
- self.player_sprite.change_angle = -3
- elif symbol == arcade.key.UP:
- self.player_sprite.thrust = 0.15
- elif symbol == arcade.key.DOWN:
- self.player_sprite.thrust = -.2
-
- def on_key_release(self, symbol, modifiers):
- """ Called whenever a key is released. """
- if symbol == arcade.key.LEFT:
- self.player_sprite.change_angle = 0
- elif symbol == arcade.key.RIGHT:
- self.player_sprite.change_angle = 0
- elif symbol == arcade.key.UP:
- self.player_sprite.thrust = 0
- elif symbol == arcade.key.DOWN:
- self.player_sprite.thrust = 0
-
- def split_asteroid(self, asteroid: AsteroidSprite):
- """ Split an asteroid into chunks. """
- x = asteroid.center_x
- y = asteroid.center_y
- self.score += 1
-
- if asteroid.size == 4:
- for i in range(3):
- image_no = random.randrange(2)
- image_list = ["images/meteorGrey_med1.png",
- "images/meteorGrey_med2.png"]
-
- enemy_sprite = AsteroidSprite(image_list[image_no],
- SCALE * 1.5)
-
- enemy_sprite.center_y = y
- enemy_sprite.center_x = x
-
- enemy_sprite.change_x = random.random() * 2.5 - 1.25
- enemy_sprite.change_y = random.random() * 2.5 - 1.25
-
- enemy_sprite.change_angle = (random.random() - 0.5) * 2
- enemy_sprite.size = 3
-
- self.all_sprites_list.append(enemy_sprite)
- self.asteroid_list.append(enemy_sprite)
- elif asteroid.size == 3:
- for i in range(3):
- image_no = random.randrange(2)
- image_list = ["images/meteorGrey_small1.png",
- "images/meteorGrey_small2.png"]
-
- enemy_sprite = AsteroidSprite(image_list[image_no],
- SCALE * 1.5)
-
- enemy_sprite.center_y = y
- enemy_sprite.center_x = x
-
- enemy_sprite.change_x = random.random() * 3 - 1.5
- enemy_sprite.change_y = random.random() * 3 - 1.5
-
- enemy_sprite.change_angle = (random.random() - 0.5) * 2
- enemy_sprite.size = 2
-
- self.all_sprites_list.append(enemy_sprite)
- self.asteroid_list.append(enemy_sprite)
- elif asteroid.size == 2:
- for i in range(3):
- image_no = random.randrange(2)
- image_list = ["images/meteorGrey_tiny1.png",
- "images/meteorGrey_tiny2.png"]
-
- enemy_sprite = AsteroidSprite(image_list[image_no],
- SCALE * 1.5)
-
- enemy_sprite.center_y = y
- enemy_sprite.center_x = x
-
- enemy_sprite.change_x = random.random() * 3.5 - 1.75
- enemy_sprite.change_y = random.random() * 3.5 - 1.75
-
- enemy_sprite.change_angle = (random.random() - 0.5) * 2
- enemy_sprite.size = 1
-
- self.all_sprites_list.append(enemy_sprite)
- self.asteroid_list.append(enemy_sprite)
-
- def update(self, x):
- """ Move everything """
-
- self.frame_count += 1
-
- if not self.game_over:
- self.all_sprites_list.update()
-
- for bullet in self.bullet_list:
- asteroids_plain = arcade.check_for_collision_with_list(bullet, self.asteroid_list)
- asteroids_spatial = arcade.check_for_collision_with_list(bullet, self.asteroid_list)
- if len(asteroids_plain) != len(asteroids_spatial):
- print("ERROR")
-
- asteroids = asteroids_spatial
-
- for asteroid in asteroids:
- self.split_asteroid(asteroid)
- asteroid.kill()
- bullet.kill()
-
- if not self.player_sprite.respawning:
- asteroids = arcade.check_for_collision_with_list(self.player_sprite, self.asteroid_list)
- if len(asteroids) > 0:
- if self.lives > 0:
- self.lives -= 1
- self.player_sprite.respawn()
- self.split_asteroid(asteroids[0])
- asteroids[0].kill()
- self.ship_life_list.pop().kill()
- print("Crash")
- else:
- self.game_over = True
- print("Game over")
-
-
-def main():
- window = MyGame()
- window.start_new_game()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/bouncing_ball.py b/arcade/examples/bouncing_ball.py
deleted file mode 100644
index cbacea1..0000000
--- a/arcade/examples/bouncing_ball.py
+++ /dev/null
@@ -1,97 +0,0 @@
-"""
-Bounce a ball on the screen, using gravity.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.bouncing_ball
-"""
-
-import arcade
-
-# --- Set up the constants
-
-# Size of the screen
-SCREEN_WIDTH = 600
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Bouncing Ball Example"
-
-# Size of the circle.
-CIRCLE_RADIUS = 20
-
-# How strong the gravity is.
-GRAVITY_CONSTANT = 0.3
-
-# Percent of velocity maintained on a bounce.
-BOUNCINESS = 0.9
-
-
-def draw(delta_time):
- """
- Use this function to draw everything to the screen.
- """
-
- # Start the render. This must happen before any drawing
- # commands. We do NOT need an stop render command.
- arcade.start_render()
-
- # Draw our rectangle
- arcade.draw_circle_filled(draw.x, draw.y, CIRCLE_RADIUS,
- arcade.color.BLACK)
-
- # Modify rectangles position based on the delta
- # vector. (Delta means change. You can also think
- # of this as our speed and direction.)
- draw.x += draw.delta_x
- draw.y += draw.delta_y
-
- draw.delta_y -= GRAVITY_CONSTANT
-
- # Figure out if we hit the left or right edge and need to reverse.
- if draw.x < CIRCLE_RADIUS and draw.delta_x < 0:
- draw.delta_x *= -BOUNCINESS
- elif draw.x > SCREEN_WIDTH - CIRCLE_RADIUS and draw.delta_x > 0:
- draw.delta_x *= -BOUNCINESS
-
- # See if we hit the bottom
- if draw.y < CIRCLE_RADIUS and draw.delta_y < 0:
- # If we bounce with a decent velocity, do a normal bounce.
- # Otherwise we won't have enough time resolution to accurate represent
- # the bounce and it will bounce forever. So we'll divide the bounciness
- # by half to let it settle out.
- if draw.delta_y * -1 > GRAVITY_CONSTANT * 15:
- draw.delta_y *= -BOUNCINESS
- else:
- draw.delta_y *= -BOUNCINESS / 2
-
-
-# Below are function-specific variables. Before we use them
-# in our function, we need to give them initial values. Then
-# the values will persist between function calls.
-#
-# In other languages, we'd declare the variables as 'static' inside the
-# function to get that same functionality.
-#
-# Later on, we'll use 'classes' to track position and velocity for multiple
-# objects.
-draw.x = CIRCLE_RADIUS
-draw.y = SCREEN_HEIGHT - CIRCLE_RADIUS
-draw.delta_x = 2
-draw.delta_y = 0
-
-
-def main():
- # Open up our window
- arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.set_background_color(arcade.color.WHITE)
-
- # Tell the computer to call the draw command at the specified interval.
- arcade.schedule(draw, 1 / 80)
-
- # Run the program
- arcade.run()
-
- # When done running the program, close the window.
- arcade.close_window()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/bouncing_balls.py b/arcade/examples/bouncing_balls.py
deleted file mode 100644
index 93b4f17..0000000
--- a/arcade/examples/bouncing_balls.py
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-Bounce balls on the screen.
-Spawn a new ball for each mouse-click.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.bouncing_balls
-"""
-
-import arcade
-import random
-
-# --- Set up the constants
-
-# Size of the screen
-SCREEN_WIDTH = 600
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Bouncing Balls Example"
-
-
-class Ball:
- """
- Class to keep track of a ball's location and vector.
- """
- def __init__(self):
- self.x = 0
- self.y = 0
- self.change_x = 0
- self.change_y = 0
- self.size = 0
- self.color = None
-
-
-def make_ball():
- """
- Function to make a new, random ball.
- """
- ball = Ball()
-
- # Size of the ball
- ball.size = random.randrange(10, 30)
-
- # Starting position of the ball.
- # Take into account the ball size so we don't spawn on the edge.
- ball.x = random.randrange(ball.size, SCREEN_WIDTH - ball.size)
- ball.y = random.randrange(ball.size, SCREEN_HEIGHT - ball.size)
-
- # Speed and direction of rectangle
- ball.change_x = random.randrange(-2, 3)
- ball.change_y = random.randrange(-2, 3)
-
- # Color
- ball.color = (random.randrange(256), random.randrange(256), random.randrange(256))
-
- return ball
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- self.ball_list = []
- ball = make_ball()
- self.ball_list.append(ball)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- for ball in self.ball_list:
- arcade.draw_circle_filled(ball.x, ball.y, ball.size, ball.color)
-
- # Put the text on the screen.
- output = "Balls: {}".format(len(self.ball_list))
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def update(self, delta_time):
- """ Movement and game logic """
- for ball in self.ball_list:
- ball.x += ball.change_x
- ball.y += ball.change_y
-
- if ball.x < ball.size:
- ball.change_x *= -1
-
- if ball.y < ball.size:
- ball.change_y *= -1
-
- if ball.x > SCREEN_WIDTH - ball.size:
- ball.change_x *= -1
-
- if ball.y > SCREEN_HEIGHT - ball.size:
- ball.change_y *= -1
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called whenever the mouse button is clicked.
- """
- ball = make_ball()
- self.ball_list.append(ball)
-
-
-def main():
- MyGame()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/bouncing_rectangle.py b/arcade/examples/bouncing_rectangle.py
deleted file mode 100644
index e98003b..0000000
--- a/arcade/examples/bouncing_rectangle.py
+++ /dev/null
@@ -1,95 +0,0 @@
-"""
-This simple animation example shows how to bounce a rectangle
-on the screen.
-
-It assumes a programmer knows how to create functions already.
-
-It does not assume a programmer knows how to create classes. If you do know
-how to create classes, see the starting template for a better example:
-
-http://arcade.academy/examples/starting_template.html
-
-Or look through the examples showing how to use Sprites.
-
-A video walk-through of this example is available at:
-https://vimeo.com/168063840
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.bouncing_rectangle
-
-"""
-
-import arcade
-
-# --- Set up the constants
-
-# Size of the screen
-SCREEN_WIDTH = 600
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Bouncing Rectangle Example"
-
-# Size of the rectangle
-RECT_WIDTH = 50
-RECT_HEIGHT = 50
-
-
-def on_draw(delta_time):
- """
- Use this function to draw everything to the screen.
- """
-
- # Start the render. This must happen before any drawing
- # commands. We do NOT need a stop render command.
- arcade.start_render()
-
- # Draw a rectangle.
- # For a full list of colors see:
- # http://arcade.academy/arcade.color.html
- arcade.draw_rectangle_filled(on_draw.center_x, on_draw.center_y,
- RECT_WIDTH, RECT_HEIGHT,
- arcade.color.ALIZARIN_CRIMSON)
-
- # Modify rectangles position based on the delta
- # vector. (Delta means change. You can also think
- # of this as our speed and direction.)
- on_draw.center_x += on_draw.delta_x * delta_time
- on_draw.center_y += on_draw.delta_y * delta_time
-
- # Figure out if we hit the edge and need to reverse.
- if on_draw.center_x < RECT_WIDTH // 2 \
- or on_draw.center_x > SCREEN_WIDTH - RECT_WIDTH // 2:
- on_draw.delta_x *= -1
- if on_draw.center_y < RECT_HEIGHT // 2 \
- or on_draw.center_y > SCREEN_HEIGHT - RECT_HEIGHT // 2:
- on_draw.delta_y *= -1
-
-
-# Below are function-specific variables. Before we use them
-# in our function, we need to give them initial values. Then
-# the values will persist between function calls.
-#
-# In other languages, we'd declare the variables as 'static' inside the
-# function to get that same functionality.
-#
-# Later on, we'll use 'classes' to track position and velocity for multiple
-# objects.
-on_draw.center_x = 100 # Initial x position
-on_draw.center_y = 50 # Initial y position
-on_draw.delta_x = 115 # Initial change in x
-on_draw.delta_y = 130 # Initial change in y
-
-
-def main():
- # Open up our window
- arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.set_background_color(arcade.color.WHITE)
-
- # Tell the computer to call the draw command at the specified interval.
- arcade.schedule(on_draw, 1 / 80)
-
- # Run the program
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/decorator_drawing_example.py b/arcade/examples/decorator_drawing_example.py
deleted file mode 100644
index cc398a8..0000000
--- a/arcade/examples/decorator_drawing_example.py
+++ /dev/null
@@ -1,124 +0,0 @@
-"""
-Example "Arcade" library code.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.decorator_drawing_example
-"""
-
-# Library imports
-import arcade
-import random
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Drawing With Decorators Example"
-
-window = arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
-bird_list = []
-
-
-def setup():
- create_birds()
- arcade.schedule(update, 1 / 60)
- arcade.run()
-
-
-def create_birds():
- for bird_count in range(10):
- x = random.randrange(SCREEN_WIDTH)
- y = random.randrange(SCREEN_HEIGHT/2, SCREEN_HEIGHT)
- bird_list.append([x, y])
-
-
-def update(delta_time):
- """
- This is run every 1/60 of a second or so. Do not draw anything
- in this function.
- """
- change_y = 0.3
-
- for bird in bird_list:
- bird[0] += change_y
- if bird[0] > SCREEN_WIDTH + 20:
- bird[0] = -20
-
-
-@window.event
-def on_draw():
- """
- This is called every time we need to update our screen. About 60
- times per second.
-
- Just draw things in this function, don't update where they are.
- """
- # Call our drawing functions.
- draw_background()
- draw_birds()
- draw_trees()
-
-
-def draw_background():
- """
- This function draws the background. Specifically, the sky and ground.
- """
- # Draw the sky in the top two-thirds
- arcade.draw_rectangle_filled(SCREEN_WIDTH / 2, SCREEN_HEIGHT * 2 / 3,
- SCREEN_WIDTH - 1, SCREEN_HEIGHT * 2 / 3,
- arcade.color.SKY_BLUE)
-
- # Draw the ground in the bottom third
- arcade.draw_rectangle_filled(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 6,
- SCREEN_WIDTH - 1, SCREEN_HEIGHT / 3,
- arcade.color.DARK_SPRING_GREEN)
-
-
-def draw_birds():
- for bird in bird_list:
- # Draw the bird.
- draw_bird(bird[0], bird[1])
-
-
-def draw_bird(x, y):
- """
- Draw a bird using a couple arcs.
- """
- arcade.draw_arc_outline(x, y, 20, 20, arcade.color.BLACK, 0, 90)
- arcade.draw_arc_outline(x + 40, y, 20, 20, arcade.color.BLACK, 90, 180)
-
-
-def draw_trees():
-
- # Draw the top row of trees
- for x in range(45, SCREEN_WIDTH, 90):
- draw_pine_tree(x, SCREEN_HEIGHT / 3)
-
- # Draw the bottom row of trees
- for x in range(65, SCREEN_WIDTH, 90):
- draw_pine_tree(x, (SCREEN_HEIGHT / 3) - 120)
-
-
-def draw_pine_tree(center_x, center_y):
- """
- This function draws a pine tree at the specified location.
-
- Args:
- :center_x: x position of the tree center.
- :center_y: y position of the tree trunk center.
- """
- # Draw the trunk center_x
- arcade.draw_rectangle_filled(center_x, center_y, 20, 40, arcade.color.DARK_BROWN)
-
- tree_bottom_y = center_y + 20
-
- # Draw the triangle on top of the trunk
- point_list = ((center_x - 40, tree_bottom_y),
- (center_x, tree_bottom_y + 100),
- (center_x + 40, tree_bottom_y))
-
- arcade.draw_polygon_filled(point_list, arcade.color.DARK_GREEN)
-
-
-if __name__ == "__main__":
- setup()
-
diff --git a/arcade/examples/drawing_primitives.py b/arcade/examples/drawing_primitives.py
deleted file mode 100644
index 3a12935..0000000
--- a/arcade/examples/drawing_primitives.py
+++ /dev/null
@@ -1,168 +0,0 @@
-"""
-Example "Arcade" library code.
-
-This example shows the drawing primitives and how they are used.
-It does not assume the programmer knows how to define functions or classes
-yet.
-
-API documentation for the draw commands can be found here:
-http://arcade.academy/quick_index.html#id1
-
-A video explaining this example can be found here:
-https://vimeo.com/167158158
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.drawing_primitives
-"""
-
-# Import the Arcade library. If this fails, then try following the instructions
-# for how to install arcade:
-# http://arcade.academy/installation.html
-import arcade
-import os
-
-# 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)
-
-# Open the window. Set the window title and dimensions (width and height)
-arcade.open_window(600, 600, "Drawing Primitives Example")
-
-# Set the background color to white
-# For a list of named colors see
-# http://arcade.academy/arcade.color.html
-# Colors can also be specified in (red, green, blue) format and
-# (red, green, blue, alpha) format.
-arcade.set_background_color(arcade.color.WHITE)
-
-# Start the render process. This must be done before any drawing commands.
-arcade.start_render()
-
-# Draw a grid
-# Draw vertical lines every 120 pixels
-for x in range(0, 601, 120):
- arcade.draw_line(x, 0, x, 600, arcade.color.BLACK, 2)
-
-# Draw horizontal lines every 200 pixels
-for y in range(0, 601, 200):
- arcade.draw_line(0, y, 800, y, arcade.color.BLACK, 2)
-
-# Draw a point
-arcade.draw_text("draw_point", 3, 405, arcade.color.BLACK, 12)
-arcade.draw_point(60, 495, arcade.color.RED, 10)
-
-# Draw a set of points
-arcade.draw_text("draw_points", 123, 405, arcade.color.BLACK, 12)
-point_list = ((165, 495),
- (165, 480),
- (165, 465),
- (195, 495),
- (195, 480),
- (195, 465))
-arcade.draw_points(point_list, arcade.color.ZAFFRE, 10)
-
-# Draw a line
-arcade.draw_text("draw_line", 243, 405, arcade.color.BLACK, 12)
-arcade.draw_line(270, 495, 300, 450, arcade.color.WOOD_BROWN, 3)
-
-# Draw a set of lines
-arcade.draw_text("draw_lines", 363, 405, arcade.color.BLACK, 12)
-point_list = ((390, 450),
- (450, 450),
- (390, 480),
- (450, 480),
- (390, 510),
- (450, 510)
- )
-arcade.draw_lines(point_list, arcade.color.BLUE, 3)
-
-# Draw a line strip
-arcade.draw_text("draw_line_strip", 483, 405, arcade.color.BLACK, 12)
-point_list = ((510, 450),
- (570, 450),
- (510, 480),
- (570, 480),
- (510, 510),
- (570, 510)
- )
-arcade.draw_line_strip(point_list, arcade.color.TROPICAL_RAIN_FOREST, 3)
-
-# Draw a polygon
-arcade.draw_text("draw_polygon_outline", 3, 207, arcade.color.BLACK, 9)
-point_list = ((30, 240),
- (45, 240),
- (60, 255),
- (60, 285),
- (45, 300),
- (30, 300))
-arcade.draw_polygon_outline(point_list, arcade.color.SPANISH_VIOLET, 3)
-
-# Draw a filled in polygon
-arcade.draw_text("draw_polygon_filled", 123, 207, arcade.color.BLACK, 9)
-point_list = ((150, 240),
- (165, 240),
- (180, 255),
- (180, 285),
- (165, 300),
- (150, 300))
-arcade.draw_polygon_filled(point_list, arcade.color.SPANISH_VIOLET)
-
-# Draw an outline of a circle
-arcade.draw_text("draw_circle_outline", 243, 207, arcade.color.BLACK, 10)
-arcade.draw_circle_outline(300, 285, 18, arcade.color.WISTERIA, 3)
-
-# Draw a filled in circle
-arcade.draw_text("draw_circle_filled", 363, 207, arcade.color.BLACK, 10)
-arcade.draw_circle_filled(420, 285, 18, arcade.color.GREEN)
-
-# Draw an ellipse outline, and another one rotated
-arcade.draw_text("draw_ellipse_outline", 483, 207, arcade.color.BLACK, 10)
-arcade.draw_ellipse_outline(540, 273, 15, 36, arcade.color.AMBER, 3)
-arcade.draw_ellipse_outline(540, 336, 15, 36,
- arcade.color.BLACK_BEAN, 3, 45)
-
-# Draw a filled ellipse, and another one rotated
-arcade.draw_text("draw_ellipse_filled", 3, 3, arcade.color.BLACK, 10)
-arcade.draw_ellipse_filled(60, 81, 15, 36, arcade.color.AMBER)
-arcade.draw_ellipse_filled(60, 144, 15, 36,
- arcade.color.BLACK_BEAN, 45)
-
-# Draw an arc, and another one rotated
-arcade.draw_text("draw_arc/filled_arc", 123, 3, arcade.color.BLACK, 10)
-arcade.draw_arc_outline(150, 81, 15, 36,
- arcade.color.BRIGHT_MAROON, 90, 360)
-arcade.draw_arc_filled(150, 144, 15, 36,
- arcade.color.BOTTLE_GREEN, 90, 360, 45)
-
-# Draw an rectangle outline
-arcade.draw_text("draw_rect", 243, 3, arcade.color.BLACK, 10)
-arcade.draw_rectangle_outline(295, 100, 45, 65,
- arcade.color.BRITISH_RACING_GREEN)
-arcade.draw_rectangle_outline(295, 160, 20, 45,
- arcade.color.BRITISH_RACING_GREEN, 3, 45)
-
-# Draw a filled in rectangle
-arcade.draw_text("draw_filled_rect", 363, 3, arcade.color.BLACK, 10)
-arcade.draw_rectangle_filled(420, 100, 45, 65, arcade.color.BLUSH)
-arcade.draw_rectangle_filled(420, 160, 20, 40, arcade.color.BLUSH, 45)
-
-# Load and draw an image to the screen
-# Image from kenney.nl asset pack #1
-arcade.draw_text("draw_bitmap", 483, 3, arcade.color.BLACK, 12)
-texture = arcade.load_texture("images/playerShip1_orange.png")
-scale = .6
-arcade.draw_texture_rectangle(540, 120, scale * texture.width,
- scale * texture.height, texture, 0)
-arcade.draw_texture_rectangle(540, 60, scale * texture.width,
- scale * texture.height, texture, 45)
-
-# Finish the render.
-# Nothing will be drawn without this.
-# Must happen after all draw commands
-arcade.finish_render()
-
-# Keep the window up until someone closes it.
-arcade.run()
diff --git a/arcade/examples/drawing_text.py b/arcade/examples/drawing_text.py
deleted file mode 100644
index 5fb4223..0000000
--- a/arcade/examples/drawing_text.py
+++ /dev/null
@@ -1,107 +0,0 @@
-"""
-Example showing how to draw text to the screen.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.drawing_text
-"""
-import arcade
-
-SCREEN_WIDTH = 500
-SCREEN_HEIGHT = 500
-SCREEN_TITLE = "Drawing Text Example"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.WHITE)
- self.text_angle = 0
- self.time_elapsed = 0.0
-
- def update(self, delta_time):
- self.text_angle += 1
- self.time_elapsed += delta_time
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command should happen before we start drawing. It will clear
- # the screen to the background color, and erase what we drew last frame.
- arcade.start_render()
-
- # start_x and start_y make the start point for the text. We draw a dot to make it easy too see
- # the text in relation to its start x and y.
- start_x = 50
- start_y = 450
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text("Simple line of text in 12 point", start_x, start_y, arcade.color.BLACK, 12)
-
- start_x = 50
- start_y = 150
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text("Garamond Text", start_x, start_y, arcade.color.BLACK, 15, font_name='GARA')
-
- start_x = 50
- start_y = 400
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text("Text anchored 'top' and 'left'.",
- start_x, start_y, arcade.color.BLACK, 12, anchor_x="left", anchor_y="top")
-
- start_y = 350
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text("14 point multi\nline\ntext",
- start_x, start_y, arcade.color.BLACK, 14, anchor_y="top")
-
- start_y = 450
- start_x = 300
- width = 200
- height = 20
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_lrtb_rectangle_outline(start_x, start_x + width,
- start_y + height, start_y,
- arcade.color.BLUE, 1)
- arcade.draw_text("Centered Text.",
- start_x, start_y, arcade.color.BLACK, 14, width=200, align="center")
-
- start_y = 250
- start_x = 300
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text("Text centered on\na point",
- start_x, start_y, arcade.color.BLACK, 14, width=200, align="center",
- anchor_x="center", anchor_y="center")
-
- start_y = 150
- start_x = 300
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text("Text rotated on\na point", start_x, start_y,
- arcade.color.BLACK, 14, width=200, align="center", anchor_x="center",
- anchor_y="center", rotation=self.text_angle)
-
- start_y = 150
- start_x = 20
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text("Sideways text", start_x, start_y,
- arcade.color.BLACK, 14, width=200, align="center",
- anchor_x="center", anchor_y="center", rotation=90.0)
-
- start_y = 20
- start_x = 50
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text(f"Time elapsed: {self.time_elapsed:7.1f}",
- start_x, start_y, arcade.color.BLACK, 14)
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/drawing_with_functions.py b/arcade/examples/drawing_with_functions.py
deleted file mode 100644
index a437101..0000000
--- a/arcade/examples/drawing_with_functions.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""
-Example "Arcade" library code.
-
-This example shows how to use functions to draw a scene.
-It does not assume that the programmer knows how to use classes yet.
-
-A video walk-through of this code is available at:
-https://vimeo.com/167296062
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.drawing_with_functions
-"""
-
-# Library imports
-import arcade
-
-# Constants - variables that do not change
-SCREEN_WIDTH = 600
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Drawing With Functions Example"
-
-
-def draw_background():
- """
- This function draws the background. Specifically, the sky and ground.
- """
- # Draw the sky in the top two-thirds
- arcade.draw_lrtb_rectangle_filled(0,
- SCREEN_WIDTH,
- SCREEN_HEIGHT,
- SCREEN_HEIGHT * (1 / 3),
- arcade.color.SKY_BLUE)
-
- # Draw the ground in the bottom third
- arcade.draw_lrtb_rectangle_filled(0,
- SCREEN_WIDTH,
- SCREEN_HEIGHT / 3,
- 0,
- arcade.color.DARK_SPRING_GREEN)
-
-
-def draw_bird(x, y):
- """
- Draw a bird using a couple arcs.
- """
- arcade.draw_arc_outline(x, y, 20, 20, arcade.color.BLACK, 0, 90)
- arcade.draw_arc_outline(x + 40, y, 20, 20, arcade.color.BLACK, 90, 180)
-
-
-def draw_pine_tree(x, y):
- """
- This function draws a pine tree at the specified location.
- """
- # Draw the triangle on top of the trunk
- arcade.draw_triangle_filled(x + 40, y,
- x, y - 100,
- x + 80, y - 100,
- arcade.color.DARK_GREEN)
-
- # Draw the trunk
- arcade.draw_lrtb_rectangle_filled(x + 30, x + 50, y - 100, y - 140,
- arcade.color.DARK_BROWN)
-
-
-def main():
- """
- This is the main program.
- """
-
- # Open the window
- arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # Start the render process. This must be done before any drawing commands.
- arcade.start_render()
-
- # Call our drawing functions.
- draw_background()
- draw_pine_tree(50, 250)
- draw_pine_tree(350, 320)
- draw_bird(70, 500)
- draw_bird(470, 550)
-
- # Finish the render.
- # Nothing will be drawn without this.
- # Must happen after all draw commands
- arcade.finish_render()
-
- # Keep the window up until someone closes it.
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/drawing_with_loops.py b/arcade/examples/drawing_with_loops.py
deleted file mode 100644
index 1f25635..0000000
--- a/arcade/examples/drawing_with_loops.py
+++ /dev/null
@@ -1,109 +0,0 @@
-"""
-Example "Arcade" library code.
-
-This example shows how to use functions and loops to draw a scene.
-It does not assume that the programmer knows how to use classes yet.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.drawing_with_loops
-"""
-
-# Library imports
-import arcade
-import random
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Drawing With Loops Example"
-
-
-def draw_background():
- """
- This function draws the background. Specifically, the sky and ground.
- """
- # Draw the sky in the top two-thirds
- arcade.draw_rectangle_filled(SCREEN_WIDTH / 2, SCREEN_HEIGHT * 2 / 3,
- SCREEN_WIDTH - 1, SCREEN_HEIGHT * 2 / 3,
- arcade.color.SKY_BLUE)
-
- # Draw the ground in the bottom third
- arcade.draw_rectangle_filled(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 6,
- SCREEN_WIDTH - 1, SCREEN_HEIGHT / 3,
- arcade.color.DARK_SPRING_GREEN)
-
-
-def draw_bird(x, y):
- """
- Draw a bird using a couple arcs.
- """
- arcade.draw_arc_outline(x, y, 20, 20, arcade.color.BLACK, 0, 90)
- arcade.draw_arc_outline(x + 40, y, 20, 20, arcade.color.BLACK, 90, 180)
-
-
-def draw_pine_tree(center_x, center_y):
- """
- This function draws a pine tree at the specified location.
-
- Args:
- :center_x: x position of the tree center.
- :center_y: y position of the tree trunk center.
- """
- # Draw the trunkcenter_x
- arcade.draw_rectangle_filled(center_x, center_y, 20, 40,
- arcade.color.DARK_BROWN)
-
- tree_bottom_y = center_y + 20
-
- # Draw the triangle on top of the trunk
- point_list = ((center_x - 40, tree_bottom_y),
- (center_x, tree_bottom_y + 100),
- (center_x + 40, tree_bottom_y))
-
- arcade.draw_polygon_filled(point_list, arcade.color.DARK_GREEN)
-
-
-def main():
- """
- This is the main program.
- """
-
- # Open the window
- arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # Start the render process. This must be done before any drawing commands.
- arcade.start_render()
-
- # Call our drawing functions.
- draw_background()
-
- # Loop to draw ten birds in random locations.
- for bird_count in range(10):
- # Any random x from 0 to the width of the screen
- x = random.randrange(0, SCREEN_WIDTH)
-
- # Any random y from in the top 2/3 of the screen.
- # No birds on the ground.
- y = random.randrange(SCREEN_HEIGHT / 3, SCREEN_HEIGHT - 20)
-
- # Draw the bird.
- draw_bird(x, y)
-
- # Draw the top row of trees
- for x in range(45, SCREEN_WIDTH, 90):
- draw_pine_tree(x, SCREEN_HEIGHT / 3)
-
- # Draw the bottom row of trees
- for x in range(65, SCREEN_WIDTH, 90):
- draw_pine_tree(x, (SCREEN_HEIGHT / 3) - 120)
-
- # Finish the render.
- # Nothing will be drawn without this.
- # Must happen after all draw commands
- arcade.finish_render()
-
- # Keep the window up until someone closes it.
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/dual_stick_shooter.py b/arcade/examples/dual_stick_shooter.py
deleted file mode 100644
index 3cadcf7..0000000
--- a/arcade/examples/dual_stick_shooter.py
+++ /dev/null
@@ -1,310 +0,0 @@
-"""
-Dual-stick Shooter Example
-
-A dual-analog stick joystick is the preferred method of input. If a joystick is
-not present, the game will fail back to use keyboard controls (WASD to move, arrows to shoot)
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.dual_stick_shooter
-"""
-import arcade
-import random
-import math
-import os
-from typing import cast
-import pprint
-
-SCREEN_WIDTH = 1024
-SCREEN_HEIGHT = 768
-SCREEN_TITLE = "Dual-stick Shooter Example"
-MOVEMENT_SPEED = 4
-BULLET_SPEED = 10
-BULLET_COOLDOWN_TICKS = 10
-ENEMY_SPAWN_INTERVAL = 1
-ENEMY_SPEED = 1
-JOY_DEADZONE = 0.2
-
-
-def dump_obj(obj):
- for key in sorted(vars(obj)):
- val = getattr(obj, key)
- print("{:30} = {} ({})".format(key, val, type(val).__name__))
-
-
-def dump_joystick(joy):
- print("========== {}".format(joy))
- print("x {}".format(joy.x))
- print("y {}".format(joy.y))
- print("z {}".format(joy.z))
- print("rx {}".format(joy.rx))
- print("ry {}".format(joy.ry))
- print("rz {}".format(joy.rz))
- print("hat_x {}".format(joy.hat_x))
- print("hat_y {}".format(joy.hat_y))
- print("buttons {}".format(joy.buttons))
- print("========== Extra joy")
- dump_obj(joy)
- print("========== Extra joy.device")
- dump_obj(joy.device)
- print("========== pprint joy")
- pprint.pprint(joy)
- print("========== pprint joy.device")
- pprint.pprint(joy.device)
-
-
-def dump_joystick_state(ticks, joy):
- # print("{:5.2f} {:5.2f} {:>20} {:5}_".format(1.234567, -8.2757272903, "hello", str(True)))
- fmt_str = "{:6d} "
- num_fmts = ["{:5.2f}"] * 6
- fmt_str += " ".join(num_fmts)
- fmt_str += " {:2d} {:2d} {}"
- buttons = " ".join(["{:5}".format(str(b)) for b in joy.buttons])
- print(fmt_str.format(ticks,
- joy.x,
- joy.y,
- joy.z,
- joy.rx,
- joy.ry,
- joy.rz,
- joy.hat_x,
- joy.hat_y,
- buttons))
-
-
-def get_joy_position(x, y):
- """Given position of joystick axes, return (x, y, angle_in_degrees).
- If movement is not outside of deadzone, return (None, None, None)"""
- if x > JOY_DEADZONE or x < -JOY_DEADZONE or y > JOY_DEADZONE or y < -JOY_DEADZONE:
- y = -y
- rad = math.atan2(y, x)
- angle = math.degrees(rad)
- return x, y, angle
- return None, None, None
-
-
-class Player(arcade.sprite.Sprite):
- def __init__(self, filename):
- super().__init__(filename=filename, scale=0.4, center_x=SCREEN_WIDTH/2, center_y=SCREEN_HEIGHT/2)
- self.shoot_up_pressed = False
- self.shoot_down_pressed = False
- self.shoot_left_pressed = False
- self.shoot_right_pressed = False
-
-
-class Enemy(arcade.sprite.Sprite):
- def __init__(self, x, y):
- super().__init__(filename='images/bumper.png', scale=0.5, center_x=x, center_y=y)
-
- def follow_sprite(self, player_sprite):
- """
- This function will move the current sprite towards whatever
- other sprite is specified as a parameter.
-
- We use the 'min' function here to get the sprite to line up with
- the target sprite, and not jump around if the sprite is not off
- an exact multiple of ENEMY_SPEED.
- """
-
- if self.center_y < player_sprite.center_y:
- self.center_y += min(ENEMY_SPEED, player_sprite.center_y - self.center_y)
- elif self.center_y > player_sprite.center_y:
- self.center_y -= min(ENEMY_SPEED, self.center_y - player_sprite.center_y)
-
- if self.center_x < player_sprite.center_x:
- self.center_x += min(ENEMY_SPEED, player_sprite.center_x - self.center_x)
- elif self.center_x > player_sprite.center_x:
- self.center_x -= min(ENEMY_SPEED, self.center_x - player_sprite.center_x)
-
-
-class MyGame(arcade.Window):
- def __init__(self, width, height, title):
- 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)
-
- arcade.set_background_color(arcade.color.DARK_MIDNIGHT_BLUE)
- self.game_over = False
- self.score = 0
- self.tick = 0
- self.bullet_cooldown = 0
- self.player = Player("images/playerShip2_orange.png")
- self.bullet_list = arcade.SpriteList()
- self.enemy_list = arcade.SpriteList()
- self.joy = None
- joys = arcade.get_joysticks()
- for joy in joys:
- dump_joystick(joy)
- if joys:
- self.joy = joys[0]
- self.joy.open()
- print("Using joystick controls: {}".format(self.joy.device))
- arcade.window_commands.schedule(self.debug_joy_state, 0.1)
- if not self.joy:
- print("No joystick present, using keyboard controls")
- arcade.window_commands.schedule(self.spawn_enemy, ENEMY_SPAWN_INTERVAL)
-
- def debug_joy_state(self, delta_time):
- dump_joystick_state(self.tick, self.joy)
-
- def spawn_enemy(self, elapsed):
- if self.game_over:
- return
- x = random.randint(0, SCREEN_WIDTH)
- y = random.randint(0, SCREEN_HEIGHT)
- self.enemy_list.append(Enemy(x, y))
-
- def update(self, delta_time):
- self.tick += 1
- if self.game_over:
- return
-
- self.bullet_cooldown += 1
-
- for enemy in self.enemy_list:
- cast(Enemy, enemy).follow_sprite(self.player)
-
- if self.joy:
- # Joystick input - movement
- move_x, move_y, move_angle = get_joy_position(self.joy.x, self.joy.y)
- if move_angle:
- self.player.change_x = move_x * MOVEMENT_SPEED
- self.player.change_y = move_y * MOVEMENT_SPEED
- # An angle of "0" means "right", but the player's image is drawn in the "up" direction.
- # So an offset is needed.
- self.player.angle = move_angle - 90
- else:
- self.player.change_x = 0
- self.player.change_y = 0
- # Joystick input - shooting
- shoot_x, shoot_y, shoot_angle = get_joy_position(self.joy.z, self.joy.rz)
- if shoot_angle:
- self.spawn_bullet(shoot_angle)
- else:
- # Keyboard input - shooting
- if self.player.shoot_right_pressed and self.player.shoot_up_pressed:
- self.spawn_bullet(0+45)
- elif self.player.shoot_up_pressed and self.player.shoot_left_pressed:
- self.spawn_bullet(90+45)
- elif self.player.shoot_left_pressed and self.player.shoot_down_pressed:
- self.spawn_bullet(180+45)
- elif self.player.shoot_down_pressed and self.player.shoot_right_pressed:
- self.spawn_bullet(270+45)
- elif self.player.shoot_right_pressed:
- self.spawn_bullet(0)
- elif self.player.shoot_up_pressed:
- self.spawn_bullet(90)
- elif self.player.shoot_left_pressed:
- self.spawn_bullet(180)
- elif self.player.shoot_down_pressed:
- self.spawn_bullet(270)
-
- self.enemy_list.update()
- self.player.update()
- self.bullet_list.update()
- ship_death_hit_list = arcade.check_for_collision_with_list(self.player, self.enemy_list)
- if len(ship_death_hit_list) > 0:
- self.game_over = True
- for bullet in self.bullet_list:
- bullet_killed = False
- enemy_shot_list = arcade.check_for_collision_with_list(bullet, self.enemy_list)
- # Loop through each colliding sprite, remove it, and add to the score.
- for enemy in enemy_shot_list:
- enemy.kill()
- bullet.kill()
- bullet_killed = True
- self.score += 1
- if bullet_killed:
- continue
-
- def on_key_press(self, key, modifiers):
- if key == arcade.key.W:
- self.player.change_y = MOVEMENT_SPEED
- self.player.angle = 0
- elif key == arcade.key.A:
- self.player.change_x = -MOVEMENT_SPEED
- self.player.angle = 90
- elif key == arcade.key.S:
- self.player.change_y = -MOVEMENT_SPEED
- self.player.angle = 180
- elif key == arcade.key.D:
- self.player.change_x = MOVEMENT_SPEED
- self.player.angle = 270
- elif key == arcade.key.RIGHT:
- self.player.shoot_right_pressed = True
- elif key == arcade.key.UP:
- self.player.shoot_up_pressed = True
- elif key == arcade.key.LEFT:
- self.player.shoot_left_pressed = True
- elif key == arcade.key.DOWN:
- self.player.shoot_down_pressed = True
-
- def on_key_release(self, key, modifiers):
- if key == arcade.key.W:
- self.player.change_y = 0
- elif key == arcade.key.A:
- self.player.change_x = 0
- elif key == arcade.key.S:
- self.player.change_y = 0
- elif key == arcade.key.D:
- self.player.change_x = 0
- elif key == arcade.key.RIGHT:
- self.player.shoot_right_pressed = False
- elif key == arcade.key.UP:
- self.player.shoot_up_pressed = False
- elif key == arcade.key.LEFT:
- self.player.shoot_left_pressed = False
- elif key == arcade.key.DOWN:
- self.player.shoot_down_pressed = False
-
- def spawn_bullet(self, angle_in_deg):
- # only allow bullet to spawn on an interval
- if self.bullet_cooldown < BULLET_COOLDOWN_TICKS:
- return
- self.bullet_cooldown = 0
-
- bullet = arcade.Sprite("images/laserBlue01.png", 0.75)
-
- # Position the bullet at the player's current location
- start_x = self.player.center_x
- start_y = self.player.center_y
- bullet.center_x = start_x
- bullet.center_y = start_y
-
- # angle the bullet visually
- bullet.angle = angle_in_deg
- angle_in_rad = math.radians(angle_in_deg)
-
- # set bullet's movement direction
- bullet.change_x = math.cos(angle_in_rad) * BULLET_SPEED
- bullet.change_y = math.sin(angle_in_rad) * BULLET_SPEED
-
- # Add the bullet to the appropriate lists
- self.bullet_list.append(bullet)
-
- def on_draw(self):
- # clear screen and start render process
- arcade.start_render()
-
- # draw game items
- self.bullet_list.draw()
- self.enemy_list.draw()
- self.player.draw()
-
- # Put the score on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- # Game over message
- if self.game_over:
- arcade.draw_text("Game Over", SCREEN_WIDTH/2, SCREEN_HEIGHT/2, arcade.color.WHITE, 100, width=SCREEN_WIDTH,
- align="center", anchor_x="center", anchor_y="center")
-
-
-if __name__ == "__main__":
- game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
diff --git a/arcade/examples/dungeon.tmx b/arcade/examples/dungeon.tmx
deleted file mode 100644
index 3334e84..0000000
--- a/arcade/examples/dungeon.tmx
+++ /dev/null
@@ -1,777 +0,0 @@
-
-
diff --git a/arcade/examples/frametime_plotter.py b/arcade/examples/frametime_plotter.py
deleted file mode 100644
index a07cd2a..0000000
--- a/arcade/examples/frametime_plotter.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""
-Helper class to track length of time taken for each frame and draw a graph when application exits.
-Also able to add events at arbitrary times across the graph.
-"""
-import time
-import matplotlib.pyplot as plt
-import statistics
-
-
-class FrametimePlotter:
- EVENT_POINT_Y = -0.05
- EVENT_MSG_Y = -0.045
-
- def __init__(self):
- self.times = []
- self.events = []
- self.start = time.perf_counter()
-
- def add_event(self, event_msg):
- self.events.append((len(self.times), event_msg))
-
- def end_frame(self, time_delta):
- self.times.append(time_delta)
-
- def _show_stats(self):
- end = time.perf_counter()
- print("Min : {:.5f}".format(min(self.times)))
- print("Max : {:.5f}".format(max(self.times)))
- print("Avg : {:.5f}".format(statistics.mean(self.times)))
- print("Median: {:.5f}".format(statistics.median(self.times)))
- try:
- print("Mode : {:.5f}".format(statistics.mode(self.times)))
- except statistics.StatisticsError as e:
- print("Mode : {}".format(e))
- print("StdDev: {:.5f}".format(statistics.stdev(self.times)))
- frame_count = len(self.times)
- elapsed_time = end - self.start
- print("Frame count: {}".format(frame_count))
- print("Elapsed time: {:.5f}".format(elapsed_time))
- print("FPS: {:.5f}".format(frame_count / elapsed_time))
-
- def show(self):
- if len(self.times) <= 1:
- return
- self._show_stats()
- frame_idxs = range(0, len(self.times))
- event_idxs = [e[0] for e in self.events]
- event_point_y = [self.EVENT_POINT_Y] * len(self.events)
- plt.figure("Frame durations", figsize=(8, 6))
- plt.plot(frame_idxs, self.times, event_idxs, event_point_y, "k|")
- plt.xlabel("frames")
- plt.ylabel("frame duration")
- plt.ylim(self.EVENT_POINT_Y - 0.005, 0.5)
- plt.tight_layout()
- for frame_idx, msg in self.events:
- plt.text(frame_idx, self.EVENT_MSG_Y, msg, horizontalalignment="center", verticalalignment="bottom",
- size="smaller", rotation="vertical")
- plt.show()
diff --git a/arcade/examples/full_screen_example.py b/arcade/examples/full_screen_example.py
deleted file mode 100644
index 213a064..0000000
--- a/arcade/examples/full_screen_example.py
+++ /dev/null
@@ -1,108 +0,0 @@
-"""
-Use sprites to scroll around a large screen.
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.full_screen_example
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Full Screen Example"
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 40
-
-MOVEMENT_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """
- Initializer
- """
- # Open a window in full screen mode. Remove fullscreen=True if
- # you don't want to start this way.
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, fullscreen=True)
-
- # 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)
-
- # This will get the size of the window, and set the viewport to match.
- # So if the window is 1000x1000, then so will our viewport. If
- # you want something different, then use those coordinates instead.
- width, height = self.get_size()
- self.set_viewport(0, width, 0, height)
- arcade.set_background_color(arcade.color.AMAZON)
- self.example_image = arcade.load_texture("images/boxCrate_double.png")
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- arcade.start_render()
-
- # Get viewport dimensions
- left, screen_width, bottom, screen_height = self.get_viewport()
-
- text_size = 18
- # Draw text on the screen so the user has an idea of what is happening
- arcade.draw_text("Press F to toggle between full screen and windowed mode, unstretched.",
- screen_width // 2, screen_height // 2 - 20,
- arcade.color.WHITE, text_size, anchor_x="center")
- arcade.draw_text("Press S to toggle between full screen and windowed mode, stretched.",
- screen_width // 2, screen_height // 2 + 20,
- arcade.color.WHITE, text_size, anchor_x="center")
-
- # Draw some boxes on the bottom so we can see how they change
- for x in range(64, 800, 128):
- y = 64
- width = 128
- height = 128
- arcade.draw_texture_rectangle(x, y, width, height, self.example_image)
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
- if key == arcade.key.F:
- # User hits f. Flip between full and not full screen.
- self.set_fullscreen(not self.fullscreen)
-
- # Get the window coordinates. Match viewport to window coordinates
- # so there is a one-to-one mapping.
- width, height = self.get_size()
- self.set_viewport(0, width, 0, height)
-
- if key == arcade.key.S:
- # User hits s. Flip between full and not full screen.
- self.set_fullscreen(not self.fullscreen)
-
- # Instead of a one-to-one mapping, stretch/squash window to match the
- # constants. This does NOT respect aspect ratio. You'd need to
- # do a bit of math for that.
- self.set_viewport(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT)
-
-
-def main():
- """ Main method """
- MyGame()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/gradients.py b/arcade/examples/gradients.py
deleted file mode 100644
index 91cb494..0000000
--- a/arcade/examples/gradients.py
+++ /dev/null
@@ -1,92 +0,0 @@
-"""
-Drawing Gradients
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.gradients
-"""
-import arcade
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Gradients Example"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Set up the application.
- """
-
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.BLACK)
-
- self.shapes = arcade.ShapeElementList()
-
- # This is a large rectangle that fills the whole
- # background. The gradient goes between the two colors
- # top to bottom.
- color1 = (215, 214, 165)
- color2 = (219, 166, 123)
- points = (0, 0), (SCREEN_WIDTH, 0), (SCREEN_WIDTH, SCREEN_HEIGHT), (0, SCREEN_HEIGHT)
- colors = (color1, color1, color2, color2)
- rect = arcade.create_rectangle_filled_with_colors(points, colors)
- self.shapes.append(rect)
-
- # Another rectangle, but in this case the color doesn't change. Just the
- # transparency. This time it goes from left to right.
- color1 = (165, 92, 85, 255)
- color2 = (165, 92, 85, 0)
- points = (100, 100), (SCREEN_WIDTH - 100, 100), (SCREEN_WIDTH - 100, 300), (100, 300)
- colors = (color2, color1, color1, color2)
- rect = arcade.create_rectangle_filled_with_colors(points, colors)
- self.shapes.append(rect)
-
- # Two lines
- color1 = (7, 67, 88)
- color2 = (69, 137, 133)
- points = (100, 400), (SCREEN_WIDTH - 100, 400), (SCREEN_WIDTH - 100, 500), (100, 500)
- colors = (color2, color1, color2, color1)
- shape = arcade.create_lines_with_colors(points, colors, line_width=5)
- self.shapes.append(shape)
-
- # Triangle
- color1 = (215, 214, 165)
- color2 = (219, 166, 123)
- color3 = (165, 92, 85)
- points = (SCREEN_WIDTH // 2, 500), (SCREEN_WIDTH // 2 - 100, 400), (SCREEN_WIDTH // 2 + 100, 400)
- colors = (color1, color2, color3)
- shape = arcade.create_triangles_filled_with_colors(points, colors)
- self.shapes.append(shape)
-
- # Ellipse, gradient between center and outside
- color1 = (69, 137, 133, 127)
- color2 = (7, 67, 88, 127)
- shape = arcade.create_ellipse_filled_with_colors(SCREEN_WIDTH // 2, 350, 50, 50,
- inside_color=color1, outside_color=color2)
- self.shapes.append(shape)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
- self.shapes.draw()
- # arcade.draw_rectangle_filled(500, 500, 50, 50, (255, 0, 0, 127))
-
-
-def main():
-
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/gui_text_button.py b/arcade/examples/gui_text_button.py
deleted file mode 100644
index 733696b..0000000
--- a/arcade/examples/gui_text_button.py
+++ /dev/null
@@ -1,238 +0,0 @@
-"""
-Buttons with text on them
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.gui_text_button
-"""
-import arcade
-import random
-import os
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "GUI Text Buton Example"
-
-
-class TextButton:
- """ Text-based button """
-
- def __init__(self,
- center_x, center_y,
- width, height,
- text,
- font_size=18,
- font_face="Arial",
- face_color=arcade.color.LIGHT_GRAY,
- highlight_color=arcade.color.WHITE,
- shadow_color=arcade.color.GRAY,
- button_height=2):
- self.center_x = center_x
- self.center_y = center_y
- self.width = width
- self.height = height
- self.text = text
- self.font_size = font_size
- self.font_face = font_face
- self.pressed = False
- self.face_color = face_color
- self.highlight_color = highlight_color
- self.shadow_color = shadow_color
- self.button_height = button_height
-
- def draw(self):
- """ Draw the button """
- arcade.draw_rectangle_filled(self.center_x, self.center_y, self.width,
- self.height, self.face_color)
-
- if not self.pressed:
- color = self.shadow_color
- else:
- color = self.highlight_color
-
- # Bottom horizontal
- arcade.draw_line(self.center_x - self.width / 2, self.center_y - self.height / 2,
- self.center_x + self.width / 2, self.center_y - self.height / 2,
- color, self.button_height)
-
- # Right vertical
- arcade.draw_line(self.center_x + self.width / 2, self.center_y - self.height / 2,
- self.center_x + self.width / 2, self.center_y + self.height / 2,
- color, self.button_height)
-
- if not self.pressed:
- color = self.highlight_color
- else:
- color = self.shadow_color
-
- # Top horizontal
- arcade.draw_line(self.center_x - self.width / 2, self.center_y + self.height / 2,
- self.center_x + self.width / 2, self.center_y + self.height / 2,
- color, self.button_height)
-
- # Left vertical
- arcade.draw_line(self.center_x - self.width / 2, self.center_y - self.height / 2,
- self.center_x - self.width / 2, self.center_y + self.height / 2,
- color, self.button_height)
-
- x = self.center_x
- y = self.center_y
- if not self.pressed:
- x -= self.button_height
- y += self.button_height
-
- arcade.draw_text(self.text, x, y,
- arcade.color.BLACK, font_size=self.font_size,
- width=self.width, align="center",
- anchor_x="center", anchor_y="center")
-
- def on_press(self):
- self.pressed = True
-
- def on_release(self):
- self.pressed = False
-
-
-def check_mouse_press_for_buttons(x, y, button_list):
- """ Given an x, y, see if we need to register any button clicks. """
- for button in button_list:
- if x > button.center_x + button.width / 2:
- continue
- if x < button.center_x - button.width / 2:
- continue
- if y > button.center_y + button.height / 2:
- continue
- if y < button.center_y - button.height / 2:
- continue
- button.on_press()
-
-
-def check_mouse_release_for_buttons(x, y, button_list):
- """ If a mouse button has been released, see if we need to process
- any release events. """
- for button in button_list:
- if button.pressed:
- button.on_release()
-
-
-class StartTextButton(TextButton):
- def __init__(self, center_x, center_y, action_function):
- super().__init__(center_x, center_y, 100, 40, "Start", 18, "Arial")
- self.action_function = action_function
-
- def on_release(self):
- super().on_release()
- self.action_function()
-
-
-class StopTextButton(TextButton):
- def __init__(self, center_x, center_y, action_function):
- super().__init__(center_x, center_y, 100, 40, "Stop", 18, "Arial")
- self.action_function = action_function
-
- def on_release(self):
- super().on_release()
- self.action_function()
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
-
- NOTE: Go ahead and delete the methods you don't need.
- If you do need a method, delete the 'pass' and replace it
- with your own code. Don't leave 'pass' in this program.
- """
-
- def __init__(self, width, height, title):
- 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)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- self.pause = False
- self.coin_list = None
- self.button_list = None
-
- def setup(self):
- # Create your sprites and sprite lists here
- self.coin_list = arcade.SpriteList()
- for i in range(10):
- coin = arcade.Sprite("images/coin_01.png", 0.25)
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
- coin.change_y = -1
- self.coin_list.append(coin)
-
- # Create our on-screen GUI buttons
- self.button_list = []
-
- play_button = StartTextButton(60, 570, self.resume_program)
- self.button_list.append(play_button)
-
- quit_button = StopTextButton(60, 515, self.pause_program)
- self.button_list.append(quit_button)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- arcade.start_render()
-
- # Draw the coins
- self.coin_list.draw()
-
- # Draw the buttons
- for button in self.button_list:
- button.draw()
-
- def update(self, delta_time):
- """
- All the logic to move, and the game logic goes here.
- Normally, you'll call update() on the sprite lists that
- need it.
- """
-
- if self.pause:
- return
-
- self.coin_list.update()
-
- for coin in self.coin_list:
- if coin.top < 0:
- coin.bottom = SCREEN_HEIGHT
-
- def on_mouse_press(self, x, y, button, key_modifiers):
- """
- Called when the user presses a mouse button.
- """
- check_mouse_press_for_buttons(x, y, self.button_list)
-
- def on_mouse_release(self, x, y, button, key_modifiers):
- """
- Called when a user releases a mouse button.
- """
- check_mouse_release_for_buttons(x, y, self.button_list)
-
- def pause_program(self):
- self.pause = True
-
- def resume_program(self):
- self.pause = False
-
-
-def main():
- """ Main method """
- game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- game.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/happy_face.py b/arcade/examples/happy_face.py
deleted file mode 100644
index 006ccd6..0000000
--- a/arcade/examples/happy_face.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""
-Drawing an example happy face
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.happy_face
-"""
-
-import arcade
-
-# Set constants for the screen size
-SCREEN_WIDTH = 600
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Happy Face Example"
-
-# Open the window. Set the window title and dimensions
-arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
-# Set the background color
-arcade.set_background_color(arcade.color.WHITE)
-
-# Clear screen and start render process
-arcade.start_render()
-
-# --- Drawing Commands Will Go Here ---
-
-# Draw the face
-x = 300; y = 300; radius = 200
-arcade.draw_circle_filled(x, y, radius, arcade.color.YELLOW)
-
-# Draw the right eye
-x = 370; y = 350; radius = 20
-arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK)
-
-# Draw the left eye
-x = 230; y = 350; radius = 20
-arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK)
-
-# Draw the smile
-x = 300; y = 280; width = 120; height = 100
-start_angle = 190; end_angle = 350
-arcade.draw_arc_outline(x, y, width, height, arcade.color.BLACK,
- start_angle, end_angle, 10)
-
-# Finish drawing and display the result
-arcade.finish_render()
-
-# Keep the window open until the user hits the 'close' button
-arcade.run()
diff --git a/arcade/examples/images/background.jpg b/arcade/examples/images/background.jpg
deleted file mode 100644
index 124bc7b..0000000
Binary files a/arcade/examples/images/background.jpg and /dev/null differ
diff --git a/arcade/examples/images/background_2.jpg b/arcade/examples/images/background_2.jpg
deleted file mode 100644
index 8964823..0000000
Binary files a/arcade/examples/images/background_2.jpg and /dev/null differ
diff --git a/arcade/examples/images/boxCrate_double.png b/arcade/examples/images/boxCrate_double.png
deleted file mode 100644
index 86ed133..0000000
Binary files a/arcade/examples/images/boxCrate_double.png and /dev/null differ
diff --git a/arcade/examples/images/bumper.png b/arcade/examples/images/bumper.png
deleted file mode 100644
index 35f8da4..0000000
Binary files a/arcade/examples/images/bumper.png and /dev/null differ
diff --git a/arcade/examples/images/bumper.svg b/arcade/examples/images/bumper.svg
deleted file mode 100644
index c58f6a9..0000000
--- a/arcade/examples/images/bumper.svg
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-
diff --git a/arcade/examples/images/character.png b/arcade/examples/images/character.png
deleted file mode 100644
index 9ad34ca..0000000
Binary files a/arcade/examples/images/character.png and /dev/null differ
diff --git a/arcade/examples/images/character_sheet.png b/arcade/examples/images/character_sheet.png
deleted file mode 100644
index e7513a6..0000000
Binary files a/arcade/examples/images/character_sheet.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character0.png b/arcade/examples/images/character_sprites/character0.png
deleted file mode 100644
index 025affd..0000000
Binary files a/arcade/examples/images/character_sprites/character0.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character1.png b/arcade/examples/images/character_sprites/character1.png
deleted file mode 100644
index f83fd23..0000000
Binary files a/arcade/examples/images/character_sprites/character1.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character10.png b/arcade/examples/images/character_sprites/character10.png
deleted file mode 100644
index 325e130..0000000
Binary files a/arcade/examples/images/character_sprites/character10.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character13.png b/arcade/examples/images/character_sprites/character13.png
deleted file mode 100644
index ad4566f..0000000
Binary files a/arcade/examples/images/character_sprites/character13.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character14.png b/arcade/examples/images/character_sprites/character14.png
deleted file mode 100644
index 3e32929..0000000
Binary files a/arcade/examples/images/character_sprites/character14.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character15.png b/arcade/examples/images/character_sprites/character15.png
deleted file mode 100644
index bfa3307..0000000
Binary files a/arcade/examples/images/character_sprites/character15.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character16.png b/arcade/examples/images/character_sprites/character16.png
deleted file mode 100644
index 66eb6e1..0000000
Binary files a/arcade/examples/images/character_sprites/character16.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character17.png b/arcade/examples/images/character_sprites/character17.png
deleted file mode 100644
index b9b6964..0000000
Binary files a/arcade/examples/images/character_sprites/character17.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character18.png b/arcade/examples/images/character_sprites/character18.png
deleted file mode 100644
index 4d606c0..0000000
Binary files a/arcade/examples/images/character_sprites/character18.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character2.png b/arcade/examples/images/character_sprites/character2.png
deleted file mode 100644
index 298c31e..0000000
Binary files a/arcade/examples/images/character_sprites/character2.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character3.png b/arcade/examples/images/character_sprites/character3.png
deleted file mode 100644
index 33e0805..0000000
Binary files a/arcade/examples/images/character_sprites/character3.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character4.png b/arcade/examples/images/character_sprites/character4.png
deleted file mode 100644
index a1cd787..0000000
Binary files a/arcade/examples/images/character_sprites/character4.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character5.png b/arcade/examples/images/character_sprites/character5.png
deleted file mode 100644
index 446ca40..0000000
Binary files a/arcade/examples/images/character_sprites/character5.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character6.png b/arcade/examples/images/character_sprites/character6.png
deleted file mode 100644
index fc76361..0000000
Binary files a/arcade/examples/images/character_sprites/character6.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/character7.png b/arcade/examples/images/character_sprites/character7.png
deleted file mode 100644
index dd226dc..0000000
Binary files a/arcade/examples/images/character_sprites/character7.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/characterw0.png b/arcade/examples/images/character_sprites/characterw0.png
deleted file mode 100644
index a73eceb..0000000
Binary files a/arcade/examples/images/character_sprites/characterw0.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/characterw1.png b/arcade/examples/images/character_sprites/characterw1.png
deleted file mode 100644
index a8b5b49..0000000
Binary files a/arcade/examples/images/character_sprites/characterw1.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/characterw2.png b/arcade/examples/images/character_sprites/characterw2.png
deleted file mode 100644
index c8525e4..0000000
Binary files a/arcade/examples/images/character_sprites/characterw2.png and /dev/null differ
diff --git a/arcade/examples/images/character_sprites/characterw3.png b/arcade/examples/images/character_sprites/characterw3.png
deleted file mode 100644
index 484cb7f..0000000
Binary files a/arcade/examples/images/character_sprites/characterw3.png and /dev/null differ
diff --git a/arcade/examples/images/coin_01.png b/arcade/examples/images/coin_01.png
deleted file mode 100644
index 9d4cbe1..0000000
Binary files a/arcade/examples/images/coin_01.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0000.png b/arcade/examples/images/explosion/explosion0000.png
deleted file mode 100644
index 518433b..0000000
Binary files a/arcade/examples/images/explosion/explosion0000.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0001.png b/arcade/examples/images/explosion/explosion0001.png
deleted file mode 100644
index f87d239..0000000
Binary files a/arcade/examples/images/explosion/explosion0001.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0002.png b/arcade/examples/images/explosion/explosion0002.png
deleted file mode 100644
index fa6f198..0000000
Binary files a/arcade/examples/images/explosion/explosion0002.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0003.png b/arcade/examples/images/explosion/explosion0003.png
deleted file mode 100644
index 7b9aee0..0000000
Binary files a/arcade/examples/images/explosion/explosion0003.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0004.png b/arcade/examples/images/explosion/explosion0004.png
deleted file mode 100644
index bf05f40..0000000
Binary files a/arcade/examples/images/explosion/explosion0004.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0005.png b/arcade/examples/images/explosion/explosion0005.png
deleted file mode 100644
index 843b907..0000000
Binary files a/arcade/examples/images/explosion/explosion0005.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0006.png b/arcade/examples/images/explosion/explosion0006.png
deleted file mode 100644
index d1e8822..0000000
Binary files a/arcade/examples/images/explosion/explosion0006.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0007.png b/arcade/examples/images/explosion/explosion0007.png
deleted file mode 100644
index 4aa8ea8..0000000
Binary files a/arcade/examples/images/explosion/explosion0007.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0008.png b/arcade/examples/images/explosion/explosion0008.png
deleted file mode 100644
index a5a06db..0000000
Binary files a/arcade/examples/images/explosion/explosion0008.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0009.png b/arcade/examples/images/explosion/explosion0009.png
deleted file mode 100644
index a067285..0000000
Binary files a/arcade/examples/images/explosion/explosion0009.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0010.png b/arcade/examples/images/explosion/explosion0010.png
deleted file mode 100644
index 3420a55..0000000
Binary files a/arcade/examples/images/explosion/explosion0010.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0011.png b/arcade/examples/images/explosion/explosion0011.png
deleted file mode 100644
index cee8857..0000000
Binary files a/arcade/examples/images/explosion/explosion0011.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0012.png b/arcade/examples/images/explosion/explosion0012.png
deleted file mode 100644
index 9b9c5fe..0000000
Binary files a/arcade/examples/images/explosion/explosion0012.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0013.png b/arcade/examples/images/explosion/explosion0013.png
deleted file mode 100644
index f4bd5fe..0000000
Binary files a/arcade/examples/images/explosion/explosion0013.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0014.png b/arcade/examples/images/explosion/explosion0014.png
deleted file mode 100644
index b9bcd6b..0000000
Binary files a/arcade/examples/images/explosion/explosion0014.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0015.png b/arcade/examples/images/explosion/explosion0015.png
deleted file mode 100644
index 80e1f77..0000000
Binary files a/arcade/examples/images/explosion/explosion0015.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0016.png b/arcade/examples/images/explosion/explosion0016.png
deleted file mode 100644
index 4311cd3..0000000
Binary files a/arcade/examples/images/explosion/explosion0016.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0017.png b/arcade/examples/images/explosion/explosion0017.png
deleted file mode 100644
index ce8e54b..0000000
Binary files a/arcade/examples/images/explosion/explosion0017.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0018.png b/arcade/examples/images/explosion/explosion0018.png
deleted file mode 100644
index 5092c3b..0000000
Binary files a/arcade/examples/images/explosion/explosion0018.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0019.png b/arcade/examples/images/explosion/explosion0019.png
deleted file mode 100644
index 04a8226..0000000
Binary files a/arcade/examples/images/explosion/explosion0019.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0020.png b/arcade/examples/images/explosion/explosion0020.png
deleted file mode 100644
index c50a579..0000000
Binary files a/arcade/examples/images/explosion/explosion0020.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0021.png b/arcade/examples/images/explosion/explosion0021.png
deleted file mode 100644
index 2c11dd0..0000000
Binary files a/arcade/examples/images/explosion/explosion0021.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0022.png b/arcade/examples/images/explosion/explosion0022.png
deleted file mode 100644
index 658f64c..0000000
Binary files a/arcade/examples/images/explosion/explosion0022.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0023.png b/arcade/examples/images/explosion/explosion0023.png
deleted file mode 100644
index c8aef24..0000000
Binary files a/arcade/examples/images/explosion/explosion0023.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0024.png b/arcade/examples/images/explosion/explosion0024.png
deleted file mode 100644
index 69b9a30..0000000
Binary files a/arcade/examples/images/explosion/explosion0024.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0025.png b/arcade/examples/images/explosion/explosion0025.png
deleted file mode 100644
index 6781e03..0000000
Binary files a/arcade/examples/images/explosion/explosion0025.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0026.png b/arcade/examples/images/explosion/explosion0026.png
deleted file mode 100644
index c9db7ba..0000000
Binary files a/arcade/examples/images/explosion/explosion0026.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0027.png b/arcade/examples/images/explosion/explosion0027.png
deleted file mode 100644
index b64e138..0000000
Binary files a/arcade/examples/images/explosion/explosion0027.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0028.png b/arcade/examples/images/explosion/explosion0028.png
deleted file mode 100644
index 576992e..0000000
Binary files a/arcade/examples/images/explosion/explosion0028.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0029.png b/arcade/examples/images/explosion/explosion0029.png
deleted file mode 100644
index 11971bc..0000000
Binary files a/arcade/examples/images/explosion/explosion0029.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0030.png b/arcade/examples/images/explosion/explosion0030.png
deleted file mode 100644
index 1dfc522..0000000
Binary files a/arcade/examples/images/explosion/explosion0030.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0031.png b/arcade/examples/images/explosion/explosion0031.png
deleted file mode 100644
index efe5b3a..0000000
Binary files a/arcade/examples/images/explosion/explosion0031.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0032.png b/arcade/examples/images/explosion/explosion0032.png
deleted file mode 100644
index ab8ee50..0000000
Binary files a/arcade/examples/images/explosion/explosion0032.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0033.png b/arcade/examples/images/explosion/explosion0033.png
deleted file mode 100644
index b3a3bae..0000000
Binary files a/arcade/examples/images/explosion/explosion0033.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0034.png b/arcade/examples/images/explosion/explosion0034.png
deleted file mode 100644
index 04f2b04..0000000
Binary files a/arcade/examples/images/explosion/explosion0034.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0035.png b/arcade/examples/images/explosion/explosion0035.png
deleted file mode 100644
index a071379..0000000
Binary files a/arcade/examples/images/explosion/explosion0035.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0036.png b/arcade/examples/images/explosion/explosion0036.png
deleted file mode 100644
index 7f105f1..0000000
Binary files a/arcade/examples/images/explosion/explosion0036.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0037.png b/arcade/examples/images/explosion/explosion0037.png
deleted file mode 100644
index 2805027..0000000
Binary files a/arcade/examples/images/explosion/explosion0037.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0038.png b/arcade/examples/images/explosion/explosion0038.png
deleted file mode 100644
index 579964b..0000000
Binary files a/arcade/examples/images/explosion/explosion0038.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0039.png b/arcade/examples/images/explosion/explosion0039.png
deleted file mode 100644
index 4260d41..0000000
Binary files a/arcade/examples/images/explosion/explosion0039.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0040.png b/arcade/examples/images/explosion/explosion0040.png
deleted file mode 100644
index 047a0f8..0000000
Binary files a/arcade/examples/images/explosion/explosion0040.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0041.png b/arcade/examples/images/explosion/explosion0041.png
deleted file mode 100644
index f331454..0000000
Binary files a/arcade/examples/images/explosion/explosion0041.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0042.png b/arcade/examples/images/explosion/explosion0042.png
deleted file mode 100644
index e9b6f39..0000000
Binary files a/arcade/examples/images/explosion/explosion0042.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0043.png b/arcade/examples/images/explosion/explosion0043.png
deleted file mode 100644
index 090a7e2..0000000
Binary files a/arcade/examples/images/explosion/explosion0043.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0044.png b/arcade/examples/images/explosion/explosion0044.png
deleted file mode 100644
index 6ec58e6..0000000
Binary files a/arcade/examples/images/explosion/explosion0044.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0045.png b/arcade/examples/images/explosion/explosion0045.png
deleted file mode 100644
index eceb4ad..0000000
Binary files a/arcade/examples/images/explosion/explosion0045.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0046.png b/arcade/examples/images/explosion/explosion0046.png
deleted file mode 100644
index e660a00..0000000
Binary files a/arcade/examples/images/explosion/explosion0046.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0047.png b/arcade/examples/images/explosion/explosion0047.png
deleted file mode 100644
index 64aeaf9..0000000
Binary files a/arcade/examples/images/explosion/explosion0047.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0048.png b/arcade/examples/images/explosion/explosion0048.png
deleted file mode 100644
index 4f45067..0000000
Binary files a/arcade/examples/images/explosion/explosion0048.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0049.png b/arcade/examples/images/explosion/explosion0049.png
deleted file mode 100644
index e4b7e61..0000000
Binary files a/arcade/examples/images/explosion/explosion0049.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0050.png b/arcade/examples/images/explosion/explosion0050.png
deleted file mode 100644
index 7de8b6b..0000000
Binary files a/arcade/examples/images/explosion/explosion0050.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0051.png b/arcade/examples/images/explosion/explosion0051.png
deleted file mode 100644
index 42713a7..0000000
Binary files a/arcade/examples/images/explosion/explosion0051.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0052.png b/arcade/examples/images/explosion/explosion0052.png
deleted file mode 100644
index dd5f717..0000000
Binary files a/arcade/examples/images/explosion/explosion0052.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0053.png b/arcade/examples/images/explosion/explosion0053.png
deleted file mode 100644
index 5148270..0000000
Binary files a/arcade/examples/images/explosion/explosion0053.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0054.png b/arcade/examples/images/explosion/explosion0054.png
deleted file mode 100644
index e157f36..0000000
Binary files a/arcade/examples/images/explosion/explosion0054.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0055.png b/arcade/examples/images/explosion/explosion0055.png
deleted file mode 100644
index 8a5bdd0..0000000
Binary files a/arcade/examples/images/explosion/explosion0055.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0056.png b/arcade/examples/images/explosion/explosion0056.png
deleted file mode 100644
index 235e547..0000000
Binary files a/arcade/examples/images/explosion/explosion0056.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0057.png b/arcade/examples/images/explosion/explosion0057.png
deleted file mode 100644
index 2cfb6cf..0000000
Binary files a/arcade/examples/images/explosion/explosion0057.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0058.png b/arcade/examples/images/explosion/explosion0058.png
deleted file mode 100644
index 11d5f08..0000000
Binary files a/arcade/examples/images/explosion/explosion0058.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0059.png b/arcade/examples/images/explosion/explosion0059.png
deleted file mode 100644
index 1824d83..0000000
Binary files a/arcade/examples/images/explosion/explosion0059.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0060.png b/arcade/examples/images/explosion/explosion0060.png
deleted file mode 100644
index 8fed34e..0000000
Binary files a/arcade/examples/images/explosion/explosion0060.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0061.png b/arcade/examples/images/explosion/explosion0061.png
deleted file mode 100644
index c701f47..0000000
Binary files a/arcade/examples/images/explosion/explosion0061.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0062.png b/arcade/examples/images/explosion/explosion0062.png
deleted file mode 100644
index 5ea9987..0000000
Binary files a/arcade/examples/images/explosion/explosion0062.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0063.png b/arcade/examples/images/explosion/explosion0063.png
deleted file mode 100644
index 02da9b5..0000000
Binary files a/arcade/examples/images/explosion/explosion0063.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0064.png b/arcade/examples/images/explosion/explosion0064.png
deleted file mode 100644
index 60d03de..0000000
Binary files a/arcade/examples/images/explosion/explosion0064.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0065.png b/arcade/examples/images/explosion/explosion0065.png
deleted file mode 100644
index 2a98ead..0000000
Binary files a/arcade/examples/images/explosion/explosion0065.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0066.png b/arcade/examples/images/explosion/explosion0066.png
deleted file mode 100644
index 2e59682..0000000
Binary files a/arcade/examples/images/explosion/explosion0066.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0067.png b/arcade/examples/images/explosion/explosion0067.png
deleted file mode 100644
index e2aecf1..0000000
Binary files a/arcade/examples/images/explosion/explosion0067.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0068.png b/arcade/examples/images/explosion/explosion0068.png
deleted file mode 100644
index 58ec48e..0000000
Binary files a/arcade/examples/images/explosion/explosion0068.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0069.png b/arcade/examples/images/explosion/explosion0069.png
deleted file mode 100644
index fd8c4f3..0000000
Binary files a/arcade/examples/images/explosion/explosion0069.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0070.png b/arcade/examples/images/explosion/explosion0070.png
deleted file mode 100644
index 098bb69..0000000
Binary files a/arcade/examples/images/explosion/explosion0070.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0071.png b/arcade/examples/images/explosion/explosion0071.png
deleted file mode 100644
index ccf4f7e..0000000
Binary files a/arcade/examples/images/explosion/explosion0071.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0072.png b/arcade/examples/images/explosion/explosion0072.png
deleted file mode 100644
index 63136b0..0000000
Binary files a/arcade/examples/images/explosion/explosion0072.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0073.png b/arcade/examples/images/explosion/explosion0073.png
deleted file mode 100644
index 739cd8c..0000000
Binary files a/arcade/examples/images/explosion/explosion0073.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0074.png b/arcade/examples/images/explosion/explosion0074.png
deleted file mode 100644
index 2fb107b..0000000
Binary files a/arcade/examples/images/explosion/explosion0074.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0075.png b/arcade/examples/images/explosion/explosion0075.png
deleted file mode 100644
index 7fa238c..0000000
Binary files a/arcade/examples/images/explosion/explosion0075.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0076.png b/arcade/examples/images/explosion/explosion0076.png
deleted file mode 100644
index 7c73a10..0000000
Binary files a/arcade/examples/images/explosion/explosion0076.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0077.png b/arcade/examples/images/explosion/explosion0077.png
deleted file mode 100644
index 422d89d..0000000
Binary files a/arcade/examples/images/explosion/explosion0077.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0078.png b/arcade/examples/images/explosion/explosion0078.png
deleted file mode 100644
index 5af8a93..0000000
Binary files a/arcade/examples/images/explosion/explosion0078.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0079.png b/arcade/examples/images/explosion/explosion0079.png
deleted file mode 100644
index 642ab0a..0000000
Binary files a/arcade/examples/images/explosion/explosion0079.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0080.png b/arcade/examples/images/explosion/explosion0080.png
deleted file mode 100644
index ceb785f..0000000
Binary files a/arcade/examples/images/explosion/explosion0080.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0081.png b/arcade/examples/images/explosion/explosion0081.png
deleted file mode 100644
index 37a12a3..0000000
Binary files a/arcade/examples/images/explosion/explosion0081.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0082.png b/arcade/examples/images/explosion/explosion0082.png
deleted file mode 100644
index fc7f345..0000000
Binary files a/arcade/examples/images/explosion/explosion0082.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0083.png b/arcade/examples/images/explosion/explosion0083.png
deleted file mode 100644
index f5579dd..0000000
Binary files a/arcade/examples/images/explosion/explosion0083.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0084.png b/arcade/examples/images/explosion/explosion0084.png
deleted file mode 100644
index d0434a0..0000000
Binary files a/arcade/examples/images/explosion/explosion0084.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0085.png b/arcade/examples/images/explosion/explosion0085.png
deleted file mode 100644
index d037749..0000000
Binary files a/arcade/examples/images/explosion/explosion0085.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0086.png b/arcade/examples/images/explosion/explosion0086.png
deleted file mode 100644
index e56a03f..0000000
Binary files a/arcade/examples/images/explosion/explosion0086.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0087.png b/arcade/examples/images/explosion/explosion0087.png
deleted file mode 100644
index 7884725..0000000
Binary files a/arcade/examples/images/explosion/explosion0087.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0088.png b/arcade/examples/images/explosion/explosion0088.png
deleted file mode 100644
index 2c6f117..0000000
Binary files a/arcade/examples/images/explosion/explosion0088.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0089.png b/arcade/examples/images/explosion/explosion0089.png
deleted file mode 100644
index 99a896f..0000000
Binary files a/arcade/examples/images/explosion/explosion0089.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0090.png b/arcade/examples/images/explosion/explosion0090.png
deleted file mode 100644
index 05b9678..0000000
Binary files a/arcade/examples/images/explosion/explosion0090.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0091.png b/arcade/examples/images/explosion/explosion0091.png
deleted file mode 100644
index 6582c54..0000000
Binary files a/arcade/examples/images/explosion/explosion0091.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0092.png b/arcade/examples/images/explosion/explosion0092.png
deleted file mode 100644
index 4e79e8f..0000000
Binary files a/arcade/examples/images/explosion/explosion0092.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0093.png b/arcade/examples/images/explosion/explosion0093.png
deleted file mode 100644
index e0a907f..0000000
Binary files a/arcade/examples/images/explosion/explosion0093.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0094.png b/arcade/examples/images/explosion/explosion0094.png
deleted file mode 100644
index 2792a25..0000000
Binary files a/arcade/examples/images/explosion/explosion0094.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0095.png b/arcade/examples/images/explosion/explosion0095.png
deleted file mode 100644
index 5cdb3c8..0000000
Binary files a/arcade/examples/images/explosion/explosion0095.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0096.png b/arcade/examples/images/explosion/explosion0096.png
deleted file mode 100644
index 71cf280..0000000
Binary files a/arcade/examples/images/explosion/explosion0096.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0097.png b/arcade/examples/images/explosion/explosion0097.png
deleted file mode 100644
index 4d798e1..0000000
Binary files a/arcade/examples/images/explosion/explosion0097.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0098.png b/arcade/examples/images/explosion/explosion0098.png
deleted file mode 100644
index c61b40e..0000000
Binary files a/arcade/examples/images/explosion/explosion0098.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0099.png b/arcade/examples/images/explosion/explosion0099.png
deleted file mode 100644
index 7e056a7..0000000
Binary files a/arcade/examples/images/explosion/explosion0099.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0100.png b/arcade/examples/images/explosion/explosion0100.png
deleted file mode 100644
index fddc5da..0000000
Binary files a/arcade/examples/images/explosion/explosion0100.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0101.png b/arcade/examples/images/explosion/explosion0101.png
deleted file mode 100644
index c7ed48f..0000000
Binary files a/arcade/examples/images/explosion/explosion0101.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0102.png b/arcade/examples/images/explosion/explosion0102.png
deleted file mode 100644
index b41dfee..0000000
Binary files a/arcade/examples/images/explosion/explosion0102.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0103.png b/arcade/examples/images/explosion/explosion0103.png
deleted file mode 100644
index 9819c4e..0000000
Binary files a/arcade/examples/images/explosion/explosion0103.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0104.png b/arcade/examples/images/explosion/explosion0104.png
deleted file mode 100644
index 832e226..0000000
Binary files a/arcade/examples/images/explosion/explosion0104.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0105.png b/arcade/examples/images/explosion/explosion0105.png
deleted file mode 100644
index 72fb8aa..0000000
Binary files a/arcade/examples/images/explosion/explosion0105.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0106.png b/arcade/examples/images/explosion/explosion0106.png
deleted file mode 100644
index eb00bd1..0000000
Binary files a/arcade/examples/images/explosion/explosion0106.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0107.png b/arcade/examples/images/explosion/explosion0107.png
deleted file mode 100644
index 65b9b4c..0000000
Binary files a/arcade/examples/images/explosion/explosion0107.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0108.png b/arcade/examples/images/explosion/explosion0108.png
deleted file mode 100644
index f39258f..0000000
Binary files a/arcade/examples/images/explosion/explosion0108.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0109.png b/arcade/examples/images/explosion/explosion0109.png
deleted file mode 100644
index eac41e9..0000000
Binary files a/arcade/examples/images/explosion/explosion0109.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0110.png b/arcade/examples/images/explosion/explosion0110.png
deleted file mode 100644
index 64bd912..0000000
Binary files a/arcade/examples/images/explosion/explosion0110.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0111.png b/arcade/examples/images/explosion/explosion0111.png
deleted file mode 100644
index 7f95119..0000000
Binary files a/arcade/examples/images/explosion/explosion0111.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0112.png b/arcade/examples/images/explosion/explosion0112.png
deleted file mode 100644
index b66654c..0000000
Binary files a/arcade/examples/images/explosion/explosion0112.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0113.png b/arcade/examples/images/explosion/explosion0113.png
deleted file mode 100644
index 8ac77e8..0000000
Binary files a/arcade/examples/images/explosion/explosion0113.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0114.png b/arcade/examples/images/explosion/explosion0114.png
deleted file mode 100644
index 5e3168a..0000000
Binary files a/arcade/examples/images/explosion/explosion0114.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0115.png b/arcade/examples/images/explosion/explosion0115.png
deleted file mode 100644
index 9ff8a42..0000000
Binary files a/arcade/examples/images/explosion/explosion0115.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0116.png b/arcade/examples/images/explosion/explosion0116.png
deleted file mode 100644
index c72008b..0000000
Binary files a/arcade/examples/images/explosion/explosion0116.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0117.png b/arcade/examples/images/explosion/explosion0117.png
deleted file mode 100644
index a7f2689..0000000
Binary files a/arcade/examples/images/explosion/explosion0117.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0118.png b/arcade/examples/images/explosion/explosion0118.png
deleted file mode 100644
index 0c109a1..0000000
Binary files a/arcade/examples/images/explosion/explosion0118.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0119.png b/arcade/examples/images/explosion/explosion0119.png
deleted file mode 100644
index 0c7a7e4..0000000
Binary files a/arcade/examples/images/explosion/explosion0119.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0120.png b/arcade/examples/images/explosion/explosion0120.png
deleted file mode 100644
index 1eff255..0000000
Binary files a/arcade/examples/images/explosion/explosion0120.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0121.png b/arcade/examples/images/explosion/explosion0121.png
deleted file mode 100644
index 34bf696..0000000
Binary files a/arcade/examples/images/explosion/explosion0121.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0122.png b/arcade/examples/images/explosion/explosion0122.png
deleted file mode 100644
index c80f718..0000000
Binary files a/arcade/examples/images/explosion/explosion0122.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0123.png b/arcade/examples/images/explosion/explosion0123.png
deleted file mode 100644
index 26a3bd4..0000000
Binary files a/arcade/examples/images/explosion/explosion0123.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0124.png b/arcade/examples/images/explosion/explosion0124.png
deleted file mode 100644
index 4ab4bd5..0000000
Binary files a/arcade/examples/images/explosion/explosion0124.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0125.png b/arcade/examples/images/explosion/explosion0125.png
deleted file mode 100644
index 4dd25d3..0000000
Binary files a/arcade/examples/images/explosion/explosion0125.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0126.png b/arcade/examples/images/explosion/explosion0126.png
deleted file mode 100644
index fc4b7f0..0000000
Binary files a/arcade/examples/images/explosion/explosion0126.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0127.png b/arcade/examples/images/explosion/explosion0127.png
deleted file mode 100644
index 8f5eeab..0000000
Binary files a/arcade/examples/images/explosion/explosion0127.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0128.png b/arcade/examples/images/explosion/explosion0128.png
deleted file mode 100644
index d76cdf4..0000000
Binary files a/arcade/examples/images/explosion/explosion0128.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0129.png b/arcade/examples/images/explosion/explosion0129.png
deleted file mode 100644
index 560518f..0000000
Binary files a/arcade/examples/images/explosion/explosion0129.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0130.png b/arcade/examples/images/explosion/explosion0130.png
deleted file mode 100644
index fd309b0..0000000
Binary files a/arcade/examples/images/explosion/explosion0130.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0131.png b/arcade/examples/images/explosion/explosion0131.png
deleted file mode 100644
index eca5dd1..0000000
Binary files a/arcade/examples/images/explosion/explosion0131.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0132.png b/arcade/examples/images/explosion/explosion0132.png
deleted file mode 100644
index dea56a9..0000000
Binary files a/arcade/examples/images/explosion/explosion0132.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0133.png b/arcade/examples/images/explosion/explosion0133.png
deleted file mode 100644
index 3898df5..0000000
Binary files a/arcade/examples/images/explosion/explosion0133.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0134.png b/arcade/examples/images/explosion/explosion0134.png
deleted file mode 100644
index 73ab8af..0000000
Binary files a/arcade/examples/images/explosion/explosion0134.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0135.png b/arcade/examples/images/explosion/explosion0135.png
deleted file mode 100644
index 436488b..0000000
Binary files a/arcade/examples/images/explosion/explosion0135.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0136.png b/arcade/examples/images/explosion/explosion0136.png
deleted file mode 100644
index 0c5c480..0000000
Binary files a/arcade/examples/images/explosion/explosion0136.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0137.png b/arcade/examples/images/explosion/explosion0137.png
deleted file mode 100644
index 0456b07..0000000
Binary files a/arcade/examples/images/explosion/explosion0137.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0138.png b/arcade/examples/images/explosion/explosion0138.png
deleted file mode 100644
index 7e08173..0000000
Binary files a/arcade/examples/images/explosion/explosion0138.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0139.png b/arcade/examples/images/explosion/explosion0139.png
deleted file mode 100644
index a873c8d..0000000
Binary files a/arcade/examples/images/explosion/explosion0139.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0140.png b/arcade/examples/images/explosion/explosion0140.png
deleted file mode 100644
index 0d97b8d..0000000
Binary files a/arcade/examples/images/explosion/explosion0140.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0141.png b/arcade/examples/images/explosion/explosion0141.png
deleted file mode 100644
index adaff0c..0000000
Binary files a/arcade/examples/images/explosion/explosion0141.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0142.png b/arcade/examples/images/explosion/explosion0142.png
deleted file mode 100644
index 242a7b3..0000000
Binary files a/arcade/examples/images/explosion/explosion0142.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0143.png b/arcade/examples/images/explosion/explosion0143.png
deleted file mode 100644
index 7116401..0000000
Binary files a/arcade/examples/images/explosion/explosion0143.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0144.png b/arcade/examples/images/explosion/explosion0144.png
deleted file mode 100644
index 279b26a..0000000
Binary files a/arcade/examples/images/explosion/explosion0144.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0145.png b/arcade/examples/images/explosion/explosion0145.png
deleted file mode 100644
index 7c84ba7..0000000
Binary files a/arcade/examples/images/explosion/explosion0145.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0146.png b/arcade/examples/images/explosion/explosion0146.png
deleted file mode 100644
index 7fb43c8..0000000
Binary files a/arcade/examples/images/explosion/explosion0146.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0147.png b/arcade/examples/images/explosion/explosion0147.png
deleted file mode 100644
index 7f65f62..0000000
Binary files a/arcade/examples/images/explosion/explosion0147.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0148.png b/arcade/examples/images/explosion/explosion0148.png
deleted file mode 100644
index 144ef28..0000000
Binary files a/arcade/examples/images/explosion/explosion0148.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0149.png b/arcade/examples/images/explosion/explosion0149.png
deleted file mode 100644
index f8c54d2..0000000
Binary files a/arcade/examples/images/explosion/explosion0149.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0150.png b/arcade/examples/images/explosion/explosion0150.png
deleted file mode 100644
index 67c636c..0000000
Binary files a/arcade/examples/images/explosion/explosion0150.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0151.png b/arcade/examples/images/explosion/explosion0151.png
deleted file mode 100644
index 0c19a83..0000000
Binary files a/arcade/examples/images/explosion/explosion0151.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0152.png b/arcade/examples/images/explosion/explosion0152.png
deleted file mode 100644
index 3daac28..0000000
Binary files a/arcade/examples/images/explosion/explosion0152.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0153.png b/arcade/examples/images/explosion/explosion0153.png
deleted file mode 100644
index 1500cb5..0000000
Binary files a/arcade/examples/images/explosion/explosion0153.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0154.png b/arcade/examples/images/explosion/explosion0154.png
deleted file mode 100644
index 6105d62..0000000
Binary files a/arcade/examples/images/explosion/explosion0154.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0155.png b/arcade/examples/images/explosion/explosion0155.png
deleted file mode 100644
index de6756e..0000000
Binary files a/arcade/examples/images/explosion/explosion0155.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0156.png b/arcade/examples/images/explosion/explosion0156.png
deleted file mode 100644
index 63737fa..0000000
Binary files a/arcade/examples/images/explosion/explosion0156.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0157.png b/arcade/examples/images/explosion/explosion0157.png
deleted file mode 100644
index 63e4bfc..0000000
Binary files a/arcade/examples/images/explosion/explosion0157.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0158.png b/arcade/examples/images/explosion/explosion0158.png
deleted file mode 100644
index 6aa8768..0000000
Binary files a/arcade/examples/images/explosion/explosion0158.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0159.png b/arcade/examples/images/explosion/explosion0159.png
deleted file mode 100644
index 856db8a..0000000
Binary files a/arcade/examples/images/explosion/explosion0159.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0160.png b/arcade/examples/images/explosion/explosion0160.png
deleted file mode 100644
index 31e5496..0000000
Binary files a/arcade/examples/images/explosion/explosion0160.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0161.png b/arcade/examples/images/explosion/explosion0161.png
deleted file mode 100644
index 923482e..0000000
Binary files a/arcade/examples/images/explosion/explosion0161.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0162.png b/arcade/examples/images/explosion/explosion0162.png
deleted file mode 100644
index 9009878..0000000
Binary files a/arcade/examples/images/explosion/explosion0162.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0163.png b/arcade/examples/images/explosion/explosion0163.png
deleted file mode 100644
index 594cc24..0000000
Binary files a/arcade/examples/images/explosion/explosion0163.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0164.png b/arcade/examples/images/explosion/explosion0164.png
deleted file mode 100644
index 6bd8697..0000000
Binary files a/arcade/examples/images/explosion/explosion0164.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0165.png b/arcade/examples/images/explosion/explosion0165.png
deleted file mode 100644
index 5d7c860..0000000
Binary files a/arcade/examples/images/explosion/explosion0165.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0166.png b/arcade/examples/images/explosion/explosion0166.png
deleted file mode 100644
index 9abe834..0000000
Binary files a/arcade/examples/images/explosion/explosion0166.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0167.png b/arcade/examples/images/explosion/explosion0167.png
deleted file mode 100644
index 77c2d84..0000000
Binary files a/arcade/examples/images/explosion/explosion0167.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0168.png b/arcade/examples/images/explosion/explosion0168.png
deleted file mode 100644
index 30a6d8e..0000000
Binary files a/arcade/examples/images/explosion/explosion0168.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0169.png b/arcade/examples/images/explosion/explosion0169.png
deleted file mode 100644
index 4923e8e..0000000
Binary files a/arcade/examples/images/explosion/explosion0169.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0170.png b/arcade/examples/images/explosion/explosion0170.png
deleted file mode 100644
index 1973ebb..0000000
Binary files a/arcade/examples/images/explosion/explosion0170.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0171.png b/arcade/examples/images/explosion/explosion0171.png
deleted file mode 100644
index a2dc0e7..0000000
Binary files a/arcade/examples/images/explosion/explosion0171.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0172.png b/arcade/examples/images/explosion/explosion0172.png
deleted file mode 100644
index 830f608..0000000
Binary files a/arcade/examples/images/explosion/explosion0172.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0173.png b/arcade/examples/images/explosion/explosion0173.png
deleted file mode 100644
index 6193dd5..0000000
Binary files a/arcade/examples/images/explosion/explosion0173.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0174.png b/arcade/examples/images/explosion/explosion0174.png
deleted file mode 100644
index de762e1..0000000
Binary files a/arcade/examples/images/explosion/explosion0174.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0175.png b/arcade/examples/images/explosion/explosion0175.png
deleted file mode 100644
index f6ca0b8..0000000
Binary files a/arcade/examples/images/explosion/explosion0175.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0176.png b/arcade/examples/images/explosion/explosion0176.png
deleted file mode 100644
index bd72434..0000000
Binary files a/arcade/examples/images/explosion/explosion0176.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0177.png b/arcade/examples/images/explosion/explosion0177.png
deleted file mode 100644
index 443a938..0000000
Binary files a/arcade/examples/images/explosion/explosion0177.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0178.png b/arcade/examples/images/explosion/explosion0178.png
deleted file mode 100644
index c6f21eb..0000000
Binary files a/arcade/examples/images/explosion/explosion0178.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0179.png b/arcade/examples/images/explosion/explosion0179.png
deleted file mode 100644
index 8ae00b2..0000000
Binary files a/arcade/examples/images/explosion/explosion0179.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0180.png b/arcade/examples/images/explosion/explosion0180.png
deleted file mode 100644
index 0bffd56..0000000
Binary files a/arcade/examples/images/explosion/explosion0180.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0181.png b/arcade/examples/images/explosion/explosion0181.png
deleted file mode 100644
index 59ed3ab..0000000
Binary files a/arcade/examples/images/explosion/explosion0181.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0182.png b/arcade/examples/images/explosion/explosion0182.png
deleted file mode 100644
index e8b5e0e..0000000
Binary files a/arcade/examples/images/explosion/explosion0182.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0183.png b/arcade/examples/images/explosion/explosion0183.png
deleted file mode 100644
index aef28a0..0000000
Binary files a/arcade/examples/images/explosion/explosion0183.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0184.png b/arcade/examples/images/explosion/explosion0184.png
deleted file mode 100644
index 1285d69..0000000
Binary files a/arcade/examples/images/explosion/explosion0184.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0185.png b/arcade/examples/images/explosion/explosion0185.png
deleted file mode 100644
index e8c8fba..0000000
Binary files a/arcade/examples/images/explosion/explosion0185.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0186.png b/arcade/examples/images/explosion/explosion0186.png
deleted file mode 100644
index e49af2b..0000000
Binary files a/arcade/examples/images/explosion/explosion0186.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0187.png b/arcade/examples/images/explosion/explosion0187.png
deleted file mode 100644
index 75facf8..0000000
Binary files a/arcade/examples/images/explosion/explosion0187.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0188.png b/arcade/examples/images/explosion/explosion0188.png
deleted file mode 100644
index addb758..0000000
Binary files a/arcade/examples/images/explosion/explosion0188.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0189.png b/arcade/examples/images/explosion/explosion0189.png
deleted file mode 100644
index 89aeb80..0000000
Binary files a/arcade/examples/images/explosion/explosion0189.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0190.png b/arcade/examples/images/explosion/explosion0190.png
deleted file mode 100644
index 5789c79..0000000
Binary files a/arcade/examples/images/explosion/explosion0190.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0191.png b/arcade/examples/images/explosion/explosion0191.png
deleted file mode 100644
index 252c331..0000000
Binary files a/arcade/examples/images/explosion/explosion0191.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0192.png b/arcade/examples/images/explosion/explosion0192.png
deleted file mode 100644
index f7be5d9..0000000
Binary files a/arcade/examples/images/explosion/explosion0192.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0193.png b/arcade/examples/images/explosion/explosion0193.png
deleted file mode 100644
index 5a5ce77..0000000
Binary files a/arcade/examples/images/explosion/explosion0193.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0194.png b/arcade/examples/images/explosion/explosion0194.png
deleted file mode 100644
index 5425b95..0000000
Binary files a/arcade/examples/images/explosion/explosion0194.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0195.png b/arcade/examples/images/explosion/explosion0195.png
deleted file mode 100644
index b263775..0000000
Binary files a/arcade/examples/images/explosion/explosion0195.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0196.png b/arcade/examples/images/explosion/explosion0196.png
deleted file mode 100644
index dc063b1..0000000
Binary files a/arcade/examples/images/explosion/explosion0196.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0197.png b/arcade/examples/images/explosion/explosion0197.png
deleted file mode 100644
index de7ce28..0000000
Binary files a/arcade/examples/images/explosion/explosion0197.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0198.png b/arcade/examples/images/explosion/explosion0198.png
deleted file mode 100644
index 0d97451..0000000
Binary files a/arcade/examples/images/explosion/explosion0198.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0199.png b/arcade/examples/images/explosion/explosion0199.png
deleted file mode 100644
index 2e0d560..0000000
Binary files a/arcade/examples/images/explosion/explosion0199.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0200.png b/arcade/examples/images/explosion/explosion0200.png
deleted file mode 100644
index 94681f0..0000000
Binary files a/arcade/examples/images/explosion/explosion0200.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0201.png b/arcade/examples/images/explosion/explosion0201.png
deleted file mode 100644
index 063867b..0000000
Binary files a/arcade/examples/images/explosion/explosion0201.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0202.png b/arcade/examples/images/explosion/explosion0202.png
deleted file mode 100644
index 75f8026..0000000
Binary files a/arcade/examples/images/explosion/explosion0202.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0203.png b/arcade/examples/images/explosion/explosion0203.png
deleted file mode 100644
index dd46b4a..0000000
Binary files a/arcade/examples/images/explosion/explosion0203.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0204.png b/arcade/examples/images/explosion/explosion0204.png
deleted file mode 100644
index 3395570..0000000
Binary files a/arcade/examples/images/explosion/explosion0204.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0205.png b/arcade/examples/images/explosion/explosion0205.png
deleted file mode 100644
index cf1078b..0000000
Binary files a/arcade/examples/images/explosion/explosion0205.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0206.png b/arcade/examples/images/explosion/explosion0206.png
deleted file mode 100644
index c493802..0000000
Binary files a/arcade/examples/images/explosion/explosion0206.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0207.png b/arcade/examples/images/explosion/explosion0207.png
deleted file mode 100644
index fc0a2c2..0000000
Binary files a/arcade/examples/images/explosion/explosion0207.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0208.png b/arcade/examples/images/explosion/explosion0208.png
deleted file mode 100644
index 9a80484..0000000
Binary files a/arcade/examples/images/explosion/explosion0208.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0209.png b/arcade/examples/images/explosion/explosion0209.png
deleted file mode 100644
index f6f86a1..0000000
Binary files a/arcade/examples/images/explosion/explosion0209.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0210.png b/arcade/examples/images/explosion/explosion0210.png
deleted file mode 100644
index 3ddea78..0000000
Binary files a/arcade/examples/images/explosion/explosion0210.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0211.png b/arcade/examples/images/explosion/explosion0211.png
deleted file mode 100644
index 346a318..0000000
Binary files a/arcade/examples/images/explosion/explosion0211.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0212.png b/arcade/examples/images/explosion/explosion0212.png
deleted file mode 100644
index 1b4255b..0000000
Binary files a/arcade/examples/images/explosion/explosion0212.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0213.png b/arcade/examples/images/explosion/explosion0213.png
deleted file mode 100644
index c4ac164..0000000
Binary files a/arcade/examples/images/explosion/explosion0213.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0214.png b/arcade/examples/images/explosion/explosion0214.png
deleted file mode 100644
index c43a38d..0000000
Binary files a/arcade/examples/images/explosion/explosion0214.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0215.png b/arcade/examples/images/explosion/explosion0215.png
deleted file mode 100644
index 3bcacb6..0000000
Binary files a/arcade/examples/images/explosion/explosion0215.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0216.png b/arcade/examples/images/explosion/explosion0216.png
deleted file mode 100644
index f7130df..0000000
Binary files a/arcade/examples/images/explosion/explosion0216.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0217.png b/arcade/examples/images/explosion/explosion0217.png
deleted file mode 100644
index 9d07ff8..0000000
Binary files a/arcade/examples/images/explosion/explosion0217.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0218.png b/arcade/examples/images/explosion/explosion0218.png
deleted file mode 100644
index 2d67503..0000000
Binary files a/arcade/examples/images/explosion/explosion0218.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0219.png b/arcade/examples/images/explosion/explosion0219.png
deleted file mode 100644
index 5cb3d42..0000000
Binary files a/arcade/examples/images/explosion/explosion0219.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0220.png b/arcade/examples/images/explosion/explosion0220.png
deleted file mode 100644
index 51fe56b..0000000
Binary files a/arcade/examples/images/explosion/explosion0220.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0221.png b/arcade/examples/images/explosion/explosion0221.png
deleted file mode 100644
index 8434422..0000000
Binary files a/arcade/examples/images/explosion/explosion0221.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0222.png b/arcade/examples/images/explosion/explosion0222.png
deleted file mode 100644
index 26c701c..0000000
Binary files a/arcade/examples/images/explosion/explosion0222.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0223.png b/arcade/examples/images/explosion/explosion0223.png
deleted file mode 100644
index ca6f3be..0000000
Binary files a/arcade/examples/images/explosion/explosion0223.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0224.png b/arcade/examples/images/explosion/explosion0224.png
deleted file mode 100644
index 8d051a1..0000000
Binary files a/arcade/examples/images/explosion/explosion0224.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0225.png b/arcade/examples/images/explosion/explosion0225.png
deleted file mode 100644
index 3e63c11..0000000
Binary files a/arcade/examples/images/explosion/explosion0225.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0226.png b/arcade/examples/images/explosion/explosion0226.png
deleted file mode 100644
index 32288cc..0000000
Binary files a/arcade/examples/images/explosion/explosion0226.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0227.png b/arcade/examples/images/explosion/explosion0227.png
deleted file mode 100644
index c6eaa5a..0000000
Binary files a/arcade/examples/images/explosion/explosion0227.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0228.png b/arcade/examples/images/explosion/explosion0228.png
deleted file mode 100644
index 6f55a17..0000000
Binary files a/arcade/examples/images/explosion/explosion0228.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0229.png b/arcade/examples/images/explosion/explosion0229.png
deleted file mode 100644
index 5e9ee5a..0000000
Binary files a/arcade/examples/images/explosion/explosion0229.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0230.png b/arcade/examples/images/explosion/explosion0230.png
deleted file mode 100644
index bb8f251..0000000
Binary files a/arcade/examples/images/explosion/explosion0230.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0231.png b/arcade/examples/images/explosion/explosion0231.png
deleted file mode 100644
index 5d76593..0000000
Binary files a/arcade/examples/images/explosion/explosion0231.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0232.png b/arcade/examples/images/explosion/explosion0232.png
deleted file mode 100644
index 1a20d34..0000000
Binary files a/arcade/examples/images/explosion/explosion0232.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0233.png b/arcade/examples/images/explosion/explosion0233.png
deleted file mode 100644
index cfc2ffe..0000000
Binary files a/arcade/examples/images/explosion/explosion0233.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0234.png b/arcade/examples/images/explosion/explosion0234.png
deleted file mode 100644
index 88682cd..0000000
Binary files a/arcade/examples/images/explosion/explosion0234.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0235.png b/arcade/examples/images/explosion/explosion0235.png
deleted file mode 100644
index 39b784f..0000000
Binary files a/arcade/examples/images/explosion/explosion0235.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0236.png b/arcade/examples/images/explosion/explosion0236.png
deleted file mode 100644
index 0ea2b15..0000000
Binary files a/arcade/examples/images/explosion/explosion0236.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0237.png b/arcade/examples/images/explosion/explosion0237.png
deleted file mode 100644
index 82a6483..0000000
Binary files a/arcade/examples/images/explosion/explosion0237.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0238.png b/arcade/examples/images/explosion/explosion0238.png
deleted file mode 100644
index 335d3ad..0000000
Binary files a/arcade/examples/images/explosion/explosion0238.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0239.png b/arcade/examples/images/explosion/explosion0239.png
deleted file mode 100644
index 756d0f1..0000000
Binary files a/arcade/examples/images/explosion/explosion0239.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0240.png b/arcade/examples/images/explosion/explosion0240.png
deleted file mode 100644
index f56eee0..0000000
Binary files a/arcade/examples/images/explosion/explosion0240.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0241.png b/arcade/examples/images/explosion/explosion0241.png
deleted file mode 100644
index a30d334..0000000
Binary files a/arcade/examples/images/explosion/explosion0241.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0242.png b/arcade/examples/images/explosion/explosion0242.png
deleted file mode 100644
index 470e6dd..0000000
Binary files a/arcade/examples/images/explosion/explosion0242.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0243.png b/arcade/examples/images/explosion/explosion0243.png
deleted file mode 100644
index 946eabc..0000000
Binary files a/arcade/examples/images/explosion/explosion0243.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0244.png b/arcade/examples/images/explosion/explosion0244.png
deleted file mode 100644
index 0cac945..0000000
Binary files a/arcade/examples/images/explosion/explosion0244.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0245.png b/arcade/examples/images/explosion/explosion0245.png
deleted file mode 100644
index f580c80..0000000
Binary files a/arcade/examples/images/explosion/explosion0245.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0246.png b/arcade/examples/images/explosion/explosion0246.png
deleted file mode 100644
index 630ce3e..0000000
Binary files a/arcade/examples/images/explosion/explosion0246.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0247.png b/arcade/examples/images/explosion/explosion0247.png
deleted file mode 100644
index 2012ae0..0000000
Binary files a/arcade/examples/images/explosion/explosion0247.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0248.png b/arcade/examples/images/explosion/explosion0248.png
deleted file mode 100644
index 645be40..0000000
Binary files a/arcade/examples/images/explosion/explosion0248.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0249.png b/arcade/examples/images/explosion/explosion0249.png
deleted file mode 100644
index 472e8c5..0000000
Binary files a/arcade/examples/images/explosion/explosion0249.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0250.png b/arcade/examples/images/explosion/explosion0250.png
deleted file mode 100644
index 66c87a5..0000000
Binary files a/arcade/examples/images/explosion/explosion0250.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0251.png b/arcade/examples/images/explosion/explosion0251.png
deleted file mode 100644
index 1543039..0000000
Binary files a/arcade/examples/images/explosion/explosion0251.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0252.png b/arcade/examples/images/explosion/explosion0252.png
deleted file mode 100644
index 7e0e379..0000000
Binary files a/arcade/examples/images/explosion/explosion0252.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0253.png b/arcade/examples/images/explosion/explosion0253.png
deleted file mode 100644
index ade0918..0000000
Binary files a/arcade/examples/images/explosion/explosion0253.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0254.png b/arcade/examples/images/explosion/explosion0254.png
deleted file mode 100644
index 92f29a9..0000000
Binary files a/arcade/examples/images/explosion/explosion0254.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0255.png b/arcade/examples/images/explosion/explosion0255.png
deleted file mode 100644
index 197c202..0000000
Binary files a/arcade/examples/images/explosion/explosion0255.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0256.png b/arcade/examples/images/explosion/explosion0256.png
deleted file mode 100644
index 85d05c0..0000000
Binary files a/arcade/examples/images/explosion/explosion0256.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0257.png b/arcade/examples/images/explosion/explosion0257.png
deleted file mode 100644
index 6161492..0000000
Binary files a/arcade/examples/images/explosion/explosion0257.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0258.png b/arcade/examples/images/explosion/explosion0258.png
deleted file mode 100644
index 5c2fbac..0000000
Binary files a/arcade/examples/images/explosion/explosion0258.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0259.png b/arcade/examples/images/explosion/explosion0259.png
deleted file mode 100644
index a25ceaf..0000000
Binary files a/arcade/examples/images/explosion/explosion0259.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0260.png b/arcade/examples/images/explosion/explosion0260.png
deleted file mode 100644
index 448b296..0000000
Binary files a/arcade/examples/images/explosion/explosion0260.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0261.png b/arcade/examples/images/explosion/explosion0261.png
deleted file mode 100644
index da7c8b0..0000000
Binary files a/arcade/examples/images/explosion/explosion0261.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0262.png b/arcade/examples/images/explosion/explosion0262.png
deleted file mode 100644
index 00f4c53..0000000
Binary files a/arcade/examples/images/explosion/explosion0262.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0263.png b/arcade/examples/images/explosion/explosion0263.png
deleted file mode 100644
index 4304071..0000000
Binary files a/arcade/examples/images/explosion/explosion0263.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0264.png b/arcade/examples/images/explosion/explosion0264.png
deleted file mode 100644
index 502610d..0000000
Binary files a/arcade/examples/images/explosion/explosion0264.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0265.png b/arcade/examples/images/explosion/explosion0265.png
deleted file mode 100644
index 4de88ac..0000000
Binary files a/arcade/examples/images/explosion/explosion0265.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0266.png b/arcade/examples/images/explosion/explosion0266.png
deleted file mode 100644
index c73b9db..0000000
Binary files a/arcade/examples/images/explosion/explosion0266.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0267.png b/arcade/examples/images/explosion/explosion0267.png
deleted file mode 100644
index 6933595..0000000
Binary files a/arcade/examples/images/explosion/explosion0267.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0268.png b/arcade/examples/images/explosion/explosion0268.png
deleted file mode 100644
index 2afaa2d..0000000
Binary files a/arcade/examples/images/explosion/explosion0268.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0269.png b/arcade/examples/images/explosion/explosion0269.png
deleted file mode 100644
index 6acafdf..0000000
Binary files a/arcade/examples/images/explosion/explosion0269.png and /dev/null differ
diff --git a/arcade/examples/images/explosion/explosion0270.png b/arcade/examples/images/explosion/explosion0270.png
deleted file mode 100644
index 5b8e021..0000000
Binary files a/arcade/examples/images/explosion/explosion0270.png and /dev/null differ
diff --git a/arcade/examples/images/gold_1.png b/arcade/examples/images/gold_1.png
deleted file mode 100644
index 0012dda..0000000
Binary files a/arcade/examples/images/gold_1.png and /dev/null differ
diff --git a/arcade/examples/images/gold_2.png b/arcade/examples/images/gold_2.png
deleted file mode 100644
index 59bc795..0000000
Binary files a/arcade/examples/images/gold_2.png and /dev/null differ
diff --git a/arcade/examples/images/gold_3.png b/arcade/examples/images/gold_3.png
deleted file mode 100644
index 9df8e56..0000000
Binary files a/arcade/examples/images/gold_3.png and /dev/null differ
diff --git a/arcade/examples/images/gold_4.png b/arcade/examples/images/gold_4.png
deleted file mode 100644
index 1d40782..0000000
Binary files a/arcade/examples/images/gold_4.png and /dev/null differ
diff --git a/arcade/examples/images/grassCenter.png b/arcade/examples/images/grassCenter.png
deleted file mode 100644
index d595bdc..0000000
Binary files a/arcade/examples/images/grassCenter.png and /dev/null differ
diff --git a/arcade/examples/images/grassCorner_left.png b/arcade/examples/images/grassCorner_left.png
deleted file mode 100644
index 385aa96..0000000
Binary files a/arcade/examples/images/grassCorner_left.png and /dev/null differ
diff --git a/arcade/examples/images/grassCorner_right.png b/arcade/examples/images/grassCorner_right.png
deleted file mode 100644
index 407a7d0..0000000
Binary files a/arcade/examples/images/grassCorner_right.png and /dev/null differ
diff --git a/arcade/examples/images/grassHill_left.png b/arcade/examples/images/grassHill_left.png
deleted file mode 100644
index d9aab2e..0000000
Binary files a/arcade/examples/images/grassHill_left.png and /dev/null differ
diff --git a/arcade/examples/images/grassHill_right.png b/arcade/examples/images/grassHill_right.png
deleted file mode 100644
index 2d769d7..0000000
Binary files a/arcade/examples/images/grassHill_right.png and /dev/null differ
diff --git a/arcade/examples/images/grassLeft.png b/arcade/examples/images/grassLeft.png
deleted file mode 100644
index f7cdc03..0000000
Binary files a/arcade/examples/images/grassLeft.png and /dev/null differ
diff --git a/arcade/examples/images/grassMid.png b/arcade/examples/images/grassMid.png
deleted file mode 100644
index acd03cd..0000000
Binary files a/arcade/examples/images/grassMid.png and /dev/null differ
diff --git a/arcade/examples/images/grassRight.png b/arcade/examples/images/grassRight.png
deleted file mode 100644
index 2e15ec4..0000000
Binary files a/arcade/examples/images/grassRight.png and /dev/null differ
diff --git a/arcade/examples/images/instructions_0.png b/arcade/examples/images/instructions_0.png
deleted file mode 100644
index 79e4717..0000000
Binary files a/arcade/examples/images/instructions_0.png and /dev/null differ
diff --git a/arcade/examples/images/instructions_1.png b/arcade/examples/images/instructions_1.png
deleted file mode 100644
index 3ceedb8..0000000
Binary files a/arcade/examples/images/instructions_1.png and /dev/null differ
diff --git a/arcade/examples/images/laserBlue01.png b/arcade/examples/images/laserBlue01.png
deleted file mode 100644
index 93e9b61..0000000
Binary files a/arcade/examples/images/laserBlue01.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_big1.png b/arcade/examples/images/meteorGrey_big1.png
deleted file mode 100644
index 74371c3..0000000
Binary files a/arcade/examples/images/meteorGrey_big1.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_big2.png b/arcade/examples/images/meteorGrey_big2.png
deleted file mode 100644
index bcc8dc7..0000000
Binary files a/arcade/examples/images/meteorGrey_big2.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_big3.png b/arcade/examples/images/meteorGrey_big3.png
deleted file mode 100644
index 0bb8674..0000000
Binary files a/arcade/examples/images/meteorGrey_big3.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_big4.png b/arcade/examples/images/meteorGrey_big4.png
deleted file mode 100644
index 6b7e708..0000000
Binary files a/arcade/examples/images/meteorGrey_big4.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_med1.png b/arcade/examples/images/meteorGrey_med1.png
deleted file mode 100644
index 9104746..0000000
Binary files a/arcade/examples/images/meteorGrey_med1.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_med2.png b/arcade/examples/images/meteorGrey_med2.png
deleted file mode 100644
index e63e2f6..0000000
Binary files a/arcade/examples/images/meteorGrey_med2.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_small1.png b/arcade/examples/images/meteorGrey_small1.png
deleted file mode 100644
index a559e9b..0000000
Binary files a/arcade/examples/images/meteorGrey_small1.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_small2.png b/arcade/examples/images/meteorGrey_small2.png
deleted file mode 100644
index 9f815b5..0000000
Binary files a/arcade/examples/images/meteorGrey_small2.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_tiny1.png b/arcade/examples/images/meteorGrey_tiny1.png
deleted file mode 100644
index 0b75fa8..0000000
Binary files a/arcade/examples/images/meteorGrey_tiny1.png and /dev/null differ
diff --git a/arcade/examples/images/meteorGrey_tiny2.png b/arcade/examples/images/meteorGrey_tiny2.png
deleted file mode 100644
index 75f944d..0000000
Binary files a/arcade/examples/images/meteorGrey_tiny2.png and /dev/null differ
diff --git a/arcade/examples/images/playerLife1_orange.png b/arcade/examples/images/playerLife1_orange.png
deleted file mode 100644
index 8c02aa2..0000000
Binary files a/arcade/examples/images/playerLife1_orange.png and /dev/null differ
diff --git a/arcade/examples/images/playerShip1_green.png b/arcade/examples/images/playerShip1_green.png
deleted file mode 100644
index 2eb6f9c..0000000
Binary files a/arcade/examples/images/playerShip1_green.png and /dev/null differ
diff --git a/arcade/examples/images/playerShip1_orange.png b/arcade/examples/images/playerShip1_orange.png
deleted file mode 100644
index 3902283..0000000
Binary files a/arcade/examples/images/playerShip1_orange.png and /dev/null differ
diff --git a/arcade/examples/images/playerShip2_orange.png b/arcade/examples/images/playerShip2_orange.png
deleted file mode 100644
index 82ddc80..0000000
Binary files a/arcade/examples/images/playerShip2_orange.png and /dev/null differ
diff --git a/arcade/examples/images/playerShip3_orange.png b/arcade/examples/images/playerShip3_orange.png
deleted file mode 100644
index 0b6b7ec..0000000
Binary files a/arcade/examples/images/playerShip3_orange.png and /dev/null differ
diff --git a/arcade/examples/images/pool_cue_ball.png b/arcade/examples/images/pool_cue_ball.png
deleted file mode 100644
index ec90308..0000000
Binary files a/arcade/examples/images/pool_cue_ball.png and /dev/null differ
diff --git a/arcade/examples/images/pool_cue_ball.svg b/arcade/examples/images/pool_cue_ball.svg
deleted file mode 100644
index e6d1d41..0000000
--- a/arcade/examples/images/pool_cue_ball.svg
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
diff --git a/arcade/examples/images/python_logo.png b/arcade/examples/images/python_logo.png
deleted file mode 100644
index 71b0815..0000000
Binary files a/arcade/examples/images/python_logo.png and /dev/null differ
diff --git a/arcade/examples/images/python_logo.svg b/arcade/examples/images/python_logo.svg
deleted file mode 100644
index 40d0e4e..0000000
--- a/arcade/examples/images/python_logo.svg
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
-
-
diff --git a/arcade/examples/images/stoneHalf.png b/arcade/examples/images/stoneHalf.png
deleted file mode 100644
index 972d932..0000000
Binary files a/arcade/examples/images/stoneHalf.png and /dev/null differ
diff --git a/arcade/examples/images/tiles_spritesheet.png b/arcade/examples/images/tiles_spritesheet.png
deleted file mode 100644
index 57ee83b..0000000
Binary files a/arcade/examples/images/tiles_spritesheet.png and /dev/null differ
diff --git a/arcade/examples/images/tiles_spritesheet.xml b/arcade/examples/images/tiles_spritesheet.xml
deleted file mode 100644
index 0a406d7..0000000
--- a/arcade/examples/images/tiles_spritesheet.xml
+++ /dev/null
@@ -1,174 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/arcade/examples/images/wormGreen.png b/arcade/examples/images/wormGreen.png
deleted file mode 100644
index 5e56ee7..0000000
Binary files a/arcade/examples/images/wormGreen.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/dirtTiles_S.png b/arcade/examples/isometric_dungeon/dirtTiles_S.png
deleted file mode 100644
index 37e860e..0000000
Binary files a/arcade/examples/isometric_dungeon/dirtTiles_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/dirt_S.png b/arcade/examples/isometric_dungeon/dirt_S.png
deleted file mode 100644
index 70e3b3d..0000000
Binary files a/arcade/examples/isometric_dungeon/dirt_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneLeft_N.png b/arcade/examples/isometric_dungeon/stoneLeft_N.png
deleted file mode 100644
index cd978df..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneLeft_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneMissingTiles_E.png b/arcade/examples/isometric_dungeon/stoneMissingTiles_E.png
deleted file mode 100644
index ba0af75..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneMissingTiles_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneMissingTiles_N.png b/arcade/examples/isometric_dungeon/stoneMissingTiles_N.png
deleted file mode 100644
index b955c9c..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneMissingTiles_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneMissingTiles_S.png b/arcade/examples/isometric_dungeon/stoneMissingTiles_S.png
deleted file mode 100644
index de97698..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneMissingTiles_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneMissingTiles_W.png b/arcade/examples/isometric_dungeon/stoneMissingTiles_W.png
deleted file mode 100644
index cd39d6f..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneMissingTiles_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneSideUneven_N.png b/arcade/examples/isometric_dungeon/stoneSideUneven_N.png
deleted file mode 100644
index 4d96645..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneSideUneven_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneSide_E.png b/arcade/examples/isometric_dungeon/stoneSide_E.png
deleted file mode 100644
index f7c6fb9..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneSide_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneTile_N.png b/arcade/examples/isometric_dungeon/stoneTile_N.png
deleted file mode 100644
index a712017..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneTile_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneTile_S.png b/arcade/examples/isometric_dungeon/stoneTile_S.png
deleted file mode 100644
index 9d88a73..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneTile_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneTile_W.png b/arcade/examples/isometric_dungeon/stoneTile_W.png
deleted file mode 100644
index eb9c8aa..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneTile_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneUneven_E.png b/arcade/examples/isometric_dungeon/stoneUneven_E.png
deleted file mode 100644
index bbcbe2b..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneUneven_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneUneven_N.png b/arcade/examples/isometric_dungeon/stoneUneven_N.png
deleted file mode 100644
index 2864fa4..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneUneven_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneUneven_S.png b/arcade/examples/isometric_dungeon/stoneUneven_S.png
deleted file mode 100644
index 9df6c00..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneUneven_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneUneven_W.png b/arcade/examples/isometric_dungeon/stoneUneven_W.png
deleted file mode 100644
index 4d1abff..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneUneven_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallAged_E.png b/arcade/examples/isometric_dungeon/stoneWallAged_E.png
deleted file mode 100644
index 9798648..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallAged_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallAged_S.png b/arcade/examples/isometric_dungeon/stoneWallAged_S.png
deleted file mode 100644
index e9ceaea..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallAged_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallArchway_S.png b/arcade/examples/isometric_dungeon/stoneWallArchway_S.png
deleted file mode 100644
index c65f54b..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallArchway_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallColumn_E.png b/arcade/examples/isometric_dungeon/stoneWallColumn_E.png
deleted file mode 100644
index b9e9bba..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallColumn_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallCorner_E.png b/arcade/examples/isometric_dungeon/stoneWallCorner_E.png
deleted file mode 100644
index 6dfc010..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallCorner_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallCorner_N.png b/arcade/examples/isometric_dungeon/stoneWallCorner_N.png
deleted file mode 100644
index 36de47b..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallCorner_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallCorner_S.png b/arcade/examples/isometric_dungeon/stoneWallCorner_S.png
deleted file mode 100644
index 6a0710e..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallCorner_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallCorner_W.png b/arcade/examples/isometric_dungeon/stoneWallCorner_W.png
deleted file mode 100644
index b12257a..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallCorner_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallGateClosed_E.png b/arcade/examples/isometric_dungeon/stoneWallGateClosed_E.png
deleted file mode 100644
index 84862c6..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallGateClosed_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallGateClosed_S.png b/arcade/examples/isometric_dungeon/stoneWallGateClosed_S.png
deleted file mode 100644
index 6fca1c9..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallGateClosed_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWallGateOpen_E.png b/arcade/examples/isometric_dungeon/stoneWallGateOpen_E.png
deleted file mode 100644
index f9a7609..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWallGateOpen_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWall_N.png b/arcade/examples/isometric_dungeon/stoneWall_N.png
deleted file mode 100644
index e4ec986..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWall_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWall_S.png b/arcade/examples/isometric_dungeon/stoneWall_S.png
deleted file mode 100644
index 28a107e..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWall_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stoneWall_W.png b/arcade/examples/isometric_dungeon/stoneWall_W.png
deleted file mode 100644
index 017418d..0000000
Binary files a/arcade/examples/isometric_dungeon/stoneWall_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stone_E.png b/arcade/examples/isometric_dungeon/stone_E.png
deleted file mode 100644
index bb0ff9e..0000000
Binary files a/arcade/examples/isometric_dungeon/stone_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stone_N.png b/arcade/examples/isometric_dungeon/stone_N.png
deleted file mode 100644
index 8d712b5..0000000
Binary files a/arcade/examples/isometric_dungeon/stone_N.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stone_S.png b/arcade/examples/isometric_dungeon/stone_S.png
deleted file mode 100644
index 3737fcb..0000000
Binary files a/arcade/examples/isometric_dungeon/stone_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/stone_W.png b/arcade/examples/isometric_dungeon/stone_W.png
deleted file mode 100644
index 4141821..0000000
Binary files a/arcade/examples/isometric_dungeon/stone_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/tableChairsBroken_E.png b/arcade/examples/isometric_dungeon/tableChairsBroken_E.png
deleted file mode 100644
index b47f966..0000000
Binary files a/arcade/examples/isometric_dungeon/tableChairsBroken_E.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/tableChairsBroken_S.png b/arcade/examples/isometric_dungeon/tableChairsBroken_S.png
deleted file mode 100644
index 4f16195..0000000
Binary files a/arcade/examples/isometric_dungeon/tableChairsBroken_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/tableShortChairs_W.png b/arcade/examples/isometric_dungeon/tableShortChairs_W.png
deleted file mode 100644
index bb15d25..0000000
Binary files a/arcade/examples/isometric_dungeon/tableShortChairs_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/woodenCrates_W.png b/arcade/examples/isometric_dungeon/woodenCrates_W.png
deleted file mode 100644
index fd9f232..0000000
Binary files a/arcade/examples/isometric_dungeon/woodenCrates_W.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/woodenSupportBeams_S.png b/arcade/examples/isometric_dungeon/woodenSupportBeams_S.png
deleted file mode 100644
index 827ba6b..0000000
Binary files a/arcade/examples/isometric_dungeon/woodenSupportBeams_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_dungeon/woodenSupportsBeam_S.png b/arcade/examples/isometric_dungeon/woodenSupportsBeam_S.png
deleted file mode 100644
index 2710eb6..0000000
Binary files a/arcade/examples/isometric_dungeon/woodenSupportsBeam_S.png and /dev/null differ
diff --git a/arcade/examples/isometric_example.py b/arcade/examples/isometric_example.py
deleted file mode 100644
index ae046a1..0000000
--- a/arcade/examples/isometric_example.py
+++ /dev/null
@@ -1,193 +0,0 @@
-"""
-Example of displaying an isometric map.
-
-Isometric map created with Tiled Map Editor: https://www.mapeditor.org/
-Tiles by Kenney: http://kenney.nl/assets/isometric-dungeon-tiles
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.isometric_example
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Isometric Example"
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 200
-
-MOVEMENT_SPEED = 5
-
-
-def read_sprite_list(grid, sprite_list):
- for row in grid:
- for grid_location in row:
- if grid_location.tile is not None:
- tile_sprite = arcade.Sprite(grid_location.tile.source, SPRITE_SCALING)
- tile_sprite.center_x = grid_location.center_x * SPRITE_SCALING
- tile_sprite.center_y = grid_location.center_y * SPRITE_SCALING
- # print(f"{grid_location.tile.source} -- ({tile_sprite.center_x:4}, {tile_sprite.center_y:4})")
- sprite_list.append(tile_sprite)
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.all_sprites_list = None
-
- # Set up the player
- self.player_sprite = None
- self.wall_list = None
- self.floor_list = None
- self.objects_list = None
- self.player_list = None
- self.view_bottom = 0
- self.view_left = 0
- self.my_map = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.floor_list = arcade.SpriteList()
- self.objects_list = arcade.SpriteList()
-
- self.my_map = arcade.read_tiled_map('dungeon.tmx', SPRITE_SCALING)
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", 0.4)
- px, py = arcade.isometric_grid_to_screen(self.my_map.width // 2,
- self.my_map.height // 2,
- self.my_map.width,
- self.my_map.height,
- self.my_map.tilewidth,
- self.my_map.tileheight)
-
- self.player_sprite.center_x = px * SPRITE_SCALING
- self.player_sprite.center_y = py * SPRITE_SCALING
- self.player_list.append(self.player_sprite)
-
- read_sprite_list(self.my_map.layers["Floor"], self.floor_list)
- read_sprite_list(self.my_map.layers["Walls"], self.wall_list)
- read_sprite_list(self.my_map.layers["Furniture"], self.wall_list)
-
- # Set the background color
- if self.my_map.backgroundcolor is None:
- arcade.set_background_color(arcade.color.BLACK)
- else:
- arcade.set_background_color(self.my_map.backgroundcolor)
-
- # Set the viewport boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.floor_list.draw()
- self.player_list.draw()
- self.wall_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def 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_sprite.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - VIEWPORT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- if changed:
- self.view_left = int(self.view_left)
- self.view_bottom = int(self.view_bottom)
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/joystick.py b/arcade/examples/joystick.py
deleted file mode 100644
index 16bd196..0000000
--- a/arcade/examples/joystick.py
+++ /dev/null
@@ -1,148 +0,0 @@
-"""
-This simple animation example shows how to move an item with the joystick.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.joystick
-"""
-
-import arcade
-
-# Set up the constants
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Joystick Control Example"
-
-RECT_WIDTH = 50
-RECT_HEIGHT = 50
-
-MOVEMENT_MULTIPLIER = 5
-DEAD_ZONE = 0.05
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
- self.player = None
- self.left_down = False
-
- joysticks = arcade.get_joysticks()
- if joysticks:
- self.joystick = joysticks[0]
- self.joystick.open()
- self.joystick.on_joybutton_press = self.on_joybutton_press
- self.joystick.on_joybutton_release = self.on_joybutton_release
- self.joystick.on_joyhat_motion = self.on_joyhat_motion
- else:
- print("There are no Joysticks")
- self.joystick = None
-
- def on_joybutton_press(self, joystick, button):
- print("Button {} down".format(button))
-
- def on_joybutton_release(self, joystick, button):
- print("Button {} up".format(button))
-
- def on_joyhat_motion(self, joystick, hat_x, hat_y):
- print("Hat ({}, {})".format(hat_x, hat_y))
-
- def setup(self):
- """ Set up the game and initialize the variables. """
- width = RECT_WIDTH
- height = RECT_HEIGHT
- x = SCREEN_WIDTH // 2
- y = SCREEN_HEIGHT // 2
- angle = 0
- color = arcade.color.WHITE
- self.player = Rectangle(x, y, width, height, angle, color)
- self.left_down = False
-
- def update(self, dt):
- # Grab the position of the joystick
- # This will be between -1.0 and +1.0
-
- if self.joystick:
- self.player.delta_x = self.joystick.x * MOVEMENT_MULTIPLIER
- # Set a "dead zone" to prevent drive from a centered joystick
- if abs(self.player.delta_x) < DEAD_ZONE:
- self.player.delta_x = 0
-
- self.player.delta_y = -self.joystick.y * MOVEMENT_MULTIPLIER
- # Set a "dead zone" to prevent drive from a centered joystick
- if abs(self.player.delta_y) < DEAD_ZONE:
- self.player.delta_y = 0
-
- """ Move everything """
- self.player.move()
-
- def on_draw(self):
- """
- Render the screen.
- """
- arcade.start_render()
-
- self.player.draw()
-
-
-class Rectangle:
-
- """ Class to represent a rectangle on the screen """
-
- def __init__(self, x, y, width, height, angle, color):
- """ Initialize our rectangle variables """
-
- # Position
- self.x = x
- self.y = y
-
- # Vector
- self.delta_x = 0
- self.delta_y = 0
-
- # Size and rotation
- self.width = width
- self.height = height
- self.angle = angle
-
- # Color
- self.color = color
-
- def draw(self):
- """ Draw our rectangle """
- arcade.draw_rectangle_filled(self.x, self.y, self.width, self.height,
- self.color, self.angle)
-
- def move(self):
-
- """ Move our rectangle """
-
- # Move left/right
- self.x += self.delta_x
-
- # See if we've gone beyond the border. If so, reset our position
- # back to the border.
- if self.x < RECT_WIDTH // 2:
- self.x = RECT_WIDTH // 2
- if self.x > SCREEN_WIDTH - (RECT_WIDTH // 2):
- self.x = SCREEN_WIDTH - (RECT_WIDTH // 2)
-
- # Move up/down
- self.y += self.delta_y
-
- # Check top and bottom boundaries
- if self.y < RECT_HEIGHT // 2:
- self.y = RECT_HEIGHT // 2
- if self.y > SCREEN_HEIGHT - (RECT_HEIGHT // 2):
- self.y = SCREEN_HEIGHT - (RECT_HEIGHT // 2)
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/level_1.tmx b/arcade/examples/level_1.tmx
deleted file mode 100644
index 2019fef..0000000
--- a/arcade/examples/level_1.tmx
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
diff --git a/arcade/examples/level_2.tmx b/arcade/examples/level_2.tmx
deleted file mode 100644
index b974f9e..0000000
--- a/arcade/examples/level_2.tmx
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
diff --git a/arcade/examples/lines_buffered.py b/arcade/examples/lines_buffered.py
deleted file mode 100644
index b2a4300..0000000
--- a/arcade/examples/lines_buffered.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""
-Using a Vertex Buffer Object With Lines
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.lines_buffered
-"""
-import arcade
-import random
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Vertex Buffer Object With Lines Example"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Set up the application.
- """
- super().__init__(width, height, title)
-
- self.shape_list = arcade.ShapeElementList()
- point_list = ((0, 50),
- (10, 10),
- (50, 0),
- (10, -10),
- (0, -50),
- (-10, -10),
- (-50, 0),
- (-10, 10),
- (0, 50))
- colors = [
- getattr(arcade.color, color)
- for color in dir(arcade.color)
- if not color.startswith("__")
- ]
- for i in range(200):
- x = SCREEN_WIDTH // 2 - random.randrange(SCREEN_WIDTH)
- y = SCREEN_HEIGHT // 2 - random.randrange(SCREEN_HEIGHT)
- color = random.choice(colors)
- points = [(px + x, py + y) for px, py in point_list]
-
- my_line_strip = arcade.create_line_strip(points, color, 5)
- self.shape_list.append(my_line_strip)
-
- self.shape_list.center_x = SCREEN_WIDTH // 2
- self.shape_list.center_y = SCREEN_HEIGHT // 2
- self.shape_list.angle = 0
-
- arcade.set_background_color(arcade.color.BLACK)
-
- def on_draw(self):
- """
- Render the screen.
- """
- # This command has to happen before we start drawing
- arcade.start_render()
-
- self.shape_list.draw()
-
- def update(self, delta_time):
- self.shape_list.angle += 1
- self.shape_list.center_x += 0.1
- self.shape_list.center_y += 0.1
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/map.csv b/arcade/examples/map.csv
deleted file mode 100644
index 51a4f0b..0000000
--- a/arcade/examples/map.csv
+++ /dev/null
@@ -1,7 +0,0 @@
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,3,-1,-1,-1,-1,-1,-1,-1,1,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0
-0,-1,-1,-1,1,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,0
-0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,-1,-1,-1,-1,-1,1,2,3,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,-1,-1,-1,-1,-1,0
-0,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,0,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,0
-1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3
diff --git a/arcade/examples/map.tmx b/arcade/examples/map.tmx
deleted file mode 100644
index 71ed931..0000000
--- a/arcade/examples/map.tmx
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
diff --git a/arcade/examples/map_with_custom_hitboxes.tmx b/arcade/examples/map_with_custom_hitboxes.tmx
deleted file mode 100644
index 1d6e85c..0000000
--- a/arcade/examples/map_with_custom_hitboxes.tmx
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
diff --git a/arcade/examples/map_with_external_tileset.tmx b/arcade/examples/map_with_external_tileset.tmx
deleted file mode 100644
index ed05a9f..0000000
--- a/arcade/examples/map_with_external_tileset.tmx
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
diff --git a/arcade/examples/map_with_ramps.csv b/arcade/examples/map_with_ramps.csv
deleted file mode 100644
index ac603fe..0000000
--- a/arcade/examples/map_with_ramps.csv
+++ /dev/null
@@ -1,7 +0,0 @@
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,-1,-1,-1,2,-1,-1,0,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,7,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,-1,-1,2,9,-1,-1,0,-1,-1,-1,-1,2,4,4,1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1,7,7,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,-1,2,9,7,-1,-1,0,-1,-1,-1,2,9,7,7,8,1,-1,0,-1,-1,-1,-1,-1,6,-1,-1,-1,-1,-1,7,7,7,8,1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,2,9,7,7,-1,-1,0,-1,-1,2,9,7,7,7,7,8,4,4,4,1,-1,0,-1,-1,-1,-1,-1,-1,-1,7,7,7,7,8,1,-1,0,0,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1
-4,4,4,4,4,4,4,4,4,4,9,7,7,7,7,7,7,7,7,7,8,4,4,4,4,4,4,4,4,4,7,7,7,7,7,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4
diff --git a/arcade/examples/map_with_ramps_2.csv b/arcade/examples/map_with_ramps_2.csv
deleted file mode 100644
index a4d239d..0000000
--- a/arcade/examples/map_with_ramps_2.csv
+++ /dev/null
@@ -1,7 +0,0 @@
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,3,7,7,2,4,-1,-1,-1,-1,-1,5,7,4,-1
--1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,7,4,-1,-1,-1,-1,-1,-1,5,7,-1,-1,5,3,1,1,1,1,2,4,-1,-1,-1,6,3,1,2,8
--1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,4,-1,-1,-1,-1,-1,5,7,4,5,3,1,2,4,-1,-1,-1,-1,5,3,1,-1,5,3,1,1,1,1,1,1,2,4,-1,-1,-1,0,0,0,-1
--1,-1,-1,-1,5,7,4,-1,-1,5,3,2,4,-1,-1,5,7,3,1,2,3,1,1,1,2,4,-1,-1,5,3,1,1,7,3,1,1,1,1,1,1,1,1,2,4,-1,-1,0,0,0,-1
-6,7,7,7,3,1,2,7,7,3,1,1,2,7,7,3,1,1,1,1,1,1,1,1,1,2,7,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7,7,7,7,7,8
diff --git a/arcade/examples/maze_depth_first.py b/arcade/examples/maze_depth_first.py
deleted file mode 100644
index c6c024c..0000000
--- a/arcade/examples/maze_depth_first.py
+++ /dev/null
@@ -1,312 +0,0 @@
-"""
-Create a maze using a depth-first search maze generation algorithm.
-For more information on this algorithm see:
-http://www.algosome.com/articles/maze-generation-depth-first.html
-...or search up some other examples.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.maze_depth_first
-"""
-import random
-import arcade
-import timeit
-import os
-
-NATIVE_SPRITE_SIZE = 128
-SPRITE_SCALING = 0.25
-SPRITE_SIZE = NATIVE_SPRITE_SIZE * SPRITE_SCALING
-
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 700
-SCREEN_TITLE = "Maze Depth First Example"
-
-MOVEMENT_SPEED = 8
-
-TILE_EMPTY = 0
-TILE_CRATE = 1
-
-# Maze must have an ODD number of rows and columns.
-# Walls go on EVEN rows/columns.
-# Openings go on ODD rows/columns
-MAZE_HEIGHT = 51
-MAZE_WIDTH = 51
-
-MERGE_SPRITES = True
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 200
-
-
-def _create_grid_with_cells(width, height):
- """ Create a grid with empty cells on odd row/column combinations. """
- grid = []
- for row in range(height):
- grid.append([])
- for column in range(width):
- if column % 2 == 1 and row % 2 == 1:
- grid[row].append(TILE_EMPTY)
- elif column == 0 or row == 0 or column == width - 1 or row == height - 1:
- grid[row].append(TILE_CRATE)
- else:
- grid[row].append(TILE_CRATE)
- return grid
-
-
-def make_maze_depth_first(maze_width, maze_height):
- maze = _create_grid_with_cells(maze_width, maze_height)
-
- w = (len(maze[0]) - 1) // 2
- h = (len(maze) - 1) // 2
- vis = [[0] * w + [1] for _ in range(h)] + [[1] * (w + 1)]
-
- def walk(x, y):
- vis[y][x] = 1
-
- d = [(x - 1, y), (x, y + 1), (x + 1, y), (x, y - 1)]
- random.shuffle(d)
- for (xx, yy) in d:
- if vis[yy][xx]:
- continue
- if xx == x:
- maze[max(y, yy) * 2][x * 2 + 1] = TILE_EMPTY
- if yy == y:
- maze[y * 2 + 1][max(x, xx) * 2] = TILE_EMPTY
-
- walk(xx, yy)
-
- walk(random.randrange(w), random.randrange(h))
-
- return maze
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.player_list = None
- self.wall_list = None
-
- # Player info
- self.score = 0
- self.player_sprite = None
-
- # Physics engine
- self.physics_engine = None
-
- # Used to scroll
- self.view_bottom = 0
- self.view_left = 0
-
- # Time to process
- self.processing_time = 0
- self.draw_time = 0
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
-
- self.score = 0
-
- # Create the maze
- maze = make_maze_depth_first(MAZE_WIDTH, MAZE_HEIGHT)
-
- # Create sprites based on 2D grid
- if not MERGE_SPRITES:
- # This is the simple-to-understand method. Each grid location
- # is a sprite.
- for row in range(MAZE_HEIGHT):
- for column in range(MAZE_WIDTH):
- if maze[row][column] == 1:
- wall = arcade.Sprite("images/grassCenter.png", SPRITE_SCALING)
- wall.center_x = column * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.center_y = row * SPRITE_SIZE + SPRITE_SIZE / 2
- self.wall_list.append(wall)
- else:
- # This uses new Arcade 1.3.1 features, that allow me to create a
- # larger sprite with a repeating texture. So if there are multiple
- # cells in a row with a wall, we merge them into one sprite, with a
- # repeating texture for each cell. This reduces our sprite count.
- for row in range(MAZE_HEIGHT):
- column = 0
- while column < len(maze):
- while column < len(maze) and maze[row][column] == 0:
- column += 1
- start_column = column
- while column < len(maze) and maze[row][column] == 1:
- column += 1
- end_column = column - 1
-
- column_count = end_column - start_column + 1
- column_mid = (start_column + end_column) / 2
-
- wall = arcade.Sprite("images/grassCenter.png", SPRITE_SCALING,
- repeat_count_x=column_count)
- wall.center_x = column_mid * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.center_y = row * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.width = SPRITE_SIZE * column_count
- self.wall_list.append(wall)
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_list.append(self.player_sprite)
-
- # Randomly place the player. If we are in a wall, repeat until we aren't.
- placed = False
- while not placed:
-
- # Randomly position
- self.player_sprite.center_x = random.randrange(MAZE_WIDTH * SPRITE_SIZE)
- self.player_sprite.center_y = random.randrange(MAZE_HEIGHT * SPRITE_SIZE)
-
- # Are we in a wall?
- walls_hit = arcade.check_for_collision_with_list(self.player_sprite, self.wall_list)
- if len(walls_hit) == 0:
- # Not in a wall! Success!
- placed = True
-
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Set the viewport boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
- print(f"Total wall blocks: {len(self.wall_list)}")
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # Draw all the sprites.
- self.wall_list.draw()
- self.player_list.draw()
-
- # Draw info on the screen
- sprite_count = len(self.wall_list)
-
- output = f"Sprite Count: {sprite_count}"
- arcade.draw_text(output,
- self.view_left + 20,
- SCREEN_HEIGHT - 20 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- SCREEN_HEIGHT - 40 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- SCREEN_HEIGHT - 60 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- start_time = timeit.default_timer()
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - VIEWPORT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- if changed:
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/maze_recursive.py b/arcade/examples/maze_recursive.py
deleted file mode 100644
index 97f0df7..0000000
--- a/arcade/examples/maze_recursive.py
+++ /dev/null
@@ -1,366 +0,0 @@
-"""
-Create a maze using a recursive division method.
-
-For more information on the algorithm, see "Recursive Division Method"
-at https://en.wikipedia.org/wiki/Maze_generation_algorithm
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.maze_recursive
-"""
-import random
-import arcade
-import timeit
-import os
-
-NATIVE_SPRITE_SIZE = 128
-SPRITE_SCALING = 0.25
-SPRITE_SIZE = NATIVE_SPRITE_SIZE * SPRITE_SCALING
-
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 700
-SCREEN_TITLE = "Maze Recursive Example"
-
-MOVEMENT_SPEED = 8
-
-TILE_EMPTY = 0
-TILE_CRATE = 1
-
-# Maze must have an ODD number of rows and columns.
-# Walls go on EVEN rows/columns.
-# Openings go on ODD rows/columns
-MAZE_HEIGHT = 51
-MAZE_WIDTH = 51
-
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 200
-
-MERGE_SPRITES = True
-
-
-def create_empty_grid(width, height, default_value=TILE_EMPTY):
- """ Create an empty grid. """
- grid = []
- for row in range(height):
- grid.append([])
- for column in range(width):
- grid[row].append(default_value)
- return grid
-
-
-def create_outside_walls(maze):
- """ Create outside border walls."""
-
- # Create left and right walls
- for row in range(len(maze)):
- maze[row][0] = TILE_CRATE
- maze[row][len(maze[row])-1] = TILE_CRATE
-
- # Create top and bottom walls
- for column in range(1, len(maze[0]) - 1):
- maze[0][column] = TILE_CRATE
- maze[len(maze) - 1][column] = TILE_CRATE
-
-
-def make_maze_recursive_call(maze, top, bottom, left, right):
- """
- Recursive function to divide up the maze in four sections
- and create three gaps.
- Walls can only go on even numbered rows/columns.
- Gaps can only go on odd numbered rows/columns.
- Maze must have an ODD number of rows and columns.
- """
-
- # Figure out where to divide horizontally
- start_range = bottom + 2
- end_range = top - 1
- y = random.randrange(start_range, end_range, 2)
-
- # Do the division
- for column in range(left + 1, right):
- maze[y][column] = TILE_CRATE
-
- # Figure out where to divide vertically
- start_range = left + 2
- end_range = right - 1
- x = random.randrange(start_range, end_range, 2)
-
- # Do the division
- for row in range(bottom + 1, top):
- maze[row][x] = TILE_CRATE
-
- # Now we'll make a gap on 3 of the 4 walls.
- # Figure out which wall does NOT get a gap.
- wall = random.randrange(4)
- if wall != 0:
- gap = random.randrange(left + 1, x, 2)
- maze[y][gap] = TILE_EMPTY
-
- if wall != 1:
- gap = random.randrange(x + 1, right, 2)
- maze[y][gap] = TILE_EMPTY
-
- if wall != 2:
- gap = random.randrange(bottom + 1, y, 2)
- maze[gap][x] = TILE_EMPTY
-
- if wall != 3:
- gap = random.randrange(y + 1, top, 2)
- maze[gap][x] = TILE_EMPTY
-
- # If there's enough space, to a recursive call.
- if top > y + 3 and x > left + 3:
- make_maze_recursive_call(maze, top, y, left, x)
-
- if top > y + 3 and x + 3 < right:
- make_maze_recursive_call(maze, top, y, x, right)
-
- if bottom + 3 < y and x + 3 < right:
- make_maze_recursive_call(maze, y, bottom, x, right)
-
- if bottom + 3 < y and x > left + 3:
- make_maze_recursive_call(maze, y, bottom, left, x)
-
-
-def make_maze_recursion(maze_width, maze_height):
- """ Make the maze by recursively splitting it into four rooms. """
- maze = create_empty_grid(maze_width, maze_height)
- # Fill in the outside walls
- create_outside_walls(maze)
-
- # Start the recursive process
- make_maze_recursive_call(maze, maze_height - 1, 0, 0, maze_width - 1)
- return maze
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.player_list = None
- self.wall_list = None
-
- # Player info
- self.score = 0
- self.player_sprite = None
-
- # Physics engine
- self.physics_engine = None
-
- # Used to scroll
- self.view_bottom = 0
- self.view_left = 0
-
- # Time to process
- self.processing_time = 0
- self.draw_time = 0
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
-
- maze = make_maze_recursion(MAZE_WIDTH, MAZE_HEIGHT)
-
- # Create sprites based on 2D grid
- if not MERGE_SPRITES:
- # This is the simple-to-understand method. Each grid location
- # is a sprite.
- for row in range(MAZE_HEIGHT):
- for column in range(MAZE_WIDTH):
- if maze[row][column] == 1:
- wall = arcade.Sprite("images/grassCenter.png", SPRITE_SCALING)
- wall.center_x = column * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.center_y = row * SPRITE_SIZE + SPRITE_SIZE / 2
- self.wall_list.append(wall)
- else:
- # This uses new Arcade 1.3.1 features, that allow me to create a
- # larger sprite with a repeating texture. So if there are multiple
- # cells in a row with a wall, we merge them into one sprite, with a
- # repeating texture for each cell. This reduces our sprite count.
- for row in range(MAZE_HEIGHT):
- column = 0
- while column < len(maze):
- while column < len(maze) and maze[row][column] == 0:
- column += 1
- start_column = column
- while column < len(maze) and maze[row][column] == 1:
- column += 1
- end_column = column - 1
-
- column_count = end_column - start_column + 1
- column_mid = (start_column + end_column) / 2
-
- wall = arcade.Sprite("images/grassCenter.png", SPRITE_SCALING,
- repeat_count_x=column_count)
- wall.center_x = column_mid * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.center_y = row * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.width = SPRITE_SIZE * column_count
- self.wall_list.append(wall)
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_list.append(self.player_sprite)
-
- # Randomly place the player. If we are in a wall, repeat until we aren't.
- placed = False
- while not placed:
-
- # Randomly position
- self.player_sprite.center_x = random.randrange(MAZE_WIDTH * SPRITE_SIZE)
- self.player_sprite.center_y = random.randrange(MAZE_HEIGHT * SPRITE_SIZE)
-
- # Are we in a wall?
- walls_hit = arcade.check_for_collision_with_list(self.player_sprite, self.wall_list)
- if len(walls_hit) == 0:
- # Not in a wall! Success!
- placed = True
-
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Set the viewport boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
- print(f"Total wall blocks: {len(self.wall_list)}")
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # Draw all the sprites.
- self.wall_list.draw()
- self.player_list.draw()
-
- # Draw info on the screen
- sprite_count = len(self.wall_list)
-
- output = f"Sprite Count: {sprite_count}"
- arcade.draw_text(output,
- self.view_left + 20,
- SCREEN_HEIGHT - 20 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- SCREEN_HEIGHT - 40 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- SCREEN_HEIGHT - 60 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- start_time = timeit.default_timer()
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - VIEWPORT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- if changed:
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/mountains_midpoint_displacement.py b/arcade/examples/mountains_midpoint_displacement.py
deleted file mode 100644
index 58cb251..0000000
--- a/arcade/examples/mountains_midpoint_displacement.py
+++ /dev/null
@@ -1,201 +0,0 @@
-"""
-Mountains Midpoint Displacement
-
-Create a random mountain range.
-Original idea and some code from:
-https://bitesofcode.wordpress.com/2016/12/23/landscape-generation-using-midpoint-displacement/
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.mountains_midpoint_displacement
-"""
-
-# Library imports
-import arcade
-import random
-import bisect
-
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 700
-SCREEN_TITLE = "Mountains Midpoint Displacement Example"
-
-
-# Iterative midpoint vertical displacement
-def midpoint_displacement(start, end, roughness, vertical_displacement=None,
- num_of_iterations=16):
- """
- Given a straight line segment specified by a starting point and an endpoint
- in the form of [starting_point_x, starting_point_y] and [endpoint_x, endpoint_y],
- a roughness value > 0, an initial vertical displacement and a number of
- iterations > 0 applies the midpoint algorithm to the specified segment and
- returns the obtained list of points in the form
- points = [[x_0, y_0],[x_1, y_1],...,[x_n, y_n]]
- """
- # Final number of points = (2^iterations)+1
- if vertical_displacement is None:
- # if no initial displacement is specified set displacement to:
- # (y_start+y_end)/2
- vertical_displacement = (start[1]+end[1])/2
- # Data structure that stores the points is a list of lists where
- # each sublist represents a point and holds its x and y coordinates:
- # points=[[x_0, y_0],[x_1, y_1],...,[x_n, y_n]]
- # | | |
- # point 0 point 1 point n
- # The points list is always kept sorted from smallest to biggest x-value
- points = [start, end]
- iteration = 1
- while iteration <= num_of_iterations:
- # Since the list of points will be dynamically updated with the new computed
- # points after each midpoint displacement it is necessary to create a copy
- # of the state at the beginning of the iteration so we can iterate over
- # the original sequence.
- # Tuple type is used for security reasons since they are immutable in Python.
- points_tup = tuple(points)
- for i in range(len(points_tup)-1):
- # Calculate x and y midpoint coordinates:
- # [(x_i+x_(i+1))/2, (y_i+y_(i+1))/2]
- midpoint = list(map(lambda x: (points_tup[i][x]+points_tup[i+1][x])/2,
- [0, 1]))
- # Displace midpoint y-coordinate
- midpoint[1] += random.choice([-vertical_displacement,
- vertical_displacement])
- # Insert the displaced midpoint in the current list of points
- bisect.insort(points, midpoint)
- # bisect allows to insert an element in a list so that its order
- # is preserved.
- # By default the maintained order is from smallest to biggest list first
- # element which is what we want.
- # Reduce displacement range
- vertical_displacement *= 2 ** (-roughness)
- # update number of iterations
- iteration += 1
- return points
-
-
-def fix_points(points):
- last_y = None
- last_x = None
- new_list = []
- for point in points:
- x = int(point[0])
- y = int(point[1])
-
- if last_y is None or y != last_y:
- if last_y is None:
- last_x = x
- last_y = y
-
- x1 = last_x
- x2 = x
- y1 = last_y
- y2 = y
-
- new_list.append((x1, 0))
- new_list.append((x1, y1))
- new_list.append((x2, y2))
- new_list.append((x2, 0))
-
- last_x = x
- last_y = y
-
- x1 = last_x
- x2 = SCREEN_WIDTH
- y1 = last_y
- y2 = last_y
-
- new_list.append((x1, 0))
- new_list.append((x1, y1))
- new_list.append((x2, y2))
- new_list.append((x2, 0))
-
- return new_list
-
-
-def create_mountain_range(start, end, roughness, vertical_displacement, num_of_iterations, color_start):
-
- shape_list = arcade.ShapeElementList()
-
- layer_1 = midpoint_displacement(start, end, roughness, vertical_displacement, num_of_iterations)
- layer_1 = fix_points(layer_1)
-
- color_list = [color_start] * len(layer_1)
- lines = arcade.create_rectangles_filled_with_colors(layer_1, color_list)
- shape_list.append(lines)
-
- return shape_list
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- self.mountains = None
-
- arcade.set_background_color(arcade.color.WHITE)
-
- def setup(self):
- """
- This, and any function with the arcade.decorator.init decorator,
- is run automatically on start-up.
- """
- self.mountains = []
-
- background = arcade.ShapeElementList()
-
- color1 = (195, 157, 224)
- color2 = (240, 203, 163)
- points = (0, 0), (SCREEN_WIDTH, 0), (SCREEN_WIDTH, SCREEN_HEIGHT), (0, SCREEN_HEIGHT)
- colors = (color1, color1, color2, color2)
- rect = arcade.create_rectangle_filled_with_colors(points, colors)
-
- background.append(rect)
- self.mountains.append(background)
-
- layer_4 = create_mountain_range([0, 350], [SCREEN_WIDTH, 320], 1.1, 250, 8, (158, 98, 204))
- self.mountains.append(layer_4)
-
- layer_3 = create_mountain_range([0, 270], [SCREEN_WIDTH, 190], 1.1, 120, 9, (130, 79, 138))
- self.mountains.append(layer_3)
-
- layer_2 = create_mountain_range([0, 180], [SCREEN_WIDTH, 80], 1.2, 30, 12, (68, 28, 99))
- self.mountains.append(layer_2)
-
- layer_1 = create_mountain_range([250, 0], [SCREEN_WIDTH, 200], 1.4, 20, 12, (49, 7, 82))
- self.mountains.append(layer_1)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- arcade.start_render()
- """
- This is called every time we need to update our screen. About 60
- times per second.
-
- Just draw things in this function, don't update where they are.
- """
- # Call our drawing functions.
-
- for mountain_range in self.mountains:
- mountain_range.draw()
-
- def on_mouse_press(self, x, y, button, key_modifiers):
- """
- Called when the user presses a mouse button.
- """
- pass
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/mountains_random_walk.py b/arcade/examples/mountains_random_walk.py
deleted file mode 100644
index 0234e0a..0000000
--- a/arcade/examples/mountains_random_walk.py
+++ /dev/null
@@ -1,140 +0,0 @@
-"""
-Mountains Random Walk
-
-Idea and algorithm from:
-https://hackernoon.com/a-procedural-landscape-experiment-4efe1826906f
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.mountains_random_walk
-"""
-
-# Library imports
-import arcade
-import random
-
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 700
-SCREEN_TITLE = "Mountains Random Walk Example"
-
-
-def create_mountain_range(height_min, height_max, color_start, color_end):
-
- shape_list = arcade.ShapeElementList()
-
- step_max = 1.5
- step_change = 0.5
-
- height = random.random() * height_max
- slope = (random.random() * step_max * 2) - step_max
-
- line_point_list = []
- line_color_list = []
-
- for x in range(SCREEN_WIDTH):
- height += slope
- slope += (random.random() * step_change * 2) - step_change
-
- if slope > step_max:
- slope = step_max
- elif slope < -step_max:
- slope = -step_max
-
- if height > height_max:
- height = height_max
- slope *= -1
- elif height < height_min:
- height = height_min
- slope *= -1
-
- line_point_list.extend(((x, height), (x, 0)))
- line_color_list.extend((color_start, color_end))
-
- lines = arcade.create_lines_with_colors(line_point_list, line_color_list)
- shape_list.append(lines)
-
- return shape_list
-
-
-def create_line_strip():
- shape_list = arcade.ShapeElementList()
-
- colors = (
- arcade.color.RED,
- arcade.color.BLACK,
- arcade.color.GREEN,
- arcade.color.BLACK,
- arcade.color.BLUE,
- arcade.color.BLACK
- )
- line_strip = arcade.create_lines_with_colors(
- ([10, 10], [500, 10],
- [10, 250], [500, 250],
- [10, 500], [500, 500]),
- colors,
- line_width=4)
-
- shape_list.append(line_strip)
-
- return shape_list
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- self.mountains = None
-
- arcade.set_background_color(arcade.color.WHITE)
-
- def setup(self):
- """
- This, and any function with the arcade.decorator.init decorator,
- is run automatically on start-up.
- """
-
- self.mountains = []
-
- background = arcade.ShapeElementList()
-
- points = (0, 0), (SCREEN_WIDTH, 0), (SCREEN_WIDTH, SCREEN_HEIGHT), (0, SCREEN_HEIGHT)
- colors = (arcade.color.SKY_BLUE, arcade.color.SKY_BLUE, arcade.color.BLUE, arcade.color.BLUE)
- rect = arcade.create_rectangles_filled_with_colors(points, colors)
-
- background.append(rect)
- self.mountains.append(background)
-
- for i in range(1, 4):
- color_start = (i * 10, i * 30, i * 10)
- color_end = (i * 20, i * 40, i * 20)
- min_y = 0 + 70 * (3 - i)
- max_y = 120 + 70 * (3 - i)
- mountain_range = create_mountain_range(min_y, max_y, color_start, color_end)
- self.mountains.append(mountain_range)
-
- def on_draw(self):
- """
- This is called every time we need to update our screen. About 60
- times per second.
-
- Just draw things in this function, don't update where they are.
- """
- # Call our drawing functions.
-
- arcade.start_render()
- for mountain_range in self.mountains:
- mountain_range.draw()
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/move_joystick.py b/arcade/examples/move_joystick.py
deleted file mode 100644
index a5b6573..0000000
--- a/arcade/examples/move_joystick.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""
-This simple animation example shows how to move an item with the joystick
-and game-pad.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.move_joystick
-"""
-
-import arcade
-
-SCREEN_WIDTH = 640
-SCREEN_HEIGHT = 480
-SCREEN_TITLE = "Move Joystick Example"
-MOVEMENT_SPEED = 5
-DEAD_ZONE = 0.02
-
-
-class Ball:
- def __init__(self, position_x, position_y, change_x, change_y, radius, color):
-
- # Take the parameters of the init function above, and create instance variables out of them.
- self.position_x = position_x
- self.position_y = position_y
- self.change_x = change_x
- self.change_y = change_y
- self.radius = radius
- self.color = color
-
- def draw(self):
- """ Draw the balls with the instance variables we have. """
- arcade.draw_circle_filled(self.position_x, self.position_y, self.radius, self.color)
-
- def update(self):
- # Move the ball
- self.position_y += self.change_y
- self.position_x += self.change_x
-
- # See if the ball hit the edge of the screen. If so, change direction
- if self.position_x < self.radius:
- self.position_x = self.radius
-
- if self.position_x > SCREEN_WIDTH - self.radius:
- self.position_x = SCREEN_WIDTH - self.radius
-
- if self.position_y < self.radius:
- self.position_y = self.radius
-
- if self.position_y > SCREEN_HEIGHT - self.radius:
- self.position_y = SCREEN_HEIGHT - self.radius
-
-
-class MyGame(arcade.Window):
-
- def __init__(self, width, height, title):
-
- # Call the parent class's init function
- super().__init__(width, height, title)
-
- # Make the mouse disappear when it is over the window.
- # So we just see our object, not the pointer.
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.ASH_GREY)
-
- # Create our ball
- self.ball = Ball(50, 50, 0, 0, 15, arcade.color.AUBURN)
-
- # Get a list of all the game controllers that are plugged in
- joysticks = arcade.get_joysticks()
-
- # If we have a game controller plugged in, grab it and
- # make an instance variable out of it.
- if joysticks:
- self.joystick = joysticks[0]
- self.joystick.open()
- else:
- print("There are no joysticks.")
- self.joystick = None
-
- def on_draw(self):
-
- """ Called whenever we need to draw the window. """
- arcade.start_render()
- self.ball.draw()
-
- def update(self, delta_time):
-
- # Update the position according to the game controller
- if self.joystick:
-
- # Set a "dead zone" to prevent drive from a centered joystick
- if abs(self.joystick.x) < DEAD_ZONE:
- self.ball.change_x = 0
- else:
- self.ball.change_x = self.joystick.x * MOVEMENT_SPEED
-
- # Set a "dead zone" to prevent drive from a centered joystick
- if abs(self.joystick.y) < DEAD_ZONE:
- self.ball.change_y = 0
- else:
- self.ball.change_y = -self.joystick.y * MOVEMENT_SPEED
-
- self.ball.update()
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/move_keyboard.py b/arcade/examples/move_keyboard.py
deleted file mode 100644
index 6d8d23a..0000000
--- a/arcade/examples/move_keyboard.py
+++ /dev/null
@@ -1,99 +0,0 @@
-"""
-This simple animation example shows how to move an item with the keyboard.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.move_keyboard
-"""
-
-import arcade
-
-SCREEN_WIDTH = 640
-SCREEN_HEIGHT = 480
-SCREEN_TITLE = "Move Keyboard Example"
-MOVEMENT_SPEED = 3
-
-
-class Ball:
- def __init__(self, position_x, position_y, change_x, change_y, radius, color):
-
- # Take the parameters of the init function above, and create instance variables out of them.
- self.position_x = position_x
- self.position_y = position_y
- self.change_x = change_x
- self.change_y = change_y
- self.radius = radius
- self.color = color
-
- def draw(self):
- """ Draw the balls with the instance variables we have. """
- arcade.draw_circle_filled(self.position_x, self.position_y, self.radius, self.color)
-
- def update(self):
- # Move the ball
- self.position_y += self.change_y
- self.position_x += self.change_x
-
- # See if the ball hit the edge of the screen. If so, change direction
- if self.position_x < self.radius:
- self.position_x = self.radius
-
- if self.position_x > SCREEN_WIDTH - self.radius:
- self.position_x = SCREEN_WIDTH - self.radius
-
- if self.position_y < self.radius:
- self.position_y = self.radius
-
- if self.position_y > SCREEN_HEIGHT - self.radius:
- self.position_y = SCREEN_HEIGHT - self.radius
-
-
-class MyGame(arcade.Window):
-
- def __init__(self, width, height, title):
-
- # Call the parent class's init function
- super().__init__(width, height, title)
-
- # Make the mouse disappear when it is over the window.
- # So we just see our object, not the pointer.
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.ASH_GREY)
-
- # Create our ball
- self.ball = Ball(50, 50, 0, 0, 15, arcade.color.AUBURN)
-
- def on_draw(self):
- """ Called whenever we need to draw the window. """
- arcade.start_render()
- self.ball.draw()
-
- def update(self, delta_time):
- self.ball.update()
-
- def on_key_press(self, key, modifiers):
- """ Called whenever the user presses a key. """
- if key == arcade.key.LEFT:
- self.ball.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.ball.change_x = MOVEMENT_SPEED
- elif key == arcade.key.UP:
- self.ball.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.ball.change_y = -MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """ Called whenever a user releases a key. """
- if key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.ball.change_x = 0
- elif key == arcade.key.UP or key == arcade.key.DOWN:
- self.ball.change_y = 0
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/move_mouse.py b/arcade/examples/move_mouse.py
deleted file mode 100644
index 1d0f999..0000000
--- a/arcade/examples/move_mouse.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""
-This simple animation example shows how to move an item with the mouse, and
-handle mouse clicks.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.move_mouse
-"""
-
-import arcade
-
-SCREEN_WIDTH = 640
-SCREEN_HEIGHT = 480
-SCREEN_TITLE = "Move Mouse Example"
-
-
-class Ball:
- def __init__(self, position_x, position_y, radius, color):
-
- # Take the parameters of the init function above, and create instance variables out of them.
- self.position_x = position_x
- self.position_y = position_y
- self.radius = radius
- self.color = color
-
- def draw(self):
- """ Draw the balls with the instance variables we have. """
- arcade.draw_circle_filled(self.position_x, self.position_y, self.radius, self.color)
-
-
-class MyGame(arcade.Window):
-
- def __init__(self, width, height, title):
-
- # Call the parent class's init function
- super().__init__(width, height, title)
-
- # Make the mouse disappear when it is over the window.
- # So we just see our object, not the pointer.
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.ASH_GREY)
-
- # Create our ball
- self.ball = Ball(50, 50, 15, arcade.color.AUBURN)
-
- def on_draw(self):
- """ Called whenever we need to draw the window. """
- arcade.start_render()
- self.ball.draw()
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Called to update our objects. Happens approximately 60 times per second."""
- self.ball.position_x = x
- self.ball.position_y = y
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called when the user presses a mouse button.
- """
- print(f"You clicked button number: {button}")
- if button == arcade.MOUSE_BUTTON_LEFT:
- self.ball.color = arcade.color.BLACK
-
- def on_mouse_release(self, x, y, button, modifiers):
- """
- Called when a user releases a mouse button.
- """
- if button == arcade.MOUSE_BUTTON_LEFT:
- self.ball.color = arcade.color.AUBURN
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/my_tileset.tsx b/arcade/examples/my_tileset.tsx
deleted file mode 100644
index 5fe6845..0000000
--- a/arcade/examples/my_tileset.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/arcade/examples/nested_loops_bottom_left_triangle.py b/arcade/examples/nested_loops_bottom_left_triangle.py
deleted file mode 100644
index a2e4f4c..0000000
--- a/arcade/examples/nested_loops_bottom_left_triangle.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-Example "Arcade" library code.
-
-Showing how to do nested loops.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.nested_loops_bottom_left_triangle
-"""
-
-# Library imports
-import arcade
-
-COLUMN_SPACING = 20
-ROW_SPACING = 20
-LEFT_MARGIN = 110
-BOTTOM_MARGIN = 110
-
-# Open the window and set the background
-arcade.open_window(400, 400, "Complex Loops - Bottom Left Triangle")
-
-arcade.set_background_color(arcade.color.WHITE)
-
-# Start the render process. This must be done before any drawing commands.
-arcade.start_render()
-
-# Loop for each row
-for row in range(10):
- # Loop for each column
- # Change the number of columns depending on the row we are in
- for column in range(10 - row):
- # Calculate our location
- x = column * COLUMN_SPACING + LEFT_MARGIN
- y = row * ROW_SPACING + BOTTOM_MARGIN
-
- # Draw the item
- arcade.draw_circle_filled(x, y, 7, arcade.color.AO)
-
-# Finish the render.
-arcade.finish_render()
-
-# Keep the window up until someone closes it.
-arcade.run()
diff --git a/arcade/examples/nested_loops_bottom_right_triangle.py b/arcade/examples/nested_loops_bottom_right_triangle.py
deleted file mode 100644
index 7abaf3f..0000000
--- a/arcade/examples/nested_loops_bottom_right_triangle.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-Example "Arcade" library code.
-
-Showing how to do nested loops.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.nested_loops_bottom_right_triangle
-"""
-
-# Library imports
-import arcade
-
-COLUMN_SPACING = 20
-ROW_SPACING = 20
-LEFT_MARGIN = 110
-BOTTOM_MARGIN = 110
-
-# Open the window and set the background
-arcade.open_window(400, 400, "Complex Loops - Bottom Right Triangle")
-
-arcade.set_background_color(arcade.color.WHITE)
-
-# Start the render process. This must be done before any drawing commands.
-arcade.start_render()
-
-# Loop for each row
-for row in range(10):
- # Loop for each column
- # Change the number of columns depending on the row we are in
- for column in range(row, 10):
- # Calculate our location
- x = column * COLUMN_SPACING + LEFT_MARGIN
- y = row * ROW_SPACING + BOTTOM_MARGIN
-
- # Draw the item
- arcade.draw_circle_filled(x, y, 7, arcade.color.AO)
-
-# Finish the render.
-arcade.finish_render()
-
-# Keep the window up until someone closes it.
-arcade.run()
diff --git a/arcade/examples/nested_loops_box.py b/arcade/examples/nested_loops_box.py
deleted file mode 100644
index 84db8fa..0000000
--- a/arcade/examples/nested_loops_box.py
+++ /dev/null
@@ -1,41 +0,0 @@
-"""
-Example "Arcade" library code.
-
-Showing how to do nested loops.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.nested_loops_box
-"""
-
-# Library imports
-import arcade
-
-COLUMN_SPACING = 20
-ROW_SPACING = 20
-LEFT_MARGIN = 110
-BOTTOM_MARGIN = 110
-
-# Open the window and set the background
-arcade.open_window(400, 400, "Complex Loops - Box")
-
-arcade.set_background_color(arcade.color.WHITE)
-
-# Start the render process. This must be done before any drawing commands.
-arcade.start_render()
-
-# Loop for each row
-for row in range(10):
- # Loop for each column
- for column in range(10):
- # Calculate our location
- x = column * COLUMN_SPACING + LEFT_MARGIN
- y = row * ROW_SPACING + BOTTOM_MARGIN
-
- # Draw the item
- arcade.draw_circle_filled(x, y, 7, arcade.color.AO)
-
-# Finish the render.
-arcade.finish_render()
-
-# Keep the window up until someone closes it.
-arcade.run()
diff --git a/arcade/examples/nested_loops_top_left_triangle.py b/arcade/examples/nested_loops_top_left_triangle.py
deleted file mode 100644
index 5e3f7c2..0000000
--- a/arcade/examples/nested_loops_top_left_triangle.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-Example "Arcade" library code.
-
-Showing how to do nested loops.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.nested_loops_top_left_triangle
-"""
-
-# Library imports
-import arcade
-
-COLUMN_SPACING = 20
-ROW_SPACING = 20
-LEFT_MARGIN = 110
-BOTTOM_MARGIN = 110
-
-# Open the window and set the background
-arcade.open_window(400, 400, "Complex Loops - Top Left Triangle")
-
-arcade.set_background_color(arcade.color.WHITE)
-
-# Start the render process. This must be done before any drawing commands.
-arcade.start_render()
-
-# Loop for each row
-for row in range(10):
- # Loop for each column
- # Change the number of columns depending on the row we are in
- for column in range(row):
- # Calculate our location
- x = column * COLUMN_SPACING + LEFT_MARGIN
- y = row * ROW_SPACING + BOTTOM_MARGIN
-
- # Draw the item
- arcade.draw_circle_filled(x, y, 7, arcade.color.AO)
-
-# Finish the render.
-arcade.finish_render()
-
-# Keep the window up until someone closes it.
-arcade.run()
diff --git a/arcade/examples/nested_loops_top_right_triangle.py b/arcade/examples/nested_loops_top_right_triangle.py
deleted file mode 100644
index ad5701c..0000000
--- a/arcade/examples/nested_loops_top_right_triangle.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-Example "Arcade" library code.
-
-Showing how to do nested loops.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.nested_loops_bottom_right_triangle
-"""
-
-# Library imports
-import arcade
-
-COLUMN_SPACING = 20
-ROW_SPACING = 20
-LEFT_MARGIN = 110
-BOTTOM_MARGIN = 110
-
-# Open the window and set the background
-arcade.open_window(400, 400, "Complex Loops - Top Right Triangle")
-
-arcade.set_background_color(arcade.color.WHITE)
-
-# Start the render process. This must be done before any drawing commands.
-arcade.start_render()
-
-# Loop for each row
-for row in range(10):
- # Loop for each column
- # Change the number of columns depending on the row we are in
- for column in range(9 - row, 10):
- # Calculate our location
- x = column * COLUMN_SPACING + LEFT_MARGIN
- y = row * ROW_SPACING + BOTTOM_MARGIN
-
- # Draw the item
- arcade.draw_circle_filled(x, y, 7, arcade.color.AO)
-
-# Finish the render.
-arcade.finish_render()
-
-# Keep the window up until someone closes it.
-arcade.run()
diff --git a/arcade/examples/particle_fireworks.py b/arcade/examples/particle_fireworks.py
deleted file mode 100644
index c39f585..0000000
--- a/arcade/examples/particle_fireworks.py
+++ /dev/null
@@ -1,364 +0,0 @@
-"""
-Particle Fireworks
-
-Use a fireworks display to demonstrate "real-world" uses of Emitters and Particles
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_list_particle_fireworks
-"""
-import arcade
-from arcade import Point, Vector
-from arcade.utils import _Vec2 # bring in "private" class
-from arcade.examples.frametime_plotter import FrametimePlotter
-import os
-import random
-import pyglet
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Particle based fireworks"
-LAUNCH_INTERVAL_MIN = 1.5
-LAUNCH_INTERVAL_MAX = 2.5
-TEXTURE = "images/pool_cue_ball.png"
-RAINBOW_COLORS = (
- arcade.color.ELECTRIC_CRIMSON,
- arcade.color.FLUORESCENT_ORANGE,
- arcade.color.ELECTRIC_YELLOW,
- arcade.color.ELECTRIC_GREEN,
- arcade.color.ELECTRIC_CYAN,
- arcade.color.MEDIUM_ELECTRIC_BLUE,
- arcade.color.ELECTRIC_INDIGO,
- arcade.color.ELECTRIC_PURPLE,
-)
-SPARK_TEXTURES = [arcade.make_circle_texture(15, clr) for clr in RAINBOW_COLORS]
-SPARK_PAIRS = [
- [SPARK_TEXTURES[0], SPARK_TEXTURES[3]],
- [SPARK_TEXTURES[1], SPARK_TEXTURES[5]],
- [SPARK_TEXTURES[7], SPARK_TEXTURES[2]],
-]
-ROCKET_SMOKE_TEXTURE = arcade.make_soft_circle_texture(15, arcade.color.GRAY)
-PUFF_TEXTURE = arcade.make_soft_circle_texture(80, (40, 40, 40))
-FLASH_TEXTURE = arcade.make_soft_circle_texture(70, (128, 128, 90))
-CLOUD_TEXTURES = [
- arcade.make_soft_circle_texture(50, arcade.color.WHITE),
- arcade.make_soft_circle_texture(50, arcade.color.LIGHT_GRAY),
- arcade.make_soft_circle_texture(50, arcade.color.LIGHT_BLUE),
-]
-STAR_TEXTURES = [
- arcade.make_soft_circle_texture(6, arcade.color.WHITE),
- arcade.make_soft_circle_texture(6, arcade.color.PASTEL_YELLOW),
-]
-SPINNER_HEIGHT = 75
-
-
-def make_spinner():
- spinner = arcade.Emitter(
- center_xy=(SCREEN_WIDTH / 2, SPINNER_HEIGHT - 5),
- emit_controller=arcade.EmitterIntervalWithTime(0.025, 2.0),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=random.choice(STAR_TEXTURES),
- change_xy=(0, 6.0),
- lifetime=0.2
- )
- )
- spinner.change_angle = 16.28
- return spinner
-
-
-def make_rocket(emit_done_cb):
- """Emitter that displays the smoke trail as the firework shell climbs into the sky"""
- rocket = RocketEmitter(
- center_xy=(random.uniform(100, SCREEN_WIDTH - 100), 25),
- emit_controller=arcade.EmitterIntervalWithTime(0.04, 2.0),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=ROCKET_SMOKE_TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), 0.08),
- scale=0.5,
- lifetime=random.uniform(1.0, 1.5),
- start_alpha=100,
- end_alpha=0,
- mutation_callback=rocket_smoke_mutator
- ),
- emit_done_cb=emit_done_cb
- )
- rocket.change_x = random.uniform(-1.0, 1.0)
- rocket.change_y = random.uniform(5.0, 7.25)
- return rocket
-
-
-def make_flash(prev_emitter):
- """Return emitter that displays the brief flash when a firework shell explodes"""
- return arcade.Emitter(
- center_xy=prev_emitter.get_pos(),
- emit_controller=arcade.EmitBurst(3),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=FLASH_TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), 3.5),
- lifetime=0.15
- )
- )
-
-
-def make_puff(prev_emitter):
- """Return emitter that generates the subtle smoke cloud left after a firework shell explodes"""
- return arcade.Emitter(
- center_xy=prev_emitter.get_pos(),
- emit_controller=arcade.EmitBurst(4),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=PUFF_TEXTURE,
- change_xy=(_Vec2(arcade.rand_in_circle((0.0, 0.0), 0.4)) + _Vec2(0.3, 0.0)).as_tuple(),
- lifetime=4.0
- )
- )
-
-
-class AnimatedAlphaParticle(arcade.LifetimeParticle):
- """A custom particle that animates between three different alpha levels"""
-
- def __init__(
- self,
- filename_or_texture: arcade.FilenameOrTexture,
- change_xy: Vector,
- start_alpha: int = 0,
- duration1: float = 1.0,
- mid_alpha: int = 255,
- duration2: float = 1.0,
- end_alpha: int = 0,
- center_xy: Point = (0.0, 0.0),
- angle: float = 0,
- change_angle: float = 0,
- scale: float = 1.0,
- mutation_callback=None,
- ):
- super().__init__(filename_or_texture, change_xy, duration1 + duration2, center_xy, angle, change_angle, scale,
- start_alpha, mutation_callback)
- self.start_alpha = start_alpha
- self.in_duration = duration1
- self.mid_alpha = mid_alpha
- self.out_duration = duration2
- self.end_alpha = end_alpha
-
- def update(self):
- super().update()
- if self.lifetime_elapsed <= self.in_duration:
- u = self.lifetime_elapsed / self.in_duration
- self.alpha = arcade.lerp(self.start_alpha, self.mid_alpha, u)
- else:
- u = (self.lifetime_elapsed - self.in_duration) / self.out_duration
- self.alpha = arcade.lerp(self.mid_alpha, self.end_alpha, u)
-
-
-class RocketEmitter(arcade.Emitter):
- """Custom emitter class to add gravity to the emitter to represent gravity on the firework shell"""
-
- def update(self):
- super().update()
- # gravity
- self.change_y += -0.05
-
-
-class FireworksApp(arcade.Window):
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- arcade.set_background_color(arcade.color.BLACK)
- self.emitters = []
- self.frametime_plotter = FrametimePlotter()
-
- self.launch_firework(0)
- arcade.schedule(self.launch_spinner, 4.0)
-
- stars = arcade.Emitter(
- center_xy=(0.0, 0.0),
- emit_controller=arcade.EmitMaintainCount(20),
- particle_factory=lambda emitter: AnimatedAlphaParticle(
- filename_or_texture=random.choice(STAR_TEXTURES),
- change_xy=(0.0, 0.0),
- start_alpha=0,
- duration1=random.uniform(2.0, 6.0),
- mid_alpha=128,
- duration2=random.uniform(2.0, 6.0),
- end_alpha=0,
- center_xy=arcade.rand_in_rect((0.0, 0.0), SCREEN_WIDTH, SCREEN_HEIGHT)
- )
- )
- self.emitters.append(stars)
-
- self.cloud = arcade.Emitter(
- center_xy=(50, 500),
- change_xy=(0.15, 0),
- emit_controller=arcade.EmitMaintainCount(60),
- particle_factory=lambda emitter: AnimatedAlphaParticle(
- filename_or_texture=random.choice(CLOUD_TEXTURES),
- change_xy=(_Vec2(arcade.rand_in_circle((0.0, 0.0), 0.04)) + _Vec2(0.1, 0)).as_tuple(),
- start_alpha=0,
- duration1=random.uniform(5.0, 10.0),
- mid_alpha=255,
- duration2=random.uniform(5.0, 10.0),
- end_alpha=0,
- center_xy=arcade.rand_in_circle((0.0, 0.0), 50)
- )
- )
- self.emitters.append(self.cloud)
-
- def launch_firework(self, delta_time):
- self.frametime_plotter.add_event("launch")
- launchers = (
- self.launch_random_firework,
- self.launch_ringed_firework,
- self.launch_sparkle_firework,
- )
- random.choice(launchers)(delta_time)
- pyglet.clock.schedule_once(self.launch_firework, random.uniform(LAUNCH_INTERVAL_MIN, LAUNCH_INTERVAL_MAX))
-
- def launch_random_firework(self, delta_time):
- """Simple firework that explodes in a random color"""
- rocket = make_rocket(self.explode_firework)
- self.emitters.append(rocket)
-
- def launch_ringed_firework(self, delta_time):
- """"Firework that has a basic explosion and a ring of sparks of a different color"""
- rocket = make_rocket(self.explode_ringed_firework)
- self.emitters.append(rocket)
-
- def launch_sparkle_firework(self, delta_time):
- """Firework which has sparks that sparkle"""
- rocket = make_rocket(self.explode_sparkle_firework)
- self.emitters.append(rocket)
-
- def launch_spinner(self, delta_time):
- """Start the spinner that throws sparks"""
- spinner1 = make_spinner()
- spinner2 = make_spinner()
- spinner2.angle = 180
- self.emitters.append(spinner1)
- self.emitters.append(spinner2)
-
- def explode_firework(self, prev_emitter):
- """Actions that happen when a firework shell explodes, resulting in a typical firework"""
- self.emitters.append(make_puff(prev_emitter))
- self.emitters.append(make_flash(prev_emitter))
-
- spark_texture = random.choice(SPARK_TEXTURES)
- sparks = arcade.Emitter(
- center_xy=prev_emitter.get_pos(),
- emit_controller=arcade.EmitBurst(random.randint(30, 40)),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=spark_texture,
- change_xy=arcade.rand_in_circle((0.0, 0.0), 9.0),
- lifetime=random.uniform(0.5, 1.2),
- mutation_callback=firework_spark_mutator
- )
- )
- self.emitters.append(sparks)
-
- def explode_ringed_firework(self, prev_emitter):
- """Actions that happen when a firework shell explodes, resulting in a ringed firework"""
- self.emitters.append(make_puff(prev_emitter))
- self.emitters.append(make_flash(prev_emitter))
-
- spark_texture, ring_texture = random.choice(SPARK_PAIRS)
- sparks = arcade.Emitter(
- center_xy=prev_emitter.get_pos(),
- emit_controller=arcade.EmitBurst(25),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=spark_texture,
- change_xy=arcade.rand_in_circle((0.0, 0.0), 8.0),
- lifetime=random.uniform(0.55, 0.8),
- mutation_callback=firework_spark_mutator
- )
- )
- self.emitters.append(sparks)
-
- ring = arcade.Emitter(
- center_xy=prev_emitter.get_pos(),
- emit_controller=arcade.EmitBurst(20),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=ring_texture,
- change_xy=arcade.rand_on_circle((0.0, 0.0), 5.0) + arcade.rand_in_circle((0.0, 0.0), 0.25),
- lifetime=random.uniform(1.0, 1.6),
- mutation_callback=firework_spark_mutator
- )
- )
- self.emitters.append(ring)
-
- def explode_sparkle_firework(self, prev_emitter):
- """Actions that happen when a firework shell explodes, resulting in a sparkling firework"""
- self.emitters.append(make_puff(prev_emitter))
- self.emitters.append(make_flash(prev_emitter))
-
- spark_texture = random.choice(SPARK_TEXTURES)
- sparks = arcade.Emitter(
- center_xy=prev_emitter.get_pos(),
- emit_controller=arcade.EmitBurst(random.randint(30, 40)),
- particle_factory=lambda emitter: AnimatedAlphaParticle(
- filename_or_texture=spark_texture,
- change_xy=arcade.rand_in_circle((0.0, 0.0), 9.0),
- start_alpha=255,
- duration1=random.uniform(0.6, 1.0),
- mid_alpha=0,
- duration2=random.uniform(0.1, 0.2),
- end_alpha=255,
- mutation_callback=firework_spark_mutator
- )
- )
- self.emitters.append(sparks)
-
- def update(self, delta_time):
- # prevent list from being mutated (often by callbacks) while iterating over it
- emitters_to_update = self.emitters.copy()
- # update cloud
- if self.cloud.center_x > SCREEN_WIDTH:
- self.cloud.center_x = 0
- # update
- for e in emitters_to_update:
- e.update()
- # remove emitters that can be reaped
- to_del = [e for e in emitters_to_update if e.can_reap()]
- for e in to_del:
- self.emitters.remove(e)
- self.frametime_plotter.end_frame(delta_time)
-
- def on_draw(self):
- arcade.start_render()
- for e in self.emitters:
- e.draw()
- arcade.draw_lrtb_rectangle_filled(0, SCREEN_WIDTH, 25, 0, arcade.color.DARK_GREEN)
- mid = SCREEN_WIDTH / 2
- arcade.draw_lrtb_rectangle_filled(mid - 2, mid + 2, SPINNER_HEIGHT, 10, arcade.color.DARK_BROWN)
-
- def on_key_press(self, key, modifiers):
- if key == arcade.key.ESCAPE:
- arcade.close_window()
-
-
-def firework_spark_mutator(particle: arcade.FadeParticle):
- """mutation_callback shared by all fireworks sparks"""
- # gravity
- particle.change_y += -0.03
- # drag
- particle.change_x *= 0.92
- particle.change_y *= 0.92
-
-
-def rocket_smoke_mutator(particle: arcade.LifetimeParticle):
- particle.scale = arcade.lerp(0.5, 3.0, particle.lifetime_elapsed / particle.lifetime_original)
- # A Sprite's scale doesn't affect generated textures
- # (ex: make_soft_circle_texture) or scale being animated over time.
- # The fix below is copied from Sprite.update_animation().
- # Bug may have been recorded here: https://github.com/pvcraven/arcade/issues/331
- particle.width = particle._texture.width * particle.scale
- particle.height = particle._texture.height * particle.scale
-
-
-if __name__ == "__main__":
- app = FireworksApp()
- arcade.run()
- app.frametime_plotter.show()
diff --git a/arcade/examples/particle_stress.py b/arcade/examples/particle_stress.py
deleted file mode 100644
index 2e63b9e..0000000
--- a/arcade/examples/particle_stress.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""
-Particle system stress test
-
-Run a particle system that spawns, updates, draws and reaps many particles every frame for performance testing.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_list_particle_fireworks
-"""
-import os
-import arcade
-from arcade.examples.frametime_plotter import FrametimePlotter
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Particle stress test"
-TEXTURE = "images/pool_cue_ball.png"
-
-
-def make_emitter():
- return arcade.Emitter(
- center_xy=(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2),
- emit_controller=arcade.EmitterIntervalWithTime(0.0004, 15.0),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), 5.0),
- lifetime=1.0,
- scale=0.5,
- alpha=128
- )
- )
-
-
-class MyGame(arcade.Window):
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- self.emitter = make_emitter()
- arcade.set_background_color(arcade.color.BLACK)
- self.frametime_plotter = FrametimePlotter()
-
- def update(self, delta_time):
- self.emitter.update()
- if self.emitter.can_reap():
- arcade.close_window()
- self.frametime_plotter.end_frame(delta_time)
-
- def on_draw(self):
- arcade.start_render()
- self.emitter.draw()
-
-
-if __name__ == "__main__":
- app = MyGame()
- arcade.run()
- app.frametime_plotter.show()
diff --git a/arcade/examples/particle_systems.py b/arcade/examples/particle_systems.py
deleted file mode 100644
index fa880be..0000000
--- a/arcade/examples/particle_systems.py
+++ /dev/null
@@ -1,775 +0,0 @@
-"""
-Particle Systems
-
-Demonstrate how to use the Emitter and Particle classes to create particle systems.
-
-Demonstrate the different effects possible with Emitter's and Particle's by showing
-a number of different emitters in sequence, with each example often varying just one
-setting from the previous example.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_list_particle_systems
-"""
-import arcade
-from arcade.examples.frametime_plotter import FrametimePlotter
-import pyglet
-import os
-import random
-import math
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Particle System Examples"
-QUIET_BETWEEN_SPAWNS = 0.25 # time between spawning another particle system
-EMITTER_TIMEOUT = 10 * 60
-CENTER_POS = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)
-BURST_PARTICLE_COUNT = 500
-TEXTURE = "images/pool_cue_ball.png"
-TEXTURE2 = "images/playerShip3_orange.png"
-TEXTURE3 = "images/bumper.png"
-TEXTURE4 = "images/wormGreen.png"
-TEXTURE5 = "images/meteorGrey_med1.png"
-TEXTURE6 = "images/character.png"
-TEXTURE7 = "images/boxCrate_double.png"
-DEFAULT_SCALE = 0.3
-DEFAULT_ALPHA = 32
-DEFAULT_PARTICLE_LIFETIME = 3.0
-PARTICLE_SPEED_FAST = 1.0
-PARTICLE_SPEED_SLOW = 0.3
-DEFAULT_EMIT_INTERVAL = 0.003
-DEFAULT_EMIT_DURATION = 1.5
-
-
-# Utils
-def sine_wave(t, min_x, max_x, wavelength):
- spread = max_x - min_x
- mid = (max_x + min_x) / 2
- return (spread / 2) * math.sin(2 * math.pi * t / wavelength) + mid
-
-
-# Example emitters
-def emitter_0():
- """Burst, emit from center, particle with lifetime"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_0.__doc__, e
-
-
-def emitter_1():
- """Burst, emit from center, particle lifetime 1.0 seconds"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=1.0,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_1.__doc__, e
-
-
-def emitter_2():
- """Burst, emit from center, particle lifetime random in range"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=random.uniform(DEFAULT_PARTICLE_LIFETIME - 1.0, DEFAULT_PARTICLE_LIFETIME),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_2.__doc__, e
-
-
-def emitter_3():
- """Burst, emit in circle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_in_circle((0.0, 0.0), 100),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_3.__doc__, e
-
-
-def emitter_4():
- """Burst, emit on circle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_on_circle((0.0, 0.0), 100),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_4.__doc__, e
-
-
-def emitter_5():
- """Burst, emit in rectangle"""
- width, height = 200, 100
- centering_offset = (-width / 2, -height / 2)
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_in_rect(centering_offset, width, height),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_5.__doc__, e
-
-
-def emitter_6():
- """Burst, emit on line"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_on_line((0.0, 0.0), (SCREEN_WIDTH, SCREEN_HEIGHT)),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_6.__doc__, e
-
-
-def emitter_7():
- """Burst, emit from center, velocity fixed speed around 360 degrees"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_on_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_7.__doc__, e
-
-
-def emitter_8():
- """Burst, emit from center, velocity in rectangle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_rect((-2.0, -2.0), 4.0, 4.0),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_8.__doc__, e
-
-
-def emitter_9():
- """Burst, emit from center, velocity in fixed angle and random speed"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_vec_magnitude(45, 1.0, 4.0),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_9.__doc__, e
-
-
-def emitter_10():
- """Burst, emit from center, velocity from angle with spread"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_vec_spread_deg(90, 45, 2.0),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_10.__doc__, e
-
-
-def emitter_11():
- """Burst, emit from center, velocity along a line"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_on_line((-2, 1), (2, 1)),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_11.__doc__, e
-
-
-def emitter_12():
- """Infinite emitting w/ eternal particle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitInterval(0.02),
- particle_factory=lambda emitter: arcade.EternalParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_12.__doc__, e
-
-
-def emitter_13():
- """Interval, emit particle every 0.01 seconds for one second"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_13.__doc__, e
-
-
-def emitter_14():
- """Interval, emit from center, particle lifetime 1.0 seconds"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=1.0,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_14.__doc__, e
-
-
-def emitter_15():
- """Interval, emit from center, particle lifetime random in range"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=random.uniform(DEFAULT_PARTICLE_LIFETIME - 1.0, DEFAULT_PARTICLE_LIFETIME),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_15.__doc__, e
-
-
-def emitter_16():
- """Interval, emit in circle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_in_circle((0.0, 0.0), 100),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_16.__doc__, e
-
-
-def emitter_17():
- """Interval, emit on circle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_on_circle((0.0, 0.0), 100),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_17.__doc__, e
-
-
-def emitter_18():
- """Interval, emit in rectangle"""
- width, height = 200, 100
- centering_offset = (-width / 2, -height / 2)
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_in_rect(centering_offset, width, height),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_18.__doc__, e
-
-
-def emitter_19():
- """Interval, emit on line"""
- e = arcade.Emitter(
- center_xy=(0.0, 0.0),
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- center_xy=arcade.rand_on_line((0.0, 0.0), (SCREEN_WIDTH, SCREEN_HEIGHT)),
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_19.__doc__, e
-
-
-def emitter_20():
- """Interval, emit from center, velocity fixed speed around 360 degrees"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_on_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_20.__doc__, e
-
-
-def emitter_21():
- """Interval, emit from center, velocity in rectangle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_rect((-2.0, -2.0), 4.0, 4.0),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_21.__doc__, e
-
-
-def emitter_22():
- """Interval, emit from center, velocity in fixed angle and speed"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(0.2, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=(1.0, 1.0),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=128
- )
- )
- return emitter_22.__doc__, e
-
-
-def emitter_23():
- """Interval, emit from center, velocity in fixed angle and random speed"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL * 8, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_vec_magnitude(45, 1.0, 4.0),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_23.__doc__, e
-
-
-def emitter_24():
- """Interval, emit from center, velocity from angle with spread"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_vec_spread_deg(90, 45, 2.0),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_24.__doc__, e
-
-
-def emitter_25():
- """Interval, emit from center, velocity along a line"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_on_line((-2, 1), (2, 1)),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_25.__doc__, e
-
-
-def emitter_26():
- """Interval, emit particles every 0.4 seconds and stop after emitting 5"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithCount(0.4, 5),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=0.6,
- alpha=128
- )
- )
- return emitter_26.__doc__, e
-
-
-def emitter_27():
- """Maintain a steady count of particles"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitMaintainCount(3),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_on_circle((0.0, 0.0), 2.0),
- lifetime=random.uniform(1.0, 3.0),
- )
- )
- return emitter_27.__doc__, e
-
-
-def emitter_28():
- """random particle textures"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=random.choice((TEXTURE, TEXTURE2, TEXTURE3)),
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE
- )
- )
- return emitter_28.__doc__, e
-
-
-def emitter_29():
- """random particle scale"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=random.uniform(0.1, 0.8),
- alpha=DEFAULT_ALPHA
- )
- )
- return emitter_29.__doc__, e
-
-
-def emitter_30():
- """random particle alpha"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE,
- alpha=random.uniform(32, 128)
- )
- )
- return emitter_30.__doc__, e
-
-
-def emitter_31():
- """Constant particle angle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE2,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- angle=45,
- scale=DEFAULT_SCALE
- )
- )
- return emitter_31.__doc__, e
-
-
-def emitter_32():
- """animate particle angle"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE2,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- change_angle=2,
- scale=DEFAULT_SCALE
- )
- )
- return emitter_32.__doc__, e
-
-
-def emitter_33():
- """Particles that fade over time"""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE
- )
- )
- return emitter_33.__doc__, e
-
-
-def emitter_34():
- """Dynamically generated textures, burst emitting, fading particles"""
- textures = [arcade.make_soft_circle_texture(48, p) for p in (arcade.color.GREEN, arcade.color.BLUE_GREEN)]
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=random.choice(textures),
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST),
- lifetime=DEFAULT_PARTICLE_LIFETIME,
- scale=DEFAULT_SCALE
- )
- )
- return emitter_34.__doc__, e
-
-
-def emitter_35():
- """Use most features"""
- soft_circle = arcade.make_soft_circle_texture(80, (255, 64, 64))
- textures = (TEXTURE, TEXTURE2, TEXTURE3, TEXTURE4, TEXTURE5, TEXTURE6, TEXTURE7, soft_circle)
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(0.01, 1.0),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=random.choice(textures),
- change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST * 2),
- lifetime=random.uniform(1.0, 3.5),
- angle=random.uniform(0, 360),
- change_angle=random.uniform(-3, 3),
- scale=random.uniform(0.1, 0.8)
- )
- )
- return emitter_35.__doc__, e
-
-
-def emitter_36():
- """Moving emitter. Particles spawn relative to emitter."""
-
- class MovingEmitter(arcade.Emitter):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.elapsed = 0.0
-
- def update(self):
- super().update()
- self.elapsed += 1 / 60
- self.center_x = sine_wave(self.elapsed, 0, SCREEN_WIDTH, SCREEN_WIDTH / 100)
- self.center_y = sine_wave(self.elapsed, 0, SCREEN_HEIGHT, SCREEN_HEIGHT / 100)
-
- e = MovingEmitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitInterval(0.005),
- particle_factory=lambda emitter: arcade.FadeParticle(
- filename_or_texture=TEXTURE,
- change_xy=arcade.rand_in_circle((0.0, 0.0), 0.1),
- lifetime=random.uniform(1.5, 5.5),
- scale=random.uniform(0.05, 0.2)
- )
- )
- return emitter_36.__doc__, e
-
-
-def emitter_37():
- """Rotating emitter. Particles initial velocity is relative to emitter's angle."""
- e = arcade.Emitter(
- center_xy=CENTER_POS,
- emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION),
- particle_factory=lambda emitter: arcade.LifetimeParticle(
- filename_or_texture=TEXTURE,
- change_xy=(0.0, 2.0),
- lifetime=2.0,
- scale=DEFAULT_SCALE
- )
- )
- e.change_angle = 10.0
- return emitter_37.__doc__, e
-
-
-def emitter_38():
- """Use simple emitter interface to create a burst emitter"""
- e = arcade.make_burst_emitter(
- center_xy=CENTER_POS,
- filenames_and_textures=(TEXTURE, TEXTURE3, TEXTURE4),
- particle_count=50,
- particle_speed=2.5,
- particle_lifetime_min=1.0,
- particle_lifetime_max=2.5,
- particle_scale=0.3,
- fade_particles=True
- )
- return emitter_38.__doc__, e
-
-
-def emitter_39():
- """Use simple emitter interface to create an interval emitter"""
- e = arcade.make_interval_emitter(
- center_xy=CENTER_POS,
- filenames_and_textures=(TEXTURE, TEXTURE3, TEXTURE4),
- emit_interval=0.01,
- emit_duration=2.0,
- particle_speed=1.5,
- particle_lifetime_min=1.0,
- particle_lifetime_max=3.0,
- particle_scale=0.2,
- fade_particles=True
- )
- return emitter_39.__doc__, e
-
-
-class MyGame(arcade.Window):
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- arcade.set_background_color(arcade.color.BLACK)
-
- # collect particle factory functions
- self.factories = [v for k, v in globals().items() if k.startswith("emitter_")]
-
- self.emitter_factory_id = -1
- self.label = None
- self.emitter = None
- self.obj = arcade.Sprite("images/bumper.png", 0.2, center_x=0, center_y=15)
- self.obj.change_x = 3
- self.frametime_plotter = FrametimePlotter()
- pyglet.clock.schedule_once(self.next_emitter, QUIET_BETWEEN_SPAWNS)
-
- def next_emitter(self, time_delta):
- self.emitter_factory_id = (self.emitter_factory_id + 1) % len(self.factories)
- print("Changing emitter to {}".format(self.emitter_factory_id))
- self.emitter_timeout = 0
- self.label, self.emitter = self.factories[self.emitter_factory_id]()
- self.frametime_plotter.add_event("spawn {}".format(self.emitter_factory_id))
-
- def update(self, delta_time):
- if self.emitter:
- self.emitter_timeout += 1
- self.emitter.update()
- if self.emitter.can_reap() or self.emitter_timeout > EMITTER_TIMEOUT:
- self.frametime_plotter.add_event("reap")
- pyglet.clock.schedule_once(self.next_emitter, QUIET_BETWEEN_SPAWNS)
- self.emitter = None
- self.obj.update()
- if self.obj.center_x > SCREEN_WIDTH:
- self.obj.center_x = 0
- self.frametime_plotter.end_frame(delta_time)
-
- def on_draw(self):
- arcade.start_render()
- self.obj.draw()
- if self.label:
- arcade.draw_text("#{} {}".format(self.emitter_factory_id, self.label),
- SCREEN_WIDTH / 2, SCREEN_HEIGHT - 20,
- arcade.color.PALE_GOLD, 20, width=SCREEN_WIDTH, align="center",
- anchor_x="center", anchor_y="center")
- if self.emitter:
- self.emitter.draw()
- arcade.draw_text("Particles: " + str(len(self.emitter._particles)), 10, 30, arcade.color.PALE_GOLD, 12)
-
- def on_key_press(self, key, modifiers):
- if key == arcade.key.ESCAPE:
- arcade.close_window()
-
-
-if __name__ == "__main__":
- game = MyGame()
- arcade.run()
- game.frametime_plotter.show()
diff --git a/arcade/examples/perf_test/stress_test_charts.py b/arcade/examples/perf_test/stress_test_charts.py
deleted file mode 100644
index 2ea1c25..0000000
--- a/arcade/examples/perf_test/stress_test_charts.py
+++ /dev/null
@@ -1,143 +0,0 @@
-import csv
-import matplotlib.pyplot as plt
-
-SPRITE_COUNT = 1
-PROCESSING_TIME = 3
-DRAWING_TIME = 4
-
-
-def read_results(filename):
- results = []
- with open(filename) as csv_file:
- csv_reader = csv.reader(csv_file, delimiter=',')
- line_count = 0
- for row in csv_reader:
- results.append([float(cell) for cell in row])
- return results
-
-
-def chart_stress_test_draw_moving_pygame():
- results = read_results("stress_test_draw_moving_pygame.csv")
-
- sprite_count = [row[SPRITE_COUNT] for row in results]
- processing_time = [row[PROCESSING_TIME] for row in results]
- drawing_time = [row[DRAWING_TIME] for row in results]
-
- # Plot our results
- plt.title("Moving and Drawing Sprites In Pygame")
- plt.plot(sprite_count, processing_time, label="Processing Time")
- plt.plot(sprite_count, drawing_time, label="Drawing Time")
-
- plt.legend(loc='upper left', shadow=True, fontsize='x-large')
-
- plt.ylabel('Time')
- plt.xlabel('Sprite Count')
-
- plt.savefig("chart_stress_test_draw_moving_pygame.svg")
- # plt.show()
- plt.clf()
-
-
-def chart_stress_test_draw_moving_arcade():
- results = read_results("stress_test_draw_moving.csv")
-
- sprite_count = [row[SPRITE_COUNT] for row in results]
- processing_time = [row[PROCESSING_TIME] for row in results]
- drawing_time = [row[DRAWING_TIME] for row in results]
-
- # Plot our results
- plt.title("Moving and Drawing Sprites In Arcade")
- plt.plot(sprite_count, processing_time, label="Processing Time")
- plt.plot(sprite_count, drawing_time, label="Drawing Time")
-
- plt.legend(loc='upper left', shadow=True, fontsize='x-large')
-
- plt.ylabel('Time')
- plt.xlabel('Sprite Count')
-
- # plt.show()
- plt.savefig("chart_stress_test_draw_moving_arcade.svg")
- plt.clf()
-
-
-def chart_stress_test_draw_moving_draw_comparison():
- r1 = read_results("stress_test_draw_moving.csv")
- r2 = read_results("stress_test_draw_moving_pygame.csv")
-
- sprite_count = [row[SPRITE_COUNT] for row in r1]
- d1 = [row[DRAWING_TIME] for row in r1]
- d2 = [row[DRAWING_TIME] for row in r2]
-
- # Plot our results
- plt.title("Drawing Sprites - Arcade vs. Pygame")
- plt.plot(sprite_count, d1, label="Drawing Time Arcade")
- plt.plot(sprite_count, d2, label="Drawing Time Pygame")
-
- plt.legend(loc='upper left', shadow=True, fontsize='x-large')
-
- plt.ylabel('Time')
- plt.xlabel('Sprite Count')
-
- # plt.show()
- plt.savefig("chart_stress_test_draw_moving_draw_comparison.svg")
- plt.clf()
-
-
-def chart_stress_test_draw_moving_process_comparison():
- r1 = read_results("stress_test_draw_moving_arcade.csv")
- r2 = read_results("stress_test_draw_moving_pygame.csv")
-
- sprite_count = [row[SPRITE_COUNT] for row in r1]
- d1 = [row[PROCESSING_TIME] for row in r1]
- d2 = [row[PROCESSING_TIME] for row in r2]
-
- # Plot our results
- plt.title("Moving Sprites - Arcade vs. Pygame")
- plt.plot(sprite_count, d1, label="Processing Time Arcade")
- plt.plot(sprite_count, d2, label="Processing Time Pygame")
-
- plt.legend(loc='upper left', shadow=True, fontsize='x-large')
-
- plt.ylabel('Time')
- plt.xlabel('Sprite Count')
-
- # plt.show()
- plt.savefig("chart_stress_test_draw_moving_process_comparison.svg")
- plt.clf()
-
-
-def chart_stress_test_collision_comparison():
- r1 = read_results("stress_test_collision_arcade.csv")
- r2 = read_results("stress_test_collision_arcade_spatial.csv")
- r3 = read_results("stress_test_collision_pygame.csv")
-
- sprite_count = [row[SPRITE_COUNT] for row in r1]
- d1 = [row[PROCESSING_TIME] for row in r1]
- d2 = [row[PROCESSING_TIME] for row in r2]
- d3 = [row[PROCESSING_TIME] for row in r3]
-
- # Plot our results
- plt.title("Colliding Sprites - Arcade vs Pygame")
- plt.plot(sprite_count, d1, label="Processing Time Arcade Normal")
- plt.plot(sprite_count, d2, label="Processing Time Arcade Spatial")
- plt.plot(sprite_count, d3, label="Processing Time Pygame")
-
- plt.legend(loc='upper left', shadow=True, fontsize='x-large')
-
- plt.ylabel('Time')
- plt.xlabel('Sprite Count')
-
- # plt.show()
- plt.savefig("chart_stress_test_collision_comparison.svg")
- plt.clf()
-
-
-def main():
- chart_stress_test_draw_moving_pygame()
- chart_stress_test_draw_moving_arcade()
- chart_stress_test_draw_moving_draw_comparison()
- chart_stress_test_draw_moving_process_comparison()
- chart_stress_test_collision_comparison()
-
-
-main()
diff --git a/arcade/examples/perf_test/stress_test_collision_arcade.py b/arcade/examples/perf_test/stress_test_collision_arcade.py
deleted file mode 100644
index f91a760..0000000
--- a/arcade/examples/perf_test/stress_test_collision_arcade.py
+++ /dev/null
@@ -1,216 +0,0 @@
-"""
-Moving Sprite Stress Test
-
-Simple program to test how fast we can draw sprites that are moving
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.stress_test_draw_moving
-"""
-
-import arcade
-import random
-import os
-import timeit
-import time
-import collections
-import pyglet
-
-# --- Constants ---
-SPRITE_SCALING_COIN = 0.09
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_NATIVE_SIZE = 128
-SPRITE_SIZE = int(SPRITE_NATIVE_SIZE * SPRITE_SCALING_COIN)
-COIN_COUNT_INCREMENT = 500
-
-STOP_COUNT = 12000
-RESULTS_FILE = "stress_test_collision_arcade.csv"
-
-SCREEN_WIDTH = 1800
-SCREEN_HEIGHT = 1000
-SCREEN_TITLE = "Moving Sprite Stress Test"
-
-
-class FPSCounter:
- def __init__(self):
- self.time = time.perf_counter()
- self.frame_times = collections.deque(maxlen=60)
-
- def tick(self):
- t1 = time.perf_counter()
- dt = t1 - self.time
- self.time = t1
- self.frame_times.append(dt)
-
- def get_fps(self):
- total_time = sum(self.frame_times)
- if total_time == 0:
- return 0
- else:
- return len(self.frame_times) / sum(self.frame_times)
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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.coin_list = None
- self.player_list = None
- self.player = None
-
- self.processing_time = 0
- self.draw_time = 0
- self.program_start_time = timeit.default_timer()
- self.sprite_count_list = []
- self.fps_list = []
- self.processing_time_list = []
- self.drawing_time_list = []
- self.last_fps_reading = 0
- self.fps = FPSCounter()
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Open file to save timings
- self.results_file = open(RESULTS_FILE, "w")
-
- def add_coins(self):
-
- # Create the coins
- for i in range(COIN_COUNT_INCREMENT):
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("../images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SPRITE_SIZE, SCREEN_WIDTH - SPRITE_SIZE)
- coin.center_y = random.randrange(SPRITE_SIZE, SCREEN_HEIGHT - SPRITE_SIZE)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.coin_list = arcade.SpriteList(use_spatial_hash=False)
- self.player_list = arcade.SpriteList()
- self.player = arcade.Sprite("../images/character.png", SPRITE_SCALING_PLAYER)
- self.player.center_x = random.randrange(SCREEN_WIDTH)
- self.player.center_y = random.randrange(SCREEN_HEIGHT)
- self.player.change_x = 3
- self.player.change_y = 5
- self.player_list.append(self.player)
-
- def on_draw(self):
- """ Draw everything """
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- arcade.start_render()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Display info on sprites
- output = f"Sprite count: {len(self.coin_list):,}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 20, arcade.color.BLACK, 16)
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.BLACK, 16)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 60, arcade.color.BLACK, 16)
-
- fps = self.fps.get_fps()
- output = f"FPS: {fps:3.0f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 80, arcade.color.BLACK, 16)
-
- self.draw_time = timeit.default_timer() - draw_start_time
- self.fps.tick()
-
- def update(self, delta_time):
- # Start update timer
-
- start_time = timeit.default_timer()
-
- self.player_list.update()
- if self.player.center_x < 0 and self.player.change_x < 0:
- self.player.change_x *= -1
- if self.player.center_y < 0 and self.player.change_y < 0:
- self.player.change_y *= -1
-
- if self.player.center_x > SCREEN_WIDTH and self.player.change_x > 0:
- self.player.change_x *= -1
- if self.player.center_y > SCREEN_HEIGHT and self.player.change_y > 0:
- self.player.change_y *= -1
-
- coin_hit_list = arcade.check_for_collision_with_list(self.player, self.coin_list)
- for coin in coin_hit_list:
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
- # Total time program has been running
- total_program_time = int(timeit.default_timer() - self.program_start_time)
-
- # Print out stats, or add more sprites
- if total_program_time > self.last_fps_reading:
- self.last_fps_reading = total_program_time
-
- # It takes the program a while to "warm up", so the first
- # few seconds our readings will be off. So wait some time
- # before taking readings
- if total_program_time > 5:
-
- # We want the program to run for a while before taking
- # timing measurements. We don't want the time it takes
- # to add new sprites to be part of that measurement. So
- # make sure we have a clear second of nothing but
- # running the sprites, and not adding the sprites.
- if total_program_time % 2 == 1:
-
- output = f"{total_program_time}, {len(self.coin_list)}, {self.fps.get_fps():.1f}, {self.processing_time:.4f}, {self.draw_time:.4f}\n"
- print(output, end="")
- self.results_file.write(output)
-
- if len(self.coin_list) >= STOP_COUNT:
- pyglet.app.exit()
- return
-
- # Take timings
- print(
- f"{total_program_time}, {len(self.coin_list)}, {self.fps.get_fps():.1f}, {self.processing_time:.4f}, {self.draw_time:.4f}")
- self.sprite_count_list.append(len(self.coin_list))
- self.fps_list.append(round(self.fps.get_fps(), 1))
- self.processing_time_list.append(self.processing_time)
- self.drawing_time_list.append(self.draw_time)
-
- # Now add the coins
- self.add_coins()
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/perf_test/stress_test_collision_pygame.py b/arcade/examples/perf_test/stress_test_collision_pygame.py
deleted file mode 100644
index caaa5e7..0000000
--- a/arcade/examples/perf_test/stress_test_collision_pygame.py
+++ /dev/null
@@ -1,296 +0,0 @@
-"""
-Sample Python/Pygame Programs
-Simpson College Computer Science
-http://programarcadegames.com/
-http://simpson.edu/computer-science/
-"""
-
-import pygame
-import random
-import os
-import time
-import timeit
-import collections
-
-# Define some colors
-BLACK = (0, 0, 0)
-WHITE = (255, 255, 255)
-RED = (255, 0, 0)
-
-# --- Constants ---
-SPRITE_SCALING_COIN = 0.09
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_NATIVE_SIZE = 128
-SPRITE_SIZE = int(SPRITE_NATIVE_SIZE * SPRITE_SCALING_COIN)
-COIN_COUNT_INCREMENT = 500
-
-STOP_COUNT = 12000
-RESULTS_FILE = "stress_test_collision_pygame.csv"
-
-SCREEN_WIDTH = 1800
-SCREEN_HEIGHT = 1000
-SCREEN_TITLE = "Moving Sprite Stress Test"
-
-
-class FPSCounter:
- def __init__(self):
- self.time = time.perf_counter()
- self.frame_times = collections.deque(maxlen=60)
-
- def tick(self):
- t1 = time.perf_counter()
- dt = t1 - self.time
- self.time = t1
- self.frame_times.append(dt)
-
- def get_fps(self):
- total_time = sum(self.frame_times)
- if total_time == 0:
- return 0
- else:
- return len(self.frame_times) / sum(self.frame_times)
-
-
-class Coin(pygame.sprite.Sprite):
- """
- This class represents the ball
- It derives from the "Sprite" class in Pygame
- """
-
- def __init__(self):
- """ Constructor. Pass in the color of the block,
- and its x and y position. """
- # Call the parent class (Sprite) constructor
- super().__init__()
-
- # Create an image of the block, and fill it with a color.
- # This could also be an image loaded from the disk.
- image = pygame.image.load("../images/coin_01.png")
- rect = image.get_rect()
- image = pygame.transform.scale(image,
- (int(rect.width * SPRITE_SCALING_COIN), int(rect.height * SPRITE_SCALING_COIN)))
- self.image = image.convert()
- self.image.set_colorkey(BLACK)
-
- # Fetch the rectangle object that has the dimensions of the image
- # image.
- # Update the position of this object by setting the values
- # of rect.x and rect.y
- self.rect = self.image.get_rect()
-
-
-class Player(pygame.sprite.Sprite):
- """
- This class represents the ball
- It derives from the "Sprite" class in Pygame
- """
-
- def __init__(self):
- """ Constructor. Pass in the color of the block,
- and its x and y position. """
- # Call the parent class (Sprite) constructor
- super().__init__()
-
- # Create an image of the block, and fill it with a color.
- # This could also be an image loaded from the disk.
- image = pygame.image.load("../images/character.png")
- rect = image.get_rect()
- image = pygame.transform.scale(image, (
- int(rect.width * SPRITE_SCALING_PLAYER), int(rect.height * SPRITE_SCALING_PLAYER)))
- self.image = image.convert()
- self.image.set_colorkey(WHITE)
-
- # Fetch the rectangle object that has the dimensions of the image
- # image.
- # Update the position of this object by setting the values
- # of rect.x and rect.y
- self.rect = self.image.get_rect()
-
- def update(self):
- """ Called each frame. """
- self.rect.x += self.change_x
- self.rect.y += self.change_y
-
-
-class MyGame:
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
-
- # 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.coin_list = None
-
- self.processing_time = 0
- self.draw_time = 0
- self.program_start_time = timeit.default_timer()
- self.sprite_count_list = []
- self.fps_list = []
- self.processing_time_list = []
- self.drawing_time_list = []
- self.last_fps_reading = 0
- self.fps = FPSCounter()
-
- # Initialize Pygame
- pygame.init()
-
- # Set the height and width of the screen
- self.screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
-
- # This is a list of every sprite. All blocks and the player block as well.
- self.coin_list = pygame.sprite.Group()
- self.player_list = pygame.sprite.Group()
-
- # Create the player instance
- self.player = Player()
-
- self.player.rect.x = random.randrange(SPRITE_SIZE, SCREEN_WIDTH - SPRITE_SIZE)
- self.player.rect.y = random.randrange(SPRITE_SIZE, SCREEN_HEIGHT - SPRITE_SIZE)
- self.player.change_x = 3
- self.player.change_y = 5
-
- self.player_list.add(self.player)
-
- self.font = pygame.font.SysFont('Calibri', 25, True, False)
-
- # Open file to save timings
- self.results_file = open(RESULTS_FILE, "w")
-
- def add_coins(self):
-
- # Create the coins
- for i in range(COIN_COUNT_INCREMENT):
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin()
-
- # Position the coin
- coin.rect.x = random.randrange(SPRITE_SIZE, SCREEN_WIDTH - SPRITE_SIZE)
- coin.rect.y = random.randrange(SPRITE_SIZE, SCREEN_HEIGHT - SPRITE_SIZE)
-
- # Add the coin to the lists
- self.coin_list.add(coin)
-
- def on_draw(self):
- """ Draw everything """
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # Clear the screen
- self.screen.fill((59, 122, 87))
-
- # Draw all the spites
- self.coin_list.draw(self.screen)
- self.player_list.draw(self.screen)
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- text = self.font.render(output, True, BLACK)
- self.screen.blit(text, [20, SCREEN_HEIGHT - 40])
-
- output = f"Drawing time: {self.draw_time:.3f}"
- text = self.font.render(output, True, BLACK)
- self.screen.blit(text, [20, SCREEN_HEIGHT - 60])
-
- fps = self.fps.get_fps()
- output = f"FPS: {fps:3.0f}"
- text = self.font.render(output, True, BLACK)
- self.screen.blit(text, [20, SCREEN_HEIGHT - 80])
-
- pygame.display.flip()
-
- self.draw_time = timeit.default_timer() - draw_start_time
- self.fps.tick()
-
- def update(self, delta_time):
- # Start update timer
- self.player_list.update()
-
- if self.player.rect.x < 0 and self.player.change_x < 0:
- self.player.change_x *= -1
- if self.player.rect.y < 0 and self.player.change_y < 0:
- self.player.change_y *= -1
-
- if self.player.rect.x > SCREEN_WIDTH and self.player.change_x > 0:
- self.player.change_x *= -1
- if self.player.rect.y > SCREEN_HEIGHT and self.player.change_y > 0:
- self.player.change_y *= -1
-
- start_time = timeit.default_timer()
-
- coin_hit_list = pygame.sprite.spritecollide(self.player, self.coin_list, False)
- for coin in coin_hit_list:
- coin.rect.x = random.randrange(SCREEN_WIDTH)
- coin.rect.y = random.randrange(SCREEN_HEIGHT)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
- # Total time program has been running
- total_program_time = int(timeit.default_timer() - self.program_start_time)
-
- # Print out stats, or add more sprites
- if total_program_time > self.last_fps_reading:
- self.last_fps_reading = total_program_time
-
- # It takes the program a while to "warm up", so the first
- # few seconds our readings will be off. So wait some time
- # before taking readings
- if total_program_time > 5:
-
- # We want the program to run for a while before taking
- # timing measurements. We don't want the time it takes
- # to add new sprites to be part of that measurement. So
- # make sure we have a clear second of nothing but
- # running the sprites, and not adding the sprites.
- if total_program_time % 2 == 1:
-
- # Take timings
- output = f"{total_program_time}, {len(self.coin_list)}, {self.fps.get_fps():.1f}, {self.processing_time:.4f}, {self.draw_time:.4f}\n"
- print(output, end="")
- self.results_file.write(output)
-
- if len(self.coin_list) >= STOP_COUNT:
- pygame.event.post(pygame.event.Event(pygame.QUIT, {}))
- return
-
- self.sprite_count_list.append(len(self.coin_list))
- self.fps_list.append(round(self.fps.get_fps(), 1))
- self.processing_time_list.append(self.processing_time)
- self.drawing_time_list.append(self.draw_time)
-
- # Now add the coins
- self.add_coins()
-
-
-def main():
- """ Main method """
- window = MyGame()
-
- # Loop until the user clicks the close button.
- done = False
-
- # Used to manage how fast the screen updates
- clock = pygame.time.Clock()
-
- # -------- Main Program Loop -----------
- while not done:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- done = True
- window.update(0)
- window.on_draw()
- clock.tick(60)
-
- pygame.quit()
-
-
-main()
diff --git a/arcade/examples/perf_test/stress_test_draw_moving_arcade.py b/arcade/examples/perf_test/stress_test_draw_moving_arcade.py
deleted file mode 100644
index e295ff6..0000000
--- a/arcade/examples/perf_test/stress_test_draw_moving_arcade.py
+++ /dev/null
@@ -1,211 +0,0 @@
-"""
-Moving Sprite Stress Test
-
-Simple program to test how fast we can draw sprites that are moving
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.stress_test_draw_moving
-"""
-
-import random
-import arcade
-import os
-import timeit
-import time
-import collections
-import pyglet
-
-# --- Constants ---
-SPRITE_SCALING_COIN = 0.09
-SPRITE_NATIVE_SIZE = 128
-SPRITE_SIZE = int(SPRITE_NATIVE_SIZE * SPRITE_SCALING_COIN)
-COIN_COUNT_INCREMENT = 100
-
-STOP_COUNT = 6000
-RESULTS_FILE = "stress_test_draw_moving_arcade.csv"
-
-SCREEN_WIDTH = 1800
-SCREEN_HEIGHT = 1000
-SCREEN_TITLE = "Moving Sprite Stress Test"
-
-
-class FPSCounter:
- def __init__(self):
- self.time = time.perf_counter()
- self.frame_times = collections.deque(maxlen=60)
-
- def tick(self):
- t1 = time.perf_counter()
- dt = t1 - self.time
- self.time = t1
- self.frame_times.append(dt)
-
- def get_fps(self):
- total_time = sum(self.frame_times)
- if total_time == 0:
- return 0
- else:
- return len(self.frame_times) / sum(self.frame_times)
-
-
-class Coin(arcade.Sprite):
-
- def update(self):
- """
- Update the sprite.
- """
- self.position = (self.position[0] + self.change_x, self.position[1] + self.change_y)
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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.coin_list = None
-
- self.processing_time = 0
- self.draw_time = 0
- self.program_start_time = timeit.default_timer()
- self.sprite_count_list = []
- self.fps_list = []
- self.processing_time_list = []
- self.drawing_time_list = []
- self.last_fps_reading = 0
- self.fps = FPSCounter()
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Open file to save timings
- self.results_file = open(RESULTS_FILE, "w")
-
- def add_coins(self):
-
- # Create the coins
- for i in range(COIN_COUNT_INCREMENT):
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin("../images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SPRITE_SIZE, SCREEN_WIDTH - SPRITE_SIZE)
- coin.center_y = random.randrange(SPRITE_SIZE, SCREEN_HEIGHT - SPRITE_SIZE)
-
- coin.change_x = random.randrange(-3, 4)
- coin.change_y = random.randrange(-3, 4)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.coin_list = arcade.SpriteList(use_spatial_hash=False)
-
- def on_draw(self):
- """ Draw everything """
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- arcade.start_render()
- self.coin_list.draw()
-
- # Display info on sprites
- output = f"Sprite count: {len(self.coin_list):,}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 20, arcade.color.BLACK, 16)
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.BLACK, 16)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 60, arcade.color.BLACK, 16)
-
- fps = self.fps.get_fps()
- output = f"FPS: {fps:3.0f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 80, arcade.color.BLACK, 16)
-
- self.draw_time = timeit.default_timer() - draw_start_time
- self.fps.tick()
-
- def update(self, delta_time):
- # Start update timer
- start_time = timeit.default_timer()
-
- self.coin_list.update()
-
- for sprite in self.coin_list:
-
- if sprite.position[0] < 0:
- sprite.change_x *= -1
- elif sprite.position[0] > SCREEN_WIDTH:
- sprite.change_x *= -1
- if sprite.position[1] < 0:
- sprite.change_y *= -1
- elif sprite.position[1] > SCREEN_HEIGHT:
- sprite.change_y *= -1
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
- # Total time program has been running
- total_program_time = int(timeit.default_timer() - self.program_start_time)
-
- # Print out stats, or add more sprites
- if total_program_time > self.last_fps_reading:
- self.last_fps_reading = total_program_time
-
- # It takes the program a while to "warm up", so the first
- # few seconds our readings will be off. So wait some time
- # before taking readings
- if total_program_time > 5:
-
- # We want the program to run for a while before taking
- # timing measurements. We don't want the time it takes
- # to add new sprites to be part of that measurement. So
- # make sure we have a clear second of nothing but
- # running the sprites, and not adding the sprites.
- if total_program_time % 2 == 1:
-
- # Take timings
- output = f"{total_program_time}, {len(self.coin_list)}, {self.fps.get_fps():.1f}, {self.processing_time:.4f}, {self.draw_time:.4f}\n"
-
- self.results_file.write(output)
- print(output, end="")
- if len(self.coin_list) >= STOP_COUNT:
- pyglet.app.exit()
- return
-
- self.sprite_count_list.append(len(self.coin_list))
- self.fps_list.append(round(self.fps.get_fps(), 1))
- self.processing_time_list.append(self.processing_time)
- self.drawing_time_list.append(self.draw_time)
-
- # Now add the coins
- self.add_coins()
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/perf_test/stress_test_draw_moving_pygame.py b/arcade/examples/perf_test/stress_test_draw_moving_pygame.py
deleted file mode 100644
index 7503a1f..0000000
--- a/arcade/examples/perf_test/stress_test_draw_moving_pygame.py
+++ /dev/null
@@ -1,284 +0,0 @@
-"""
-Moving Sprite Stress Test
-
-Simple program to test how fast we can draw sprites that are moving
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.stress_test_draw_moving_pygame
-"""
-
-import pygame
-import random
-import os
-import timeit
-import time
-import collections
-
-import matplotlib.pyplot as plt
-
-# Define some colors
-BLACK = (0, 0, 0)
-WHITE = (255, 255, 255)
-RED = (255, 0, 0)
-
-# --- Constants ---
-SPRITE_SCALING_COIN = 0.09
-SPRITE_NATIVE_SIZE = 128
-SPRITE_SIZE = int(SPRITE_NATIVE_SIZE * SPRITE_SCALING_COIN)
-COIN_COUNT_INCREMENT = 100
-
-STOP_COUNT = 6000
-RESULTS_FILE = "stress_test_draw_moving_pygame.csv"
-
-SCREEN_WIDTH = 1800
-SCREEN_HEIGHT = 1000
-SCREEN_TITLE = "Moving Sprite Stress Test"
-
-
-class FPSCounter:
- def __init__(self):
- self.time = time.perf_counter()
- self.frame_times = collections.deque(maxlen=60)
-
- def tick(self):
- t1 = time.perf_counter()
- dt = t1 - self.time
- self.time = t1
- self.frame_times.append(dt)
-
- def get_fps(self):
- total_time = sum(self.frame_times)
- if total_time == 0:
- return 0
- else:
- return len(self.frame_times) / sum(self.frame_times)
-
-
-class Coin(pygame.sprite.Sprite):
- """
- This class represents the ball
- It derives from the "Sprite" class in Pygame
- """
-
- def __init__(self):
- """ Constructor. Pass in the color of the block,
- and its x and y position. """
- # Call the parent class (Sprite) constructor
- super().__init__()
-
- # Create an image of the block, and fill it with a color.
- # This could also be an image loaded from the disk.
- image = pygame.image.load("../images/coin_01.png")
- rect = image.get_rect()
- image = pygame.transform.scale(
- image,
- (int(rect.width * SPRITE_SCALING_COIN), int(rect.height * SPRITE_SCALING_COIN)))
- self.image = image.convert()
- self.image.set_colorkey(BLACK)
-
- # Fetch the rectangle object that has the dimensions of the image
- # image.
- # Update the position of this object by setting the values
- # of rect.x and rect.y
- self.rect = self.image.get_rect()
-
- # Instance variables for our current speed and direction
- self.change_x = 0
- self.change_y = 0
-
- def update(self):
- """ Called each frame. """
- self.rect.x += self.change_x
- self.rect.y += self.change_y
-
-
-class MyGame:
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
-
- # 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.coin_list = None
-
- self.processing_time = 0
- self.draw_time = 0
- self.program_start_time = timeit.default_timer()
- self.sprite_count_list = []
- self.fps_list = []
- self.processing_time_list = []
- self.drawing_time_list = []
- self.last_fps_reading = 0
- self.fps = FPSCounter()
-
- # Initialize Pygame
- pygame.init()
-
- # Set the height and width of the screen
- self.screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
-
- # This is a list of every sprite. All blocks and the player block as well.
- self.coin_list = pygame.sprite.Group()
-
- self.font = pygame.font.SysFont('Calibri', 25, True, False)
-
- # Open file to save timings
- self.results_file = open(RESULTS_FILE, "w")
-
- def add_coins(self):
-
- # Create the coins
- for i in range(COIN_COUNT_INCREMENT):
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin()
-
- # Position the coin
- coin.rect.x = random.randrange(SPRITE_SIZE, SCREEN_WIDTH - SPRITE_SIZE)
- coin.rect.y = random.randrange(SPRITE_SIZE, SCREEN_HEIGHT - SPRITE_SIZE)
-
- coin.change_x = random.randrange(-3, 4)
- coin.change_y = random.randrange(-3, 4)
-
- # Add the coin to the lists
- self.coin_list.add(coin)
-
- def on_draw(self):
- """ Draw everything """
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # Clear the screen
- self.screen.fill((59, 122, 87))
-
- # Draw all the spites
- self.coin_list.draw(self.screen)
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- text = self.font.render(output, True, BLACK)
- self.screen.blit(text, [20, SCREEN_HEIGHT - 40])
-
- output = f"Drawing time: {self.draw_time:.3f}"
- text = self.font.render(output, True, BLACK)
- self.screen.blit(text, [20, SCREEN_HEIGHT - 60])
-
- fps = self.fps.get_fps()
- output = f"FPS: {fps:3.0f}"
- text = self.font.render(output, True, BLACK)
- self.screen.blit(text, [20, SCREEN_HEIGHT - 80])
-
- pygame.display.flip()
-
- self.draw_time = timeit.default_timer() - draw_start_time
- self.fps.tick()
-
- def update(self, delta_time):
- # Start update timer
- start_time = timeit.default_timer()
-
- self.coin_list.update()
-
- for sprite in self.coin_list:
-
- if sprite.rect.x < 0:
- sprite.change_x *= -1
- elif sprite.rect.x > SCREEN_WIDTH:
- sprite.change_x *= -1
- if sprite.rect.y < 0:
- sprite.change_y *= -1
- elif sprite.rect.y > SCREEN_HEIGHT:
- sprite.change_y *= -1
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
- # Total time program has been running
- total_program_time = int(timeit.default_timer() - self.program_start_time)
-
- # Print out stats, or add more sprites
- if total_program_time > self.last_fps_reading:
- self.last_fps_reading = total_program_time
-
- # It takes the program a while to "warm up", so the first
- # few seconds our readings will be off. So wait some time
- # before taking readings
- if total_program_time > 5:
-
- # We want the program to run for a while before taking
- # timing measurements. We don't want the time it takes
- # to add new sprites to be part of that measurement. So
- # make sure we have a clear second of nothing but
- # running the sprites, and not adding the sprites.
- if total_program_time % 2 == 1:
-
- # Take timings
- output = f"{total_program_time}, {len(self.coin_list)}, {self.fps.get_fps():.1f}, {self.processing_time:.4f}, {self.draw_time:.4f}\n"
- print(output, end="")
- self.results_file.write(output)
-
- if len(self.coin_list) >= STOP_COUNT:
- pygame.event.post(pygame.event.Event(pygame.QUIT, {}))
- return
-
- self.sprite_count_list.append(len(self.coin_list))
- self.fps_list.append(round(self.fps.get_fps(), 1))
- self.processing_time_list.append(self.processing_time)
- self.drawing_time_list.append(self.draw_time)
-
- # Now add the coins
- self.add_coins()
-
-
-def main():
- """ Main method """
- window = MyGame()
-
- # Loop until the user clicks the close button.
- done = False
-
- # Used to manage how fast the screen updates
- clock = pygame.time.Clock()
-
- # -------- Main Program Loop -----------
- while not done:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- done = True
- window.update(0)
- window.on_draw()
- clock.tick(60)
-
- pygame.quit()
-
- # Plot our results
- plt.plot(window.sprite_count_list, window.processing_time_list, label="Processing Time")
- plt.plot(window.sprite_count_list, window.drawing_time_list, label="Drawing Time")
-
- plt.legend(loc='upper left', shadow=True, fontsize='x-large')
-
- plt.ylabel('Time')
- plt.xlabel('Sprite Count')
-
- plt.show()
-
- # Plot our results
- plt.plot(window.sprite_count_list, window.fps_list)
-
- plt.ylabel('FPS')
- plt.xlabel('Sprite Count')
-
- plt.show()
-
-
-main()
diff --git a/arcade/examples/perlin_noise_1.py b/arcade/examples/perlin_noise_1.py
deleted file mode 100644
index 57b0cbf..0000000
--- a/arcade/examples/perlin_noise_1.py
+++ /dev/null
@@ -1,162 +0,0 @@
-"""
-Perlin Noise 1
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.perlin_noise_1
-
-TODO: This code doesn't work properly, and isn't currently listed in the examples.
-"""
-import arcade
-import numpy as np
-from PIL import Image
-
-# Set how many rows and columns we will have
-ROW_COUNT = 30
-COLUMN_COUNT = 30
-
-# This sets the WIDTH and HEIGHT of each grid location
-WIDTH = 10
-HEIGHT = 10
-
-# This sets the margin between each cell
-# and on the edges of the screen.
-MARGIN = 2
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = (WIDTH + MARGIN) * COLUMN_COUNT + MARGIN
-SCREEN_HEIGHT = (HEIGHT + MARGIN) * ROW_COUNT + MARGIN
-SCREEN_TITLE = "Perlin Noise 1 Example"
-
-
-# Perlin noise generator from:
-# https://stackoverflow.com/questions/42147776/producing-2d-perlin-noise-with-numpy
-
-def perlin(x, y, seed=0):
- # permutation table
- np.random.seed(seed)
- p = np.arange(256, dtype=int)
- np.random.shuffle(p)
- p = np.stack([p, p]).flatten()
- # coordinates of the top-left
- xi = x.astype(int)
- yi = y.astype(int)
- # internal coordinates
- xf = x - xi
- yf = y - yi
- # fade factors
- u = fade(xf)
- v = fade(yf)
- # noise components
- n00 = gradient(p[p[xi] + yi], xf, yf)
- n01 = gradient(p[p[xi] + yi + 1], xf, yf - 1)
- n11 = gradient(p[p[xi + 1] + yi + 1], xf - 1, yf - 1)
- n10 = gradient(p[p[xi + 1] + yi], xf - 1, yf)
- # combine noises
- x1 = lerp(n00, n10, u)
- x2 = lerp(n01, n11, u) # FIX1: I was using n10 instead of n01
- return lerp(x1, x2, v) # FIX2: I also had to reverse x1 and x2 here
-
-
-def lerp(a, b, x):
- """linear interpolation"""
- return a + x * (b - a)
-
-
-def fade(t):
- """6t^5 - 15t^4 + 10t^3"""
- return 6 * t ** 5 - 15 * t ** 4 + 10 * t ** 3
-
-
-def gradient(h, x, y):
- """grad converts h to the right gradient vector and return the dot product with (x,y)"""
- vectors = np.array([[0, 1], [0, -1], [1, 0], [-1, 0]])
- g = vectors[h % 4]
- return g[:, :, 0] * x + g[:, :, 1] * y
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Set up the application.
- """
- super().__init__(width, height, title)
-
- self.shape_list = None
-
- arcade.set_background_color(arcade.color.BLACK)
-
- self.grid = None
- self.recreate_grid()
-
- def recreate_grid(self):
- lin = np.linspace(0, 5, ROW_COUNT, endpoint=False)
- y, x = np.meshgrid(lin, lin)
- self.grid = (perlin(x, y, seed=0))
-
- self.grid *= 255
- self.grid += 128
-
- # for row in range(ROW_COUNT):
- # for column in range(COLUMN_COUNT):
- # print(f"{self.grid[row][column]:5.2f} ", end="")
- # print()
-
- self.shape_list = arcade.ShapeElementList()
- for row in range(ROW_COUNT):
- for column in range(COLUMN_COUNT):
- color = self.grid[row][column], 0, 0
-
- x = (MARGIN + WIDTH) * column + MARGIN + WIDTH // 2
- y = (MARGIN + HEIGHT) * row + MARGIN + HEIGHT // 2
-
- current_rect = arcade.create_rectangle_filled(x, y, WIDTH, HEIGHT, color)
- self.shape_list.append(current_rect)
-
- im = Image.fromarray(np.uint8(self.grid), "L")
- im.save("test.png")
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- self.shape_list.draw()
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called when the user presses a mouse button.
- """
-
- # Change the x/y screen coordinates to grid coordinates
- column = x // (WIDTH + MARGIN)
- row = y // (HEIGHT + MARGIN)
-
- print(f"Click coordinates: ({x}, {y}). Grid coordinates: ({row}, {column})")
-
- # Make sure we are on-grid. It is possible to click in the upper right
- # corner in the margin and go to a grid location that doesn't exist
- if row < ROW_COUNT and column < COLUMN_COUNT:
-
- # Flip the location between 1 and 0.
- if self.grid[row][column] == 0:
- self.grid[row][column] = 1
- else:
- self.grid[row][column] = 0
-
- self.recreate_grid()
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/perlin_noise_2.py b/arcade/examples/perlin_noise_2.py
deleted file mode 100644
index 7f9d6aa..0000000
--- a/arcade/examples/perlin_noise_2.py
+++ /dev/null
@@ -1,154 +0,0 @@
-"""
-Perlin Noise 2
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.perlin_noise_2
-
-TODO: This code doesn't work properly, and isn't currently listed in the examples.
-"""
-import arcade
-import numpy as np
-from PIL import Image
-
-# Set how many rows and columns we will have
-ROW_COUNT = 30
-COLUMN_COUNT = 30
-
-# This sets the WIDTH and HEIGHT of each grid location
-WIDTH = 10
-HEIGHT = 10
-
-# This sets the margin between each cell
-# and on the edges of the screen.
-MARGIN = 2
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = (WIDTH + MARGIN) * COLUMN_COUNT + MARGIN
-SCREEN_HEIGHT = (HEIGHT + MARGIN) * ROW_COUNT + MARGIN
-SCREEN_TITLE = "Perlin Noise 2 Example"
-
-
-# Perlin noise generator from:
-# https://stackoverflow.com/questions/42147776/producing-2d-perlin-noise-with-numpy
-
-def perlin(x, y, seed=0):
- # permutation table
- np.random.seed(seed)
- p = np.arange(256, dtype=int)
- np.random.shuffle(p)
- p = np.stack([p, p]).flatten()
- # coordinates of the top-left
- xi = x.astype(int)
- yi = y.astype(int)
- # internal coordinates
- xf = x - xi
- yf = y - yi
- # fade factors
- u = fade(xf)
- v = fade(yf)
- # noise components
- n00 = gradient(p[p[xi] + yi], xf, yf)
- n01 = gradient(p[p[xi] + yi + 1], xf, yf - 1)
- n11 = gradient(p[p[xi + 1] + yi + 1], xf - 1, yf - 1)
- n10 = gradient(p[p[xi + 1] + yi], xf - 1, yf)
- # combine noises
- x1 = lerp(n00, n10, u)
- x2 = lerp(n01, n11, u) # FIX1: I was using n10 instead of n01
- return lerp(x1, x2, v) # FIX2: I also had to reverse x1 and x2 here
-
-
-def lerp(a, b, x):
- """linear interpolation"""
- return a + x * (b - a)
-
-
-def fade(t):
- """6t^5 - 15t^4 + 10t^3"""
- return 6 * t ** 5 - 15 * t ** 4 + 10 * t ** 3
-
-
-def gradient(h, x, y):
- """grad converts h to the right gradient vector and return the dot product with (x,y)"""
- vectors = np.array([[0, 1], [0, -1], [1, 0], [-1, 0]])
- g = vectors[h % 4]
- return g[:, :, 0] * x + g[:, :, 1] * y
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Set up the application.
- """
- super().__init__(width, height, title)
- self.background_list = None
- arcade.set_background_color(arcade.color.BLACK)
-
- self.grid = None
- self.recreate_grid()
-
- def recreate_grid(self):
- lin = np.linspace(0, 5, ROW_COUNT, endpoint=False)
- y, x = np.meshgrid(lin, lin)
- self.grid = (perlin(x, y, seed=0))
- self.grid *= 255
- self.grid += 128
-
- # for row in range(ROW_COUNT):
- # for column in range(COLUMN_COUNT):
- # print(f"{self.grid[row][column]:7.1f} ", end="")
- # print()
-
- im = Image.fromarray(np.uint8(self.grid), "L")
- background_sprite = arcade.Sprite()
- background_sprite.center_x = SCREEN_WIDTH / 2
- background_sprite.center_y = SCREEN_HEIGHT / 2
- background_sprite.append_texture(arcade.Texture("dynamic noise image", im))
- background_sprite.set_texture(0)
-
- self.background_list = arcade.SpriteList()
- self.background_list.append(background_sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
- self.background_list.draw()
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called when the user presses a mouse button.
- """
-
- # Change the x/y screen coordinates to grid coordinates
- column = x // (WIDTH + MARGIN)
- row = y // (HEIGHT + MARGIN)
-
- print(f"Click coordinates: ({x}, {y}). Grid coordinates: ({row}, {column})")
-
- # Make sure we are on-grid. It is possible to click in the upper right
- # corner in the margin and go to a grid location that doesn't exist
- if row < ROW_COUNT and column < COLUMN_COUNT:
-
- # Flip the location between 1 and 0.
- if self.grid[row][column] == 0:
- self.grid[row][column] = 1
- else:
- self.grid[row][column] = 0
-
- self.recreate_grid()
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/01_open_window.py b/arcade/examples/platform_tutorial/01_open_window.py
deleted file mode 100644
index 70359a7..0000000
--- a/arcade/examples/platform_tutorial/01_open_window.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
- pass
-
- def on_draw(self):
- """ Render the screen. """
-
- arcade.start_render()
- # Code to draw the screen goes here
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/02_draw_sprites.py b/arcade/examples/platform_tutorial/02_draw_sprites.py
deleted file mode 100644
index 05965be..0000000
--- a/arcade/examples/platform_tutorial/02_draw_sprites.py
+++ /dev/null
@@ -1,91 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 120
- self.player_list.append(self.player_sprite)
-
- # Create the ground
- # This shows using a loop to place multiple sprites horizontally
- for x in range(0, 1250, 64):
- wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
- wall.center_x = x
- wall.center_y = 32
- self.wall_list.append(wall)
-
- # Put some crates on the ground
- # This shows using a coordinate list to place sprites
- coordinate_list = [[512, 96],
- [256, 96],
- [768, 96]]
-
- for coordinate in coordinate_list:
- # Add a crate on the ground
- wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
- wall.position = coordinate
- self.wall_list.append(wall)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/03_user_control.py b/arcade/examples/platform_tutorial/03_user_control.py
deleted file mode 100644
index cdd9d4b..0000000
--- a/arcade/examples/platform_tutorial/03_user_control.py
+++ /dev/null
@@ -1,131 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our physics engine
- self.physics_engine = None
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 120
- self.player_list.append(self.player_sprite)
-
- # Create the ground
- # This shows using a loop to place multiple sprites horizontally
- for x in range(0, 1250, 64):
- wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
- wall.center_x = x
- wall.center_y = 32
- self.wall_list.append(wall)
-
- # Put some crates on the ground
- # This shows using a coordinate list to place sprites
- coordinate_list = [[512, 96],
- [256, 96],
- [768, 96]]
-
- for coordinate in coordinate_list:
- # Add a crate on the ground
- wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
- wall.position = coordinate
- self.wall_list.append(wall)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- self.player_sprite.change_y = PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.DOWN or key == arcade.key.S:
- self.player_sprite.change_y = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- self.player_sprite.change_y = 0
- elif key == arcade.key.DOWN or key == arcade.key.S:
- self.player_sprite.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/04_add_gravity.py b/arcade/examples/platform_tutorial/04_add_gravity.py
deleted file mode 100644
index 0a00b9f..0000000
--- a/arcade/examples/platform_tutorial/04_add_gravity.py
+++ /dev/null
@@ -1,130 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 5
-GRAVITY = 1
-PLAYER_JUMP_SPEED = 15
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our physics engine
- self.physics_engine = None
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 96
- self.player_list.append(self.player_sprite)
-
- # Create the ground
- # This shows using a loop to place multiple sprites horizontally
- for x in range(0, 1250, 64):
- wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
- wall.center_x = x
- wall.center_y = 32
- self.wall_list.append(wall)
-
- # Put some crates on the ground
- # This shows using a coordinate list to place sprites
- coordinate_list = [[512, 96],
- [256, 96],
- [768, 96]]
-
- for coordinate in coordinate_list:
- # Add a crate on the ground
- wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
- wall.position = coordinate
- self.wall_list.append(wall)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- GRAVITY)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = PLAYER_JUMP_SPEED
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/05_scrolling.py b/arcade/examples/platform_tutorial/05_scrolling.py
deleted file mode 100644
index 3da5e85..0000000
--- a/arcade/examples/platform_tutorial/05_scrolling.py
+++ /dev/null
@@ -1,188 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 5
-GRAVITY = 1
-PLAYER_JUMP_SPEED = 15
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-LEFT_VIEWPORT_MARGIN = 150
-RIGHT_VIEWPORT_MARGIN = 150
-BOTTOM_VIEWPORT_MARGIN = 50
-TOP_VIEWPORT_MARGIN = 100
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our physics engine
- self.physics_engine = None
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 96
- self.player_list.append(self.player_sprite)
-
- # Create the ground
- # This shows using a loop to place multiple sprites horizontally
- for x in range(0, 1250, 64):
- wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
- wall.center_x = x
- wall.center_y = 32
- self.wall_list.append(wall)
-
- # Put some crates on the ground
- # This shows using a coordinate list to place sprites
- coordinate_list = [[512, 96],
- [256, 96],
- [768, 96]]
-
- for coordinate in coordinate_list:
- # Add a crate on the ground
- wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
- wall.position = coordinate
- self.wall_list.append(wall)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- GRAVITY)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = PLAYER_JUMP_SPEED
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
- if self.player_sprite.left < left_boundary:
- self.view_left -= left_boundary - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
- if self.player_sprite.right > right_boundary:
- self.view_left += self.player_sprite.right - right_boundary
- changed = True
-
- # Scroll up
- top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
- if self.player_sprite.top > top_boundary:
- self.view_bottom += self.player_sprite.top - top_boundary
- changed = True
-
- # Scroll down
- bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_boundary:
- self.view_bottom -= bottom_boundary - self.player_sprite.bottom
- changed = True
-
- if changed:
- # Only scroll to integers. Otherwise we end up with pixels that
- # don't line up on the screen
- self.view_bottom = int(self.view_bottom)
- self.view_left = int(self.view_left)
-
- # Do the scrolling
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/06_coins_and_sound.py b/arcade/examples/platform_tutorial/06_coins_and_sound.py
deleted file mode 100644
index 7421065..0000000
--- a/arcade/examples/platform_tutorial/06_coins_and_sound.py
+++ /dev/null
@@ -1,212 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 5
-GRAVITY = 1
-PLAYER_JUMP_SPEED = 15
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-LEFT_VIEWPORT_MARGIN = 150
-RIGHT_VIEWPORT_MARGIN = 150
-BOTTOM_VIEWPORT_MARGIN = 50
-TOP_VIEWPORT_MARGIN = 100
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our physics engine
- self.physics_engine = None
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Load sounds
- self.collect_coin_sound = arcade.load_sound("sounds/coin1.wav")
- self.jump_sound = arcade.load_sound("sounds/jump1.wav")
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 96
- self.player_list.append(self.player_sprite)
-
- # Create the ground
- # This shows using a loop to place multiple sprites horizontally
- for x in range(0, 1250, 64):
- wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
- wall.center_x = x
- wall.center_y = 32
- self.wall_list.append(wall)
-
- # Put some crates on the ground
- # This shows using a coordinate list to place sprites
- coordinate_list = [[512, 96],
- [256, 96],
- [768, 96]]
-
- for coordinate in coordinate_list:
- # Add a crate on the ground
- wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
- wall.position = coordinate
- self.wall_list.append(wall)
-
- # Use a loop to place some coins for our character to pick up
- for x in range(128, 1250, 256):
- coin = arcade.Sprite("images/items/coinGold.png", COIN_SCALING)
- coin.center_x = x
- coin.center_y = 96
- self.coin_list.append(coin)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- GRAVITY)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = PLAYER_JUMP_SPEED
- arcade.play_sound(self.jump_sound)
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # See if we hit any coins
- coin_hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_list)
-
- # Loop through each coin we hit (if any) and remove it
- for coin in coin_hit_list:
- # Remove the coin
- coin.remove_from_sprite_lists()
- # Play a sound
- arcade.play_sound(self.collect_coin_sound)
- # Add one to the score
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
- if self.player_sprite.left < left_boundary:
- self.view_left -= left_boundary - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
- if self.player_sprite.right > right_boundary:
- self.view_left += self.player_sprite.right - right_boundary
- changed = True
-
- # Scroll up
- top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
- if self.player_sprite.top > top_boundary:
- self.view_bottom += self.player_sprite.top - top_boundary
- changed = True
-
- # Scroll down
- bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_boundary:
- self.view_bottom -= bottom_boundary - self.player_sprite.bottom
- changed = True
-
- if changed:
- # Only scroll to integers. Otherwise we end up with pixels that
- # don't line up on the screen
- self.view_bottom = int(self.view_bottom)
- self.view_left = int(self.view_left)
-
- # Do the scrolling
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/07_score.py b/arcade/examples/platform_tutorial/07_score.py
deleted file mode 100644
index b36f49f..0000000
--- a/arcade/examples/platform_tutorial/07_score.py
+++ /dev/null
@@ -1,224 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 5
-GRAVITY = 1
-PLAYER_JUMP_SPEED = 15
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-LEFT_VIEWPORT_MARGIN = 150
-RIGHT_VIEWPORT_MARGIN = 150
-BOTTOM_VIEWPORT_MARGIN = 50
-TOP_VIEWPORT_MARGIN = 100
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our physics engine
- self.physics_engine = None
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Keep track of the score
- self.score = 0
-
- # Load sounds
- self.collect_coin_sound = arcade.load_sound("sounds/coin1.wav")
- self.jump_sound = arcade.load_sound("sounds/jump1.wav")
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Keep track of the score
- self.score = 0
-
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 96
- self.player_list.append(self.player_sprite)
-
- # Create the ground
- # This shows using a loop to place multiple sprites horizontally
- for x in range(0, 1250, 64):
- wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
- wall.center_x = x
- wall.center_y = 32
- self.wall_list.append(wall)
-
- # Put some crates on the ground
- # This shows using a coordinate list to place sprites
- coordinate_list = [[512, 96],
- [256, 96],
- [768, 96]]
-
- for coordinate in coordinate_list:
- # Add a crate on the ground
- wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
- wall.position = coordinate
- self.wall_list.append(wall)
-
- # Use a loop to place some coins for our character to pick up
- for x in range(128, 1250, 256):
- coin = arcade.Sprite("images/items/coinGold.png", COIN_SCALING)
- coin.center_x = x
- coin.center_y = 96
- self.coin_list.append(coin)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- GRAVITY)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Draw our score on the screen, scrolling it with the viewport
- score_text = f"Score: {self.score}"
- arcade.draw_text(score_text, 10 + self.view_left, 10 + self.view_bottom,
- arcade.csscolor.WHITE, 18)
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = PLAYER_JUMP_SPEED
- arcade.play_sound(self.jump_sound)
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # See if we hit any coins
- coin_hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_list)
-
- # Loop through each coin we hit (if any) and remove it
- for coin in coin_hit_list:
- # Remove the coin
- coin.remove_from_sprite_lists()
- # Play a sound
- arcade.play_sound(self.collect_coin_sound)
- # Add one to the score
- self.score += 1
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
- if self.player_sprite.left < left_boundary:
- self.view_left -= left_boundary - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
- if self.player_sprite.right > right_boundary:
- self.view_left += self.player_sprite.right - right_boundary
- changed = True
-
- # Scroll up
- top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
- if self.player_sprite.top > top_boundary:
- self.view_bottom += self.player_sprite.top - top_boundary
- changed = True
-
- # Scroll down
- bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_boundary:
- self.view_bottom -= bottom_boundary - self.player_sprite.bottom
- changed = True
-
- if changed:
- # Only scroll to integers. Otherwise we end up with pixels that
- # don't line up on the screen
- self.view_bottom = int(self.view_bottom)
- self.view_left = int(self.view_left)
-
- # Do the scrolling
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/08_load_map.py b/arcade/examples/platform_tutorial/08_load_map.py
deleted file mode 100644
index c9c0513..0000000
--- a/arcade/examples/platform_tutorial/08_load_map.py
+++ /dev/null
@@ -1,222 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * TILE_SCALING)
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 10
-GRAVITY = 1
-PLAYER_JUMP_SPEED = 15
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-LEFT_VIEWPORT_MARGIN = 150
-RIGHT_VIEWPORT_MARGIN = 150
-BOTTOM_VIEWPORT_MARGIN = 100
-TOP_VIEWPORT_MARGIN = 100
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our physics engine
- self.physics_engine = None
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Keep track of the score
- self.score = 0
-
- # Load sounds
- self.collect_coin_sound = arcade.load_sound("sounds/coin1.wav")
- self.jump_sound = arcade.load_sound("sounds/jump1.wav")
-
- arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Keep track of the score
- self.score = 0
-
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 96
- self.player_list.append(self.player_sprite)
-
- # --- Load in a map from the tiled editor ---
-
- # Name of map file to load
- map_name = "map.tmx"
- # Name of the layer in the file that has our platforms/walls
- platforms_layer_name = 'Platforms'
- # Name of the layer that has items for pick-up
- coins_layer_name = 'Coins'
-
- # Read in the tiled map
- my_map = arcade.tilemap.read_tmx(map_name)
-
- # -- Platforms
- self.wall_list = arcade.tilemap.process_layer(my_map, platforms_layer_name, TILE_SCALING)
-
- # -- Coins
- self.coin_list = arcade.tilemap.process_layer(my_map, coins_layer_name, TILE_SCALING)
-
- # --- Other stuff
- # Set the background color
- if my_map.background_color:
- arcade.set_background_color(my_map.background_color)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- GRAVITY)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Draw our score on the screen, scrolling it with the viewport
- score_text = f"Score: {self.score}"
- arcade.draw_text(score_text, 10 + self.view_left, 10 + self.view_bottom,
- arcade.csscolor.WHITE, 18)
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = PLAYER_JUMP_SPEED
- arcade.play_sound(self.jump_sound)
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # See if we hit any coins
- coin_hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_list)
-
- # Loop through each coin we hit (if any) and remove it
- for coin in coin_hit_list:
- # Remove the coin
- coin.remove_from_sprite_lists()
- # Play a sound
- arcade.play_sound(self.collect_coin_sound)
- # Add one to the score
- self.score += 1
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
- if self.player_sprite.left < left_boundary:
- self.view_left -= left_boundary - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
- if self.player_sprite.right > right_boundary:
- self.view_left += self.player_sprite.right - right_boundary
- changed = True
-
- # Scroll up
- top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
- if self.player_sprite.top > top_boundary:
- self.view_bottom += self.player_sprite.top - top_boundary
- changed = True
-
- # Scroll down
- bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_boundary:
- self.view_bottom -= bottom_boundary - self.player_sprite.bottom
- changed = True
-
- if changed:
- # Only scroll to integers. Otherwise we end up with pixels that
- # don't line up on the screen
- self.view_bottom = int(self.view_bottom)
- self.view_left = int(self.view_left)
-
- # Do the scrolling
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/09_endgame.py b/arcade/examples/platform_tutorial/09_endgame.py
deleted file mode 100644
index d4d08f7..0000000
--- a/arcade/examples/platform_tutorial/09_endgame.py
+++ /dev/null
@@ -1,306 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * TILE_SCALING)
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 10
-GRAVITY = 1
-PLAYER_JUMP_SPEED = 20
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-LEFT_VIEWPORT_MARGIN = 200
-RIGHT_VIEWPORT_MARGIN = 200
-BOTTOM_VIEWPORT_MARGIN = 150
-TOP_VIEWPORT_MARGIN = 100
-
-PLAYER_START_X = 64
-PLAYER_START_Y = 225
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.foreground_list = None
- self.background_list = None
- self.dont_touch_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our physics engine
- self.physics_engine = None
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Keep track of the score
- self.score = 0
-
- # Where is the right edge of the map?
- self.end_of_map = 0
-
- # Level
- self.level = 1
-
- # Load sounds
- self.collect_coin_sound = arcade.load_sound("sounds/coin1.wav")
- self.jump_sound = arcade.load_sound("sounds/jump1.wav")
- self.game_over = arcade.load_sound("sounds/gameover1.wav")
-
- def setup(self, level):
- """ Set up the game here. Call this function to restart the game. """
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Keep track of the score
- self.score = 0
-
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.foreground_list = arcade.SpriteList()
- self.background_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- self.player_sprite = arcade.Sprite("images/player_1/player_stand.png",
- CHARACTER_SCALING)
- self.player_sprite.center_x = PLAYER_START_X
- self.player_sprite.center_y = PLAYER_START_Y
- self.player_list.append(self.player_sprite)
-
- # --- Load in a map from the tiled editor ---
-
- # Name of the layer in the file that has our platforms/walls
- platforms_layer_name = 'Platforms'
- # Name of the layer that has items for pick-up
- coins_layer_name = 'Coins'
- # Name of the layer that has items for foreground
- foreground_layer_name = 'Foreground'
- # Name of the layer that has items for background
- background_layer_name = 'Background'
- # Name of the layer that has items we shouldn't touch
- dont_touch_layer_name = "Don't Touch"
-
- # Map name
- map_name = f"map2_level_{level}.tmx"
-
- # Read in the tiled map
- my_map = arcade.tilemap.read_tmx(map_name)
-
- # Calculate the right edge of the my_map in pixels
- self.end_of_map = my_map.map_size.width * GRID_PIXEL_SIZE
-
- # -- Background
- self.background_list = arcade.tilemap.process_layer(my_map,
- background_layer_name,
- TILE_SCALING)
-
- # -- Foreground
- self.foreground_list = arcade.tilemap.process_layer(my_map,
- foreground_layer_name,
- TILE_SCALING)
-
- # -- Platforms
- self.wall_list = arcade.tilemap.process_layer(my_map,
- platforms_layer_name,
- TILE_SCALING)
-
- # -- Coins
- self.coin_list = arcade.tilemap.process_layer(my_map,
- coins_layer_name,
- TILE_SCALING)
-
- # -- Don't Touch Layer
- self.dont_touch_list = arcade.tilemap.process_layer(my_map,
- dont_touch_layer_name,
- TILE_SCALING)
-
- # --- Other stuff
- # Set the background color
- if my_map.background_color:
- arcade.set_background_color(my_map.background_color)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- GRAVITY)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.background_list.draw()
- self.wall_list.draw()
- self.coin_list.draw()
- self.dont_touch_list.draw()
- self.player_list.draw()
- self.foreground_list.draw()
-
- # Draw our score on the screen, scrolling it with the viewport
- score_text = f"Score: {self.score}"
- arcade.draw_text(score_text, 10 + self.view_left, 10 + self.view_bottom,
- arcade.csscolor.BLACK, 18)
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = PLAYER_JUMP_SPEED
- arcade.play_sound(self.jump_sound)
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # See if we hit any coins
- coin_hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_list)
-
- # Loop through each coin we hit (if any) and remove it
- for coin in coin_hit_list:
- # Remove the coin
- coin.remove_from_sprite_lists()
- # Play a sound
- arcade.play_sound(self.collect_coin_sound)
- # Add one to the score
- self.score += 1
-
- # Track if we need to change the viewport
- changed_viewport = False
-
- # Did the player fall off the map?
- if self.player_sprite.center_y < -100:
- self.player_sprite.center_x = PLAYER_START_X
- self.player_sprite.center_y = PLAYER_START_Y
-
- # Set the camera to the start
- self.view_left = 0
- self.view_bottom = 0
- changed_viewport = True
- arcade.play_sound(self.game_over)
-
- # Did the player touch something they should not?
- if arcade.check_for_collision_with_list(self.player_sprite,
- self.dont_touch_list):
- self.player_sprite.change_x = 0
- self.player_sprite.change_y = 0
- self.player_sprite.center_x = PLAYER_START_X
- self.player_sprite.center_y = PLAYER_START_Y
-
- # Set the camera to the start
- self.view_left = 0
- self.view_bottom = 0
- changed_viewport = True
- arcade.play_sound(self.game_over)
-
- # See if the user got to the end of the level
- if self.player_sprite.center_x >= self.end_of_map:
- # Advance to the next level
- self.level += 1
-
- # Load the next level
- self.setup(self.level)
-
- # Set the camera to the start
- self.view_left = 0
- self.view_bottom = 0
- changed_viewport = True
-
- # --- Manage Scrolling ---
-
- # Scroll left
- left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
- if self.player_sprite.left < left_boundary:
- self.view_left -= left_boundary - self.player_sprite.left
- changed_viewport = True
-
- # Scroll right
- right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
- if self.player_sprite.right > right_boundary:
- self.view_left += self.player_sprite.right - right_boundary
- changed_viewport = True
-
- # Scroll up
- top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
- if self.player_sprite.top > top_boundary:
- self.view_bottom += self.player_sprite.top - top_boundary
- changed_viewport = True
-
- # Scroll down
- bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_boundary:
- self.view_bottom -= bottom_boundary - self.player_sprite.bottom
- changed_viewport = True
-
- if changed_viewport:
- # Only scroll to integers. Otherwise we end up with pixels that
- # don't line up on the screen
- self.view_bottom = int(self.view_bottom)
- self.view_left = int(self.view_left)
-
- # Do the scrolling
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup(window.level)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/10_ladders_and_more.py b/arcade/examples/platform_tutorial/10_ladders_and_more.py
deleted file mode 100644
index d3c28fc..0000000
--- a/arcade/examples/platform_tutorial/10_ladders_and_more.py
+++ /dev/null
@@ -1,293 +0,0 @@
-"""
-Platformer Game
-"""
-import arcade
-import os
-
-# Constants
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 650
-SCREEN_TITLE = "Platformer"
-
-# Constants used to scale our sprites from their original size
-CHARACTER_SCALING = 1
-TILE_SCALING = 0.5
-COIN_SCALING = 0.5
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * TILE_SCALING)
-
-# Movement speed of player, in pixels per frame
-PLAYER_MOVEMENT_SPEED = 7
-GRAVITY = 1.5
-PLAYER_JUMP_SPEED = 30
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-LEFT_VIEWPORT_MARGIN = 200
-RIGHT_VIEWPORT_MARGIN = 200
-BOTTOM_VIEWPORT_MARGIN = 150
-TOP_VIEWPORT_MARGIN = 100
-
-PLAYER_START_X = 64
-PLAYER_START_Y = 256
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
- """
- Initializer for the game
- """
-
- # Call the parent class and set up the window
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- # Set the path to start with this program
- file_path = os.path.dirname(os.path.abspath(__file__))
- os.chdir(file_path)
-
- # These are 'lists' that keep track of our sprites. Each sprite should
- # go into a list.
- self.coin_list = None
- self.wall_list = None
- self.background_list = None
- self.ladder_list = None
- self.player_list = None
-
- # Separate variable that holds the player sprite
- self.player_sprite = None
-
- # Our 'physics' engine
- self.physics_engine = None
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- self.end_of_map = 0
-
- # Keep track of the score
- self.score = 0
-
- # Load sounds
- self.collect_coin_sound = arcade.load_sound("sounds/coin1.wav")
- self.jump_sound = arcade.load_sound("sounds/jump1.wav")
- self.game_over = arcade.load_sound("sounds/gameover1.wav")
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
-
- # Used to keep track of our scrolling
- self.view_bottom = 0
- self.view_left = 0
-
- # Keep track of the score
- self.score = 0
-
- # Create the Sprite lists
- self.player_list = arcade.SpriteList()
- self.background_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player, specifically placing it at these coordinates.
- # self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
- self.player_sprite = \
- arcade.Sprite("../../../arcade/examples/platform_tutorial/images/player_1/player_stand.png")
- self.player_sprite.center_x = PLAYER_START_X
- self.player_sprite.center_y = PLAYER_START_Y
- self.player_list.append(self.player_sprite)
-
- # --- Load in a map from the tiled editor ---
-
- # Name of the layer in the file that has our platforms/walls
- platforms_layer_name = 'Platforms'
- moving_platforms_layer_name = 'Moving Platforms'
-
- # Name of the layer that has items for pick-up
- coins_layer_name = 'Coins'
-
- # Map name
- map_name = f"map_with_ladders.tmx"
-
- # Read in the tiled map
- my_map = arcade.tilemap.read_tmx(map_name)
-
- # Calculate the right edge of the my_map in pixels
- self.end_of_map = my_map.map_size.width * GRID_PIXEL_SIZE
-
- # -- Platforms
- self.wall_list = arcade.tilemap.process_layer(my_map, platforms_layer_name, TILE_SCALING)
-
- # -- Moving Platforms
- moving_platforms_list = arcade.tilemap.process_layer(my_map, moving_platforms_layer_name, TILE_SCALING)
- for sprite in moving_platforms_list:
- self.wall_list.append(sprite)
-
- # -- Background objects
- self.background_list = arcade.tilemap.process_layer(my_map, "Background", TILE_SCALING)
-
- # -- Background objects
- self.ladder_list = arcade.tilemap.process_layer(my_map, "Ladders", TILE_SCALING)
-
- # -- Coins
- self.coin_list = arcade.tilemap.process_layer(my_map, coins_layer_name, TILE_SCALING)
-
- # --- Other stuff
- # Set the background color
- if my_map.background_color:
- arcade.set_background_color(my_map.background_color)
-
- # Create the 'physics engine'
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- gravity_constant=GRAVITY,
- ladders=self.ladder_list)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Clear the screen to the background color
- arcade.start_render()
-
- # Draw our sprites
- self.wall_list.draw()
- self.background_list.draw()
- self.ladder_list.draw()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Draw our score on the screen, scrolling it with the viewport
- score_text = f"Score: {self.score}"
- arcade.draw_text(score_text, 10 + self.view_left, 10 + self.view_bottom,
- arcade.csscolor.BLACK, 18)
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.is_on_ladder():
- self.player_sprite.change_y = PLAYER_MOVEMENT_SPEED
- elif self.physics_engine.can_jump():
- self.player_sprite.change_y = PLAYER_JUMP_SPEED
- arcade.play_sound(self.jump_sound)
- elif key == arcade.key.DOWN or key == arcade.key.S:
- if self.physics_engine.is_on_ladder():
- self.player_sprite.change_y = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.UP or key == arcade.key.W:
- if self.physics_engine.is_on_ladder():
- self.player_sprite.change_y = 0
- elif key == arcade.key.DOWN or key == arcade.key.S:
- if self.physics_engine.is_on_ladder():
- self.player_sprite.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.A:
- self.player_sprite.change_x = 0
- elif key == arcade.key.RIGHT or key == arcade.key.D:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # Update animations
- self.coin_list.update_animation(delta_time)
- self.background_list.update_animation(delta_time)
-
- # Update walls, used with moving platforms
- self.wall_list.update()
-
- # See if the wall hit a boundary and needs to reverse direction.
- for wall in self.wall_list:
-
- if wall.boundary_right and wall.right > wall.boundary_right and wall.change_x > 0:
- wall.change_x *= -1
- if wall.boundary_left and wall.left < wall.boundary_left and wall.change_x < 0:
- wall.change_x *= -1
- if wall.boundary_top and wall.top > wall.boundary_top and wall.change_y > 0:
- wall.change_y *= -1
- if wall.boundary_bottom and wall.bottom < wall.boundary_bottom and wall.change_y < 0:
- wall.change_y *= -1
-
- # See if we hit any coins
- coin_hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_list)
-
- # Loop through each coin we hit (if any) and remove it
- for coin in coin_hit_list:
-
- # Figure out how many points this coin is worth
- if 'Points' not in coin.properties:
- print("Warning, collected a coing without a Points property.")
- else:
- points = int(coin.properties['Points'])
- self.score += points
-
- # Remove the coin
- coin.remove_from_sprite_lists()
- arcade.play_sound(self.collect_coin_sound)
-
- # Track if we need to change the viewport
- changed_viewport = False
-
- # --- Manage Scrolling ---
-
- # Scroll left
- left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
- if self.player_sprite.left < left_boundary:
- self.view_left -= left_boundary - self.player_sprite.left
- changed_viewport = True
-
- # Scroll right
- right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
- if self.player_sprite.right > right_boundary:
- self.view_left += self.player_sprite.right - right_boundary
- changed_viewport = True
-
- # Scroll up
- top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
- if self.player_sprite.top > top_boundary:
- self.view_bottom += self.player_sprite.top - top_boundary
- changed_viewport = True
-
- # Scroll down
- bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_boundary:
- self.view_bottom -= bottom_boundary - self.player_sprite.bottom
- changed_viewport = True
-
- if changed_viewport:
- # Only scroll to integers. Otherwise we end up with pixels that
- # don't line up on the screen
- self.view_bottom = int(self.view_bottom)
- self.view_left = int(self.view_left)
-
- # Do the scrolling
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/platform_tutorial/images/Kenney Donate.url b/arcade/examples/platform_tutorial/images/Kenney Donate.url
deleted file mode 100644
index a310f49..0000000
--- a/arcade/examples/platform_tutorial/images/Kenney Donate.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://kenney.nl/support
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/images/Kenney Facebook.url b/arcade/examples/platform_tutorial/images/Kenney Facebook.url
deleted file mode 100644
index e37cfb3..0000000
--- a/arcade/examples/platform_tutorial/images/Kenney Facebook.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://social.kenney.nl/facebook
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/images/Kenney Twitter.url b/arcade/examples/platform_tutorial/images/Kenney Twitter.url
deleted file mode 100644
index 10be373..0000000
--- a/arcade/examples/platform_tutorial/images/Kenney Twitter.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://social.kenney.nl/twitter
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/images/Kenney Website.url b/arcade/examples/platform_tutorial/images/Kenney Website.url
deleted file mode 100644
index fbdde43..0000000
--- a/arcade/examples/platform_tutorial/images/Kenney Website.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://www.kenney.nl/
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/images/License.txt b/arcade/examples/platform_tutorial/images/License.txt
deleted file mode 100644
index 8a9c62c..0000000
--- a/arcade/examples/platform_tutorial/images/License.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- Everything in this package is licensed CC0 (see below).
-
- ------------------------------
-
- License (Creative Commons Zero, CC0)
- http://creativecommons.org/publicdomain/zero/1.0/
-
- You may use these graphics in personal and commercial projects.
- Credit (Kenney or www.kenney.nl) would be nice but is not mandatory.
-
- ------------------------------
-
- Donate: http://donate.kenney.nl/
- Request: http://request.kenney.nl/
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/images/alien/alienBlue_climb1.png b/arcade/examples/platform_tutorial/images/alien/alienBlue_climb1.png
deleted file mode 100644
index 415de24..0000000
Binary files a/arcade/examples/platform_tutorial/images/alien/alienBlue_climb1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/alien/alienBlue_climb2.png b/arcade/examples/platform_tutorial/images/alien/alienBlue_climb2.png
deleted file mode 100644
index 5d7cddf..0000000
Binary files a/arcade/examples/platform_tutorial/images/alien/alienBlue_climb2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/alien/alienBlue_front.png b/arcade/examples/platform_tutorial/images/alien/alienBlue_front.png
deleted file mode 100644
index aa64b7c..0000000
Binary files a/arcade/examples/platform_tutorial/images/alien/alienBlue_front.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/alien/alienBlue_jump.png b/arcade/examples/platform_tutorial/images/alien/alienBlue_jump.png
deleted file mode 100644
index 79f0231..0000000
Binary files a/arcade/examples/platform_tutorial/images/alien/alienBlue_jump.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/alien/alienBlue_walk1.png b/arcade/examples/platform_tutorial/images/alien/alienBlue_walk1.png
deleted file mode 100644
index 7922b84..0000000
Binary files a/arcade/examples/platform_tutorial/images/alien/alienBlue_walk1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/alien/alienBlue_walk2.png b/arcade/examples/platform_tutorial/images/alien/alienBlue_walk2.png
deleted file mode 100644
index 48245ae..0000000
Binary files a/arcade/examples/platform_tutorial/images/alien/alienBlue_walk2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/bee.png b/arcade/examples/platform_tutorial/images/enemies/bee.png
deleted file mode 100644
index 8f2b2d0..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/bee.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/fishGreen.png b/arcade/examples/platform_tutorial/images/enemies/fishGreen.png
deleted file mode 100644
index 0ee8a64..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/fishGreen.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/fishPink.png b/arcade/examples/platform_tutorial/images/enemies/fishPink.png
deleted file mode 100644
index 925cc60..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/fishPink.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/fly.png b/arcade/examples/platform_tutorial/images/enemies/fly.png
deleted file mode 100644
index a733879..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/fly.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/frog.png b/arcade/examples/platform_tutorial/images/enemies/frog.png
deleted file mode 100644
index 8107bb4..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/frog.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/frog_move.png b/arcade/examples/platform_tutorial/images/enemies/frog_move.png
deleted file mode 100644
index 87a39af..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/frog_move.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/ladybug.png b/arcade/examples/platform_tutorial/images/enemies/ladybug.png
deleted file mode 100644
index 3f95a2d..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/ladybug.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/mouse.png b/arcade/examples/platform_tutorial/images/enemies/mouse.png
deleted file mode 100644
index 5d98c41..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/mouse.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/saw.png b/arcade/examples/platform_tutorial/images/enemies/saw.png
deleted file mode 100644
index 4494ec7..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/saw.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/sawHalf.png b/arcade/examples/platform_tutorial/images/enemies/sawHalf.png
deleted file mode 100644
index c5f7732..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/sawHalf.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/slimeBlock.png b/arcade/examples/platform_tutorial/images/enemies/slimeBlock.png
deleted file mode 100644
index 790350a..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/slimeBlock.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/slimeBlue.png b/arcade/examples/platform_tutorial/images/enemies/slimeBlue.png
deleted file mode 100644
index 6d18e27..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/slimeBlue.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/slimeBlue_move.png b/arcade/examples/platform_tutorial/images/enemies/slimeBlue_move.png
deleted file mode 100644
index e676dcc..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/slimeBlue_move.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/slimeGreen.png b/arcade/examples/platform_tutorial/images/enemies/slimeGreen.png
deleted file mode 100644
index 397b623..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/slimeGreen.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/slimePurple.png b/arcade/examples/platform_tutorial/images/enemies/slimePurple.png
deleted file mode 100644
index e72ac04..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/slimePurple.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/wormGreen.png b/arcade/examples/platform_tutorial/images/enemies/wormGreen.png
deleted file mode 100644
index 045161a..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/wormGreen.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/wormGreen_dead.png b/arcade/examples/platform_tutorial/images/enemies/wormGreen_dead.png
deleted file mode 100644
index fba0f23..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/wormGreen_dead.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/wormGreen_move.png b/arcade/examples/platform_tutorial/images/enemies/wormGreen_move.png
deleted file mode 100644
index 999416e..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/wormGreen_move.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/enemies/wormPink.png b/arcade/examples/platform_tutorial/images/enemies/wormPink.png
deleted file mode 100644
index 4ee861a..0000000
Binary files a/arcade/examples/platform_tutorial/images/enemies/wormPink.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/coinBronze.png b/arcade/examples/platform_tutorial/images/items/coinBronze.png
deleted file mode 100644
index cf346cb..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/coinBronze.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/coinGold.png b/arcade/examples/platform_tutorial/images/items/coinGold.png
deleted file mode 100644
index 4df83e2..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/coinGold.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/coinSilver.png b/arcade/examples/platform_tutorial/images/items/coinSilver.png
deleted file mode 100644
index dc36564..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/coinSilver.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagGreen1.png b/arcade/examples/platform_tutorial/images/items/flagGreen1.png
deleted file mode 100644
index b7b4278..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagGreen1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagGreen2.png b/arcade/examples/platform_tutorial/images/items/flagGreen2.png
deleted file mode 100644
index 57534e3..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagGreen2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagGreen_down.png b/arcade/examples/platform_tutorial/images/items/flagGreen_down.png
deleted file mode 100644
index 1b1a1e9..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagGreen_down.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagRed1.png b/arcade/examples/platform_tutorial/images/items/flagRed1.png
deleted file mode 100644
index fae407e..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagRed1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagRed2.png b/arcade/examples/platform_tutorial/images/items/flagRed2.png
deleted file mode 100644
index 4193385..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagRed2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagRed_down.png b/arcade/examples/platform_tutorial/images/items/flagRed_down.png
deleted file mode 100644
index a97a990..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagRed_down.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagYellow1.png b/arcade/examples/platform_tutorial/images/items/flagYellow1.png
deleted file mode 100644
index 909099d..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagYellow1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagYellow2.png b/arcade/examples/platform_tutorial/images/items/flagYellow2.png
deleted file mode 100644
index c5e1bbd..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagYellow2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/flagYellow_down.png b/arcade/examples/platform_tutorial/images/items/flagYellow_down.png
deleted file mode 100644
index c2d5fc5..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/flagYellow_down.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/gemBlue.png b/arcade/examples/platform_tutorial/images/items/gemBlue.png
deleted file mode 100644
index dfd6025..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/gemBlue.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/gemGreen.png b/arcade/examples/platform_tutorial/images/items/gemGreen.png
deleted file mode 100644
index 6cdc8f0..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/gemGreen.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/gemRed.png b/arcade/examples/platform_tutorial/images/items/gemRed.png
deleted file mode 100644
index 27dcf03..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/gemRed.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/gemYellow.png b/arcade/examples/platform_tutorial/images/items/gemYellow.png
deleted file mode 100644
index 5a8201a..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/gemYellow.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/keyBlue.png b/arcade/examples/platform_tutorial/images/items/keyBlue.png
deleted file mode 100644
index b4099ef..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/keyBlue.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/keyGreen.png b/arcade/examples/platform_tutorial/images/items/keyGreen.png
deleted file mode 100644
index 00d5140..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/keyGreen.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/keyRed.png b/arcade/examples/platform_tutorial/images/items/keyRed.png
deleted file mode 100644
index d4c1c59..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/keyRed.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/keyYellow.png b/arcade/examples/platform_tutorial/images/items/keyYellow.png
deleted file mode 100644
index bcfd368..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/keyYellow.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/ladderMid.png b/arcade/examples/platform_tutorial/images/items/ladderMid.png
deleted file mode 100644
index 7ef8720..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/ladderMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/ladderTop.png b/arcade/examples/platform_tutorial/images/items/ladderTop.png
deleted file mode 100644
index d363693..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/ladderTop.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/items/star.png b/arcade/examples/platform_tutorial/images/items/star.png
deleted file mode 100644
index 20f5dd1..0000000
Binary files a/arcade/examples/platform_tutorial/images/items/star.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_1/female_back.png b/arcade/examples/platform_tutorial/images/player_1/female_back.png
deleted file mode 100644
index 0b2e3b1..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_1/female_back.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_1/female_jump.png b/arcade/examples/platform_tutorial/images/player_1/female_jump.png
deleted file mode 100644
index 79ae316..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_1/female_jump.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_1/female_walk1.png b/arcade/examples/platform_tutorial/images/player_1/female_walk1.png
deleted file mode 100644
index 8d0680d..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_1/female_walk1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_1/female_walk2.png b/arcade/examples/platform_tutorial/images/player_1/female_walk2.png
deleted file mode 100644
index 373de43..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_1/female_walk2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_1/player_stand.png b/arcade/examples/platform_tutorial/images/player_1/player_stand.png
deleted file mode 100644
index e98af64..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_1/player_stand.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_2/player_back.png b/arcade/examples/platform_tutorial/images/player_2/player_back.png
deleted file mode 100644
index df00a2d..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_2/player_back.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_2/player_jump.png b/arcade/examples/platform_tutorial/images/player_2/player_jump.png
deleted file mode 100644
index af3661a..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_2/player_jump.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_2/player_stand.png b/arcade/examples/platform_tutorial/images/player_2/player_stand.png
deleted file mode 100644
index ff5655a..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_2/player_stand.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_2/player_walk1.png b/arcade/examples/platform_tutorial/images/player_2/player_walk1.png
deleted file mode 100644
index 46c2a5f..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_2/player_walk1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/player_2/player_walk2.png b/arcade/examples/platform_tutorial/images/player_2/player_walk2.png
deleted file mode 100644
index 1fb6de2..0000000
Binary files a/arcade/examples/platform_tutorial/images/player_2/player_walk2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/readme.txt b/arcade/examples/platform_tutorial/images/readme.txt
deleted file mode 100644
index 3d9ed43..0000000
--- a/arcade/examples/platform_tutorial/images/readme.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-These assets are a subset of what is available from Kenney.nl.
-
-If you like his work, please go support is by purchasing his full asset packs
-at https://kenney.nl/
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/images/tiles/boxCrate.png b/arcade/examples/platform_tutorial/images/tiles/boxCrate.png
deleted file mode 100644
index 8f5737f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/boxCrate.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/boxCrate_double.png b/arcade/examples/platform_tutorial/images/tiles/boxCrate_double.png
deleted file mode 100644
index 86ed133..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/boxCrate_double.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/boxCrate_single.png b/arcade/examples/platform_tutorial/images/tiles/boxCrate_single.png
deleted file mode 100644
index c96f660..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/boxCrate_single.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/brickBrown.png b/arcade/examples/platform_tutorial/images/tiles/brickBrown.png
deleted file mode 100644
index f919d25..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/brickBrown.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/brickGrey.png b/arcade/examples/platform_tutorial/images/tiles/brickGrey.png
deleted file mode 100644
index 00f38ec..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/brickGrey.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/bridgeA.png b/arcade/examples/platform_tutorial/images/tiles/bridgeA.png
deleted file mode 100644
index ac2d8ec..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/bridgeA.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/bridgeB.png b/arcade/examples/platform_tutorial/images/tiles/bridgeB.png
deleted file mode 100644
index 71ae128..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/bridgeB.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/bush.png b/arcade/examples/platform_tutorial/images/tiles/bush.png
deleted file mode 100644
index ee353ba..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/bush.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/cactus.png b/arcade/examples/platform_tutorial/images/tiles/cactus.png
deleted file mode 100644
index 3e06c71..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/cactus.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirt.png b/arcade/examples/platform_tutorial/images/tiles/dirt.png
deleted file mode 100644
index 9cd4c2b..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirt.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCenter.png b/arcade/examples/platform_tutorial/images/tiles/dirtCenter.png
deleted file mode 100644
index f6458f0..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCenter.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCenter_rounded.png b/arcade/examples/platform_tutorial/images/tiles/dirtCenter_rounded.png
deleted file mode 100644
index d3be245..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCenter_rounded.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCliffAlt_left.png b/arcade/examples/platform_tutorial/images/tiles/dirtCliffAlt_left.png
deleted file mode 100644
index ee77778..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCliffAlt_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCliffAlt_right.png b/arcade/examples/platform_tutorial/images/tiles/dirtCliffAlt_right.png
deleted file mode 100644
index f5d19aa..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCliffAlt_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCliff_left.png b/arcade/examples/platform_tutorial/images/tiles/dirtCliff_left.png
deleted file mode 100644
index 0aa844f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCliff_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCliff_right.png b/arcade/examples/platform_tutorial/images/tiles/dirtCliff_right.png
deleted file mode 100644
index 508bfbf..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCliff_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCorner_left.png b/arcade/examples/platform_tutorial/images/tiles/dirtCorner_left.png
deleted file mode 100644
index 7919775..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCorner_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtCorner_right.png b/arcade/examples/platform_tutorial/images/tiles/dirtCorner_right.png
deleted file mode 100644
index fb0cb54..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtCorner_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtHalf.png b/arcade/examples/platform_tutorial/images/tiles/dirtHalf.png
deleted file mode 100644
index 8e3a462..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtHalf.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtHalf_left.png b/arcade/examples/platform_tutorial/images/tiles/dirtHalf_left.png
deleted file mode 100644
index 497d658..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtHalf_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtHalf_mid.png b/arcade/examples/platform_tutorial/images/tiles/dirtHalf_mid.png
deleted file mode 100644
index a656a0f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtHalf_mid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtHalf_right.png b/arcade/examples/platform_tutorial/images/tiles/dirtHalf_right.png
deleted file mode 100644
index 9b4de8c..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtHalf_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtHill_left.png b/arcade/examples/platform_tutorial/images/tiles/dirtHill_left.png
deleted file mode 100644
index 313d33c..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtHill_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtHill_right.png b/arcade/examples/platform_tutorial/images/tiles/dirtHill_right.png
deleted file mode 100644
index f45ef32..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtHill_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtLeft.png b/arcade/examples/platform_tutorial/images/tiles/dirtLeft.png
deleted file mode 100644
index 0d18085..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtMid.png b/arcade/examples/platform_tutorial/images/tiles/dirtMid.png
deleted file mode 100644
index d9612cf..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/dirtRight.png b/arcade/examples/platform_tutorial/images/tiles/dirtRight.png
deleted file mode 100644
index 695eaf8..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/dirtRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/doorClosed_mid.png b/arcade/examples/platform_tutorial/images/tiles/doorClosed_mid.png
deleted file mode 100644
index 2b32291..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/doorClosed_mid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/doorClosed_top.png b/arcade/examples/platform_tutorial/images/tiles/doorClosed_top.png
deleted file mode 100644
index 9001993..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/doorClosed_top.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grass.png b/arcade/examples/platform_tutorial/images/tiles/grass.png
deleted file mode 100644
index e23656a..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grass.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCenter.png b/arcade/examples/platform_tutorial/images/tiles/grassCenter.png
deleted file mode 100644
index d595bdc..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCenter.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCenter_round.png b/arcade/examples/platform_tutorial/images/tiles/grassCenter_round.png
deleted file mode 100644
index acb578f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCenter_round.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCliffAlt_left.png b/arcade/examples/platform_tutorial/images/tiles/grassCliffAlt_left.png
deleted file mode 100644
index f92955f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCliffAlt_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCliffAlt_right.png b/arcade/examples/platform_tutorial/images/tiles/grassCliffAlt_right.png
deleted file mode 100644
index b3d5aa4..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCliffAlt_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCliff_left.png b/arcade/examples/platform_tutorial/images/tiles/grassCliff_left.png
deleted file mode 100644
index c5d47fc..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCliff_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCliff_right.png b/arcade/examples/platform_tutorial/images/tiles/grassCliff_right.png
deleted file mode 100644
index 92be008..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCliff_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCorner_left.png b/arcade/examples/platform_tutorial/images/tiles/grassCorner_left.png
deleted file mode 100644
index 385aa96..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCorner_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassCorner_right.png b/arcade/examples/platform_tutorial/images/tiles/grassCorner_right.png
deleted file mode 100644
index 407a7d0..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassCorner_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassHalf.png b/arcade/examples/platform_tutorial/images/tiles/grassHalf.png
deleted file mode 100644
index 42f62ff..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassHalf.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassHalf_left.png b/arcade/examples/platform_tutorial/images/tiles/grassHalf_left.png
deleted file mode 100644
index 0ac58a9..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassHalf_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassHalf_mid.png b/arcade/examples/platform_tutorial/images/tiles/grassHalf_mid.png
deleted file mode 100644
index f1cd7c1..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassHalf_mid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassHalf_right.png b/arcade/examples/platform_tutorial/images/tiles/grassHalf_right.png
deleted file mode 100644
index 4b65788..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassHalf_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassHill_left.png b/arcade/examples/platform_tutorial/images/tiles/grassHill_left.png
deleted file mode 100644
index d9aab2e..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassHill_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassHill_right.png b/arcade/examples/platform_tutorial/images/tiles/grassHill_right.png
deleted file mode 100644
index 2d769d7..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassHill_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassLeft.png b/arcade/examples/platform_tutorial/images/tiles/grassLeft.png
deleted file mode 100644
index f7cdc03..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassMid.png b/arcade/examples/platform_tutorial/images/tiles/grassMid.png
deleted file mode 100644
index acd03cd..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grassRight.png b/arcade/examples/platform_tutorial/images/tiles/grassRight.png
deleted file mode 100644
index 2e15ec4..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grassRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/grass_sprout.png b/arcade/examples/platform_tutorial/images/tiles/grass_sprout.png
deleted file mode 100644
index 132ad54..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/grass_sprout.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/ladderMid.png b/arcade/examples/platform_tutorial/images/tiles/ladderMid.png
deleted file mode 100644
index 7ef8720..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/ladderMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/ladderTop.png b/arcade/examples/platform_tutorial/images/tiles/ladderTop.png
deleted file mode 100644
index d363693..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/ladderTop.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/lava.png b/arcade/examples/platform_tutorial/images/tiles/lava.png
deleted file mode 100644
index c23d440..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/lava.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/lavaTop_high.png b/arcade/examples/platform_tutorial/images/tiles/lavaTop_high.png
deleted file mode 100644
index bf7a954..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/lavaTop_high.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/lavaTop_low.png b/arcade/examples/platform_tutorial/images/tiles/lavaTop_low.png
deleted file mode 100644
index a220af4..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/lavaTop_low.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/leverLeft.png b/arcade/examples/platform_tutorial/images/tiles/leverLeft.png
deleted file mode 100644
index 3a57cae..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/leverLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/leverMid.png b/arcade/examples/platform_tutorial/images/tiles/leverMid.png
deleted file mode 100644
index 523d012..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/leverMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/leverRight.png b/arcade/examples/platform_tutorial/images/tiles/leverRight.png
deleted file mode 100644
index a8cb42c..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/leverRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/lockRed.png b/arcade/examples/platform_tutorial/images/tiles/lockRed.png
deleted file mode 100644
index 00ce745..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/lockRed.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/lockYellow.png b/arcade/examples/platform_tutorial/images/tiles/lockYellow.png
deleted file mode 100644
index 7173a53..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/lockYellow.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/mushroomRed.png b/arcade/examples/platform_tutorial/images/tiles/mushroomRed.png
deleted file mode 100644
index ca88eec..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/mushroomRed.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planet.png b/arcade/examples/platform_tutorial/images/tiles/planet.png
deleted file mode 100644
index 15a48b8..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planet.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCenter.png b/arcade/examples/platform_tutorial/images/tiles/planetCenter.png
deleted file mode 100644
index b635b6f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCenter.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCenter_rounded.png b/arcade/examples/platform_tutorial/images/tiles/planetCenter_rounded.png
deleted file mode 100644
index acba26d..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCenter_rounded.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCliffAlt_left.png b/arcade/examples/platform_tutorial/images/tiles/planetCliffAlt_left.png
deleted file mode 100644
index 3206176..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCliffAlt_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCliffAlt_right.png b/arcade/examples/platform_tutorial/images/tiles/planetCliffAlt_right.png
deleted file mode 100644
index 10ee32e..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCliffAlt_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCliff_left.png b/arcade/examples/platform_tutorial/images/tiles/planetCliff_left.png
deleted file mode 100644
index f4a8d47..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCliff_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCliff_right.png b/arcade/examples/platform_tutorial/images/tiles/planetCliff_right.png
deleted file mode 100644
index 152db3e..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCliff_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCorner_left.png b/arcade/examples/platform_tutorial/images/tiles/planetCorner_left.png
deleted file mode 100644
index 62e3e2a..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCorner_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetCorner_right.png b/arcade/examples/platform_tutorial/images/tiles/planetCorner_right.png
deleted file mode 100644
index 2197fd2..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetCorner_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetHalf.png b/arcade/examples/platform_tutorial/images/tiles/planetHalf.png
deleted file mode 100644
index 59522fc..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetHalf.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetHalf_left.png b/arcade/examples/platform_tutorial/images/tiles/planetHalf_left.png
deleted file mode 100644
index 2ae6221..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetHalf_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetHalf_mid.png b/arcade/examples/platform_tutorial/images/tiles/planetHalf_mid.png
deleted file mode 100644
index db09438..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetHalf_mid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetHalf_right.png b/arcade/examples/platform_tutorial/images/tiles/planetHalf_right.png
deleted file mode 100644
index 7f8c4e0..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetHalf_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetHill_left.png b/arcade/examples/platform_tutorial/images/tiles/planetHill_left.png
deleted file mode 100644
index 601e362..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetHill_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetHill_right.png b/arcade/examples/platform_tutorial/images/tiles/planetHill_right.png
deleted file mode 100644
index aa36c85..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetHill_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetLeft.png b/arcade/examples/platform_tutorial/images/tiles/planetLeft.png
deleted file mode 100644
index 1140caf..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetMid.png b/arcade/examples/platform_tutorial/images/tiles/planetMid.png
deleted file mode 100644
index 530cd69..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/planetRight.png b/arcade/examples/platform_tutorial/images/tiles/planetRight.png
deleted file mode 100644
index 5a1a0f8..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/planetRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/plantPurple.png b/arcade/examples/platform_tutorial/images/tiles/plantPurple.png
deleted file mode 100644
index 41effce..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/plantPurple.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/rock.png b/arcade/examples/platform_tutorial/images/tiles/rock.png
deleted file mode 100644
index d8624b1..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/rock.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sand.png b/arcade/examples/platform_tutorial/images/tiles/sand.png
deleted file mode 100644
index 13194f0..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sand.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCenter.png b/arcade/examples/platform_tutorial/images/tiles/sandCenter.png
deleted file mode 100644
index c2517e3..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCenter.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCenter_rounded.png b/arcade/examples/platform_tutorial/images/tiles/sandCenter_rounded.png
deleted file mode 100644
index 659b8a0..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCenter_rounded.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCliffAlt_left.png b/arcade/examples/platform_tutorial/images/tiles/sandCliffAlt_left.png
deleted file mode 100644
index f358511..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCliffAlt_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCliffAlt_right.png b/arcade/examples/platform_tutorial/images/tiles/sandCliffAlt_right.png
deleted file mode 100644
index ac61f89..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCliffAlt_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCliff_left.png b/arcade/examples/platform_tutorial/images/tiles/sandCliff_left.png
deleted file mode 100644
index a919e7b..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCliff_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCliff_right.png b/arcade/examples/platform_tutorial/images/tiles/sandCliff_right.png
deleted file mode 100644
index e4f0032..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCliff_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCorner_leftg.png b/arcade/examples/platform_tutorial/images/tiles/sandCorner_leftg.png
deleted file mode 100644
index 56690f2..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCorner_leftg.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandCorner_right.png b/arcade/examples/platform_tutorial/images/tiles/sandCorner_right.png
deleted file mode 100644
index 164ea4e..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandCorner_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandHalf.png b/arcade/examples/platform_tutorial/images/tiles/sandHalf.png
deleted file mode 100644
index 210abd2..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandHalf.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandHalf_left.png b/arcade/examples/platform_tutorial/images/tiles/sandHalf_left.png
deleted file mode 100644
index e46782c..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandHalf_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandHalf_mid.png b/arcade/examples/platform_tutorial/images/tiles/sandHalf_mid.png
deleted file mode 100644
index b48e2ca..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandHalf_mid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandHalf_right.png b/arcade/examples/platform_tutorial/images/tiles/sandHalf_right.png
deleted file mode 100644
index 58c67a2..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandHalf_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandHill_left.png b/arcade/examples/platform_tutorial/images/tiles/sandHill_left.png
deleted file mode 100644
index 3404419..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandHill_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandHill_right.png b/arcade/examples/platform_tutorial/images/tiles/sandHill_right.png
deleted file mode 100644
index 34e0d12..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandHill_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandLeft.png b/arcade/examples/platform_tutorial/images/tiles/sandLeft.png
deleted file mode 100644
index 7767e14..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandMid.png b/arcade/examples/platform_tutorial/images/tiles/sandMid.png
deleted file mode 100644
index 8ecd234..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/sandRight.png b/arcade/examples/platform_tutorial/images/tiles/sandRight.png
deleted file mode 100644
index e51d3e2..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/sandRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/signExit.png b/arcade/examples/platform_tutorial/images/tiles/signExit.png
deleted file mode 100644
index fac42c0..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/signExit.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/signLeft.png b/arcade/examples/platform_tutorial/images/tiles/signLeft.png
deleted file mode 100644
index 0d12fff..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/signLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/signRight.png b/arcade/examples/platform_tutorial/images/tiles/signRight.png
deleted file mode 100644
index 334b79e..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/signRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snow.png b/arcade/examples/platform_tutorial/images/tiles/snow.png
deleted file mode 100644
index 1932a4a..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snow.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCenter.png b/arcade/examples/platform_tutorial/images/tiles/snowCenter.png
deleted file mode 100644
index 5908ca1..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCenter.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCenter_rounded.png b/arcade/examples/platform_tutorial/images/tiles/snowCenter_rounded.png
deleted file mode 100644
index 8c4689a..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCenter_rounded.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCliffAlt_left.png b/arcade/examples/platform_tutorial/images/tiles/snowCliffAlt_left.png
deleted file mode 100644
index 7fc57e5..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCliffAlt_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCliffAlt_right.png b/arcade/examples/platform_tutorial/images/tiles/snowCliffAlt_right.png
deleted file mode 100644
index d797efc..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCliffAlt_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCliff_left.png b/arcade/examples/platform_tutorial/images/tiles/snowCliff_left.png
deleted file mode 100644
index 75c7cc6..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCliff_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCliff_right.png b/arcade/examples/platform_tutorial/images/tiles/snowCliff_right.png
deleted file mode 100644
index 0a78861..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCliff_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCorner_left.png b/arcade/examples/platform_tutorial/images/tiles/snowCorner_left.png
deleted file mode 100644
index 59882cb..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCorner_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowCorner_right.png b/arcade/examples/platform_tutorial/images/tiles/snowCorner_right.png
deleted file mode 100644
index e235c82..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowCorner_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowHalf.png b/arcade/examples/platform_tutorial/images/tiles/snowHalf.png
deleted file mode 100644
index a9c09c5..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowHalf.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowHalf_left.png b/arcade/examples/platform_tutorial/images/tiles/snowHalf_left.png
deleted file mode 100644
index 179801e..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowHalf_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowHalf_mid.png b/arcade/examples/platform_tutorial/images/tiles/snowHalf_mid.png
deleted file mode 100644
index 4b8387a..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowHalf_mid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowHalf_right.png b/arcade/examples/platform_tutorial/images/tiles/snowHalf_right.png
deleted file mode 100644
index dfe967a..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowHalf_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowHill_left.png b/arcade/examples/platform_tutorial/images/tiles/snowHill_left.png
deleted file mode 100644
index c20fe15..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowHill_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowHill_right.png b/arcade/examples/platform_tutorial/images/tiles/snowHill_right.png
deleted file mode 100644
index 8a4d9c8..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowHill_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowLeft.png b/arcade/examples/platform_tutorial/images/tiles/snowLeft.png
deleted file mode 100644
index ae82d1d..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowMid.png b/arcade/examples/platform_tutorial/images/tiles/snowMid.png
deleted file mode 100644
index bf541b4..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snowRight.png b/arcade/examples/platform_tutorial/images/tiles/snowRight.png
deleted file mode 100644
index 2cf0d64..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snowRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/snow_pile.png b/arcade/examples/platform_tutorial/images/tiles/snow_pile.png
deleted file mode 100644
index 4ab1536..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/snow_pile.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/spikes.png b/arcade/examples/platform_tutorial/images/tiles/spikes.png
deleted file mode 100644
index 08dc172..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/spikes.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stone.png b/arcade/examples/platform_tutorial/images/tiles/stone.png
deleted file mode 100644
index 9e1fe8f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stone.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCenter.png b/arcade/examples/platform_tutorial/images/tiles/stoneCenter.png
deleted file mode 100644
index 05393e0..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCenter.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCenter_rounded.png b/arcade/examples/platform_tutorial/images/tiles/stoneCenter_rounded.png
deleted file mode 100644
index 4d1be1f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCenter_rounded.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCliffAlt_left.png b/arcade/examples/platform_tutorial/images/tiles/stoneCliffAlt_left.png
deleted file mode 100644
index cc4f5b8..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCliffAlt_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCliffAlt_right.png b/arcade/examples/platform_tutorial/images/tiles/stoneCliffAlt_right.png
deleted file mode 100644
index 2983549..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCliffAlt_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCliff_left.png b/arcade/examples/platform_tutorial/images/tiles/stoneCliff_left.png
deleted file mode 100644
index 814b779..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCliff_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCliff_right.png b/arcade/examples/platform_tutorial/images/tiles/stoneCliff_right.png
deleted file mode 100644
index a0b4b64..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCliff_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCorner_left.png b/arcade/examples/platform_tutorial/images/tiles/stoneCorner_left.png
deleted file mode 100644
index d7e0fdf..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCorner_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneCorner_right.png b/arcade/examples/platform_tutorial/images/tiles/stoneCorner_right.png
deleted file mode 100644
index 7de3cc6..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneCorner_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneHalf.png b/arcade/examples/platform_tutorial/images/tiles/stoneHalf.png
deleted file mode 100644
index adea72f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneHalf.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneHalf_left.png b/arcade/examples/platform_tutorial/images/tiles/stoneHalf_left.png
deleted file mode 100644
index 5b1355a..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneHalf_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneHalf_mid.png b/arcade/examples/platform_tutorial/images/tiles/stoneHalf_mid.png
deleted file mode 100644
index 82bdd72..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneHalf_mid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneHalf_right.png b/arcade/examples/platform_tutorial/images/tiles/stoneHalf_right.png
deleted file mode 100644
index 43b6175..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneHalf_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneHill_left.png b/arcade/examples/platform_tutorial/images/tiles/stoneHill_left.png
deleted file mode 100644
index 25c3a06..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneHill_left.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneHill_right.png b/arcade/examples/platform_tutorial/images/tiles/stoneHill_right.png
deleted file mode 100644
index 8a33781..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneHill_right.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneLeft.png b/arcade/examples/platform_tutorial/images/tiles/stoneLeft.png
deleted file mode 100644
index 7cf175f..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneLeft.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneMid.png b/arcade/examples/platform_tutorial/images/tiles/stoneMid.png
deleted file mode 100644
index e11b3c1..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneMid.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/stoneRight.png b/arcade/examples/platform_tutorial/images/tiles/stoneRight.png
deleted file mode 100644
index 2f74870..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/stoneRight.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/switchGreen.png b/arcade/examples/platform_tutorial/images/tiles/switchGreen.png
deleted file mode 100644
index 713ca25..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/switchGreen.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/switchGreen_pressed.png b/arcade/examples/platform_tutorial/images/tiles/switchGreen_pressed.png
deleted file mode 100644
index dcb5aab..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/switchGreen_pressed.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/switchRed.png b/arcade/examples/platform_tutorial/images/tiles/switchRed.png
deleted file mode 100644
index 3d25e67..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/switchRed.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/switchRed_pressed.png b/arcade/examples/platform_tutorial/images/tiles/switchRed_pressed.png
deleted file mode 100644
index 52da8db..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/switchRed_pressed.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/torch1.png b/arcade/examples/platform_tutorial/images/tiles/torch1.png
deleted file mode 100644
index 7bdfed7..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/torch1.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/torch2.png b/arcade/examples/platform_tutorial/images/tiles/torch2.png
deleted file mode 100644
index 91a4c35..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/torch2.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/torchOff.png b/arcade/examples/platform_tutorial/images/tiles/torchOff.png
deleted file mode 100644
index a774b80..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/torchOff.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/water.png b/arcade/examples/platform_tutorial/images/tiles/water.png
deleted file mode 100644
index a36a0bd..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/water.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/waterTop_high.png b/arcade/examples/platform_tutorial/images/tiles/waterTop_high.png
deleted file mode 100644
index f550da5..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/waterTop_high.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/images/tiles/waterTop_low.png b/arcade/examples/platform_tutorial/images/tiles/waterTop_low.png
deleted file mode 100644
index d64bca1..0000000
Binary files a/arcade/examples/platform_tutorial/images/tiles/waterTop_low.png and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/map.tmx b/arcade/examples/platform_tutorial/map.tmx
deleted file mode 100644
index fedad61..0000000
--- a/arcade/examples/platform_tutorial/map.tmx
+++ /dev/null
@@ -1,482 +0,0 @@
-
-
diff --git a/arcade/examples/platform_tutorial/map2_level_1.tmx b/arcade/examples/platform_tutorial/map2_level_1.tmx
deleted file mode 100644
index 62f1730..0000000
--- a/arcade/examples/platform_tutorial/map2_level_1.tmx
+++ /dev/null
@@ -1,574 +0,0 @@
-
-
diff --git a/arcade/examples/platform_tutorial/map2_level_2.tmx b/arcade/examples/platform_tutorial/map2_level_2.tmx
deleted file mode 100644
index d0ca07e..0000000
--- a/arcade/examples/platform_tutorial/map2_level_2.tmx
+++ /dev/null
@@ -1,544 +0,0 @@
-
-
diff --git a/arcade/examples/platform_tutorial/map_with_ladders.tmx b/arcade/examples/platform_tutorial/map_with_ladders.tmx
deleted file mode 100644
index d8a655a..0000000
--- a/arcade/examples/platform_tutorial/map_with_ladders.tmx
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
diff --git a/arcade/examples/platform_tutorial/more_tiles.tsx b/arcade/examples/platform_tutorial/more_tiles.tsx
deleted file mode 100644
index 7f9601b..0000000
--- a/arcade/examples/platform_tutorial/more_tiles.tsx
+++ /dev/null
@@ -1,448 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/arcade/examples/platform_tutorial/sounds/Kenney Donate.url b/arcade/examples/platform_tutorial/sounds/Kenney Donate.url
deleted file mode 100644
index a310f49..0000000
--- a/arcade/examples/platform_tutorial/sounds/Kenney Donate.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://kenney.nl/support
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/sounds/Kenney Facebook.url b/arcade/examples/platform_tutorial/sounds/Kenney Facebook.url
deleted file mode 100644
index e37cfb3..0000000
--- a/arcade/examples/platform_tutorial/sounds/Kenney Facebook.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://social.kenney.nl/facebook
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/sounds/Kenney Twitter.url b/arcade/examples/platform_tutorial/sounds/Kenney Twitter.url
deleted file mode 100644
index 10be373..0000000
--- a/arcade/examples/platform_tutorial/sounds/Kenney Twitter.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://social.kenney.nl/twitter
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/sounds/Kenney Website.url b/arcade/examples/platform_tutorial/sounds/Kenney Website.url
deleted file mode 100644
index fbdde43..0000000
--- a/arcade/examples/platform_tutorial/sounds/Kenney Website.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=http://www.kenney.nl/
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/sounds/License.txt b/arcade/examples/platform_tutorial/sounds/License.txt
deleted file mode 100644
index 8a9c62c..0000000
--- a/arcade/examples/platform_tutorial/sounds/License.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- Everything in this package is licensed CC0 (see below).
-
- ------------------------------
-
- License (Creative Commons Zero, CC0)
- http://creativecommons.org/publicdomain/zero/1.0/
-
- You may use these graphics in personal and commercial projects.
- Credit (Kenney or www.kenney.nl) would be nice but is not mandatory.
-
- ------------------------------
-
- Donate: http://donate.kenney.nl/
- Request: http://request.kenney.nl/
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/sounds/coin1.wav b/arcade/examples/platform_tutorial/sounds/coin1.wav
deleted file mode 100644
index 85fe3e6..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/coin1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/coin2.wav b/arcade/examples/platform_tutorial/sounds/coin2.wav
deleted file mode 100644
index 0372638..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/coin2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/coin3.wav b/arcade/examples/platform_tutorial/sounds/coin3.wav
deleted file mode 100644
index 95f9bd9..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/coin3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/coin4.wav b/arcade/examples/platform_tutorial/sounds/coin4.wav
deleted file mode 100644
index 9119c61..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/coin4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/coin5.wav b/arcade/examples/platform_tutorial/sounds/coin5.wav
deleted file mode 100644
index cad434b..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/coin5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/error1.wav b/arcade/examples/platform_tutorial/sounds/error1.wav
deleted file mode 100644
index e0203d2..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/error1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/error2.wav b/arcade/examples/platform_tutorial/sounds/error2.wav
deleted file mode 100644
index aefa6a2..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/error2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/error3.wav b/arcade/examples/platform_tutorial/sounds/error3.wav
deleted file mode 100644
index 5ac209f..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/error3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/error4.wav b/arcade/examples/platform_tutorial/sounds/error4.wav
deleted file mode 100644
index 61ddd8b..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/error4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/error5.wav b/arcade/examples/platform_tutorial/sounds/error5.wav
deleted file mode 100644
index c2c6b09..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/error5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/explosion1.wav b/arcade/examples/platform_tutorial/sounds/explosion1.wav
deleted file mode 100644
index 184869e..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/explosion1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/explosion2.wav b/arcade/examples/platform_tutorial/sounds/explosion2.wav
deleted file mode 100644
index a90d9d3..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/explosion2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/fall1.wav b/arcade/examples/platform_tutorial/sounds/fall1.wav
deleted file mode 100644
index da01bfc..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/fall1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/fall2.wav b/arcade/examples/platform_tutorial/sounds/fall2.wav
deleted file mode 100644
index fc4d3d7..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/fall2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/fall3.wav b/arcade/examples/platform_tutorial/sounds/fall3.wav
deleted file mode 100644
index 60b9851..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/fall3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/fall4.wav b/arcade/examples/platform_tutorial/sounds/fall4.wav
deleted file mode 100644
index a9c49ba..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/fall4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/gameover1.wav b/arcade/examples/platform_tutorial/sounds/gameover1.wav
deleted file mode 100644
index db5431e..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/gameover1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/gameover2.wav b/arcade/examples/platform_tutorial/sounds/gameover2.wav
deleted file mode 100644
index 8242a5a..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/gameover2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/gameover3.wav b/arcade/examples/platform_tutorial/sounds/gameover3.wav
deleted file mode 100644
index 77b9ee9..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/gameover3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/gameover4.wav b/arcade/examples/platform_tutorial/sounds/gameover4.wav
deleted file mode 100644
index ecfa369..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/gameover4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/gameover5.wav b/arcade/examples/platform_tutorial/sounds/gameover5.wav
deleted file mode 100644
index f3d5049..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/gameover5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hit1.wav b/arcade/examples/platform_tutorial/sounds/hit1.wav
deleted file mode 100644
index 251b238..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hit1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hit2.wav b/arcade/examples/platform_tutorial/sounds/hit2.wav
deleted file mode 100644
index d7d0a47..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hit2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hit3.wav b/arcade/examples/platform_tutorial/sounds/hit3.wav
deleted file mode 100644
index 7875ced..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hit3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hit4.wav b/arcade/examples/platform_tutorial/sounds/hit4.wav
deleted file mode 100644
index 7151a25..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hit4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hit5.wav b/arcade/examples/platform_tutorial/sounds/hit5.wav
deleted file mode 100644
index 189da3b..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hit5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hurt1.wav b/arcade/examples/platform_tutorial/sounds/hurt1.wav
deleted file mode 100644
index 392314f..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hurt1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hurt2.wav b/arcade/examples/platform_tutorial/sounds/hurt2.wav
deleted file mode 100644
index d3addb6..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hurt2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hurt3.wav b/arcade/examples/platform_tutorial/sounds/hurt3.wav
deleted file mode 100644
index ea3e7c5..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hurt3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hurt4.wav b/arcade/examples/platform_tutorial/sounds/hurt4.wav
deleted file mode 100644
index 04384c0..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hurt4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/hurt5.wav b/arcade/examples/platform_tutorial/sounds/hurt5.wav
deleted file mode 100644
index c5a8593..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/hurt5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/jump1.wav b/arcade/examples/platform_tutorial/sounds/jump1.wav
deleted file mode 100644
index ec27da0..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/jump1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/jump2.wav b/arcade/examples/platform_tutorial/sounds/jump2.wav
deleted file mode 100644
index 576e3aa..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/jump2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/jump3.wav b/arcade/examples/platform_tutorial/sounds/jump3.wav
deleted file mode 100644
index 2ecad1a..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/jump3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/jump4.wav b/arcade/examples/platform_tutorial/sounds/jump4.wav
deleted file mode 100644
index 137b71c..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/jump4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/jump5.wav b/arcade/examples/platform_tutorial/sounds/jump5.wav
deleted file mode 100644
index 9bccf3c..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/jump5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/laser1.wav b/arcade/examples/platform_tutorial/sounds/laser1.wav
deleted file mode 100644
index e2bb70f..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/laser1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/laser2.wav b/arcade/examples/platform_tutorial/sounds/laser2.wav
deleted file mode 100644
index ee05304..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/laser2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/laser3.wav b/arcade/examples/platform_tutorial/sounds/laser3.wav
deleted file mode 100644
index c9ed32f..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/laser3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/laser4.wav b/arcade/examples/platform_tutorial/sounds/laser4.wav
deleted file mode 100644
index 700bde2..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/laser4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/laser5.wav b/arcade/examples/platform_tutorial/sounds/laser5.wav
deleted file mode 100644
index 1af501b..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/laser5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/lose1.wav b/arcade/examples/platform_tutorial/sounds/lose1.wav
deleted file mode 100644
index a6f9cf5..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/lose1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/lose2.wav b/arcade/examples/platform_tutorial/sounds/lose2.wav
deleted file mode 100644
index e292bcf..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/lose2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/lose3.wav b/arcade/examples/platform_tutorial/sounds/lose3.wav
deleted file mode 100644
index d2e178d..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/lose3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/lose4.wav b/arcade/examples/platform_tutorial/sounds/lose4.wav
deleted file mode 100644
index 3e45bae..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/lose4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/lose5.wav b/arcade/examples/platform_tutorial/sounds/lose5.wav
deleted file mode 100644
index ca2df76..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/lose5.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/readme.txt b/arcade/examples/platform_tutorial/sounds/readme.txt
deleted file mode 100644
index 3d9ed43..0000000
--- a/arcade/examples/platform_tutorial/sounds/readme.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-These assets are a subset of what is available from Kenney.nl.
-
-If you like his work, please go support is by purchasing his full asset packs
-at https://kenney.nl/
\ No newline at end of file
diff --git a/arcade/examples/platform_tutorial/sounds/secret2.wav b/arcade/examples/platform_tutorial/sounds/secret2.wav
deleted file mode 100644
index b35ba6e..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/secret2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/secret4.wav b/arcade/examples/platform_tutorial/sounds/secret4.wav
deleted file mode 100644
index c190191..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/secret4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/upgrade1.wav b/arcade/examples/platform_tutorial/sounds/upgrade1.wav
deleted file mode 100644
index 0877e8e..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/upgrade1.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/upgrade2.wav b/arcade/examples/platform_tutorial/sounds/upgrade2.wav
deleted file mode 100644
index 71d44b1..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/upgrade2.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/upgrade3.wav b/arcade/examples/platform_tutorial/sounds/upgrade3.wav
deleted file mode 100644
index 19919b5..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/upgrade3.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/upgrade4.wav b/arcade/examples/platform_tutorial/sounds/upgrade4.wav
deleted file mode 100644
index a5ab16e..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/upgrade4.wav and /dev/null differ
diff --git a/arcade/examples/platform_tutorial/sounds/upgrade5.wav b/arcade/examples/platform_tutorial/sounds/upgrade5.wav
deleted file mode 100644
index 37c81dc..0000000
Binary files a/arcade/examples/platform_tutorial/sounds/upgrade5.wav and /dev/null differ
diff --git a/arcade/examples/procedural_caves_bsp.py b/arcade/examples/procedural_caves_bsp.py
deleted file mode 100644
index 2a1ac37..0000000
--- a/arcade/examples/procedural_caves_bsp.py
+++ /dev/null
@@ -1,455 +0,0 @@
-"""
-This example procedurally develops a random cave based on
-Binary Space Partitioning (BSP)
-
-For more information, see:
-http://roguebasin.roguelikedevelopment.org/index.php?title=Basic_BSP_Dungeon_generation
-https://github.com/DanaL/RLDungeonGenerator
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.procedural_caves_bsp
-"""
-
-import random
-import arcade
-import timeit
-import math
-import os
-
-# Sprite scaling. Make this larger, like 0.5 to zoom in and add
-# 'mystery' to what you can see. Make it smaller, like 0.1 to see
-# more of the map.
-WALL_SPRITE_SCALING = 0.25
-PLAYER_SPRITE_SCALING = 0.20
-
-WALL_SPRITE_SIZE = 128 * WALL_SPRITE_SCALING
-
-# How big the grid is
-GRID_WIDTH = 100
-GRID_HEIGHT = 100
-
-AREA_WIDTH = GRID_WIDTH * WALL_SPRITE_SIZE
-AREA_HEIGHT = GRID_HEIGHT * WALL_SPRITE_SIZE
-
-# How fast the player moves
-MOVEMENT_SPEED = 5
-
-# How close the player can get to the edge before we scroll.
-VIEWPORT_MARGIN = 300
-
-# How big the window is
-WINDOW_WIDTH = 800
-WINDOW_HEIGHT = 600
-WINDOW_TITLE = "Procedural Caves BSP Example"
-
-MERGE_SPRITES = True
-
-
-class Room:
- def __init__(self, r, c, h, w):
- self.row = r
- self.col = c
- self.height = h
- self.width = w
-
-
-class RLDungeonGenerator:
- def __init__(self, w, h):
- self.MAX = 15 # Cutoff for when we want to stop dividing sections
- self.width = w
- self.height = h
- self.leaves = []
- self.dungeon = []
- self.rooms = []
-
- for h in range(self.height):
- row = []
- for w in range(self.width):
- row.append('#')
-
- self.dungeon.append(row)
-
- def random_split(self, min_row, min_col, max_row, max_col):
- # We want to keep splitting until the sections get down to the threshold
- seg_height = max_row - min_row
- seg_width = max_col - min_col
-
- if seg_height < self.MAX and seg_width < self.MAX:
- self.leaves.append((min_row, min_col, max_row, max_col))
- elif seg_height < self.MAX <= seg_width:
- self.split_on_vertical(min_row, min_col, max_row, max_col)
- elif seg_height >= self.MAX > seg_width:
- self.split_on_horizontal(min_row, min_col, max_row, max_col)
- else:
- if random.random() < 0.5:
- self.split_on_horizontal(min_row, min_col, max_row, max_col)
- else:
- self.split_on_vertical(min_row, min_col, max_row, max_col)
-
- def split_on_horizontal(self, min_row, min_col, max_row, max_col):
- split = (min_row + max_row) // 2 + random.choice((-2, -1, 0, 1, 2))
- self.random_split(min_row, min_col, split, max_col)
- self.random_split(split + 1, min_col, max_row, max_col)
-
- def split_on_vertical(self, min_row, min_col, max_row, max_col):
- split = (min_col + max_col) // 2 + random.choice((-2, -1, 0, 1, 2))
- self.random_split(min_row, min_col, max_row, split)
- self.random_split(min_row, split + 1, max_row, max_col)
-
- def carve_rooms(self):
- for leaf in self.leaves:
- # We don't want to fill in every possible room or the
- # dungeon looks too uniform
- if random.random() > 0.80:
- continue
- section_width = leaf[3] - leaf[1]
- section_height = leaf[2] - leaf[0]
-
- # The actual room's height and width will be 60-100% of the
- # available section.
- room_width = round(random.randrange(60, 100) / 100 * section_width)
- room_height = round(random.randrange(60, 100) / 100 * section_height)
-
- # If the room doesn't occupy the entire section we are carving it from,
- # 'jiggle' it a bit in the square
- if section_height > room_height:
- room_start_row = leaf[0] + random.randrange(section_height - room_height)
- else:
- room_start_row = leaf[0]
-
- if section_width > room_width:
- room_start_col = leaf[1] + random.randrange(section_width - room_width)
- else:
- room_start_col = leaf[1]
-
- self.rooms.append(Room(room_start_row, room_start_col, room_height, room_width))
- for r in range(room_start_row, room_start_row + room_height):
- for c in range(room_start_col, room_start_col + room_width):
- self.dungeon[r][c] = '.'
-
- def are_rooms_adjacent(self, room1, room2):
- adj_rows = []
- adj_cols = []
- for r in range(room1.row, room1.row + room1.height):
- if room2.row <= r < room2.row + room2.height:
- adj_rows.append(r)
-
- for c in range(room1.col, room1.col + room1.width):
- if room2.col <= c < room2.col + room2.width:
- adj_cols.append(c)
-
- return adj_rows, adj_cols
-
- def distance_between_rooms(self, room1, room2):
- centre1 = (room1.row + room1.height // 2, room1.col + room1.width // 2)
- centre2 = (room2.row + room2.height // 2, room2.col + room2.width // 2)
-
- return math.sqrt((centre1[0] - centre2[0]) ** 2 + (centre1[1] - centre2[1]) ** 2)
-
- def carve_corridor_between_rooms(self, room1, room2):
- if room2[2] == 'rows':
- row = random.choice(room2[1])
- # Figure out which room is to the left of the other
- if room1.col + room1.width < room2[0].col:
- start_col = room1.col + room1.width
- end_col = room2[0].col
- else:
- start_col = room2[0].col + room2[0].width
- end_col = room1.col
- for c in range(start_col, end_col):
- self.dungeon[row][c] = '.'
-
- if end_col - start_col >= 4:
- self.dungeon[row][start_col] = '+'
- self.dungeon[row][end_col - 1] = '+'
- elif start_col == end_col - 1:
- self.dungeon[row][start_col] = '+'
- else:
- col = random.choice(room2[1])
- # Figure out which room is above the other
- if room1.row + room1.height < room2[0].row:
- start_row = room1.row + room1.height
- end_row = room2[0].row
- else:
- start_row = room2[0].row + room2[0].height
- end_row = room1.row
-
- for r in range(start_row, end_row):
- self.dungeon[r][col] = '.'
-
- if end_row - start_row >= 4:
- self.dungeon[start_row][col] = '+'
- self.dungeon[end_row - 1][col] = '+'
- elif start_row == end_row - 1:
- self.dungeon[start_row][col] = '+'
-
- # Find two nearby rooms that are in difference groups, draw
- # a corridor between them and merge the groups
- def find_closest_unconnect_groups(self, groups, room_dict):
- shortest_distance = 99999
- start = None
- start_group = None
- nearest = None
-
- for group in groups:
- for room in group:
- key = (room.row, room.col)
- for other in room_dict[key]:
- if not other[0] in group and other[3] < shortest_distance:
- shortest_distance = other[3]
- start = room
- nearest = other
- start_group = group
-
- self.carve_corridor_between_rooms(start, nearest)
-
- # Merge the groups
- other_group = None
- for group in groups:
- if nearest[0] in group:
- other_group = group
- break
-
- start_group += other_group
- groups.remove(other_group)
-
- def connect_rooms(self):
- # Build a dictionary containing an entry for each room. Each bucket will
- # hold a list of the adjacent rooms, weather they are adjacent along rows or
- # columns and the distance between them.
- #
- # Also build the initial groups (which start of as a list of individual rooms)
- groups = []
- room_dict = {}
- for room in self.rooms:
- key = (room.row, room.col)
- room_dict[key] = []
- for other in self.rooms:
- other_key = (other.row, other.col)
- if key == other_key:
- continue
- adj = self.are_rooms_adjacent(room, other)
- if len(adj[0]) > 0:
- room_dict[key].append((other, adj[0], 'rows', self.distance_between_rooms(room, other)))
- elif len(adj[1]) > 0:
- room_dict[key].append((other, adj[1], 'cols', self.distance_between_rooms(room, other)))
-
- groups.append([room])
-
- while len(groups) > 1:
- self.find_closest_unconnect_groups(groups, room_dict)
-
- def generate_map(self):
- self.random_split(1, 1, self.height - 1, self.width - 1)
- self.carve_rooms()
- self.connect_rooms()
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- 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)
-
- self.grid = None
- self.wall_list = None
- self.player_list = None
- self.player_sprite = None
- self.view_bottom = 0
- self.view_left = 0
- self.physics_engine = None
-
- self.processing_time = 0
- self.draw_time = 0
-
- arcade.set_background_color(arcade.color.BLACK)
-
- def setup(self):
- self.wall_list = arcade.SpriteList()
- self.player_list = arcade.SpriteList()
-
- # Create cave system using a 2D grid
- dg = RLDungeonGenerator(GRID_WIDTH, GRID_HEIGHT)
- dg.generate_map()
-
- # Create sprites based on 2D grid
- if not MERGE_SPRITES:
- # This is the simple-to-understand method. Each grid location
- # is a sprite.
- for row in range(dg.height):
- for column in range(dg.width):
- value = dg.dungeon[row][column]
- if value.sqr == '#':
- wall = arcade.Sprite("images/grassCenter.png", WALL_SPRITE_SCALING)
- wall.center_x = column * WALL_SPRITE_SIZE + WALL_SPRITE_SIZE / 2
- wall.center_y = row * WALL_SPRITE_SIZE + WALL_SPRITE_SIZE / 2
- self.wall_list.append(wall)
- else:
- # This uses new Arcade 1.3.1 features, that allow me to create a
- # larger sprite with a repeating texture. So if there are multiple
- # cells in a row with a wall, we merge them into one sprite, with a
- # repeating texture for each cell. This reduces our sprite count.
- for row in range(dg.height):
- column = 0
- while column < dg.width:
- while column < dg.width and dg.dungeon[row][column] != '#':
- column += 1
- start_column = column
- while column < dg.width and dg.dungeon[row][column] == '#':
- column += 1
- end_column = column - 1
-
- column_count = end_column - start_column + 1
- column_mid = (start_column + end_column) / 2
-
- wall = arcade.Sprite("images/grassCenter.png", WALL_SPRITE_SCALING,
- repeat_count_x=column_count)
- wall.center_x = column_mid * WALL_SPRITE_SIZE + WALL_SPRITE_SIZE / 2
- wall.center_y = row * WALL_SPRITE_SIZE + WALL_SPRITE_SIZE / 2
- wall.width = WALL_SPRITE_SIZE * column_count
- self.wall_list.append(wall)
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", PLAYER_SPRITE_SCALING)
- self.player_list.append(self.player_sprite)
-
- # Randomly place the player. If we are in a wall, repeat until we aren't.
- placed = False
- while not placed:
-
- # Randomly position
- self.player_sprite.center_x = random.randrange(AREA_WIDTH)
- self.player_sprite.center_y = random.randrange(AREA_HEIGHT)
-
- # Are we in a wall?
- walls_hit = arcade.check_for_collision_with_list(self.player_sprite, self.wall_list)
- if len(walls_hit) == 0:
- # Not in a wall! Success!
- placed = True
-
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite,
- self.wall_list)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # This command should happen before we start drawing. It will clear
- # the screen to the background color, and erase what we drew last frame.
- arcade.start_render()
-
- # Draw the sprites
- self.wall_list.draw()
- self.player_list.draw()
-
- # Draw info on the screen
- sprite_count = len(self.wall_list)
-
- output = f"Sprite Count: {sprite_count}"
- arcade.draw_text(output,
- self.view_left + 20,
- WINDOW_HEIGHT - 20 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- WINDOW_HEIGHT - 40 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- WINDOW_HEIGHT - 60 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- start_time = timeit.default_timer()
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + WINDOW_WIDTH - VIEWPORT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + WINDOW_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- if changed:
- arcade.set_viewport(self.view_left,
- WINDOW_WIDTH + self.view_left,
- self.view_bottom,
- WINDOW_HEIGHT + self.view_bottom)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
-
-def main():
- game = MyGame(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE)
- game.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/procedural_caves_cellular.py b/arcade/examples/procedural_caves_cellular.py
deleted file mode 100644
index 0ac9671..0000000
--- a/arcade/examples/procedural_caves_cellular.py
+++ /dev/null
@@ -1,317 +0,0 @@
-"""
-This example procedurally develops a random cave based on cellular automata.
-
-For more information, see:
-https://gamedevelopment.tutsplus.com/tutorials/generate-random-cave-levels-using-cellular-automata--gamedev-9664
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.procedural_caves_cellular
-"""
-
-import random
-import arcade
-import timeit
-import os
-
-# Sprite scaling. Make this larger, like 0.5 to zoom in and add
-# 'mystery' to what you can see. Make it smaller, like 0.1 to see
-# more of the map.
-SPRITE_SCALING = 0.125
-SPRITE_SIZE = 128 * SPRITE_SCALING
-
-# How big the grid is
-GRID_WIDTH = 400
-GRID_HEIGHT = 300
-
-# Parameters for cellular automata
-CHANCE_TO_START_ALIVE = 0.4
-DEATH_LIMIT = 3
-BIRTH_LIMIT = 4
-NUMBER_OF_STEPS = 4
-
-# How fast the player moves
-MOVEMENT_SPEED = 5
-
-# How close the player can get to the edge before we scroll.
-VIEWPORT_MARGIN = 300
-
-# How big the window is
-WINDOW_WIDTH = 800
-WINDOW_HEIGHT = 600
-WINDOW_TITLE = "Procedural Caves Cellular Automata Example"
-# If true, rather than each block being a separate sprite, blocks on rows
-# will be merged into one sprite.
-MERGE_SPRITES = False
-
-
-def create_grid(width, height):
- """ Create a two-dimensional grid of specified size. """
- return [[0 for x in range(width)] for y in range(height)]
-
-
-def initialize_grid(grid):
- """ Randomly set grid locations to on/off based on chance. """
- height = len(grid)
- width = len(grid[0])
- for row in range(height):
- for column in range(width):
- if random.random() <= CHANCE_TO_START_ALIVE:
- grid[row][column] = 1
-
-
-def count_alive_neighbors(grid, x, y):
- """ Count neighbors that are alive. """
- height = len(grid)
- width = len(grid[0])
- alive_count = 0
- for i in range(-1, 2):
- for j in range(-1, 2):
- neighbor_x = x + i
- neighbor_y = y + j
- if i == 0 and j == 0:
- continue
- elif neighbor_x < 0 or neighbor_y < 0 or neighbor_y >= height or neighbor_x >= width:
- # Edges are considered alive. Makes map more likely to appear naturally closed.
- alive_count += 1
- elif grid[neighbor_y][neighbor_x] == 1:
- alive_count += 1
- return alive_count
-
-
-def do_simulation_step(old_grid):
- """ Run a step of the cellular automaton. """
- height = len(old_grid)
- width = len(old_grid[0])
- new_grid = create_grid(width, height)
- for x in range(width):
- for y in range(height):
- alive_neighbors = count_alive_neighbors(old_grid, x, y)
- if old_grid[y][x] == 1:
- if alive_neighbors < DEATH_LIMIT:
- new_grid[y][x] = 0
- else:
- new_grid[y][x] = 1
- else:
- if alive_neighbors > BIRTH_LIMIT:
- new_grid[y][x] = 1
- else:
- new_grid[y][x] = 0
- return new_grid
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
- super().__init__(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE, resizable=True)
-
- # 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)
-
- self.grid = None
- self.wall_list = None
- self.player_list = None
- self.player_sprite = None
- self.view_bottom = 0
- self.view_left = 0
- self.draw_time = 0
- self.physics_engine = None
-
- arcade.set_background_color(arcade.color.BLACK)
-
- def setup(self):
- self.wall_list = arcade.SpriteList(use_spatial_hash=True)
- self.player_list = arcade.SpriteList()
-
- # Create cave system using a 2D grid
- self.grid = create_grid(GRID_WIDTH, GRID_HEIGHT)
- initialize_grid(self.grid)
- for step in range(NUMBER_OF_STEPS):
- self.grid = do_simulation_step(self.grid)
-
- # Create sprites based on 2D grid
- if not MERGE_SPRITES:
- # This is the simple-to-understand method. Each grid location
- # is a sprite.
- for row in range(GRID_HEIGHT):
- for column in range(GRID_WIDTH):
- if self.grid[row][column] == 1:
- wall = arcade.Sprite("images/grassCenter.png", SPRITE_SCALING)
- wall.center_x = column * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.center_y = row * SPRITE_SIZE + SPRITE_SIZE / 2
- self.wall_list.append(wall)
- else:
- # This uses new Arcade 1.3.1 features, that allow me to create a
- # larger sprite with a repeating texture. So if there are multiple
- # cells in a row with a wall, we merge them into one sprite, with a
- # repeating texture for each cell. This reduces our sprite count.
- for row in range(GRID_HEIGHT):
- column = 0
- while column < GRID_WIDTH:
- while column < GRID_WIDTH and self.grid[row][column] == 0:
- column += 1
- start_column = column
- while column < GRID_WIDTH and self.grid[row][column] == 1:
- column += 1
- end_column = column - 1
-
- column_count = end_column - start_column + 1
- column_mid = (start_column + end_column) / 2
-
- wall = arcade.Sprite("images/grassCenter.png", SPRITE_SCALING,
- repeat_count_x=column_count)
- wall.center_x = column_mid * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.center_y = row * SPRITE_SIZE + SPRITE_SIZE / 2
- wall.width = SPRITE_SIZE * column_count
- self.wall_list.append(wall)
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_list.append(self.player_sprite)
-
- # Randomly place the player. If we are in a wall, repeat until we aren't.
- placed = False
- while not placed:
-
- # Randomly position
- max_x = GRID_WIDTH * SPRITE_SIZE
- max_y = GRID_HEIGHT * SPRITE_SIZE
- self.player_sprite.center_x = random.randrange(max_x)
- self.player_sprite.center_y = random.randrange(max_y)
-
- # Are we in a wall?
- walls_hit = arcade.check_for_collision_with_list(self.player_sprite, self.wall_list)
- if len(walls_hit) == 0:
- # Not in a wall! Success!
- placed = True
-
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite,
- self.wall_list)
-
- def on_draw(self):
- """ Render the screen. """
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # This command should happen before we start drawing. It will clear
- # the screen to the background color, and erase what we drew last frame.
- arcade.start_render()
-
- # Draw the sprites
- self.wall_list.draw()
- self.player_list.draw()
-
- # Draw info on the screen
- sprite_count = len(self.wall_list)
-
- output = f"Sprite Count: {sprite_count}"
- arcade.draw_text(output,
- self.view_left + 20,
- self.height - 20 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- self.height - 40 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output,
- self.view_left + 20,
- self.height - 60 + self.view_bottom,
- arcade.color.WHITE, 16)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def on_resize(self, width, height):
-
- arcade.set_viewport(self.view_left,
- self.width + self.view_left,
- self.view_bottom,
- self.height + self.view_bottom)
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- start_time = timeit.default_timer()
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + WINDOW_WIDTH - VIEWPORT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + WINDOW_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- if changed:
- arcade.set_viewport(self.view_left,
- self.width + self.view_left,
- self.view_bottom,
- self.height + self.view_bottom)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
-
-def main():
- game = MyGame()
- game.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/pyinstaller/build-exe.bat b/arcade/examples/pyinstaller/build-exe.bat
deleted file mode 100644
index 8a03bc9..0000000
--- a/arcade/examples/pyinstaller/build-exe.bat
+++ /dev/null
@@ -1,8 +0,0 @@
-rem @echo off
-for /f %%i in ('python -c "import site; print(site.getsitepackages()[0])"') do set PYTHON_ROOT="%%i"
-rem copy %PYTHON_ROOT%\Lib\site-packages\arcade\Win64\avbin.dll .
-rem copy avbin.dll avbin64.dll
-rem pyinstaller --exclude-module tkinter --add-data resources;resources --add-data ./avbin64.dll;. --add-data ./avbin.dll;Win64 --onefile --noconsole sample.py
-rem del avbin.dll
-rem del avbin64.dll
-rem pause
diff --git a/arcade/examples/pyinstaller/build-exe.py b/arcade/examples/pyinstaller/build-exe.py
deleted file mode 100644
index f10764a..0000000
--- a/arcade/examples/pyinstaller/build-exe.py
+++ /dev/null
@@ -1,16 +0,0 @@
-import site
-import shutil
-import os
-import subprocess
-
-
-python_root = site.getsitepackages()[0]
-
-shutil.copyfile(f"{python_root}/Lib/site-packages/arcade/Win64/avbin.dll", "avbin.dll")
-shutil.copyfile(f"avbin.dll", "avbin64.dll")
-sp = subprocess.run(["pyinstaller", "--exclude-module", "tkinter", "--add-data", "resources;resources", "--add-data", "./avbin64.dll;.", "--add-data", "./avbin.dll;Win64", "--onefile", "--noconsole", "sample.py"], stdout=subprocess.PIPE)
-# rem pyinstaller --exclude-module tkinter --add-data resources;resources --add-data ./avbin64.dll;. --add-data ./avbin.dll;Win64 --onefile --noconsole sample.py
-# print(sp.stdout)
-os.unlink("avbin.dll")
-os.unlink("avbin64.dll")
-
diff --git a/arcade/examples/pyinstaller/resources/cat-meow.wav b/arcade/examples/pyinstaller/resources/cat-meow.wav
deleted file mode 100644
index 9eb0a7c..0000000
Binary files a/arcade/examples/pyinstaller/resources/cat-meow.wav and /dev/null differ
diff --git a/arcade/examples/pyinstaller/resources/character.png b/arcade/examples/pyinstaller/resources/character.png
deleted file mode 100644
index 9ad34ca..0000000
Binary files a/arcade/examples/pyinstaller/resources/character.png and /dev/null differ
diff --git a/arcade/examples/pyinstaller/sample.py b/arcade/examples/pyinstaller/sample.py
deleted file mode 100644
index 6b9c5f4..0000000
--- a/arcade/examples/pyinstaller/sample.py
+++ /dev/null
@@ -1,36 +0,0 @@
-import arcade
-import pyglet
-import time
-import sys
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 500
-TITLE = 'Arcade cx_Freeze Sample'
-BACKGROUND_COLOR = arcade.color.WHITE
-
-
-def resource_path(file):
- path = 'resources/' + file
- # are we in a frozen environment (e.g. pyInstaller)?
- if getattr(sys, 'frozen', False):
- path = sys._MEIPASS.replace('\\', '/') + '/' + path
- return path
-
-
-def main():
- arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, TITLE)
- arcade.set_background_color(BACKGROUND_COLOR)
- arcade.start_render()
- arcade.draw_circle_filled(400, 250, 100, arcade.color.BLACK)
- # load image
- image = arcade.load_texture(resource_path('character.png'))
- arcade.draw_texture_rectangle(200, 250, image.width, image.height, image)
- # load sound
- sound = arcade.sound.load_sound(resource_path('cat-meow.wav'))
- arcade.sound.play_sound(sound)
- arcade.finish_render()
- arcade.run()
- return
-
-
-main()
diff --git a/arcade/examples/pymunk_box_stacks.py b/arcade/examples/pymunk_box_stacks.py
deleted file mode 100644
index 2c2f3c5..0000000
--- a/arcade/examples/pymunk_box_stacks.py
+++ /dev/null
@@ -1,215 +0,0 @@
-"""
-Use Pymunk physics engine.
-
-For more info on Pymunk see:
-http://www.pymunk.org/en/latest/
-
-To install pymunk:
-pip install pymunk
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.pymunk_box_stacks
-
-Click and drag with the mouse to move the boxes.
-"""
-
-import arcade
-import pymunk
-import timeit
-import math
-import os
-
-SCREEN_WIDTH = 1800
-SCREEN_HEIGHT = 800
-SCREEN_TITLE = "Pymunk test"
-
-
-class PhysicsSprite(arcade.Sprite):
- def __init__(self, pymunk_shape, filename):
- super().__init__(filename, center_x=pymunk_shape.body.position.x, center_y=pymunk_shape.body.position.y)
- self.pymunk_shape = pymunk_shape
-
-
-class CircleSprite(PhysicsSprite):
- def __init__(self, pymunk_shape, filename):
- super().__init__(pymunk_shape, filename)
- self.width = pymunk_shape.radius * 2
- self.height = pymunk_shape.radius * 2
-
-
-class BoxSprite(PhysicsSprite):
- def __init__(self, pymunk_shape, filename, width, height):
- super().__init__(pymunk_shape, filename)
- self.width = width
- self.height = height
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- 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)
-
- arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
-
- # -- Pymunk
- self.space = pymunk.Space()
- self.space.iterations = 35
- self.space.gravity = (0.0, -900.0)
-
- # Lists of sprites or lines
- self.sprite_list = arcade.SpriteList()
- self.static_lines = []
-
- # Used for dragging shapes around with the mouse
- self.shape_being_dragged = None
- self.last_mouse_position = 0, 0
-
- self.draw_time = 0
- self.processing_time = 0
-
- # Create the floor
- floor_height = 80
- body = pymunk.Body(body_type=pymunk.Body.STATIC)
- shape = pymunk.Segment(body, [0, floor_height], [SCREEN_WIDTH, floor_height], 0.0)
- shape.friction = 10
- self.space.add(shape)
- self.static_lines.append(shape)
-
- # Create the stacks of boxes
- for row in range(10):
- for column in range(10):
- size = 32
- mass = 1.0
- x = 500 + column * 32
- y = (floor_height + size / 2) + row * size
- moment = pymunk.moment_for_box(mass, (size, size))
- body = pymunk.Body(mass, moment)
- body.position = pymunk.Vec2d(x, y)
- shape = pymunk.Poly.create_box(body, (size, size))
- shape.elasticity = 0.2
- shape.friction = 0.9
- self.space.add(body, shape)
- # body.sleep()
-
- sprite = BoxSprite(shape, "images/boxCrate_double.png", width=size, height=size)
- self.sprite_list.append(sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # Draw all the sprites
- self.sprite_list.draw()
-
- # Draw the lines that aren't sprites
- for line in self.static_lines:
- body = line.body
-
- pv1 = body.position + line.a.rotated(body.angle)
- pv2 = body.position + line.b.rotated(body.angle)
- arcade.draw_line(pv1.x, pv1.y, pv2.x, pv2.y, arcade.color.WHITE, 2)
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 20, arcade.color.WHITE, 12)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.WHITE, 12)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def on_mouse_press(self, x, y, button, modifiers):
- if button == arcade.MOUSE_BUTTON_LEFT:
- self.last_mouse_position = x, y
- # See if we clicked on anything
- shape_list = self.space.point_query((x, y), 1, pymunk.ShapeFilter())
-
- # If we did, remember what we clicked on
- if len(shape_list) > 0:
- self.shape_being_dragged = shape_list[0]
-
- elif button == arcade.MOUSE_BUTTON_RIGHT:
- # With right mouse button, shoot a heavy coin fast.
- mass = 60
- radius = 10
- inertia = pymunk.moment_for_circle(mass, 0, radius, (0, 0))
- body = pymunk.Body(mass, inertia)
- body.position = x, y
- body.velocity = 2000, 0
- shape = pymunk.Circle(body, radius, pymunk.Vec2d(0, 0))
- shape.friction = 0.3
- self.space.add(body, shape)
-
- sprite = CircleSprite(shape, "images/coin_01.png")
- self.sprite_list.append(sprite)
-
- def on_mouse_release(self, x, y, button, modifiers):
- if button == arcade.MOUSE_BUTTON_LEFT:
- # Release the item we are holding (if any)
- self.shape_being_dragged = None
-
- def on_mouse_motion(self, x, y, dx, dy):
- if self.shape_being_dragged is not None:
- # If we are holding an object, move it with the mouse
- self.last_mouse_position = x, y
- self.shape_being_dragged.shape.body.position = self.last_mouse_position
- self.shape_being_dragged.shape.body.velocity = dx * 20, dy * 20
-
- def update(self, delta_time):
- start_time = timeit.default_timer()
-
- # Check for balls that fall off the screen
- for sprite in self.sprite_list:
- if sprite.pymunk_shape.body.position.y < 0:
- # Remove balls from physics space
- self.space.remove(sprite.pymunk_shape, sprite.pymunk_shape.body)
- # Remove balls from physics list
- sprite.kill()
-
- # Update physics
- # Use a constant time step, don't use delta_time
- # See "Game loop / moving time forward"
- # http://www.pymunk.org/en/latest/overview.html#game-loop-moving-time-forward
- self.space.step(1 / 60.0)
-
- # If we are dragging an object, make sure it stays with the mouse. Otherwise
- # gravity will drag it down.
- if self.shape_being_dragged is not None:
- self.shape_being_dragged.shape.body.position = self.last_mouse_position
- self.shape_being_dragged.shape.body.velocity = 0, 0
-
- # Move sprites to where physics objects are
- for sprite in self.sprite_list:
- sprite.center_x = sprite.pymunk_shape.body.position.x
- sprite.center_y = sprite.pymunk_shape.body.position.y
- sprite.angle = math.degrees(sprite.pymunk_shape.body.angle)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/pymunk_joint_builder.py b/arcade/examples/pymunk_joint_builder.py
deleted file mode 100644
index 91e2962..0000000
--- a/arcade/examples/pymunk_joint_builder.py
+++ /dev/null
@@ -1,322 +0,0 @@
-"""
-Pymunk 2
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.pymunk_joint_builder
-"""
-import arcade
-import pymunk
-import timeit
-import math
-import os
-
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 800
-SCREEN_TITLE = "Pymunk 2 Example"
-
-"""
-Key bindings:
-
-1 - Drag mode
-2 - Make box mode
-3 - Make PinJoint mode
-4 - Make DampedSpring mode
-
-S - No gravity or friction
-L - Layout, no gravity, lots of friction
-G - Gravity, little bit of friction
-
-Right-click, fire coin
-
-"""
-
-
-class PhysicsSprite(arcade.Sprite):
- def __init__(self, pymunk_shape, filename):
- super().__init__(filename, center_x=pymunk_shape.body.position.x, center_y=pymunk_shape.body.position.y)
- self.pymunk_shape = pymunk_shape
-
-
-class CircleSprite(PhysicsSprite):
- def __init__(self, pymunk_shape, filename):
- super().__init__(pymunk_shape, filename)
- self.width = pymunk_shape.radius * 2
- self.height = pymunk_shape.radius * 2
-
-
-class BoxSprite(PhysicsSprite):
- def __init__(self, pymunk_shape, filename, width, height):
- super().__init__(pymunk_shape, filename)
- self.width = width
- self.height = height
-
-
-class MyApplication(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- 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)
-
- arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
-
- # -- Pymunk
- self.space = pymunk.Space()
- self.space.gravity = (0.0, -900.0)
-
- # Lists of sprites or lines
- self.sprite_list = arcade.SpriteList()
- self.static_lines = []
-
- # Used for dragging shapes aruond with the mouse
- self.shape_being_dragged = None
- self.last_mouse_position = 0, 0
-
- self.processing_time_text = None
- self.draw_time_text = None
- self.draw_mode_text = None
- self.shape_1 = None
- self.shape_2 = None
- self.draw_time = 0
- self.processing_time = 0
- self.joints = []
-
- self.physics = "Normal"
- self.mode = "Make Box"
-
- # Create the floor
- self.floor_height = 80
- body = pymunk.Body(body_type=pymunk.Body.STATIC)
- shape = pymunk.Segment(body, [0, self.floor_height], [SCREEN_WIDTH, self.floor_height], 0.0)
- shape.friction = 10
- self.space.add(shape)
- self.static_lines.append(shape)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # Draw all the sprites
- self.sprite_list.draw()
-
- # Draw the lines that aren't sprites
- for line in self.static_lines:
- body = line.body
-
- pv1 = body.position + line.a.rotated(body.angle)
- pv2 = body.position + line.b.rotated(body.angle)
- arcade.draw_line(pv1.x, pv1.y, pv2.x, pv2.y, arcade.color.WHITE, 2)
-
- for joint in self.joints:
- color = arcade.color.WHITE
- if isinstance(joint, pymunk.DampedSpring):
- color = arcade.color.DARK_GREEN
- arcade.draw_line(joint.a.position.x, joint.a.position.y, joint.b.position.x, joint.b.position.y, color, 3)
-
- # arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 20, arcade.color.WHITE)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.WHITE)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- output = f"Mode: {self.mode}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 60, arcade.color.WHITE)
-
- output = f"Physics: {self.physics}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 80, arcade.color.WHITE)
-
- def make_box(self, x, y):
- size = 45
- mass = 12.0
- moment = pymunk.moment_for_box(mass, (size, size))
- body = pymunk.Body(mass, moment)
- body.position = pymunk.Vec2d(x, y)
- shape = pymunk.Poly.create_box(body, (size, size))
- shape.friction = 0.3
- self.space.add(body, shape)
-
- sprite = BoxSprite(shape, "images/boxCrate_double.png", width=size, height=size)
- self.sprite_list.append(sprite)
-
- def make_circle(self, x, y):
- size = 20
- mass = 12.0
- moment = pymunk.moment_for_circle(mass, 0, size, (0, 0))
- body = pymunk.Body(mass, moment)
- body.position = pymunk.Vec2d(x, y)
- shape = pymunk.Circle(body, size, pymunk.Vec2d(0, 0))
- shape.friction = 0.3
- self.space.add(body, shape)
-
- sprite = CircleSprite(shape, "images/coin_01.png")
- self.sprite_list.append(sprite)
-
- def make_pin_joint(self, x, y):
- shape_selected = self.get_shape(x, y)
- if shape_selected is None:
- return
-
- if self.shape_1 is None:
- print("Shape 1 Selected")
- self.shape_1 = shape_selected
- elif self.shape_2 is None:
- print("Shape 2 Selected")
- self.shape_2 = shape_selected
- joint = pymunk.PinJoint(self.shape_1.shape.body, self.shape_2.shape.body)
- self.space.add(joint)
- self.joints.append(joint)
- self.shape_1 = None
- self.shape_2 = None
- print("Joint Made")
-
- def make_damped_spring(self, x, y):
- shape_selected = self.get_shape(x, y)
- if shape_selected is None:
- return
-
- if self.shape_1 is None:
- print("Shape 1 Selected")
- self.shape_1 = shape_selected
- elif self.shape_2 is None:
- print("Shape 2 Selected")
- self.shape_2 = shape_selected
- joint = pymunk.DampedSpring(self.shape_1.shape.body, self.shape_2.shape.body, (0, 0), (0, 0), 45, 300, 30)
- self.space.add(joint)
- self.joints.append(joint)
- self.shape_1 = None
- self.shape_2 = None
- print("Joint Made")
-
- def get_shape(self, x, y):
- # See if we clicked on anything
- shape_list = self.space.point_query((x, y), 1, pymunk.ShapeFilter())
-
- # If we did, remember what we clicked on
- if len(shape_list) > 0:
- shape = shape_list[0]
- else:
- shape = None
-
- return shape
-
- def on_mouse_press(self, x, y, button, modifiers):
-
- if button == 1 and self.mode == "Drag":
- self.last_mouse_position = x, y
- self.shape_being_dragged = self.get_shape(x, y)
-
- elif button == 1 and self.mode == "Make Box":
- self.make_box(x, y)
-
- elif button == 1 and self.mode == "Make Circle":
- self.make_circle(x, y)
-
- elif button == 1 and self.mode == "Make PinJoint":
- self.make_pin_joint(x, y)
-
- elif button == 1 and self.mode == "Make DampedSpring":
- self.make_damped_spring(x, y)
-
- elif button == 4:
- # With right mouse button, shoot a heavy coin fast.
- mass = 60
- radius = 10
- inertia = pymunk.moment_for_circle(mass, 0, radius, (0, 0))
- body = pymunk.Body(mass, inertia)
- body.position = x, y
- body.velocity = 2000, 0
- shape = pymunk.Circle(body, radius, pymunk.Vec2d(0, 0))
- shape.friction = 0.3
- self.space.add(body, shape)
-
- sprite = CircleSprite(shape, "images/coin_01.png")
- self.sprite_list.append(sprite)
-
- def on_mouse_release(self, x, y, button, modifiers):
- if button == 1:
- # Release the item we are holding (if any)
- self.shape_being_dragged = None
-
- def on_mouse_motion(self, x, y, dx, dy):
- if self.shape_being_dragged is not None:
- # If we are holding an object, move it with the mouse
- self.last_mouse_position = x, y
- self.shape_being_dragged.shape.body.position = self.last_mouse_position
- self.shape_being_dragged.shape.body.velocity = dx * 20, dy * 20
-
- def on_key_press(self, symbol: int, modifiers: int):
- if symbol == arcade.key.KEY_1:
- self.mode = "Drag"
- elif symbol == arcade.key.KEY_2:
- self.mode = "Make Box"
- elif symbol == arcade.key.KEY_3:
- self.mode = "Make Circle"
-
- elif symbol == arcade.key.KEY_4:
- self.mode = "Make PinJoint"
- elif symbol == arcade.key.KEY_5:
- self.mode = "Make DampedSpring"
-
- elif symbol == arcade.key.S:
- self.space.gravity = (0.0, 0.0)
- self.space.damping = 1
- self.physics = "Outer Space"
- elif symbol == arcade.key.L:
- self.space.gravity = (0.0, 0.0)
- self.space.damping = 0
- self.physics = "Layout"
- elif symbol == arcade.key.G:
- self.space.damping = 0.95
- self.space.gravity = (0.0, -900.0)
- self.physics = "Normal"
-
- def update(self, delta_time):
- start_time = timeit.default_timer()
-
- # Check for balls that fall off the screen
- for sprite in self.sprite_list:
- if sprite.pymunk_shape.body.position.y < 0:
- # Remove balls from physics space
- self.space.remove(sprite.pymunk_shape, sprite.pymunk_shape.body)
- # Remove balls from physics list
- sprite.kill()
-
- # Update physics
- self.space.step(1 / 80.0)
-
- # If we are dragging an object, make sure it stays with the mouse. Otherwise
- # gravity will drag it down.
- if self.shape_being_dragged is not None:
- self.shape_being_dragged.shape.body.position = self.last_mouse_position
- self.shape_being_dragged.shape.body.velocity = 0, 0
-
- # Move sprites to where physics objects are
- for sprite in self.sprite_list:
- sprite.center_x = sprite.pymunk_shape.body.position.x
- sprite.center_y = sprite.pymunk_shape.body.position.y
- sprite.angle = math.degrees(sprite.pymunk_shape.body.angle)
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
-
-window = MyApplication(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
-arcade.run()
diff --git a/arcade/examples/pymunk_pegboard.py b/arcade/examples/pymunk_pegboard.py
deleted file mode 100644
index 8aa3757..0000000
--- a/arcade/examples/pymunk_pegboard.py
+++ /dev/null
@@ -1,178 +0,0 @@
-"""
-Use Pymunk physics engine.
-
-For more info on Pymunk see:
-http://www.pymunk.org/en/latest/
-
-To install pymunk:
-pip install pymunk
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.pymunk_pegboard
-
-Click and drag with the mouse to move the boxes.
-"""
-
-import arcade
-import pymunk
-import random
-import timeit
-import math
-import os
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 800
-SCREEN_TITLE = "Pymunk Pegboard Example"
-
-
-class CircleSprite(arcade.Sprite):
- def __init__(self, filename, pymunk_shape):
- super().__init__(filename, center_x=pymunk_shape.body.position.x, center_y=pymunk_shape.body.position.y)
- self.width = pymunk_shape.radius * 2
- self.height = pymunk_shape.radius * 2
- self.pymunk_shape = pymunk_shape
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- 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)
-
- self.peg_list = arcade.SpriteList()
- self.ball_list = arcade.SpriteList()
- arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
-
- self.draw_time = 0
- self.processing_time = 0
- self.time = 0
-
- # -- Pymunk
- self.space = pymunk.Space()
- self.space.gravity = (0.0, -900.0)
-
- self.static_lines = []
-
- self.ticks_to_next_ball = 10
-
- body = pymunk.Body(body_type=pymunk.Body.STATIC)
- shape = pymunk.Segment(body, [0, 10], [SCREEN_WIDTH, 10], 0.0)
- shape.friction = 10
- self.space.add(shape)
- self.static_lines.append(shape)
-
- body = pymunk.Body(body_type=pymunk.Body.STATIC)
- shape = pymunk.Segment(body, [SCREEN_WIDTH - 50, 10], [SCREEN_WIDTH, 30], 0.0)
- shape.friction = 10
- self.space.add(shape)
- self.static_lines.append(shape)
-
- body = pymunk.Body(body_type=pymunk.Body.STATIC)
- shape = pymunk.Segment(body, [50, 10], [0, 30], 0.0)
- shape.friction = 10
- self.space.add(shape)
- self.static_lines.append(shape)
-
- radius = 20
- separation = 150
- for row in range(6):
- for column in range(6):
- x = column * separation + (separation // 2 * (row % 2))
- y = row * separation + separation // 2
- body = pymunk.Body(body_type=pymunk.Body.STATIC)
- body.position = x, y
- shape = pymunk.Circle(body, radius, pymunk.Vec2d(0, 0))
- shape.friction = 0.3
- self.space.add(body, shape)
-
- sprite = CircleSprite("images/bumper.png", shape)
- self.peg_list.append(sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- draw_start_time = timeit.default_timer()
- self.peg_list.draw()
- self.ball_list.draw()
-
- for line in self.static_lines:
- body = line.body
-
- pv1 = body.position + line.a.rotated(body.angle)
- pv2 = body.position + line.b.rotated(body.angle)
- arcade.draw_line(pv1.x, pv1.y, pv2.x, pv2.y, arcade.color.WHITE, 2)
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 20, arcade.color.WHITE, 12)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.WHITE, 12)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def update(self, delta_time):
- start_time = timeit.default_timer()
-
- self.ticks_to_next_ball -= 1
- if self.ticks_to_next_ball <= 0:
- self.ticks_to_next_ball = 20
- mass = 0.5
- radius = 15
- inertia = pymunk.moment_for_circle(mass, 0, radius, (0, 0))
- body = pymunk.Body(mass, inertia)
- x = random.randint(0, SCREEN_WIDTH)
- y = SCREEN_HEIGHT
- body.position = x, y
- shape = pymunk.Circle(body, radius, pymunk.Vec2d(0, 0))
- shape.friction = 0.3
- self.space.add(body, shape)
-
- sprite = CircleSprite("images/coin_01.png", shape)
- self.ball_list.append(sprite)
-
- # Check for balls that fall off the screen
- for ball in self.ball_list:
- if ball.pymunk_shape.body.position.y < 0:
- # Remove balls from physics space
- self.space.remove(ball.pymunk_shape, ball.pymunk_shape.body)
- # Remove balls from physics list
- ball.kill()
-
- # Update physics
- # Use a constant time step, don't use delta_time
- # See "Game loop / moving time forward"
- # http://www.pymunk.org/en/latest/overview.html#game-loop-moving-time-forward
- self.space.step(1 / 60.0)
-
- # Move sprites to where physics objects are
- for ball in self.ball_list:
- ball.center_x = ball.pymunk_shape.body.position.x
- ball.center_y = ball.pymunk_shape.body.position.y
- ball.angle = math.degrees(ball.pymunk_shape.body.angle)
-
- self.time = timeit.default_timer() - start_time
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/pymunk_platformer/__init__.py b/arcade/examples/pymunk_platformer/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/arcade/examples/pymunk_platformer/constants.py b/arcade/examples/pymunk_platformer/constants.py
deleted file mode 100644
index b1b5261..0000000
--- a/arcade/examples/pymunk_platformer/constants.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Size of the window
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 800
-SCREEN_TITLE = 'Pymunk Platformer'
-
-# Default friction used for sprites, unless otherwise specified
-DEFAULT_FRICTION = 0.2
-
-# Default mass used for sprites
-DEFAULT_MASS = 1
-
-# Gravity
-GRAVITY = (0.0, -900.0)
-
-# Player forces
-PLAYER_MOVE_FORCE = 700
-PLAYER_JUMP_IMPULSE = 600
-PLAYER_PUNCH_IMPULSE = 600
-
-# Grid-size
-SPRITE_SIZE = 64
-
-# How close we get to the edge before scrolling
-VIEWPORT_MARGIN = 100
diff --git a/arcade/examples/pymunk_platformer/create_level.py b/arcade/examples/pymunk_platformer/create_level.py
deleted file mode 100644
index 65af252..0000000
--- a/arcade/examples/pymunk_platformer/create_level.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-This code creates the layout of level one.
-"""
-import pymunk
-
-from arcade.examples.pymunk_platformer.physics_utility import (
- PymunkSprite,
-)
-from constants import *
-
-
-def create_floor(space, sprite_list):
- """ Create a bunch of blocks for the floor. """
- for x in range(-1000, 2000, SPRITE_SIZE):
- y = SPRITE_SIZE / 2
- sprite = PymunkSprite("../images/grassMid.png", x, y, scale=0.5, body_type=pymunk.Body.STATIC)
- sprite_list.append(sprite)
- space.add(sprite.body, sprite.shape)
-
-
-def create_platform(space, sprite_list, start_x, y, count):
- """ Create a platform """
- for x in range(start_x, start_x + count * SPRITE_SIZE + 1, SPRITE_SIZE):
- sprite = PymunkSprite("../images/grassMid.png", x, y, scale=0.5, body_type=pymunk.Body.STATIC)
- sprite_list.append(sprite)
- space.add(sprite.body, sprite.shape)
-
-
-def create_level_1(space, static_sprite_list, dynamic_sprite_list):
- """ Create level one. """
- create_floor(space, static_sprite_list)
- create_platform(space, static_sprite_list, 200, SPRITE_SIZE * 3, 3)
- create_platform(space, static_sprite_list, 500, SPRITE_SIZE * 6, 3)
- create_platform(space, static_sprite_list, 200, SPRITE_SIZE * 9, 3)
-
- # Create the stacks of boxes
- for column in range(6):
- for row in range(column):
- x = 600 + column * SPRITE_SIZE
- y = (3 * SPRITE_SIZE / 2) + row * SPRITE_SIZE
- sprite = PymunkSprite("../images/boxCrate_double.png", x, y, scale=0.5, friction=0.4)
- dynamic_sprite_list.append(sprite)
- space.add(sprite.body, sprite.shape)
diff --git a/arcade/examples/pymunk_platformer/main_window.py b/arcade/examples/pymunk_platformer/main_window.py
deleted file mode 100644
index 1be3d95..0000000
--- a/arcade/examples/pymunk_platformer/main_window.py
+++ /dev/null
@@ -1,309 +0,0 @@
-"""
-Use Pymunk physics engine.
-
-For more info on Pymunk see:
-http://www.pymunk.org/en/latest/
-
-To install pymunk:
-pip install pymunk
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.pymunk_platformer.main_window
-
-Click and drag with the mouse to move the boxes.
-"""
-
-import timeit
-import os
-import arcade
-import pymunk
-
-from arcade.examples.pymunk_platformer.create_level import create_level_1
-from arcade.examples.pymunk_platformer.physics_utility import (
- PymunkSprite,
- check_grounding,
- resync_physics_sprites,
-)
-
-from constants import *
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- 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)
-
- arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
-
- # -- Pymunk
- self.space = pymunk.Space()
- self.space.gravity = GRAVITY
-
- # Physics joint used for grabbing items
- self.grab_joint = None
-
- # Lists of sprites
- self.dynamic_sprite_list = arcade.SpriteList()
- self.static_sprite_list = arcade.SpriteList()
-
- # Used for dragging shapes around with the mouse
- self.shape_being_dragged = None
- self.last_mouse_position = 0, 0
-
- # Draw and processing timings
- self.draw_time = 0
- self.processing_time = 0
-
- # Current force applied to the player for movement by keyboard
- self.force = (0, 0)
-
- # Set the viewport boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- create_level_1(self.space, self.static_sprite_list, self.dynamic_sprite_list)
-
- # Create player
- x = 50
- y = (SPRITE_SIZE + SPRITE_SIZE / 2)
- self.player = PymunkSprite("../images/character.png", x, y, scale=0.5, moment=pymunk.inf, mass=1)
- self.dynamic_sprite_list.append(self.player)
- self.space.add(self.player.body, self.player.shape)
-
- def on_draw(self):
- """ Render the screen. """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # Draw all the sprites
- self.static_sprite_list.draw()
- self.dynamic_sprite_list.draw()
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output, 20 + self.view_left, SCREEN_HEIGHT - 20 + self.view_bottom, arcade.color.WHITE, 12)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output, 20 + self.view_left, SCREEN_HEIGHT - 40 + self.view_bottom, arcade.color.WHITE, 12)
-
- # Display instructions
- output = "Use the mouse to move boxes, space to punch, hold G to grab an item to the right."
- arcade.draw_text(output, 20 + self.view_left, SCREEN_HEIGHT - 60 + self.view_bottom, arcade.color.WHITE, 12)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def on_mouse_press(self, x, y, button, modifiers):
- """ Handle mouse down events """
-
- if button == arcade.MOUSE_BUTTON_LEFT:
-
- # Store where the mouse is clicked. Adjust accordingly if we've
- # scrolled the viewport.
- self.last_mouse_position = (x + self.view_left, y + self.view_bottom)
-
- # See if we clicked on any physics object
- shape_list = self.space.point_query(self.last_mouse_position, 1, pymunk.ShapeFilter())
-
- # If we did, remember what we clicked on
- if len(shape_list) > 0:
- self.shape_being_dragged = shape_list[0]
-
- def on_mouse_release(self, x, y, button, modifiers):
- """ Handle mouse up events """
-
- if button == arcade.MOUSE_BUTTON_LEFT:
- # Release the item we are holding (if any)
- self.shape_being_dragged = None
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle mouse motion events """
-
- if self.shape_being_dragged is not None:
- # If we are holding an object, move it with the mouse
- self.last_mouse_position = (x + self.view_left, y + self.view_bottom)
- self.shape_being_dragged.shape.body.position = self.last_mouse_position
- self.shape_being_dragged.shape.body.velocity = dx * 20, dy * 20
-
- def scroll_viewport(self):
- """ Manage scrolling of the viewport. """
-
- # Flipped to true if we need to scroll
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player.left < left_bndry:
- self.view_left -= left_bndry - self.player.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - VIEWPORT_MARGIN
- if self.player.right > right_bndry:
- self.view_left += self.player.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player.top > top_bndry:
- self.view_bottom += self.player.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player.bottom
- changed = True
-
- if changed:
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
- def update(self, delta_time):
- """ Update the sprites """
-
- # Keep track of how long this function takes.
- start_time = timeit.default_timer()
-
- # If we have force to apply to the player (from hitting the arrow
- # keys), apply it.
- self.player.body.apply_force_at_local_point(self.force, (0, 0))
-
- # check_collision(self.player)
-
- # See if the player is standing on an item.
- # If she is, apply opposite force to the item below her.
- # So if she moves left, the box below her will have
- # a force to move to the right.
- grounding = check_grounding(self.player)
- if self.force[0] and grounding and grounding['body']:
- grounding['body'].apply_force_at_world_point((-self.force[0], 0), grounding['position'])
-
- # Check for sprites that fall off the screen.
- # If so, get rid of them.
- for sprite in self.dynamic_sprite_list:
- if sprite.shape.body.position.y < 0:
- # Remove sprites from physics space
- self.space.remove(sprite.shape, sprite.shape.body)
- # Remove sprites from physics list
- sprite.kill()
-
- # Update physics
- # Use a constant time step, don't use delta_time
- # See "Game loop / moving time forward"
- # http://www.pymunk.org/en/latest/overview.html#game-loop-moving-time-forward
- self.space.step(1 / 60.0)
-
- # If we are dragging an object, make sure it stays with the mouse. Otherwise
- # gravity will drag it down.
- if self.shape_being_dragged is not None:
- self.shape_being_dragged.shape.body.position = self.last_mouse_position
- self.shape_being_dragged.shape.body.velocity = 0, 0
-
- # Resync the sprites to the physics objects that shadow them
- resync_physics_sprites(self.dynamic_sprite_list)
-
- # Scroll the viewport if needed
- self.scroll_viewport()
-
- # Save the time it took to do this.
- self.processing_time = timeit.default_timer() - start_time
-
- def punch(self):
- # --- Punch left
- # See if we have a physics object to our right
- self.check_point = (self.player.right + 10, self.player.center_y)
- shape_list = self.space.point_query(self.check_point, 1, pymunk.ShapeFilter())
-
- # Apply force to any object to our right
- for shape in shape_list:
- shape.shape.body.apply_impulse_at_world_point((PLAYER_PUNCH_IMPULSE, PLAYER_PUNCH_IMPULSE),
- self.check_point)
-
- # --- Punch right
- # See if we have a physics object to our left
- self.check_point = (self.player.left - 10, self.player.center_y)
- shape_list = self.space.point_query(self.check_point, 1, pymunk.ShapeFilter())
-
- # Apply force to any object to our right
- for shape in shape_list:
- shape.shape.body.apply_impulse_at_world_point((-PLAYER_PUNCH_IMPULSE, PLAYER_PUNCH_IMPULSE),
- self.check_point)
-
- def grab(self):
- """ Grab something """
- # See if we have a physics object to our right
- self.check_point = (self.player.right + 10, self.player.center_y)
- shape_list = self.space.point_query(self.check_point, 1, pymunk.ShapeFilter())
-
- # Create a joint for an item to our right
- for shape in shape_list:
- self.grab_joint = pymunk.PinJoint(self.player.shape.body, shape.shape.body)
- self.space.add(self.grab_joint)
-
- def let_go(self):
- """ Let go of whatever we are holding """
- if self.grab_joint:
- self.space.remove(self.grab_joint)
- self.grab_joint = None
-
- def on_key_press(self, symbol: int, modifiers: int):
- """ Handle keyboard presses. """
- if symbol == arcade.key.RIGHT:
- # Add force to the player, and set the player friction to zero
- self.force = (PLAYER_MOVE_FORCE, 0)
- self.player.shape.friction = 0
- elif symbol == arcade.key.LEFT:
- # Add force to the player, and set the player friction to zero
- self.force = (-PLAYER_MOVE_FORCE, 0)
- self.player.shape.friction = 0
- elif symbol == arcade.key.UP:
- # find out if player is standing on ground
- grounding = check_grounding(self.player)
- if grounding['body'] is not None and abs(
- grounding['normal'].x / grounding['normal'].y) < self.player.shape.friction:
- # She is! Go ahead and jump
- self.player.body.apply_impulse_at_local_point((0, PLAYER_JUMP_IMPULSE))
- elif symbol == arcade.key.SPACE:
- self.punch()
- elif symbol == arcade.key.G:
- self.grab()
-
- def on_key_release(self, symbol: int, modifiers: int):
- """ Handle keyboard releases. """
- if symbol == arcade.key.RIGHT:
- # Remove force from the player, and set the player friction to a high number so she stops
- self.force = (0, 0)
- self.player.shape.friction = 15
- elif symbol == arcade.key.LEFT:
- # Remove force from the player, and set the player friction to a high number so she stops
- self.force = (0, 0)
- self.player.shape.friction = 15
- elif symbol == arcade.key.G:
- self.let_go()
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/pymunk_platformer/physics_utility.py b/arcade/examples/pymunk_platformer/physics_utility.py
deleted file mode 100644
index 8d10847..0000000
--- a/arcade/examples/pymunk_platformer/physics_utility.py
+++ /dev/null
@@ -1,70 +0,0 @@
-import arcade
-from arcade.examples.pymunk_platformer.constants import (
- DEFAULT_FRICTION,
- DEFAULT_MASS,
-)
-
-import pymunk
-import math
-
-
-class PymunkSprite(arcade.Sprite):
- """
- We need a Sprite and a Pymunk physics object. This class blends them
- together.
- """
- def __init__(self,
- filename,
- center_x=0,
- center_y=0,
- scale=1,
- mass=DEFAULT_MASS,
- moment=None,
- friction=DEFAULT_FRICTION,
- body_type=pymunk.Body.DYNAMIC):
-
- super().__init__(filename, scale=scale, center_x=center_x, center_y=center_y)
-
- width = self.texture.width * scale
- height = self.texture.height * scale
-
- if moment is None:
- moment = pymunk.moment_for_box(mass, (width, height))
-
- self.body = pymunk.Body(mass, moment, body_type=body_type)
- self.body.position = pymunk.Vec2d(center_x, center_y)
-
- self.shape = pymunk.Poly.create_box(self.body, (width, height))
- self.shape.friction = friction
-
-
-def check_grounding(player):
- """ See if the player is on the ground. Used to see if we can jump. """
- grounding = {
- 'normal': pymunk.Vec2d.zero(),
- 'penetration': pymunk.Vec2d.zero(),
- 'impulse': pymunk.Vec2d.zero(),
- 'position': pymunk.Vec2d.zero(),
- 'body': None
- }
-
- def f(arbiter):
- n = -arbiter.contact_point_set.normal
- if n.y > grounding['normal'].y:
- grounding['normal'] = n
- grounding['penetration'] = -arbiter.contact_point_set.points[0].distance
- grounding['body'] = arbiter.shapes[1].body
- grounding['impulse'] = arbiter.total_impulse
- grounding['position'] = arbiter.contact_point_set.points[0].point_b
-
- player.body.each_arbiter(f)
-
- return grounding
-
-
-def resync_physics_sprites(sprite_list):
- """ Move sprites to where physics objects are """
- for sprite in sprite_list:
- sprite.center_x = sprite.shape.body.position.x
- sprite.center_y = sprite.shape.body.position.y
- sprite.angle = math.degrees(sprite.shape.body.angle)
diff --git a/arcade/examples/radar_sweep.py b/arcade/examples/radar_sweep.py
deleted file mode 100644
index 26f3eca..0000000
--- a/arcade/examples/radar_sweep.py
+++ /dev/null
@@ -1,68 +0,0 @@
-"""
-This animation example shows how perform a radar sweep animation.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.radar_sweep
-"""
-
-import arcade
-import math
-
-# Set up the constants
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Radar Sweep Example"
-
-# These constants control the particulars about the radar
-CENTER_X = SCREEN_WIDTH // 2
-CENTER_Y = SCREEN_HEIGHT // 2
-RADIANS_PER_FRAME = 0.02
-SWEEP_LENGTH = 250
-
-
-def on_draw(delta_time):
- """ Use this function to draw everything to the screen. """
-
- # Move the angle of the sweep.
- on_draw.angle += RADIANS_PER_FRAME
-
- # Calculate the end point of our radar sweep. Using math.
- x = SWEEP_LENGTH * math.sin(on_draw.angle) + CENTER_X
- y = SWEEP_LENGTH * math.cos(on_draw.angle) + CENTER_Y
-
- # Start the render. This must happen before any drawing
- # commands. We do NOT need an stop render command.
- arcade.start_render()
-
- # Draw the radar line
- arcade.draw_line(CENTER_X, CENTER_Y, x, y, arcade.color.OLIVE, 4)
-
- # Draw the outline of the radar
- arcade.draw_circle_outline(CENTER_X, CENTER_Y, SWEEP_LENGTH,
- arcade.color.DARK_GREEN, 10)
-
-
-# This is a function-specific variable. Before we
-# use them in our function, we need to give them initial
-# values.
-on_draw.angle = 0
-
-
-def main():
-
- # Open up our window
- arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.set_background_color(arcade.color.BLACK)
-
- # Tell the computer to call the draw command at the specified interval.
- arcade.schedule(on_draw, 1 / 80)
-
- # Run the program
- arcade.run()
-
- # When done running the program, close the window.
- arcade.close_window()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/resizable_window.py b/arcade/examples/resizable_window.py
deleted file mode 100644
index c8712ad..0000000
--- a/arcade/examples/resizable_window.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""
-Example showing how handle screen resizing.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.resizable_window
-"""
-import arcade
-
-SCREEN_WIDTH = 500
-SCREEN_HEIGHT = 500
-SCREEN_TITLE = "Resizing Window Example"
-START = 0
-END = 2000
-STEP = 50
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title, resizable=True)
-
- arcade.set_background_color(arcade.color.WHITE)
-
- def on_resize(self, width, height):
- """ This method is automatically called when the window is resized. """
-
- # Call the parent. Failing to do this will mess up the coordinates, and default to 0,0 at the center and the
- # edges being -1 to 1.
- super().on_resize(width, height)
-
- print(f"Window resized to: {width}, {height}")
-
- def on_draw(self):
- """ Render the screen. """
-
- arcade.start_render()
-
- # Draw the y labels
- i = 0
- for y in range(START, END, STEP):
- arcade.draw_point(0, y, arcade.color.BLUE, 5)
- arcade.draw_text(f"{y}", 5, y, arcade.color.BLACK, 12, anchor_x="left", anchor_y="bottom")
- i += 1
-
- # Draw the x labels.
- i = 1
- for x in range(START + STEP, END, STEP):
- arcade.draw_point(x, 0, arcade.color.BLUE, 5)
- arcade.draw_text(f"{x}", x, 5, arcade.color.BLACK, 12, anchor_x="left", anchor_y="bottom")
- i += 1
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shape_list_demo_1.py b/arcade/examples/shape_list_demo_1.py
deleted file mode 100644
index 90dab6d..0000000
--- a/arcade/examples/shape_list_demo_1.py
+++ /dev/null
@@ -1,65 +0,0 @@
-"""
-This demo shows the speed of drawing a full grid of squares using no buffering.
-
-For me this takes about 0.850 seconds per frame.
-
-It is slow because we load all the points and all the colors to the card every
-time.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shape_list_demo_1
-"""
-
-import arcade
-import timeit
-
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 800
-SCREEN_TITLE = "Shape List Demo 1"
-
-SQUARE_WIDTH = 5
-SQUARE_HEIGHT = 5
-SQUARE_SPACING = 40
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
-
- self.draw_time = 0
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # --- Draw all the rectangles
- for x in range(0, SCREEN_WIDTH, SQUARE_SPACING):
- for y in range(0, SCREEN_HEIGHT, SQUARE_SPACING):
- arcade.draw_rectangle_filled(x, y, SQUARE_WIDTH, SQUARE_HEIGHT, arcade.color.DARK_BLUE)
-
- # Print the timing
- output = f"Drawing time: {self.draw_time:.3f} seconds per frame."
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.WHITE, 18)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shape_list_demo_2.py b/arcade/examples/shape_list_demo_2.py
deleted file mode 100644
index 53ee880..0000000
--- a/arcade/examples/shape_list_demo_2.py
+++ /dev/null
@@ -1,75 +0,0 @@
-"""
-This demo shows using buffered rectangles to draw a grid of squares on the
-screen.
-
-For me this starts at 0.500 seconds and goes down to 0.220 seconds after the
-graphics card figures out some optimizations.
-
-It is faster than demo 1 because we aren't loading the vertices and color
-to the card again and again. It isn't very fast because we are still sending
-individual draw commands to the graphics card for each square.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shape_list_demo_2
-"""
-
-import arcade
-import timeit
-
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 800
-SCREEN_TITLE = "Shape List Demo 2"
-
-SQUARE_WIDTH = 5
-SQUARE_HEIGHT = 5
-SQUARE_SPACING = 10
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
-
- self.draw_time = 0
- self.shape_list = None
-
- def setup(self):
- # --- Create the vertex buffers objects for each square before we do
- # any drawing.
- self.shape_list = arcade.ShapeElementList()
- for x in range(0, SCREEN_WIDTH, SQUARE_SPACING):
- for y in range(0, SCREEN_HEIGHT, SQUARE_SPACING):
- shape = arcade.create_rectangle_filled(x, y, SQUARE_WIDTH, SQUARE_HEIGHT, arcade.color.DARK_BLUE)
- self.shape_list.append(shape)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # --- Draw all the rectangles
- self.shape_list.draw()
-
- output = f"Drawing time: {self.draw_time:.3f} seconds per frame."
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.WHITE, 18)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shape_list_demo_3.py b/arcade/examples/shape_list_demo_3.py
deleted file mode 100644
index ff8b775..0000000
--- a/arcade/examples/shape_list_demo_3.py
+++ /dev/null
@@ -1,101 +0,0 @@
-"""
-This demo shows drawing a grid of squares using a single buffer.
-
-We calculate the points of each rectangle and add them to a point list.
-We create a list of colors for each point.
-We then draw all the squares with one drawing command.
-
-This runs in about 0.000 seconds for me. It is much more complex in code
-than the prior two examples, but the pay-off in speed is huge.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shape_list_demo_3
-"""
-
-import arcade
-import timeit
-
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 800
-SCREEN_TITLE = "Shape List Demo 3"
-
-HALF_SQUARE_WIDTH = 2.5
-HALF_SQUARE_HEIGHT = 2.5
-SQUARE_SPACING = 10
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
-
- self.draw_time = 0
- self.shape_list = None
-
- def setup(self):
- self.shape_list = arcade.ShapeElementList()
-
- # --- Create all the rectangles
-
- # We need a list of all the points and colors
- point_list = []
- color_list = []
-
- # Now calculate all the points
- for x in range(0, SCREEN_WIDTH, SQUARE_SPACING):
- for y in range(0, SCREEN_HEIGHT, SQUARE_SPACING):
-
- # Calculate where the four points of the rectangle will be if
- # x and y are the center
- top_left = (x - HALF_SQUARE_WIDTH, y + HALF_SQUARE_HEIGHT)
- top_right = (x + HALF_SQUARE_WIDTH, y + HALF_SQUARE_HEIGHT)
- bottom_right = (x + HALF_SQUARE_WIDTH, y - HALF_SQUARE_HEIGHT)
- bottom_left = (x - HALF_SQUARE_WIDTH, y - HALF_SQUARE_HEIGHT)
-
- # Add the points to the points list.
- # ORDER MATTERS!
- # Rotate around the rectangle, don't append points caty-corner
- point_list.append(top_left)
- point_list.append(top_right)
- point_list.append(bottom_right)
- point_list.append(bottom_left)
-
- # Add a color for each point. Can be different colors if you want
- # gradients.
- for i in range(4):
- color_list.append(arcade.color.DARK_BLUE)
-
- shape = arcade.create_rectangles_filled_with_colors(point_list, color_list)
- self.shape_list.append(shape)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- # --- Draw all the rectangles
- self.shape_list.draw()
-
- output = f"Drawing time: {self.draw_time:.3f} seconds per frame."
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.WHITE, 18)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shape_list_demo_person.py b/arcade/examples/shape_list_demo_person.py
deleted file mode 100644
index be853a3..0000000
--- a/arcade/examples/shape_list_demo_person.py
+++ /dev/null
@@ -1,131 +0,0 @@
-"""
-Simple program showing how to use a shape list to create a more complex shape
-out of basic ones.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shape_list_demo_person
-"""
-import arcade
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Shape List Demo Person"
-
-
-def make_person(head_radius,
- chest_height,
- chest_width,
- leg_width,
- leg_height,
- arm_width,
- arm_length,
- arm_gap,
- shoulder_height):
-
- shape_list = arcade.ShapeElementList()
-
- # Head
- shape = arcade.create_ellipse_filled(0, chest_height / 2 + head_radius, head_radius, head_radius,
- arcade.color.WHITE)
- shape_list.append(shape)
-
- # Chest
- shape = arcade.create_rectangle_filled(0, 0, chest_width, chest_height, arcade.color.BLACK)
- shape_list.append(shape)
-
- # Left leg
- shape = arcade.create_rectangle_filled(-(chest_width / 2) + leg_width / 2, -(chest_height / 2) - leg_height / 2,
- leg_width, leg_height, arcade.color.RED)
- shape_list.append(shape)
-
- # Right leg
- shape = arcade.create_rectangle_filled((chest_width / 2) - leg_width / 2, -(chest_height / 2) - leg_height / 2,
- leg_width, leg_height, arcade.color.RED)
- shape_list.append(shape)
-
- # Left arm
- shape = arcade.create_rectangle_filled(-(chest_width / 2) - arm_width / 2 - arm_gap,
- (chest_height / 2) - arm_length / 2 - shoulder_height, arm_width, arm_length,
- arcade.color.BLUE)
- shape_list.append(shape)
-
- # Left shoulder
- shape = arcade.create_rectangle_filled(-(chest_width / 2) - (arm_gap + arm_width) / 2,
- (chest_height / 2) - shoulder_height / 2, arm_gap + arm_width,
- shoulder_height, arcade.color.BLUE_BELL)
- shape_list.append(shape)
-
- # Right arm
- shape = arcade.create_rectangle_filled((chest_width / 2) + arm_width / 2 + arm_gap,
- (chest_height / 2) - arm_length / 2 - shoulder_height, arm_width, arm_length,
- arcade.color.BLUE)
- shape_list.append(shape)
-
- # Right shoulder
- shape = arcade.create_rectangle_filled((chest_width / 2) + (arm_gap + arm_width) / 2,
- (chest_height / 2) - shoulder_height / 2, arm_gap + arm_width,
- shoulder_height, arcade.color.BLUE_BELL)
- shape_list.append(shape)
-
- return shape_list
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- head_radius = 30
- chest_height = 110
- chest_width = 70
- leg_width = 20
- leg_height = 80
- arm_width = 15
- arm_length = 70
- arm_gap = 10
- shoulder_height = 15
-
- self.shape_list = make_person(head_radius,
- chest_height,
- chest_width,
- leg_width,
- leg_height,
- arm_width,
- arm_length,
- arm_gap,
- shoulder_height)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
-
- """ Set up the game and initialize the variables. """
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- self.shape_list.draw()
-
- def update(self, delta_time):
- """ Movement and game logic """
- self.shape_list.center_x += 1
- self.shape_list.center_y += 1
- self.shape_list.angle += .1
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shape_list_demo_skylines.py b/arcade/examples/shape_list_demo_skylines.py
deleted file mode 100644
index 8edb65a..0000000
--- a/arcade/examples/shape_list_demo_skylines.py
+++ /dev/null
@@ -1,178 +0,0 @@
-"""
-City Scape Generator
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shape_list_skylines
-"""
-import random
-import arcade
-import time
-
-SCREEN_WIDTH = 1200
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Skyline Using Buffered Shapes"
-
-
-def make_star_field(star_count):
- """ Make a bunch of circles for stars. """
-
- shape_list = arcade.ShapeElementList()
-
- for star_no in range(star_count):
- x = random.randrange(SCREEN_WIDTH)
- y = random.randrange(SCREEN_HEIGHT)
- radius = random.randrange(1, 4)
- brightness = random.randrange(127, 256)
- color = (brightness, brightness, brightness)
- shape = arcade.create_rectangle_filled(x, y, radius, radius, color)
- shape_list.append(shape)
-
- return shape_list
-
-
-def make_skyline(width, skyline_height, skyline_color,
- gap_chance=0.70, window_chance=0.30, light_on_chance=0.5,
- window_color=(255, 255, 200), window_margin=3, window_gap=2,
- cap_chance=0.20):
- """ Make a skyline """
-
- shape_list = arcade.ShapeElementList()
-
- # Add the "base" that we build the buildings on
- shape = arcade.create_rectangle_filled(width / 2, skyline_height / 2, width, skyline_height, skyline_color)
- shape_list.append(shape)
-
- building_center_x = 0
-
- skyline_point_list = []
- color_list = []
-
- while building_center_x < width:
-
- # Is there a gap between the buildings?
- if random.random() < gap_chance:
- gap_width = random.randrange(10, 50)
- else:
- gap_width = 0
-
- # Figure out location and size of building
- building_width = random.randrange(20, 70)
- building_height = random.randrange(40, 150)
- building_center_x += gap_width + (building_width / 2)
- building_center_y = skyline_height + (building_height / 2)
-
- x1 = building_center_x - building_width / 2
- x2 = building_center_x + building_width / 2
- y1 = skyline_height
- y2 = skyline_height + building_height
-
- skyline_point_list.append([x1, y1])
-
- skyline_point_list.append([x1, y2])
-
- skyline_point_list.append([x2, y2])
-
- skyline_point_list.append([x2, y1])
-
- for i in range(4):
- color_list.append([skyline_color[0], skyline_color[1], skyline_color[2]])
-
- if random.random() < cap_chance:
- x1 = building_center_x - building_width / 2
- x2 = building_center_x + building_width / 2
- x3 = building_center_x
-
- y1 = y2 = building_center_y + building_height / 2
- y3 = y1 + building_width / 2
-
- shape = arcade.create_polygon([[x1, y1], [x2, y2], [x3, y3]], skyline_color)
- shape_list.append(shape)
-
- # See if we should have some windows
- if random.random() < window_chance:
- # Yes windows! How many windows?
- window_rows = random.randrange(10, 15)
- window_columns = random.randrange(1, 7)
-
- # Based on that, how big should they be?
- window_height = (building_height - window_margin * 2) / window_rows
- window_width = (building_width - window_margin * 2 - window_gap * (window_columns - 1)) / window_columns
-
- # Find the bottom left of the building so we can start adding widows
- building_base_y = building_center_y - building_height / 2
- building_left_x = building_center_x - building_width / 2
-
- # Loop through each window
- for row in range(window_rows):
- for column in range(window_columns):
- if random.random() < light_on_chance:
- x1 = building_left_x + column * (window_width + window_gap) + window_margin
- x2 = building_left_x + column * (window_width + window_gap) + window_width + window_margin
- y1 = building_base_y + row * window_height
- y2 = building_base_y + row * window_height + window_height * .8
-
- skyline_point_list.append([x1, y1])
- skyline_point_list.append([x1, y2])
- skyline_point_list.append([x2, y2])
- skyline_point_list.append([x2, y1])
-
- for i in range(4):
- color_list.append((window_color[0], window_color[1], window_color[2]))
-
- building_center_x += (building_width / 2)
-
- shape = arcade.create_rectangles_filled_with_colors(skyline_point_list, color_list)
- shape_list.append(shape)
-
- return shape_list
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- self.stars = make_star_field(150)
- self.skyline1 = make_skyline(SCREEN_WIDTH * 5, 250, (80, 80, 80))
- self.skyline2 = make_skyline(SCREEN_WIDTH * 5, 150, (50, 50, 50))
-
- arcade.set_background_color(arcade.color.BLACK)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
-
- start_time = int(round(time.time() * 1000))
- arcade.start_render()
-
- self.stars.draw()
- self.skyline1.draw()
- self.skyline2.draw()
- end_time = int(round(time.time() * 1000))
- total_time = end_time - start_time
-
- arcade.draw_text(f"Time: {total_time}", 10, 10, arcade.color.WHITE)
-
- def update(self, delta_time):
- """ Movement and game logic """
- self.skyline1.center_x -= 0.5
- self.skyline2.center_x -= 1
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shape_list_non_center_rotate.py b/arcade/examples/shape_list_non_center_rotate.py
deleted file mode 100644
index 4c260b0..0000000
--- a/arcade/examples/shape_list_non_center_rotate.py
+++ /dev/null
@@ -1,67 +0,0 @@
-"""
-Shape List Non-center Rotation Demo
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shape_list_non_center_rotate
-"""
-import arcade
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Shape List Non-center Rotation Demo"
-
-
-def make_shape():
-
- shape_list = arcade.ShapeElementList()
-
- # Shape center around which we will rotate
- center_x = 20
- center_y = 30
-
- width = 30
- height = 40
-
- shape = arcade.create_ellipse_filled(center_x, center_y, width, height, arcade.color.WHITE)
- shape_list.append(shape)
-
- return shape_list
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
-
- self.shape_list = make_shape()
-
- # This specifies where on the screen the center of the shape will go
- self.shape_list.center_x = SCREEN_WIDTH / 2
- self.shape_list.center_y = SCREEN_HEIGHT / 2
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- self.shape_list.draw()
-
- def update(self, delta_time):
- """ Movement and game logic """
- self.shape_list.angle += 1
-
-
-def main():
- window = MyGame()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shapes.py b/arcade/examples/shapes.py
deleted file mode 100644
index bdb5597..0000000
--- a/arcade/examples/shapes.py
+++ /dev/null
@@ -1,128 +0,0 @@
-"""
-This simple animation example shows how to use classes to animate
-multiple objects on the screen at the same time.
-
-Because this is redraws the shapes from scratch each frame, this is SLOW
-and inefficient.
-
-Using buffered drawing commands (Vertex Buffer Objects) is a bit more complex,
-but faster.
-
-See http://arcade.academy/examples/index.html#shape-lists for some examples.
-
-Also, any Sprite class put in a SpriteList and drawn with the SpriteList will
-be drawn using Vertex Buffer Objects for better performance.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shapes
-"""
-
-import arcade
-import random
-
-# Set up the constants
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Shapes!"
-
-RECT_WIDTH = 50
-RECT_HEIGHT = 50
-
-NUMBER_OF_SHAPES = 200
-
-
-class Shape:
-
- def __init__(self, x, y, width, height, angle, delta_x, delta_y,
- delta_angle, color):
- self.x = x
- self.y = y
- self.width = width
- self.height = height
- self.angle = angle
- self.delta_x = delta_x
- self.delta_y = delta_y
- self.delta_angle = delta_angle
- self.color = color
-
- def move(self):
- self.x += self.delta_x
- self.y += self.delta_y
- self.angle += self.delta_angle
-
-
-class Ellipse(Shape):
-
- def draw(self):
- arcade.draw_ellipse_filled(self.x, self.y, self.width, self.height,
- self.color, self.angle)
-
-
-class Rectangle(Shape):
-
- def draw(self):
- arcade.draw_rectangle_filled(self.x, self.y, self.width, self.height,
- self.color, self.angle)
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- self.shape_list = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
- self.shape_list = []
-
- for i in range(NUMBER_OF_SHAPES):
- x = random.randrange(0, SCREEN_WIDTH)
- y = random.randrange(0, SCREEN_HEIGHT)
- width = random.randrange(10, 30)
- height = random.randrange(10, 30)
- angle = random.randrange(0, 360)
-
- d_x = random.randrange(-3, 4)
- d_y = random.randrange(-3, 4)
- d_angle = random.randrange(-3, 4)
-
- red = random.randrange(256)
- green = random.randrange(256)
- blue = random.randrange(256)
- alpha = random.randrange(256)
-
- shape_type = random.randrange(2)
-
- if shape_type == 0:
- shape = Rectangle(x, y, width, height, angle, d_x, d_y,
- d_angle, (red, green, blue, alpha))
- else:
- shape = Ellipse(x, y, width, height, angle, d_x, d_y,
- d_angle, (red, green, blue, alpha))
- self.shape_list.append(shape)
-
- def update(self, dt):
- """ Move everything """
-
- for shape in self.shape_list:
- shape.move()
-
- def on_draw(self):
- """
- Render the screen.
- """
- arcade.start_render()
-
- for shape in self.shape_list:
- shape.draw()
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/shapes_buffered.py b/arcade/examples/shapes_buffered.py
deleted file mode 100644
index d666201..0000000
--- a/arcade/examples/shapes_buffered.py
+++ /dev/null
@@ -1,118 +0,0 @@
-"""
-Shapes buffered in ShapeElementList
-
-Show how to use a ShapeElementList to display multiple shapes on-screen.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.shapes_buffered
-"""
-import arcade
-import random
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Buffered Shapes"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Set up the application.
- """
- super().__init__(width, height, title)
-
- self.shape_list = arcade.ShapeElementList()
- self.shape_list.center_x = SCREEN_WIDTH // 2
- self.shape_list.center_y = SCREEN_HEIGHT // 2
- self.shape_list.angle = 0
- point_list = ((0, 50),
- (10, 10),
- (50, 0),
- (10, -10),
- (0, -50),
- (-10, -10),
- (-50, 0),
- (-10, 10),
- (0, 50))
- colors = [
- getattr(arcade.color, color)
- for color in dir(arcade.color)
- if not color.startswith("__")
- ]
- for i in range(5):
- x = SCREEN_WIDTH // 2 - random.randrange(SCREEN_WIDTH - 50)
- y = SCREEN_HEIGHT // 2 - random.randrange(SCREEN_HEIGHT - 50)
- color = random.choice(colors)
- points = [(px + x, py + y) for px, py in point_list]
-
- my_line_strip = arcade.create_line_strip(points, color, 5)
- self.shape_list.append(my_line_strip)
-
- point_list = ((-50, -50),
- (0, 40),
- (50, -50))
- for i in range(5):
- x = SCREEN_WIDTH // 2 - random.randrange(SCREEN_WIDTH - 50)
- y = SCREEN_HEIGHT // 2 - random.randrange(SCREEN_HEIGHT - 50)
- points = [(px + x, py + y) for px, py in point_list]
- triangle_filled = arcade.create_triangles_filled_with_colors(
- points,
- random.sample(colors, 3)
- )
- self.shape_list.append(triangle_filled)
-
- point_list = ((-50, -70),
- (-50, 70),
- (50, 70),
- (50, -70))
- for i in range(5):
- x = SCREEN_WIDTH // 2 - random.randrange(SCREEN_WIDTH - 50)
- y = SCREEN_HEIGHT // 2 - random.randrange(SCREEN_HEIGHT - 50)
- points = [(px + x, py + y) for px, py in point_list]
- rect_filled = arcade.create_rectangle_filled_with_colors(
- points,
- random.sample(colors, 4)
- )
- self.shape_list.append(rect_filled)
-
- point_list = ((100, 100),
- (50, 150),
- (100, 200),
- (200, 200),
- (250, 150),
- (200, 100))
- poly = arcade.create_polygon(point_list, (255, 10, 10))
- self.shape_list.append(poly)
-
- ellipse = arcade.create_ellipse(20, 30, 50, 20, (230, 230, 0))
- self.shape_list.append(ellipse)
-
- arcade.set_background_color(arcade.color.BLACK)
-
- def on_draw(self):
- """
- Render the screen.
- """
- # This command has to happen before we start drawing
- arcade.start_render()
-
- self.shape_list.draw()
-
- def update(self, delta_time):
- self.shape_list.angle += 0.2
- self.shape_list.center_x += 0.1
- self.shape_list.center_y += 0.1
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/snow.py b/arcade/examples/snow.py
deleted file mode 100644
index 65e7919..0000000
--- a/arcade/examples/snow.py
+++ /dev/null
@@ -1,115 +0,0 @@
-"""
-Simple Snow
-Based primarily on: http://arcade.academy/examples/sprite_collect_coins_move_down.html
-
-Contributed to Python Arcade Library by Nicholas Hartunian
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.snow
-"""
-
-import random
-import math
-import arcade
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Snow"
-
-
-class Snowflake:
- """
- Each instance of this class represents a single snowflake.
- Based on drawing filled-circles.
- """
-
- def __init__(self):
- self.x = 0
- self.y = 0
-
- def reset_pos(self):
- # Reset flake to random position above screen
- self.y = random.randrange(SCREEN_HEIGHT, SCREEN_HEIGHT + 100)
- self.x = random.randrange(SCREEN_WIDTH)
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- Initializer
- :param width:
- :param height:
- """
- # Calls "__init__" of parent class (arcade.Window) to setup screen
- super().__init__(width, height, title)
-
- # Sprite lists
- self.snowflake_list = None
-
- def start_snowfall(self):
- """ Set up snowfall and initialize variables. """
- self.snowflake_list = []
-
- for i in range(50):
- # Create snowflake instance
- snowflake = Snowflake()
-
- # Randomly position snowflake
- snowflake.x = random.randrange(SCREEN_WIDTH)
- snowflake.y = random.randrange(SCREEN_HEIGHT + 200)
-
- # Set other variables for the snowflake
- snowflake.size = random.randrange(4)
- snowflake.speed = random.randrange(20, 40)
- snowflake.angle = random.uniform(math.pi, math.pi * 2)
-
- # Add snowflake to snowflake list
- self.snowflake_list.append(snowflake)
-
- # Don't show the mouse pointer
- self.set_mouse_visible(False)
-
- # Set the background color
- arcade.set_background_color(arcade.color.BLACK)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command is necessary before drawing
- arcade.start_render()
-
- # Draw the current position of each snowflake
- for snowflake in self.snowflake_list:
- arcade.draw_circle_filled(snowflake.x, snowflake.y,
- snowflake.size, arcade.color.WHITE)
-
- def update(self, delta_time):
- """
- All the logic to move, and the game logic goes here.
- """
-
- # Animate all the snowflakes falling
- for snowflake in self.snowflake_list:
- snowflake.y -= snowflake.speed * delta_time
-
- # Check if snowflake has fallen below screen
- if snowflake.y < 0:
- snowflake.reset_pos()
-
- # Some math to make the snowflakes move side to side
- snowflake.x += snowflake.speed * math.cos(snowflake.angle) * delta_time
- snowflake.angle += 1 * delta_time
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.start_snowfall()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sound.py b/arcade/examples/sound.py
deleted file mode 100644
index 46c14d3..0000000
--- a/arcade/examples/sound.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""
-Sound Demo
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sound
-"""
-import arcade
-import os
-
-# 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)
-
-arcade.open_window(300, 300, "Sound Demo")
-laser_sound = arcade.load_sound("sounds/laser1.wav")
-arcade.play_sound(laser_sound)
-arcade.run()
diff --git a/arcade/examples/sound_test.py b/arcade/examples/sound_test.py
deleted file mode 100644
index 0c90764..0000000
--- a/arcade/examples/sound_test.py
+++ /dev/null
@@ -1,67 +0,0 @@
-""" Test for sound in Arcade.
-(May only work for windows at current time)
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sound_test
-"""
-
-import arcade
-import os
-
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sound Test Example"
-
-window = None
-
-
-class MyGame(arcade.Window):
- """ Main sound test class """
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- # Set background color to black
- arcade.set_background_color(arcade.color.BLACK)
-
- def on_draw(self):
- """Render the screen"""
-
- arcade.start_render()
-
- # Text on screen
- text = "Press left mouse to make noise"
-
- # Render text
- arcade.draw_text(text, 150, 300, arcade.color.WHITE, 30)
-
- def on_mouse_press(self, x, y, button, modifiers):
- """Plays sound on key press"""
-
- # Load sound
- loaded_sound = arcade.sound.load_sound("sounds/laser1.wav")
-
- # Play Sound
- arcade.sound.play_sound(loaded_sound)
-
- def update(self, delta_time):
- """animations"""
-
-
-def main():
- MyGame()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sounds/laser1.mp3 b/arcade/examples/sounds/laser1.mp3
deleted file mode 100644
index f8d7192..0000000
Binary files a/arcade/examples/sounds/laser1.mp3 and /dev/null differ
diff --git a/arcade/examples/sounds/laser1.ogg b/arcade/examples/sounds/laser1.ogg
deleted file mode 100644
index 383035b..0000000
Binary files a/arcade/examples/sounds/laser1.ogg and /dev/null differ
diff --git a/arcade/examples/sounds/laser1.wav b/arcade/examples/sounds/laser1.wav
deleted file mode 100644
index 8c3db0f..0000000
Binary files a/arcade/examples/sounds/laser1.wav and /dev/null differ
diff --git a/arcade/examples/sounds/phaseJump1.ogg b/arcade/examples/sounds/phaseJump1.ogg
deleted file mode 100644
index 30fe73b..0000000
Binary files a/arcade/examples/sounds/phaseJump1.ogg and /dev/null differ
diff --git a/arcade/examples/sounds/phaseJump1.wav b/arcade/examples/sounds/phaseJump1.wav
deleted file mode 100644
index decb9ba..0000000
Binary files a/arcade/examples/sounds/phaseJump1.wav and /dev/null differ
diff --git a/arcade/examples/sounds/rockHit2.ogg b/arcade/examples/sounds/rockHit2.ogg
deleted file mode 100644
index d7838e3..0000000
Binary files a/arcade/examples/sounds/rockHit2.ogg and /dev/null differ
diff --git a/arcade/examples/sounds/rockHit2.wav b/arcade/examples/sounds/rockHit2.wav
deleted file mode 100644
index fe6a9be..0000000
Binary files a/arcade/examples/sounds/rockHit2.wav and /dev/null differ
diff --git a/arcade/examples/sprite_bouncing_coins.py b/arcade/examples/sprite_bouncing_coins.py
deleted file mode 100644
index 030518e..0000000
--- a/arcade/examples/sprite_bouncing_coins.py
+++ /dev/null
@@ -1,152 +0,0 @@
-"""
-Sprite Simple Bouncing
-
-Simple program to show how to bounce items.
-This only works for straight vertical and horizontal angles.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_bouncing_coins
-"""
-
-import arcade
-import os
-import random
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 832
-SCREEN_HEIGHT = 632
-SCREEN_TITLE = "Sprite Bouncing Coins"
-
-MOVEMENT_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.coin_list = None
- self.wall_list = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # -- Set up the walls
-
- # Create horizontal rows of boxes
- for x in range(32, SCREEN_WIDTH, 64):
- # Bottom edge
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = x
- wall.center_y = 32
- self.wall_list.append(wall)
-
- # Top edge
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = x
- wall.center_y = SCREEN_HEIGHT - 32
- self.wall_list.append(wall)
-
- # Create vertical columns of boxes
- for y in range(96, SCREEN_HEIGHT, 64):
- # Left
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = 32
- wall.center_y = y
- self.wall_list.append(wall)
-
- # Right
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = SCREEN_WIDTH - 32
- wall.center_y = y
- self.wall_list.append(wall)
-
- # Create boxes in the middle
- for x in range(128, SCREEN_WIDTH, 196):
- for y in range(128, SCREEN_HEIGHT, 196):
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = x
- wall.center_y = y
- # wall.angle = 45
- self.wall_list.append(wall)
-
- # Create coins
- for i in range(10):
- coin = arcade.Sprite("images/coin_01.png", 0.25)
- coin.center_x = random.randrange(100, 700)
- coin.center_y = random.randrange(100, 500)
- while coin.change_x == 0 and coin.change_y == 0:
- coin.change_x = random.randrange(-4, 5)
- coin.change_y = random.randrange(-4, 5)
-
- self.coin_list.append(coin)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.wall_list.draw()
- self.coin_list.draw()
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- for coin in self.coin_list:
-
- coin.center_x += coin.change_x
- walls_hit = arcade.check_for_collision_with_list(coin, self.wall_list)
- for wall in walls_hit:
- if coin.change_x > 0:
- coin.right = wall.left
- elif coin.change_x < 0:
- coin.left = wall.right
- if len(walls_hit) > 0:
- coin.change_x *= -1
-
- coin.center_y += coin.change_y
- walls_hit = arcade.check_for_collision_with_list(coin, self.wall_list)
- for wall in walls_hit:
- if coin.change_y > 0:
- coin.top = wall.bottom
- elif coin.change_y < 0:
- coin.bottom = wall.top
- if len(walls_hit) > 0:
- coin.change_y *= -1
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_bullets.py b/arcade/examples/sprite_bullets.py
deleted file mode 100644
index 0a89467..0000000
--- a/arcade/examples/sprite_bullets.py
+++ /dev/null
@@ -1,176 +0,0 @@
-"""
-Sprite Bullets
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_bullets
-"""
-import random
-import arcade
-import os
-
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-SPRITE_SCALING_LASER = 0.8
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprites and Bullets Example"
-
-BULLET_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
- self.bullet_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- # Load sounds. Sounds from kenney.nl
- self.gun_sound = arcade.sound.load_sound("sounds/laser1.wav")
- self.hit_sound = arcade.sound.load_sound("sounds/phaseJump1.wav")
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
-
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
- self.bullet_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
-
- # Image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 70
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(120, SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.coin_list.draw()
- self.bullet_list.draw()
- self.player_list.draw()
-
- # Render the text
- arcade.draw_text(f"Score: {self.score}", 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """
- Called whenever the mouse moves.
- """
- self.player_sprite.center_x = x
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called whenever the mouse button is clicked.
- """
- # Gunshot sound
- arcade.sound.play_sound(self.gun_sound)
- # Create a bullet
- bullet = arcade.Sprite("images/laserBlue01.png", SPRITE_SCALING_LASER)
-
- # The image points to the right, and we want it to point up. So
- # rotate it.
- bullet.angle = 90
-
- # Give the bullet a speed
- bullet.change_y = BULLET_SPEED
-
- # Position the bullet
- bullet.center_x = self.player_sprite.center_x
- bullet.bottom = self.player_sprite.top
-
- # Add the bullet to the appropriate lists
- self.bullet_list.append(bullet)
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on bullet sprites
- self.bullet_list.update()
-
- # Loop through each bullet
- for bullet in self.bullet_list:
-
- # Check this bullet to see if it hit a coin
- hit_list = arcade.check_for_collision_with_list(bullet, self.coin_list)
-
- # If it did, get rid of the bullet
- if len(hit_list) > 0:
- bullet.kill()
-
- # For every coin we hit, add to the score and remove the coin
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
- # Hit Sound
- arcade.sound.play_sound(self.hit_sound)
-
- # If the bullet flies off-screen, remove it.
- if bullet.bottom > SCREEN_HEIGHT:
- bullet.kill()
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_bullets_aimed.py b/arcade/examples/sprite_bullets_aimed.py
deleted file mode 100644
index 7ae9f59..0000000
--- a/arcade/examples/sprite_bullets_aimed.py
+++ /dev/null
@@ -1,186 +0,0 @@
-"""
-Sprite Bullets
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_bullets_aimed
-"""
-
-import random
-import arcade
-import math
-import os
-
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-SPRITE_SCALING_LASER = 0.8
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprites and Bullets Aimed Example"
-
-BULLET_SPEED = 5
-
-window = None
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
- self.bullet_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
- self.score_text = None
-
- # Load sounds. Sounds from kenney.nl
- self.gun_sound = arcade.sound.load_sound("sounds/laser1.wav")
- self.hit_sound = arcade.sound.load_sound("sounds/phaseJump1.wav")
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
-
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
- self.bullet_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
-
- # Image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 70
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(120, SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.coin_list.draw()
- self.bullet_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called whenever the mouse moves.
- """
- # Create a bullet
- bullet = arcade.Sprite("images/laserBlue01.png", SPRITE_SCALING_LASER)
-
- # Position the bullet at the player's current location
- start_x = self.player_sprite.center_x
- start_y = self.player_sprite.center_y
- bullet.center_x = start_x
- bullet.center_y = start_y
-
- # Get from the mouse the destination location for the bullet
- # IMPORTANT! If you have a scrolling screen, you will also need
- # to add in self.view_bottom and self.view_left.
- dest_x = x
- dest_y = y
-
- # Do math to calculate how to get the bullet to the destination.
- # Calculation the angle in radians between the start points
- # and end points. This is the angle the bullet will travel.
- x_diff = dest_x - start_x
- y_diff = dest_y - start_y
- angle = math.atan2(y_diff, x_diff)
-
- # Angle the bullet sprite so it doesn't look like it is flying
- # sideways.
- bullet.angle = math.degrees(angle)
- print(f"Bullet angle: {bullet.angle:.2f}")
-
- # Taking into account the angle, calculate our change_x
- # and change_y. Velocity is how fast the bullet travels.
- bullet.change_x = math.cos(angle) * BULLET_SPEED
- bullet.change_y = math.sin(angle) * BULLET_SPEED
-
- # Add the bullet to the appropriate lists
- self.bullet_list.append(bullet)
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites
- self.bullet_list.update()
-
- # Loop through each bullet
- for bullet in self.bullet_list:
-
- # Check this bullet to see if it hit a coin
- hit_list = arcade.check_for_collision_with_list(bullet, self.coin_list)
-
- # If it did, get rid of the bullet
- if len(hit_list) > 0:
- bullet.kill()
-
- # For every coin we hit, add to the score and remove the coin
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
- # If the bullet flies off-screen, remove it.
- if bullet.bottom > self.width or bullet.top < 0 or bullet.right < 0 or bullet.left > self.width:
- bullet.kill()
-
-
-def main():
- game = MyGame()
- game.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_bullets_enemy_aims.py b/arcade/examples/sprite_bullets_enemy_aims.py
deleted file mode 100644
index 2a8cb10..0000000
--- a/arcade/examples/sprite_bullets_enemy_aims.py
+++ /dev/null
@@ -1,140 +0,0 @@
-"""
-Show how to have enemies shoot bullets aimed at the player.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_bullets_enemy_aims
-"""
-
-import arcade
-import math
-import os
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprites and Bullets Enemy Aims Example"
-BULLET_SPEED = 4
-
-
-class MyGame(arcade.Window):
- """ Main application class """
-
- def __init__(self, width, height, title):
- 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)
-
- arcade.set_background_color(arcade.color.BLACK)
-
- self.frame_count = 0
-
- self.enemy_list = None
- self.bullet_list = None
- self.player_list = None
- self.player = None
-
- def setup(self):
- self.enemy_list = arcade.SpriteList()
- self.bullet_list = arcade.SpriteList()
- self.player_list = arcade.SpriteList()
-
- # Add player ship
- self.player = arcade.Sprite("images/playerShip1_orange.png", 0.5)
- self.player_list.append(self.player)
-
- # Add top-left enemy ship
- enemy = arcade.Sprite("images/playerShip1_green.png", 0.5)
- enemy.center_x = 120
- enemy.center_y = SCREEN_HEIGHT - enemy.height
- enemy.angle = 180
- self.enemy_list.append(enemy)
-
- # Add top-right enemy ship
- enemy = arcade.Sprite("images/playerShip1_green.png", 0.5)
- enemy.center_x = SCREEN_WIDTH - 120
- enemy.center_y = SCREEN_HEIGHT - enemy.height
- enemy.angle = 180
- self.enemy_list.append(enemy)
-
- def on_draw(self):
- """Render the screen. """
-
- arcade.start_render()
-
- self.enemy_list.draw()
- self.bullet_list.draw()
- self.player_list.draw()
-
- def update(self, delta_time):
- """All the logic to move, and the game logic goes here. """
-
- self.frame_count += 1
-
- # Loop through each enemy that we have
- for enemy in self.enemy_list:
-
- # First, calculate the angle to the player. We could do this
- # only when the bullet fires, but in this case we will rotate
- # the enemy to face the player each frame, so we'll do this
- # each frame.
-
- # Position the start at the enemy's current location
- start_x = enemy.center_x
- start_y = enemy.center_y
-
- # Get the destination location for the bullet
- dest_x = self.player.center_x
- dest_y = self.player.center_y
-
- # Do math to calculate how to get the bullet to the destination.
- # Calculation the angle in radians between the start points
- # and end points. This is the angle the bullet will travel.
- x_diff = dest_x - start_x
- y_diff = dest_y - start_y
- angle = math.atan2(y_diff, x_diff)
-
- # Set the enemy to face the player.
- enemy.angle = math.degrees(angle)-90
-
- # Shoot every 60 frames change of shooting each frame
- if self.frame_count % 60 == 0:
- bullet = arcade.Sprite("images/laserBlue01.png")
- bullet.center_x = start_x
- bullet.center_y = start_y
-
- # Angle the bullet sprite
- bullet.angle = math.degrees(angle)
-
- # Taking into account the angle, calculate our change_x
- # and change_y. Velocity is how fast the bullet travels.
- bullet.change_x = math.cos(angle) * BULLET_SPEED
- bullet.change_y = math.sin(angle) * BULLET_SPEED
-
- self.bullet_list.append(bullet)
-
- # Get rid of the bullet when it flies off-screen
- for bullet in self.bullet_list:
- if bullet.top < 0:
- bullet.kill()
-
- self.bullet_list.update()
-
- def on_mouse_motion(self, x, y, delta_x, delta_y):
- """Called whenever the mouse moves. """
- self.player.center_x = x
- self.player.center_y = y
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_bullets_periodic.py b/arcade/examples/sprite_bullets_periodic.py
deleted file mode 100644
index 7171411..0000000
--- a/arcade/examples/sprite_bullets_periodic.py
+++ /dev/null
@@ -1,104 +0,0 @@
-"""
-Show how to have enemies shoot bullets at regular intervals.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_bullets_periodic
-"""
-import arcade
-import os
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprites and Periodic Bullets Example"
-
-
-class MyGame(arcade.Window):
- """ Main application class """
-
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- arcade.set_background_color(arcade.color.BLACK)
-
- # --- Keep track of a frame count.
- # --- This is important for doing things every x frames
- self.frame_count = 0
-
- self.player_list = arcade.SpriteList()
- self.enemy_list = arcade.SpriteList()
- self.bullet_list = arcade.SpriteList()
-
- # Add player ship
- self.player = arcade.Sprite("images/playerShip1_orange.png", 0.5)
- self.player_list.append(self.player)
-
- # Add top-left enemy ship
- enemy = arcade.Sprite("images/playerShip1_green.png", 0.5)
- enemy.center_x = 120
- enemy.center_y = SCREEN_HEIGHT - enemy.height
- enemy.angle = 180
- self.enemy_list.append(enemy)
-
- # Add top-right enemy ship
- enemy = arcade.Sprite("images/playerShip1_green.png", 0.5)
- enemy.center_x = SCREEN_WIDTH - 120
- enemy.center_y = SCREEN_HEIGHT - enemy.height
- enemy.angle = 180
- self.enemy_list.append(enemy)
-
- def on_draw(self):
- """Render the screen. """
-
- arcade.start_render()
-
- self.enemy_list.draw()
- self.bullet_list.draw()
- self.player_list.draw()
-
- def update(self, delta_time):
- """All the logic to move, and the game logic goes here. """
-
- # --- Add one to the frame count
- self.frame_count += 1
-
- # Loop through each enemy that we have
- for enemy in self.enemy_list:
-
- # --- Use the modulus to trigger doing something every 120 frames
- if self.frame_count % 120 == 0:
- bullet = arcade.Sprite("images/laserBlue01.png")
- bullet.center_x = enemy.center_x
- bullet.angle = -90
- bullet.top = enemy.bottom
- bullet.change_y = -2
- self.bullet_list.append(bullet)
-
- # Get rid of the bullet when it flies off-screen
- for bullet in self.bullet_list:
- if bullet.top < 0:
- bullet.kill()
-
- self.bullet_list.update()
-
- def on_mouse_motion(self, x, y, delta_x, delta_y):
- """
- Called whenever the mouse moves.
- """
- self.player.center_x = x
- self.player.center_y = 20
-
-
-def main():
- MyGame()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_bullets_random.py b/arcade/examples/sprite_bullets_random.py
deleted file mode 100644
index 46f47fd..0000000
--- a/arcade/examples/sprite_bullets_random.py
+++ /dev/null
@@ -1,106 +0,0 @@
-"""
-Show how to have enemies shoot bullets at random intervals.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_bullets_random
-"""
-import arcade
-import random
-import os
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprites and Random Bullets Example"
-
-
-class MyGame(arcade.Window):
- """ Main application class """
-
- def __init__(self, width, height, title):
- 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)
-
- arcade.set_background_color(arcade.color.BLACK)
-
- self.frame_count = 0
- self.player_list = None
- self.enemy_list = None
- self.bullet_list = None
-
- self.player = None
-
- def setup(self):
- self.player_list = arcade.SpriteList()
- self.enemy_list = arcade.SpriteList()
- self.bullet_list = arcade.SpriteList()
-
- # Add player ship
- self.player = arcade.Sprite("images/playerShip1_orange.png", 0.5)
- self.player_list.append(self.player)
-
- # Add top-left enemy ship
- enemy = arcade.Sprite("images/playerShip1_green.png", 0.5)
- enemy.center_x = 120
- enemy.center_y = SCREEN_HEIGHT - enemy.height
- enemy.angle = 180
- self.enemy_list.append(enemy)
-
- # Add top-right enemy ship
- enemy = arcade.Sprite("images/playerShip1_green.png", 0.5)
- enemy.center_x = SCREEN_WIDTH - 120
- enemy.center_y = SCREEN_HEIGHT - enemy.height
- enemy.angle = 180
- self.enemy_list.append(enemy)
-
- def on_draw(self):
- """Render the screen. """
-
- arcade.start_render()
-
- self.enemy_list.draw()
- self.bullet_list.draw()
- self.player_list.draw()
-
- def update(self, delta_time):
- """All the logic to move, and the game logic goes here. """
-
- # Loop through each enemy that we have
- for enemy in self.enemy_list:
-
- # Have a random 1 in 200 change of shooting each frame
- if random.randrange(200) == 0:
- bullet = arcade.Sprite("images/laserBlue01.png")
- bullet.center_x = enemy.center_x
- bullet.angle = -90
- bullet.top = enemy.bottom
- bullet.change_y = -2
- self.bullet_list.append(bullet)
-
- # Get rid of the bullet when it flies off-screen
- for bullet in self.bullet_list:
- if bullet.top < 0:
- bullet.kill()
-
- self.bullet_list.update()
-
- def on_mouse_motion(self, x, y, delta_x, delta_y):
- """ Called whenever the mouse moves. """
- self.player.center_x = x
- self.player.center_y = 20
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_change_coins.py b/arcade/examples/sprite_change_coins.py
deleted file mode 100644
index 183ff64..0000000
--- a/arcade/examples/sprite_change_coins.py
+++ /dev/null
@@ -1,143 +0,0 @@
-"""
-Sprite Change Coins
-
-This shows how you can change a sprite once it is hit, rather than eliminate it.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_change_coins
-"""
-
-import random
-import arcade
-import os
-
-SPRITE_SCALING = 1
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Change Coins"
-
-
-class Collectable(arcade.Sprite):
- """ This class represents something the player collects. """
-
- def __init__(self, filename, scale):
- super().__init__(filename, scale)
- # Flip this once the coin has been collected.
- self.changed = False
-
-
-class MyGame(arcade.Window):
- """
- Main application class.a
- """
-
- def __init__(self, width, height, title):
- 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)
-
- # Sprite lists
- self.player_list = None
- self.coin_list = None
-
- # Set up the player
- self.score = 0
- self.player_sprite = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
- self.player_sprite = arcade.Sprite("images/character.png", 0.5)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- for i in range(50):
- # Create the coin instance
- coin = Collectable("images/coin_01.png", SPRITE_SCALING)
- coin.width = 30
- coin.height = 30
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.coin_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """
- Called whenever the mouse moves.
- """
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def 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()
- self.coin_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, change it, and add to the score.
- for coin in hit_list:
- # Have we collected this?
- if not coin.changed:
- # No? Then do so
- coin.append_texture(arcade.load_texture("images/bumper.png"))
- coin.set_texture(1)
- coin.changed = True
- coin.width = 30
- coin.height = 30
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_coins.py b/arcade/examples/sprite_collect_coins.py
deleted file mode 100644
index f2aa224..0000000
--- a/arcade/examples/sprite_collect_coins.py
+++ /dev/null
@@ -1,126 +0,0 @@
-"""
-Sprite Collect Coins
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_coins
-"""
-
-import random
-import arcade
-import os
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Coins Example"
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Score
- self.score = 0
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def on_draw(self):
- """ Draw everything """
- arcade.start_render()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.coin_list.update()
-
- # Generate a list of all sprites that collided with the player.
- coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in coins_hit_list:
- coin.kill()
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_coins_background.py b/arcade/examples/sprite_collect_coins_background.py
deleted file mode 100644
index 4953b80..0000000
--- a/arcade/examples/sprite_collect_coins_background.py
+++ /dev/null
@@ -1,139 +0,0 @@
-"""
-Sprite Collect Coins with Background
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_coins_background
-"""
-import random
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 1024
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Coins with Background Example"
-
-
-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)
-
- # Background image will be stored in this variable
- self.background = None
-
- # Variables that will hold sprite lists
- self.player_list = None
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
- self.score_text = None
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Load the background image. Do this in the setup so we don't keep reloading it all the time.
- # Image from:
- # http://wallpaper-gallery.net/single/free-background-images/free-background-images-22.html
- self.background = arcade.load_texture("images/background.jpg")
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- for i in range(50):
-
- # Create the coin instance
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING / 3)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw the background texture
- arcade.draw_texture_rectangle(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2,
- SCREEN_WIDTH, SCREEN_HEIGHT, self.background)
-
- # Draw all the sprites.
- self.coin_list.draw()
- self.player_list.draw()
-
- # Render the text
- arcade.draw_text(f"Score: {self.score}", 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """
- Called whenever the mouse moves.
- """
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on the coin sprites (The sprites don't do much in this
- # example though.)
- self.coin_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_coins_diff_levels.py b/arcade/examples/sprite_collect_coins_diff_levels.py
deleted file mode 100644
index a0552e8..0000000
--- a/arcade/examples/sprite_collect_coins_diff_levels.py
+++ /dev/null
@@ -1,202 +0,0 @@
-"""
-Sprite Collect Coins with Different Levels
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_coins_diff_levels
-"""
-
-import random
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Coins with Different Levels Example"
-
-
-class FallingCoin(arcade.Sprite):
- """ Simple sprite that falls down """
-
- def update(self):
- """ Move the coin """
-
- # Fall down
- self.center_y -= 2
-
- # Did we go off the screen? If so, pop back to the top.
- if self.top < 0:
- self.bottom = SCREEN_HEIGHT
-
-
-class RisingCoin(arcade.Sprite):
- """ Simple sprite that falls up """
-
- def update(self):
- """ Move the coin """
-
- # Move up
- self.center_y += 2
-
- # Did we go off the screen? If so, pop back to the bottom.
- if self.bottom > SCREEN_HEIGHT:
- self.top = 0
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """ Initialize """
-
- # 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
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- self.level = 1
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def level_1(self):
- for i in range(20):
-
- # Create the coin instance
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING / 3)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def level_2(self):
- for i in range(30):
-
- # Create the coin instance
- coin = FallingCoin("images/gold_1.png", SPRITE_SCALING / 2)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT, SCREEN_HEIGHT * 2)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def level_3(self):
- for i in range(30):
-
- # Create the coin instance
- coin = RisingCoin("images/gold_1.png", SPRITE_SCALING / 2)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(-SCREEN_HEIGHT, 0)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- self.score = 0
- self.level = 1
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png",
- SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- self.level_1()
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_sprite.draw()
- self.coin_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 15)
-
- output = f"Level: {self.level}"
- arcade.draw_text(output, 10, 35, arcade.color.WHITE, 15)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """
- Called whenever the mouse moves.
- """
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.coin_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
- # See if we should go to level 2
- if len(self.coin_list) == 0 and self.level == 1:
- self.level += 1
- self.level_2()
- # See if we should go to level 3
- elif len(self.coin_list) == 0 and self.level == 2:
- self.level += 1
- self.level_3()
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_coins_move_bouncing.py b/arcade/examples/sprite_collect_coins_move_bouncing.py
deleted file mode 100644
index 78fbd39..0000000
--- a/arcade/examples/sprite_collect_coins_move_bouncing.py
+++ /dev/null
@@ -1,157 +0,0 @@
-"""
-Sprite Collect Moving and Bouncing Coins
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_coins_move_bouncing
-"""
-
-import random
-import arcade
-import os
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Moving and Bouncing Coins Example"
-
-
-class Coin(arcade.Sprite):
-
- def __init__(self, filename, sprite_scaling):
-
- super().__init__(filename, sprite_scaling)
-
- self.change_x = 0
- self.change_y = 0
-
- def update(self):
-
- # Move the coin
- self.center_x += self.change_x
- self.center_y += self.change_y
-
- # If we are out-of-bounds, then 'bounce'
- if self.left < 0:
- self.change_x *= -1
-
- if self.right > SCREEN_WIDTH:
- self.change_x *= -1
-
- if self.bottom < 0:
- self.change_y *= -1
-
- if self.top > SCREEN_HEIGHT:
- self.change_y *= -1
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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.all_sprites_list = None
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Score
- self.score = 0
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.all_sprites_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(50):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
- coin.change_x = random.randrange(-3, 4)
- coin.change_y = random.randrange(-3, 4)
-
- # Add the coin to the lists
- self.all_sprites_list.append(coin)
- self.coin_list.append(coin)
-
- def on_draw(self):
- """ Draw everything """
- arcade.start_render()
- self.all_sprites_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.all_sprites_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_coins_move_circle.py b/arcade/examples/sprite_collect_coins_move_circle.py
deleted file mode 100644
index 5d3bcc6..0000000
--- a/arcade/examples/sprite_collect_coins_move_circle.py
+++ /dev/null
@@ -1,160 +0,0 @@
-"""
-Sprite Collect Coins Moving in Circles
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_coins_move_circle
-"""
-
-import random
-import arcade
-import math
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Coins Moving in Circles Example"
-
-
-class Coin(arcade.Sprite):
-
- def __init__(self, filename, sprite_scaling):
- """ Constructor. """
- # Call the parent class (Sprite) constructor
- super().__init__(filename, sprite_scaling)
-
- # Current angle in radians
- self.circle_angle = 0
-
- # How far away from the center to orbit, in pixels
- self.circle_radius = 0
-
- # How fast to orbit, in radians per frame
- self.circle_speed = 0.008
-
- # Set the center of the point we will orbit around
- self.circle_center_x = 0
- self.circle_center_y = 0
-
- def update(self):
-
- """ Update the ball's position. """
- # Calculate a new x, y
- self.center_x = self.circle_radius * math.sin(self.circle_angle) \
- + self.circle_center_x
- self.center_y = self.circle_radius * math.cos(self.circle_angle) \
- + self.circle_center_y
-
- # Increase the angle in prep for the next round.
- self.circle_angle += self.circle_speed
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
-
- 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)
-
- # Sprite lists
- self.all_sprites_list = None
- self.coin_list = None
-
- # Set up the player
- self.score = 0
- self.player_sprite = None
-
- def start_new_game(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 70
- self.all_sprites_list.append(self.player_sprite)
-
- for i in range(50):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin("images/coin_01.png", SPRITE_SCALING / 3)
-
- # Position the center of the circle the coin will orbit
- coin.circle_center_x = random.randrange(SCREEN_WIDTH)
- coin.circle_center_y = random.randrange(SCREEN_HEIGHT)
-
- # Random radius from 10 to 200
- coin.circle_radius = random.randrange(10, 200)
-
- # Random start angle from 0 to 2pi
- coin.circle_angle = random.random() * 2 * math.pi
-
- # Add the coin to the lists
- self.all_sprites_list.append(coin)
- self.coin_list.append(coin)
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.all_sprites_list.draw()
-
- # Put the text on the screen.
- output = "Score: " + str(self.score)
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.all_sprites_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- self.score += 1
- coin.kill()
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.start_new_game()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_coins_move_down.py b/arcade/examples/sprite_collect_coins_move_down.py
deleted file mode 100644
index 747eb37..0000000
--- a/arcade/examples/sprite_collect_coins_move_down.py
+++ /dev/null
@@ -1,151 +0,0 @@
-"""
-Sprite Collect Coins Moving Down
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_coins_move_down
-"""
-
-import random
-import arcade
-import os
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Coins Moving Down Example"
-
-
-class Coin(arcade.Sprite):
- """
- This class represents the coins on our screen. It is a child class of
- the arcade library's "Sprite" class.
- """
-
- def reset_pos(self):
-
- # Reset the coin to a random spot above the screen
- self.center_y = random.randrange(SCREEN_HEIGHT + 20,
- SCREEN_HEIGHT + 100)
- self.center_x = random.randrange(SCREEN_WIDTH)
-
- def update(self):
-
- # Move the coin
- self.center_y -= 1
-
- # See if the coin has fallen off the bottom of the screen.
- # If so, reset it.
- if self.top < 0:
- self.reset_pos()
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
-
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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_sprite_list = None
- self.coin_sprite_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_sprite_list = arcade.SpriteList()
- self.coin_sprite_list = arcade.SpriteList()
-
- # Score
- self.score = 0
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_sprite_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_sprite_list.append(coin)
-
- def on_draw(self):
- """ Draw everything """
- arcade.start_render()
- self.coin_sprite_list.draw()
- self.player_sprite_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.coin_sprite_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite,
- self.coin_sprite_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_coins_with_stats.py b/arcade/examples/sprite_collect_coins_with_stats.py
deleted file mode 100644
index 1ab6689..0000000
--- a/arcade/examples/sprite_collect_coins_with_stats.py
+++ /dev/null
@@ -1,158 +0,0 @@
-"""
-Sprite Collect Coins with Stats
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_coins_with_stats
-"""
-
-import random
-import arcade
-import os
-import timeit
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Coins with Stats Example"
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- self.processing_time = 0
- self.draw_time = 0
- self.frame_count = 0
- self.fps_start_timer = None
- self.fps = None
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Score
- self.score = 0
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def on_draw(self):
- """ Draw everything """
-
- # Start timing how long this takes
- draw_start_time = timeit.default_timer()
-
- if self.frame_count % 60 == 0:
- if self.fps_start_timer is not None:
- total_time = timeit.default_timer() - self.fps_start_timer
- self.fps = 60 / total_time
- self.fps_start_timer = timeit.default_timer()
- self.frame_count += 1
-
- arcade.start_render()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- # Display timings
- output = f"Processing time: {self.processing_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 20, arcade.color.BLACK, 16)
-
- output = f"Drawing time: {self.draw_time:.3f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 40, arcade.color.BLACK, 16)
-
- if self.fps is not None:
- output = f"FPS: {self.fps:.0f}"
- arcade.draw_text(output, 20, SCREEN_HEIGHT - 60, arcade.color.BLACK, 16)
-
- self.draw_time = timeit.default_timer() - draw_start_time
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
- # print(x, y)
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.coin_list.update()
-
- # Generate a list of all sprites that collided with the player.
- coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in coins_hit_list:
- coin.kill()
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_collect_rotating.py b/arcade/examples/sprite_collect_rotating.py
deleted file mode 100644
index 839e880..0000000
--- a/arcade/examples/sprite_collect_rotating.py
+++ /dev/null
@@ -1,138 +0,0 @@
-"""
-Sprite Collect Rotating Coins
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_collect_rotating
-"""
-
-import random
-import arcade
-import os
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Collect Rotating Coins Example"
-
-
-class Coin(arcade.Sprite):
-
- def update(self):
- # Rotate the coin.
- # The arcade.Sprite class has an "angle" attribute that controls
- # the sprite rotation. Change this, and the sprite rotates.
- self.angle += self.change_angle
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Score
- self.score = 0
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Set up the initial angle, and the "spin"
- coin.angle = random.randrange(360)
- coin.change_angle = random.randrange(-5, 6)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def on_draw(self):
- """ Draw everything """
- arcade.start_render()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.coin_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.remove_from_sprite_lists()
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_csv_map.py b/arcade/examples/sprite_csv_map.py
deleted file mode 100644
index a3feb95..0000000
--- a/arcade/examples/sprite_csv_map.py
+++ /dev/null
@@ -1,234 +0,0 @@
-"""
-Load a map stored in csv format, as exported by the program 'Tiled.'
-
-Artwork from: http://kenney.nl
-Tiled available from: http://www.mapeditor.org/
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_csv_map
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite CSV Map Example"
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * SPRITE_SCALING)
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 40
-RIGHT_MARGIN = 150
-
-# Physics
-MOVEMENT_SPEED = 5
-JUMP_SPEED = 14
-GRAVITY = 0.5
-
-
-def get_map(filename):
- """
- This function loads an array based on a map stored as a list of
- numbers separated by commas.
- """
- map_file = open(filename)
- map_array = []
- for line in map_file:
- line = line.strip()
- map_row = line.split(",")
- for index, item in enumerate(map_row):
- map_row[index] = int(item)
- map_array.append(map_row)
- return map_array
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """
- Initializer
- """
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- # Sprite lists
- self.wall_list = None
- self.player_list = None
-
- # Set up the player
- self.player_sprite = None
-
- self.physics_engine = None
- self.view_left = 0
- self.view_bottom = 0
- self.game_over = False
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
-
- # Starting position of the player
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 270
- self.player_list.append(self.player_sprite)
-
- # Get a 2D array made of numbers based on the map
- map_array = get_map("map.csv")
-
- # Right edge of the map in pixels
- self.end_of_map = len(map_array[0]) * GRID_PIXEL_SIZE
-
- for row_index, row in enumerate(map_array):
- for column_index, item in enumerate(row):
-
- # For this map, the numbers represent:
- # -1 = empty
- # 0 = box
- # 1 = grass left edge
- # 2 = grass middle
- # 3 = grass right edge
- if item == -1:
- continue
- elif item == 0:
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- elif item == 1:
- wall = arcade.Sprite("images/grassLeft.png", SPRITE_SCALING)
- elif item == 2:
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
- elif item == 3:
- wall = arcade.Sprite("images/grassRight.png", SPRITE_SCALING)
-
- wall.right = column_index * 64
- wall.top = (7 - row_index) * 64
- self.wall_list.append(wall)
-
- self.physics_engine = \
- arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- gravity_constant=GRAVITY)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Set the view port boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- self.game_over = False
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_list.draw()
- self.wall_list.draw()
-
- # Put the text on the screen.
- # Adjust the text position based on the view port so that we don't
- # scroll the text too.
- distance = self.player_sprite.right
- output = f"Distance: {distance}"
- arcade.draw_text(output, self.view_left + 10, self.view_bottom + 20, arcade.color.WHITE, 14)
-
- if self.game_over:
- arcade.draw_text("Game Over", self.view_left + 200, self.view_bottom + 200, arcade.color.WHITE, 30)
-
- def on_key_press(self, key, modifiers):
- """
- Called whenever the mouse moves.
- """
- if key == arcade.key.UP:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = JUMP_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """
- Called when the user presses a mouse button.
- """
- if key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- if self.player_sprite.right >= self.end_of_map:
- self.game_over = True
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- if not self.game_over:
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the view port
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - RIGHT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- # If we need to scroll, go ahead and do it.
- if changed:
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_enemies_in_platformer.py b/arcade/examples/sprite_enemies_in_platformer.py
deleted file mode 100644
index 9fbf528..0000000
--- a/arcade/examples/sprite_enemies_in_platformer.py
+++ /dev/null
@@ -1,197 +0,0 @@
-"""
-Show how to do enemies in a platformer
-
-Artwork from: http://kenney.nl
-Tiled available from: http://www.mapeditor.org/
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_enemies_in_platformer
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-SPRITE_NATIVE_SIZE = 128
-SPRITE_SIZE = int(SPRITE_NATIVE_SIZE * SPRITE_SCALING)
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Enemies in a Platformer Example"
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 40
-RIGHT_MARGIN = 150
-
-# Physics
-MOVEMENT_SPEED = 5
-JUMP_SPEED = 14
-GRAVITY = 0.5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """
- Initializer
- """
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- # Sprite lists
- self.wall_list = None
- self.enemy_list = None
- self.player_list = None
-
- # Set up the player
- self.player_sprite = None
- self.physics_engine = None
- self.view_left = 0
- self.view_bottom = 0
- self.game_over = False
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.wall_list = arcade.SpriteList()
- self.enemy_list = arcade.SpriteList()
- self.player_list = arcade.SpriteList()
-
- # Draw the walls on the bottom
- for x in range(0, SCREEN_WIDTH, SPRITE_SIZE):
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
-
- wall.bottom = 0
- wall.left = x
- self.wall_list.append(wall)
-
- # Draw the platform
- for x in range(SPRITE_SIZE * 3, SPRITE_SIZE * 8, SPRITE_SIZE):
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
-
- wall.bottom = SPRITE_SIZE * 3
- wall.left = x
- self.wall_list.append(wall)
-
- # Draw the crates
- for x in range(0, SCREEN_WIDTH, SPRITE_SIZE * 5):
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
-
- wall.bottom = SPRITE_SIZE
- wall.left = x
- self.wall_list.append(wall)
-
- # -- Draw an enemy on the ground
- enemy = arcade.Sprite("images/wormGreen.png", SPRITE_SCALING)
-
- enemy.bottom = SPRITE_SIZE
- enemy.left = SPRITE_SIZE * 2
-
- # Set enemy initial speed
- enemy.change_x = 2
- self.enemy_list.append(enemy)
-
- # -- Draw a enemy on the platform
- enemy = arcade.Sprite("images/wormGreen.png", SPRITE_SCALING)
-
- enemy.bottom = SPRITE_SIZE * 4
- enemy.left = SPRITE_SIZE * 4
-
- # Set boundaries on the left/right the enemy can't cross
- enemy.boundary_right = SPRITE_SIZE * 8
- enemy.boundary_left = SPRITE_SIZE * 3
- enemy.change_x = 2
- self.enemy_list.append(enemy)
-
- # -- Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_list.append(self.player_sprite)
-
- # Starting position of the player
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 270
-
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- gravity_constant=GRAVITY)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_list.draw()
- self.wall_list.draw()
- self.enemy_list.draw()
-
- def on_key_press(self, key, modifiers):
- """
- Called whenever the mouse moves.
- """
- if key == arcade.key.UP:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = JUMP_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """
- Called when the user presses a mouse button.
- """
- if key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Update the player based on the physics engine
- if not self.game_over:
- # Move the enemies
- self.enemy_list.update()
-
- # Check each enemy
- for enemy in self.enemy_list:
- # If the enemy hit a wall, reverse
- if len(arcade.check_for_collision_with_list(enemy, self.wall_list)) > 0:
- enemy.change_x *= -1
- # If the enemy hit the left boundary, reverse
- elif enemy.boundary_left is not None and enemy.left < enemy.boundary_left:
- enemy.change_x *= -1
- # If the enemy hit the right boundary, reverse
- elif enemy.boundary_right is not None and enemy.right > enemy.boundary_right:
- enemy.change_x *= -1
-
- # Update the player using the physics engine
- self.physics_engine.update()
-
- # See if the player hit a worm. If so, game over.
- if len(arcade.check_for_collision_with_list(self.player_sprite, self.enemy_list)) > 0:
- self.game_over = True
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_explosion.py b/arcade/examples/sprite_explosion.py
deleted file mode 100644
index b609b2c..0000000
--- a/arcade/examples/sprite_explosion.py
+++ /dev/null
@@ -1,226 +0,0 @@
-"""
-Sprite Explosion
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-Explosion graphics from http://www.explosiongenerator.com/
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_explosion
-"""
-import random
-import arcade
-import os
-
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-SPRITE_SCALING_LASER = 0.8
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Explosion Example"
-
-BULLET_SPEED = 5
-
-EXPLOSION_TEXTURE_COUNT = 60
-
-
-class Explosion(arcade.Sprite):
- """ This class creates an explosion animation """
-
- # Static variable that holds all the explosion textures
- explosion_textures = []
-
- def __init__(self, texture_list):
- super().__init__("images/explosion/explosion0000.png")
-
- # Start at the first frame
- self.current_texture = 0
- self.textures = texture_list
-
- def update(self):
-
- # Update to the next frame of the animation. If we are at the end
- # of our frames, then delete this sprite.
- self.current_texture += 1
- if self.current_texture < len(self.textures):
- self.set_texture(self.current_texture)
- else:
- self.kill()
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
- self.bullet_list = None
- self.explosions_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- # Pre-load the animation frames. We don't do this in the __init__
- # of the explosion sprite because it
- # takes too long and would cause the game to pause.
- self.explosion_texture_list = []
-
- for i in range(EXPLOSION_TEXTURE_COUNT):
- # Files from http://www.explosiongenerator.com are numbered sequentially.
- # This code loads all of the explosion0000.png to explosion0270.png files
- # that are part of this explosion.
- texture_name = f"images/explosion/explosion{i:04d}.png"
-
- self.explosion_texture_list.append(arcade.load_texture(texture_name))
-
- # Load sounds. Sounds from kenney.nl
- self.gun_sound = arcade.sound.load_sound("sounds/laser1.wav")
- self.hit_sound = arcade.sound.load_sound("sounds/phaseJump1.wav")
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
-
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
- self.bullet_list = arcade.SpriteList()
- self.explosions_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
-
- # Image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 70
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for coin_index in range(COIN_COUNT):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(150, SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.coin_list.draw()
- self.bullet_list.draw()
- self.player_list.draw()
- self.explosions_list.draw()
-
- # Render the text
- arcade.draw_text(f"Score: {self.score}", 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """
- Called whenever the mouse moves.
- """
- self.player_sprite.center_x = x
-
- def on_mouse_press(self, x, y, button, modifiers):
- """
- Called whenever the mouse button is clicked.
- """
-
- # Gunshot sound
- arcade.sound.play_sound(self.gun_sound)
-
- # Create a bullet
- bullet = arcade.Sprite("images/laserBlue01.png", SPRITE_SCALING_LASER)
-
- # The image points to the right, and we want it to point up. So
- # rotate it.
- bullet.angle = 90
-
- # Give it a speed
- bullet.change_y = BULLET_SPEED
-
- # Position the bullet
- bullet.center_x = self.player_sprite.center_x
- bullet.bottom = self.player_sprite.top
-
- # Add the bullet to the appropriate lists
- self.bullet_list.append(bullet)
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on bullet sprites
- self.bullet_list.update()
- self.explosions_list.update()
-
- # Loop through each bullet
- for bullet in self.bullet_list:
-
- # Check this bullet to see if it hit a coin
- hit_list = arcade.check_for_collision_with_list(bullet, self.coin_list)
-
- # If it did, get rid of the bullet
- if len(hit_list) > 0:
- explosion = Explosion(self.explosion_texture_list)
- explosion.center_x = hit_list[0].center_x
- explosion.center_y = hit_list[0].center_y
- self.explosions_list.append(explosion)
- bullet.kill()
-
- # For every coin we hit, add to the score and remove the coin
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
- # Hit Sound
- arcade.sound.play_sound(self.hit_sound)
-
- # If the bullet flies off-screen, remove it.
- if bullet.bottom > SCREEN_HEIGHT:
- bullet.kill()
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_face_left_or_right.py b/arcade/examples/sprite_face_left_or_right.py
deleted file mode 100644
index 68112f3..0000000
--- a/arcade/examples/sprite_face_left_or_right.py
+++ /dev/null
@@ -1,152 +0,0 @@
-"""
-Sprite Facing Left or Right
-Face left or right depending on our direction
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_face_left_or_right
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Face Left or Right Example"
-
-MOVEMENT_SPEED = 5
-
-TEXTURE_LEFT = 0
-TEXTURE_RIGHT = 1
-
-
-class Player(arcade.Sprite):
-
- def __init__(self):
- super().__init__()
-
- # Load a left facing texture and a right facing texture.
- # mirrored=True will mirror the image we load.
- texture = arcade.load_texture("images/character.png", mirrored=True, scale=SPRITE_SCALING)
- self.textures.append(texture)
- texture = arcade.load_texture("images/character.png", scale=SPRITE_SCALING)
- self.textures.append(texture)
-
- # By default, face right.
- self.set_texture(TEXTURE_RIGHT)
-
- def update(self):
- self.center_x += self.change_x
- self.center_y += self.change_y
-
- # Figure out if we should face left or right
- if self.change_x < 0:
- self.set_texture(TEXTURE_LEFT)
- if self.change_x > 0:
- self.set_texture(TEXTURE_RIGHT)
-
- if self.left < 0:
- self.left = 0
- elif self.right > SCREEN_WIDTH - 1:
- self.right = SCREEN_WIDTH - 1
-
- if self.bottom < 0:
- self.bottom = 0
- elif self.top > SCREEN_HEIGHT - 1:
- self.top = SCREEN_HEIGHT - 1
-
-
-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.all_sprites_list = None
-
- # Set up the player info
- self.player_sprite = None
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = Player()
- self.player_sprite.center_x = SCREEN_WIDTH / 2
- self.player_sprite.center_y = SCREEN_HEIGHT / 2
- self.all_sprites_list.append(self.player_sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.all_sprites_list.draw()
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.all_sprites_list.update()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_follow_simple.py b/arcade/examples/sprite_follow_simple.py
deleted file mode 100644
index 2b68d5c..0000000
--- a/arcade/examples/sprite_follow_simple.py
+++ /dev/null
@@ -1,153 +0,0 @@
-"""
-Sprite Follow Player
-
-This moves towards the player in both the x and y direction.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_follow_simple
-"""
-
-import random
-import arcade
-import os
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-COIN_COUNT = 50
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Follow Player Simple Example"
-
-SPRITE_SPEED = 0.5
-
-
-class Coin(arcade.Sprite):
- """
- This class represents the coins on our screen. It is a child class of
- the arcade library's "Sprite" class.
- """
-
- def follow_sprite(self, player_sprite):
- """
- This function will move the current sprite towards whatever
- other sprite is specified as a parameter.
-
- We use the 'min' function here to get the sprite to line up with
- the target sprite, and not jump around if the sprite is not off
- an exact multiple of SPRITE_SPEED.
- """
-
- if self.center_y < player_sprite.center_y:
- self.center_y += min(SPRITE_SPEED, player_sprite.center_y - self.center_y)
- elif self.center_y > player_sprite.center_y:
- self.center_y -= min(SPRITE_SPEED, self.center_y - player_sprite.center_y)
-
- if self.center_x < player_sprite.center_x:
- self.center_x += min(SPRITE_SPEED, player_sprite.center_x - self.center_x)
- elif self.center_x > player_sprite.center_x:
- self.center_x -= min(SPRITE_SPEED, self.center_x - player_sprite.center_x)
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Score
- self.score = 0
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def on_draw(self):
- """ Draw everything """
- arcade.start_render()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- for coin in self.coin_list:
- coin.follow_sprite(self.player_sprite)
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_follow_simple_2.py b/arcade/examples/sprite_follow_simple_2.py
deleted file mode 100644
index 8c1d19f..0000000
--- a/arcade/examples/sprite_follow_simple_2.py
+++ /dev/null
@@ -1,172 +0,0 @@
-"""
-Sprite Follow Player 2
-
-This calculates a 'vector' towards the player and randomly updates it based
-on the player's location. This is a bit more complex, but more interesting
-way of following the player.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_follow_simple_2
-"""
-
-import random
-import arcade
-import math
-import os
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-SPRITE_SCALING_COIN = 0.2
-COIN_COUNT = 5
-COIN_SPEED = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Follow Player Simple Example 2"
-
-SPRITE_SPEED = 0.5
-
-
-class Coin(arcade.Sprite):
- """
- This class represents the coins on our screen. It is a child class of
- the arcade library's "Sprite" class.
- """
-
- def follow_sprite(self, player_sprite):
- """
- This function will move the current sprite towards whatever
- other sprite is specified as a parameter.
-
- We use the 'min' function here to get the sprite to line up with
- the target sprite, and not jump around if the sprite is not off
- an exact multiple of SPRITE_SPEED.
- """
-
- self.center_x += self.change_x
- self.center_y += self.change_y
-
- # Random 1 in 100 chance that we'll change from our old direction and
- # then re-aim toward the player
- if random.randrange(100) == 0:
- start_x = self.center_x
- start_y = self.center_y
-
- # Get the destination location for the bullet
- dest_x = player_sprite.center_x
- dest_y = player_sprite.center_y
-
- # Do math to calculate how to get the bullet to the destination.
- # Calculation the angle in radians between the start points
- # and end points. This is the angle the bullet will travel.
- x_diff = dest_x - start_x
- y_diff = dest_y - start_y
- angle = math.atan2(y_diff, x_diff)
-
- # Taking into account the angle, calculate our change_x
- # and change_y. Velocity is how fast the bullet travels.
- self.change_x = math.cos(angle) * COIN_SPEED
- self.change_y = math.sin(angle) * COIN_SPEED
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
- self.score = 0
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Score
- self.score = 0
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- # Create the coins
- for i in range(COIN_COUNT):
- # Create the coin instance
- # Coin image from kenney.nl
- coin = Coin("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def on_draw(self):
- """ Draw everything """
- arcade.start_render()
- self.coin_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- for coin in self.coin_list:
- coin.follow_sprite(self.player_sprite)
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.kill()
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_move_angle.py b/arcade/examples/sprite_move_angle.py
deleted file mode 100644
index e587f1e..0000000
--- a/arcade/examples/sprite_move_angle.py
+++ /dev/null
@@ -1,140 +0,0 @@
-"""
-Move Sprite by Angle
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_move_angle
-"""
-import arcade
-import os
-import math
-
-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)
-
-
-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.BLACK)
-
- 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("images/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)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_list.draw()
-
- def 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()
-
- 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 main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_move_animation.py b/arcade/examples/sprite_move_animation.py
deleted file mode 100644
index 65a2667..0000000
--- a/arcade/examples/sprite_move_animation.py
+++ /dev/null
@@ -1,179 +0,0 @@
-"""
-Move with a Sprite Animation
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_move_animation
-"""
-import arcade
-import random
-import os
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Move with a Sprite Animation Example"
-
-COIN_SCALE = 0.5
-COIN_COUNT = 50
-
-MOVEMENT_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = None
- self.coin_list = None
-
- # Set up the player
- self.score = 0
- self.player = None
-
- def setup(self):
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
- self.player = arcade.AnimatedWalkingSprite()
-
- character_scale = 0.75
- self.player.stand_right_textures = []
- self.player.stand_right_textures.append(arcade.load_texture("images/character_sprites/character0.png",
- scale=character_scale))
- self.player.stand_left_textures = []
- self.player.stand_left_textures.append(arcade.load_texture("images/character_sprites/character0.png",
- scale=character_scale, mirrored=True))
-
- self.player.walk_right_textures = []
-
- self.player.walk_right_textures.append(arcade.load_texture("images/character_sprites/characterw0.png",
- scale=character_scale))
- self.player.walk_right_textures.append(arcade.load_texture("images/character_sprites/characterw1.png",
- scale=character_scale))
- self.player.walk_right_textures.append(arcade.load_texture("images/character_sprites/characterw2.png",
- scale=character_scale))
- self.player.walk_right_textures.append(arcade.load_texture("images/character_sprites/characterw3.png",
- scale=character_scale))
-
- self.player.walk_left_textures = []
-
- self.player.walk_left_textures.append(arcade.load_texture("images/character_sprites/characterw0.png",
- scale=character_scale, mirrored=True))
- self.player.walk_left_textures.append(arcade.load_texture("images/character_sprites/characterw1.png",
- scale=character_scale, mirrored=True))
- self.player.walk_left_textures.append(arcade.load_texture("images/character_sprites/characterw2.png",
- scale=character_scale, mirrored=True))
- self.player.walk_left_textures.append(arcade.load_texture("images/character_sprites/characterw3.png",
- scale=character_scale, mirrored=True))
-
- self.player.texture_change_distance = 20
-
- self.player.center_x = SCREEN_WIDTH // 2
- self.player.center_y = SCREEN_HEIGHT // 2
- self.player.scale = 0.8
-
- self.player_list.append(self.player)
-
- for i in range(COIN_COUNT):
- coin = arcade.AnimatedTimeSprite(scale=0.5)
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- coin.textures = []
- coin.textures.append(arcade.load_texture("images/gold_1.png", scale=COIN_SCALE))
- coin.textures.append(arcade.load_texture("images/gold_2.png", scale=COIN_SCALE))
- coin.textures.append(arcade.load_texture("images/gold_3.png", scale=COIN_SCALE))
- coin.textures.append(arcade.load_texture("images/gold_4.png", scale=COIN_SCALE))
- coin.textures.append(arcade.load_texture("images/gold_3.png", scale=COIN_SCALE))
- coin.textures.append(arcade.load_texture("images/gold_2.png", scale=COIN_SCALE))
- coin.cur_texture_index = random.randrange(len(coin.textures))
-
- self.coin_list.append(coin)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.coin_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
-
- def on_key_press(self, key, modifiers):
- """
- Called whenever a key is pressed.
- """
- if key == arcade.key.UP:
- self.player.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- self.coin_list.update()
- self.coin_list.update_animation()
- self.player_list.update()
- self.player_list.update_animation()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the score.
- for coin in hit_list:
- coin.remove_from_sprite_lists()
- self.score += 1
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_move_joystick.py b/arcade/examples/sprite_move_joystick.py
deleted file mode 100644
index 1f5e75a..0000000
--- a/arcade/examples/sprite_move_joystick.py
+++ /dev/null
@@ -1,152 +0,0 @@
-"""
-Move Sprite with Joystick
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_move_joystick
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Move Sprite with Joystick Example"
-
-MOVEMENT_SPEED = 5
-DEAD_ZONE = 0.05
-
-
-class Player(arcade.Sprite):
-
- def __init__(self, filename, scale):
- super().__init__(filename, scale)
-
- joysticks = arcade.get_joysticks()
- if joysticks:
- self.joystick = joysticks[0]
- self.joystick.open()
- else:
- print("There are no Joysticks")
- self.joystick = None
-
- def update(self):
- if self.joystick:
- self.change_x = self.joystick.x * MOVEMENT_SPEED
- # Set a "dead zone" to prevent drive from a centered joystick
- if abs(self.change_x) < DEAD_ZONE:
- self.change_x = 0
-
- self.change_y = -self.joystick.y * MOVEMENT_SPEED
- # Set a "dead zone" to prevent drive from a centered joystick
- if abs(self.change_y) < DEAD_ZONE:
- self.change_y = 0
-
- self.center_x += self.change_x
- self.center_y += self.change_y
-
- if self.left < 0:
- self.left = 0
- elif self.right > SCREEN_WIDTH - 1:
- self.right = SCREEN_WIDTH - 1
-
- if self.bottom < 0:
- self.bottom = 0
- elif self.top > SCREEN_HEIGHT - 1:
- self.top = SCREEN_HEIGHT - 1
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- """
- Initializer
- """
-
- # 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)
-
- # Call the parent class initializer
- super().__init__(width, height, title)
-
- # Variables that will hold sprite lists
- self.all_sprites_list = None
-
- # Set up the player info
- self.player_sprite = None
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = Player("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.all_sprites_list.append(self.player_sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.all_sprites_list.draw()
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.all_sprites_list.update()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_move_keyboard.py b/arcade/examples/sprite_move_keyboard.py
deleted file mode 100644
index 030e10a..0000000
--- a/arcade/examples/sprite_move_keyboard.py
+++ /dev/null
@@ -1,131 +0,0 @@
-"""
-Move Sprite With Keyboard
-
-Simple program to show moving a sprite with the keyboard.
-The sprite_move_keyboard_better.py example is slightly better
-in how it works, but also slightly more complex.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_move_keyboard
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Move Sprite with Keyboard Example"
-
-MOVEMENT_SPEED = 5
-
-
-class Player(arcade.Sprite):
-
- def update(self):
- self.center_x += self.change_x
- self.center_y += self.change_y
-
- if self.left < 0:
- self.left = 0
- elif self.right > SCREEN_WIDTH - 1:
- self.right = SCREEN_WIDTH - 1
-
- if self.bottom < 0:
- self.bottom = 0
- elif self.top > SCREEN_HEIGHT - 1:
- self.top = SCREEN_HEIGHT - 1
-
-
-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.AMAZON)
-
- 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("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_list.draw()
-
- def 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()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_move_keyboard_better.py b/arcade/examples/sprite_move_keyboard_better.py
deleted file mode 100644
index 19b8150..0000000
--- a/arcade/examples/sprite_move_keyboard_better.py
+++ /dev/null
@@ -1,155 +0,0 @@
-"""
-Better Move Sprite With Keyboard
-
-Simple program to show moving a sprite with the keyboard.
-This is slightly better than sprite_move_keyboard.py example
-in how it works, but also slightly more complex.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_move_keyboard_better
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Better Move Sprite with Keyboard Example"
-
-MOVEMENT_SPEED = 5
-
-
-class Player(arcade.Sprite):
-
- def update(self):
- self.center_x += self.change_x
- self.center_y += self.change_y
-
- if self.left < 0:
- self.left = 0
- elif self.right > SCREEN_WIDTH - 1:
- self.right = SCREEN_WIDTH - 1
-
- if self.bottom < 0:
- self.bottom = 0
- elif self.top > SCREEN_HEIGHT - 1:
- self.top = SCREEN_HEIGHT - 1
-
-
-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
-
- # Track the current state of what key is pressed
- self.left_pressed = False
- self.right_pressed = False
- self.up_pressed = False
- self.down_pressed = False
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- 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("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_list.draw()
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Calculate speed based on the keys pressed
- self.player_sprite.change_x = 0
- self.player_sprite.change_y = 0
-
- if self.up_pressed and not self.down_pressed:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif self.down_pressed and not self.up_pressed:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- if self.left_pressed and not self.right_pressed:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif self.right_pressed and not self.left_pressed:
- self.player_sprite.change_x = MOVEMENT_SPEED
-
- # Call update to move the sprite
- # If using a physics engine, call update on it instead of the sprite
- # list.
- self.player_list.update()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.up_pressed = True
- elif key == arcade.key.DOWN:
- self.down_pressed = True
- elif key == arcade.key.LEFT:
- self.left_pressed = True
- elif key == arcade.key.RIGHT:
- self.right_pressed = True
-
- def on_key_release(self, key, modifiers):
- """Called when the user releases a key. """
-
- if key == arcade.key.UP:
- self.up_pressed = False
- elif key == arcade.key.DOWN:
- self.down_pressed = False
- elif key == arcade.key.LEFT:
- self.left_pressed = False
- elif key == arcade.key.RIGHT:
- self.right_pressed = False
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_move_scrolling.py b/arcade/examples/sprite_move_scrolling.py
deleted file mode 100644
index 0c20481..0000000
--- a/arcade/examples/sprite_move_scrolling.py
+++ /dev/null
@@ -1,173 +0,0 @@
-"""
-Use sprites to scroll around a large screen.
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_move_scrolling
-"""
-
-import random
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Move with Scrolling Screen Example"
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 40
-
-MOVEMENT_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.player_list = None
- self.coin_list = None
-
- # Set up the player
- self.player_sprite = None
- self.wall_list = None
- self.physics_engine = None
- self.view_bottom = 0
- self.view_left = 0
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", 0.4)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 270
- self.player_list.append(self.player_sprite)
-
- # -- Set up several columns of walls
- for x in range(200, 1650, 210):
- for y in range(0, 1000, 64):
- # Randomly skip a box so the player can find a way through
- if random.randrange(5) > 0:
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = x
- wall.center_y = y
- self.wall_list.append(wall)
-
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Set the viewport boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.wall_list.draw()
- self.player_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - VIEWPORT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- if changed:
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_move_walls.py b/arcade/examples/sprite_move_walls.py
deleted file mode 100644
index 03e616d..0000000
--- a/arcade/examples/sprite_move_walls.py
+++ /dev/null
@@ -1,132 +0,0 @@
-"""
-Sprite Move With Walls
-
-Simple program to show basic sprite usage.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_move_walls
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Move with Walls Example"
-
-MOVEMENT_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.coin_list = None
- self.wall_list = None
- self.player_list = None
-
- # Set up the player
- self.player_sprite = None
- self.physics_engine = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png",
- SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 64
- self.player_list.append(self.player_sprite)
-
- # -- Set up the walls
- # Create a row of boxes
- for x in range(173, 650, 64):
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = x
- wall.center_y = 200
- self.wall_list.append(wall)
-
- # Create a column of boxes
- for y in range(273, 500, 64):
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = 465
- wall.center_y = y
- self.wall_list.append(wall)
-
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite,
- self.wall_list)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.wall_list.draw()
- self.player_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_moving_platforms.py b/arcade/examples/sprite_moving_platforms.py
deleted file mode 100644
index 0ecf8ab..0000000
--- a/arcade/examples/sprite_moving_platforms.py
+++ /dev/null
@@ -1,287 +0,0 @@
-"""
-Sprite with Moving Platforms
-
-Load a map stored in csv format, as exported by the program 'Tiled.'
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_moving_platforms
-"""
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 1000
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite with Moving Platforms Example"
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * SPRITE_SCALING)
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = SPRITE_PIXEL_SIZE * SPRITE_SCALING
-RIGHT_MARGIN = 4 * SPRITE_PIXEL_SIZE * SPRITE_SCALING
-
-# Physics
-MOVEMENT_SPEED = 10 * SPRITE_SCALING
-JUMP_SPEED = 28 * SPRITE_SCALING
-GRAVITY = .9 * SPRITE_SCALING
-
-
-def get_map():
- map_file = open("map.csv")
- map_array = []
- for line in map_file:
- line = line.strip()
- map_row = line.split(",")
- for index, item in enumerate(map_row):
- map_row[index] = int(item)
- map_array.append(map_row)
- return map_array
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.all_sprites_list = None
- self.all_wall_list = None
- self.static_wall_list = None
- self.moving_wall_list = None
- self.player_list = None
- self.coin_list = None
-
- # Set up the player
- self.player_sprite = None
- self.physics_engine = None
- self.view_left = 0
- self.view_bottom = 0
- self.game_over = False
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
- self.all_wall_list = arcade.SpriteList()
- self.static_wall_list = arcade.SpriteList()
- self.moving_wall_list = arcade.SpriteList()
- self.player_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 2 * GRID_PIXEL_SIZE
- self.player_sprite.center_y = 3 * GRID_PIXEL_SIZE
- self.player_list.append(self.player_sprite)
-
- map_array = get_map()
-
- # Right edge of the map in pixels
- self.end_of_map = len(map_array[0]) * GRID_PIXEL_SIZE
-
- for row_index, row in enumerate(map_array):
- for column_index, item in enumerate(row):
-
- if item == -1:
- continue
- elif item == 0:
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- elif item == 1:
- wall = arcade.Sprite("images/grassLeft.png", SPRITE_SCALING)
- elif item == 2:
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
- elif item == 3:
- wall = arcade.Sprite("images/grassRight.png", SPRITE_SCALING)
-
- wall.left = column_index * GRID_PIXEL_SIZE
- wall.top = (7 - row_index) * GRID_PIXEL_SIZE
- self.all_sprites_list.append(wall)
- self.all_wall_list.append(wall)
- self.static_wall_list.append(wall)
-
- # Create platform side to side
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
- wall.center_y = 3 * GRID_PIXEL_SIZE
- wall.center_x = 3 * GRID_PIXEL_SIZE
- wall.boundary_left = 2 * GRID_PIXEL_SIZE
- wall.boundary_right = 5 * GRID_PIXEL_SIZE
- wall.change_x = 2 * SPRITE_SCALING
-
- self.all_sprites_list.append(wall)
- self.all_wall_list.append(wall)
- self.moving_wall_list.append(wall)
-
- # Create platform side to side
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
- wall.center_y = 3 * GRID_PIXEL_SIZE
- wall.center_x = 7 * GRID_PIXEL_SIZE
- wall.boundary_left = 5 * GRID_PIXEL_SIZE
- wall.boundary_right = 9 * GRID_PIXEL_SIZE
- wall.change_x = -2 * SPRITE_SCALING
-
- self.all_sprites_list.append(wall)
- self.all_wall_list.append(wall)
- self.moving_wall_list.append(wall)
-
- # Create platform moving up and down
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
- wall.center_y = 5 * GRID_PIXEL_SIZE
- wall.center_x = 5 * GRID_PIXEL_SIZE
- wall.boundary_top = 8 * GRID_PIXEL_SIZE
- wall.boundary_bottom = 4 * GRID_PIXEL_SIZE
- wall.change_y = 2 * SPRITE_SCALING
-
- self.all_sprites_list.append(wall)
- self.all_wall_list.append(wall)
- self.moving_wall_list.append(wall)
-
- # Create platform moving diagonally
- wall = arcade.Sprite("images/grassMid.png", SPRITE_SCALING)
- wall.center_y = 5 * GRID_PIXEL_SIZE
- wall.center_x = 8 * GRID_PIXEL_SIZE
- wall.boundary_left = 7 * GRID_PIXEL_SIZE
- wall.boundary_right = 9 * GRID_PIXEL_SIZE
-
- wall.boundary_top = 8 * GRID_PIXEL_SIZE
- wall.boundary_bottom = 4 * GRID_PIXEL_SIZE
- wall.change_x = 2 * SPRITE_SCALING
- wall.change_y = 2 * SPRITE_SCALING
-
- self.all_sprites_list.append(wall)
- self.all_wall_list.append(wall)
- self.moving_wall_list.append(wall)
-
- self.physics_engine = \
- arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.all_wall_list,
- gravity_constant=GRAVITY)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Set the viewport boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- self.game_over = False
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw the sprites.
- self.static_wall_list.draw()
- self.moving_wall_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- # Adjust the text position based on the viewport so that we don't
- # scroll the text too.
- distance = self.player_sprite.right
- output = f"Distance: {distance}"
- arcade.draw_text(output, self.view_left + 10, self.view_bottom + 20,
- arcade.color.WHITE, 14)
-
- if self.game_over:
- output = "Game Over"
- arcade.draw_text(output, self.view_left + 200,
- self.view_bottom + 200,
- arcade.color.WHITE, 30)
-
- def on_key_press(self, key, modifiers):
- """
- Called whenever the mouse moves.
- """
- if key == arcade.key.UP:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = JUMP_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """
- Called when the user presses a mouse button.
- """
- if key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- if self.player_sprite.right >= self.end_of_map:
- self.game_over = True
-
- # Call update on all sprites
- if not self.game_over:
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_boundary = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_boundary:
- self.view_left -= left_boundary - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_MARGIN
- if self.player_sprite.right > right_boundary:
- self.view_left += self.player_sprite.right - right_boundary
- changed = True
-
- # Scroll up
- top_boundary = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_boundary:
- self.view_bottom += self.player_sprite.top - top_boundary
- changed = True
-
- # Scroll down
- bottom_boundary = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_boundary:
- self.view_bottom -= bottom_boundary - self.player_sprite.bottom
- changed = True
-
- # If we need to scroll, go ahead and do it.
- if changed:
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_no_coins_on_walls.py b/arcade/examples/sprite_no_coins_on_walls.py
deleted file mode 100644
index 97842fa..0000000
--- a/arcade/examples/sprite_no_coins_on_walls.py
+++ /dev/null
@@ -1,163 +0,0 @@
-"""
-No coins on the walls
-
-Simple program to show basic sprite usage. Specifically, create coin sprites that
-aren't on top of any walls, and don't have coins on top of each other.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_no_coins_on_walls
-"""
-import arcade
-import random
-import os
-
-SPRITE_SCALING = 0.5
-SPRITE_SCALING_COIN = 0.2
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite No Coins on Walls Example"
-
-NUMBER_OF_COINS = 50
-
-MOVEMENT_SPEED = 5
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.all_sprites_list = None
- self.coin_list = None
-
- # Set up the player
- self.player_sprite = None
- self.wall_list = None
- self.physics_engine = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 64
-
- # -- Set up the walls
- # Create a series of horizontal walls
- for y in range(0, 800, 200):
- for x in range(100, 700, 64):
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.center_x = x
- wall.center_y = y
- self.wall_list.append(wall)
-
- # -- Randomly place coins where there are no walls
- # Create the coins
- for i in range(NUMBER_OF_COINS):
-
- # Create the coin instance
- # Coin image from kenney.nl
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN)
-
- # --- IMPORTANT PART ---
-
- # Boolean variable if we successfully placed the coin
- coin_placed_successfully = False
-
- # Keep trying until success
- while not coin_placed_successfully:
- # Position the coin
- coin.center_x = random.randrange(SCREEN_WIDTH)
- coin.center_y = random.randrange(SCREEN_HEIGHT)
-
- # See if the coin is hitting a wall
- wall_hit_list = arcade.check_for_collision_with_list(coin, self.wall_list)
-
- # See if the coin is hitting another coin
- coin_hit_list = arcade.check_for_collision_with_list(coin, self.coin_list)
-
- if len(wall_hit_list) == 0 and len(coin_hit_list) == 0:
- # It is!
- coin_placed_successfully = True
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- # --- END OF IMPORTANT PART ---
-
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.wall_list.draw()
- self.coin_list.draw()
- self.player_sprite.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_properties.py b/arcade/examples/sprite_properties.py
deleted file mode 100644
index d8567b1..0000000
--- a/arcade/examples/sprite_properties.py
+++ /dev/null
@@ -1,135 +0,0 @@
-"""
-Sprites with Properties Example
-
-Simple program to show how to store properties on sprites.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_properties
-
-"""
-
-import arcade
-import os
-
-# --- Constants ---
-SPRITE_SCALING_PLAYER = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprites with Properties Example"
-
-
-class MyGame(arcade.Window):
- """ Our custom Window Class"""
-
- def __init__(self):
- """ Initializer """
- # Call the parent class initializer
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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
- self.coin_list = None
-
- # Set up the player info
- self.player_sprite = None
-
- # Set up sprite that will serve as trigger
- self.trigger_sprite = None
-
- # Don't show the mouse cursor
- self.set_mouse_visible(False)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- # Character image from kenney.nl
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 150
- self.player_list.append(self.player_sprite)
-
- # Create the sprites
- for x in range(100, 800, 100):
- coin = arcade.Sprite("images/coin_01.png", scale=0.3, center_x=x, center_y=400)
- coin.intensity = 'dim'
- coin.alpha = 64
- self.coin_list.append(coin)
-
- # Create trigger
- self.trigger_sprite = arcade.Sprite("images/bumper.png", scale=0.5, center_x=750, center_y=50)
-
- def on_draw(self):
- """ Draw everything """
- arcade.start_render()
- self.coin_list.draw()
- self.trigger_sprite.draw()
- self.player_list.draw()
-
- # Put the instructions on the screen.
- instructions1 = "Touch a coin to set its intensity property to 'bright'."
- arcade.draw_text(instructions1, 10, 90, arcade.color.WHITE, 14)
- instructions2 = "Touch the trigger at the bottom-right to destroy all 'bright' sprites."
- arcade.draw_text(instructions2, 10, 70, arcade.color.WHITE, 14)
-
- # Query the property on the coins and show results.
- coins_are_bright = [coin.intensity == 'bright' for coin in self.coin_list]
- output_any = f"Any sprites have intensity=bright? : {any(coins_are_bright)}"
- arcade.draw_text(output_any, 10, 40, arcade.color.WHITE, 14)
- output_all = f"All sprites have intensity=bright? : {all(coins_are_bright)}"
- arcade.draw_text(output_all, 10, 20, arcade.color.WHITE, 14)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """ Handle Mouse Motion """
-
- # Move the center of the player sprite to match the mouse x, y
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.coin_list.update()
-
- # Generate a list of all sprites that collided with the player.
- coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite to set intensity=bright
- for coin in coins_hit_list:
- coin.intensity = 'bright'
- coin.alpha = 255
-
- hit_trigger = arcade.check_for_collision(self.player_sprite, self.trigger_sprite)
- if hit_trigger:
- intense_sprites = [sprite for sprite in self.coin_list if sprite.intensity == 'bright']
- for coin in intense_sprites:
- coin.kill()
-
-
-def main():
- """ Main method """
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_ramps.py b/arcade/examples/sprite_ramps.py
deleted file mode 100644
index 4e8a597..0000000
--- a/arcade/examples/sprite_ramps.py
+++ /dev/null
@@ -1,246 +0,0 @@
-"""
-Load a map stored in csv format, as exported by the program 'Tiled.'
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_ramps
-"""
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite with Ramps Example"
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * SPRITE_SCALING)
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN = 40
-RIGHT_MARGIN = 150
-
-# Physics
-MOVEMENT_SPEED = 5
-JUMP_SPEED = 14
-GRAVITY = 0.5
-
-
-def get_map():
- map_file = open("map_with_ramps_2.csv")
- map_array = []
- for line in map_file:
- line = line.strip()
- map_row = line.split(",")
- for index, item in enumerate(map_row):
- map_row[index] = int(item)
- map_array.append(map_row)
- return map_array
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.all_sprites_list = None
- self.coin_list = None
- self.player_list = None
-
- # Set up the player
- self.player_sprite = None
- self.wall_list = None
- self.physics_engine = None
- self.view_left = 0
- self.view_bottom = 0
- self.game_over = False
-
- def start_new_game(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.all_sprites_list = arcade.SpriteList()
- self.wall_list = arcade.SpriteList()
- self.player_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png",
- SPRITE_SCALING)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 270
- self.player_list.append(self.player_sprite)
- self.all_sprites_list.append(self.player_sprite)
-
- map_array = get_map()
-
- # Right edge of the map in pixels
- self.end_of_map = len(map_array[0]) * GRID_PIXEL_SIZE
-
- map_items = ["images/boxCrate_double.png",
- "images/grassCenter.png",
- "images/grassCorner_left.png",
- "images/grassCorner_right.png",
- "images/grassHill_left.png",
- "images/grassHill_right.png",
- "images/grassLeft.png",
- "images/grassMid.png",
- "images/grassRight.png",
- "images/stoneHalf.png"
- ]
- for row_index, row in enumerate(map_array):
- for column_index, item in enumerate(row):
-
- if item == -1:
- continue
- else:
- wall = arcade.Sprite(map_items[item],
- SPRITE_SCALING)
-
- # Change the collision polygon to be a ramp instead of
- # a rectangle
- if item == 4:
- wall.points = ((-wall.width // 2, wall.height // 2),
- (wall.width // 2, -wall.height // 2),
- (-wall.width // 2, -wall.height // 2))
- elif item == 5:
- wall.points = ((-wall.width // 2, -wall.height // 2),
- (wall.width // 2, -wall.height // 2),
- (wall.width // 2, wall.height // 2))
-
- wall.right = column_index * 64
- wall.top = (7 - row_index) * 64
- self.all_sprites_list.append(wall)
- self.wall_list.append(wall)
-
- self.physics_engine = \
- arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- gravity_constant=GRAVITY)
-
- # Set the background color
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Set the viewport boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- self.game_over = False
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.wall_list.draw()
- self.player_list.draw()
-
- # Put the text on the screen.
- # Adjust the text position based on the viewport so that we don't
- # scroll the text too.
- distance = self.player_sprite.right
- output = "Distance: {}".format(distance)
- arcade.draw_text(output, self.view_left + 10, self.view_bottom + 20,
- arcade.color.WHITE, 14)
-
- if self.game_over:
- output = "Game Over"
- arcade.draw_text(output, self.view_left + 200,
- self.view_bottom + 200,
- arcade.color.WHITE, 30)
-
- def on_key_press(self, key, modifiers):
- """
- Called whenever a key is pressed down.
- """
- if key == arcade.key.UP:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = JUMP_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """
- Called when the user releases a key.
- """
- if key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- if self.player_sprite.right >= self.end_of_map:
- self.game_over = True
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- if not self.game_over:
- self.physics_engine.update()
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the viewport
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= int(left_bndry - self.player_sprite.left)
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - RIGHT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += int(self.player_sprite.right - right_bndry)
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN
- if self.player_sprite.top > top_bndry:
- self.view_bottom += int(self.player_sprite.top - top_bndry)
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= int(bottom_bndry - self.player_sprite.bottom)
- changed = True
-
- # If we need to scroll, go ahead and do it.
- if changed:
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.start_new_game()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_rooms.py b/arcade/examples/sprite_rooms.py
deleted file mode 100644
index ab3e20b..0000000
--- a/arcade/examples/sprite_rooms.py
+++ /dev/null
@@ -1,245 +0,0 @@
-"""
-Sprite move between different rooms.
-
-Artwork from http://kenney.nl
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_rooms
-"""
-
-import arcade
-import os
-
-SPRITE_SCALING = 0.5
-SPRITE_NATIVE_SIZE = 128
-SPRITE_SIZE = int(SPRITE_NATIVE_SIZE * SPRITE_SCALING)
-
-SCREEN_WIDTH = SPRITE_SIZE * 14
-SCREEN_HEIGHT = SPRITE_SIZE * 10
-SCREEN_TITLE = "Sprite Rooms Example"
-
-MOVEMENT_SPEED = 5
-
-
-class Room:
- """
- This class holds all the information about the
- different rooms.
- """
- def __init__(self):
- # You may want many lists. Lists for coins, monsters, etc.
- self.wall_list = None
-
- # This holds the background images. If you don't want changing
- # background images, you can delete this part.
- self.background = None
-
-
-def setup_room_1():
- """
- Create and return room 1.
- If your program gets large, you may want to separate this into different
- files.
- """
- room = Room()
-
- """ Set up the game and initialize the variables. """
- # Sprite lists
- room.wall_list = arcade.SpriteList()
-
- # -- Set up the walls
- # Create bottom and top row of boxes
- # This y loops a list of two, the coordinate 0, and just under the top of window
- for y in (0, SCREEN_HEIGHT - SPRITE_SIZE):
- # Loop for each box going across
- for x in range(0, SCREEN_WIDTH, SPRITE_SIZE):
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.left = x
- wall.bottom = y
- room.wall_list.append(wall)
-
- # Create left and right column of boxes
- for x in (0, SCREEN_WIDTH - SPRITE_SIZE):
- # Loop for each box going across
- for y in range(SPRITE_SIZE, SCREEN_HEIGHT - SPRITE_SIZE, SPRITE_SIZE):
- # Skip making a block 4 and 5 blocks up on the right side
- if (y != SPRITE_SIZE * 4 and y != SPRITE_SIZE * 5) or x == 0:
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.left = x
- wall.bottom = y
- room.wall_list.append(wall)
-
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.left = 7 * SPRITE_SIZE
- wall.bottom = 5 * SPRITE_SIZE
- room.wall_list.append(wall)
-
- # If you want coins or monsters in a level, then add that code here.
-
- # Load the background image for this level.
- room.background = arcade.load_texture("images/background.jpg")
-
- return room
-
-
-def setup_room_2():
- """
- Create and return room 2.
- """
- room = Room()
-
- """ Set up the game and initialize the variables. """
- # Sprite lists
- room.wall_list = arcade.SpriteList()
-
- # -- Set up the walls
- # Create bottom and top row of boxes
- # This y loops a list of two, the coordinate 0, and just under the top of window
- for y in (0, SCREEN_HEIGHT - SPRITE_SIZE):
- # Loop for each box going across
- for x in range(0, SCREEN_WIDTH, SPRITE_SIZE):
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.left = x
- wall.bottom = y
- room.wall_list.append(wall)
-
- # Create left and right column of boxes
- for x in (0, SCREEN_WIDTH - SPRITE_SIZE):
- # Loop for each box going across
- for y in range(SPRITE_SIZE, SCREEN_HEIGHT - SPRITE_SIZE, SPRITE_SIZE):
- # Skip making a block 4 and 5 blocks up
- if (y != SPRITE_SIZE * 4 and y != SPRITE_SIZE * 5) or x != 0:
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.left = x
- wall.bottom = y
- room.wall_list.append(wall)
-
- wall = arcade.Sprite("images/boxCrate_double.png", SPRITE_SCALING)
- wall.left = 5 * SPRITE_SIZE
- wall.bottom = 6 * SPRITE_SIZE
- room.wall_list.append(wall)
- room.background = arcade.load_texture("images/background_2.jpg")
-
- return room
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """
- 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)
-
- # Sprite lists
- self.current_room = 0
-
- # Set up the player
- self.rooms = None
- self.player_sprite = None
- self.player_list = None
- self.physics_engine = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 100
- self.player_sprite.center_y = 100
- self.player_list = arcade.SpriteList()
- self.player_list.append(self.player_sprite)
-
- # Our list of rooms
- self.rooms = []
-
- # Create the rooms. Extend the pattern for each room.
- room = setup_room_1()
- self.rooms.append(room)
-
- room = setup_room_2()
- self.rooms.append(room)
-
- # Our starting room number
- self.current_room = 0
-
- # Create a physics engine for this room
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.rooms[self.current_room].wall_list)
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw the background texture
- arcade.draw_texture_rectangle(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2,
- SCREEN_WIDTH, SCREEN_HEIGHT, self.rooms[self.current_room].background)
-
- # Draw all the walls in this room
- self.rooms[self.current_room].wall_list.draw()
-
- # If you have coins or monsters, then copy and modify the line
- # above for each list.
-
- self.player_list.draw()
-
- def on_key_press(self, key, modifiers):
- """Called whenever a key is pressed. """
-
- if key == arcade.key.UP:
- self.player_sprite.change_y = MOVEMENT_SPEED
- elif key == arcade.key.DOWN:
- self.player_sprite.change_y = -MOVEMENT_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_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.change_y = 0
- elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.physics_engine.update()
-
- # Do some logic here to figure out what room we are in, and if we need to go
- # to a different room.
- if self.player_sprite.center_x > SCREEN_WIDTH and self.current_room == 0:
- self.current_room = 1
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite,
- self.rooms[self.current_room].wall_list)
- self.player_sprite.center_x = 0
- elif self.player_sprite.center_x < 0 and self.current_room == 1:
- self.current_room = 0
- self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite,
- self.rooms[self.current_room].wall_list)
- self.player_sprite.center_x = SCREEN_WIDTH
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_tiled_map.py b/arcade/examples/sprite_tiled_map.py
deleted file mode 100644
index 19df073..0000000
--- a/arcade/examples/sprite_tiled_map.py
+++ /dev/null
@@ -1,238 +0,0 @@
-"""
-Load a Tiled map file
-
-Artwork from: http://kenney.nl
-Tiled available from: http://www.mapeditor.org/
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_tiled_map
-"""
-
-import arcade
-import os
-import time
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Tiled Map Example"
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * SPRITE_SCALING)
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN_TOP = 60
-VIEWPORT_MARGIN_BOTTOM = 60
-VIEWPORT_RIGHT_MARGIN = 270
-VIEWPORT_LEFT_MARGIN = 270
-
-# Physics
-MOVEMENT_SPEED = 5
-JUMP_SPEED = 23
-GRAVITY = 1.1
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """
- Initializer
- """
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- # Sprite lists
- self.wall_list = None
- self.player_list = None
- self.coin_list = None
-
- # Set up the player
- self.score = 0
- self.player_sprite = None
-
- self.physics_engine = None
- self.view_left = 0
- self.view_bottom = 0
- self.game_over = False
- self.last_time = None
- self.frame_count = 0
- self.fps_message = None
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
-
- # Starting position of the player
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 270
- self.player_list.append(self.player_sprite)
-
- platforms_layer_name = 'Platforms'
- coins_layer_name = 'Coins'
- map_name = "map.tmx"
-
- # Read in the tiled map
- my_map = arcade.read_tiled_map(map_name, SPRITE_SCALING)
-
- # --- Walls ---
- # Grab the layer of items we can't move through
- map_array = my_map.layers_int_data[platforms_layer_name]
-
- # Calculate the right edge of the my_map in pixels
- self.end_of_map = len(map_array[0]) * GRID_PIXEL_SIZE
-
- # --- Platforms ---
- self.wall_list = arcade.generate_sprites(my_map, platforms_layer_name, SPRITE_SCALING)
-
- # --- Coins ---
- self.coin_list = arcade.generate_sprites(my_map, coins_layer_name, SPRITE_SCALING)
-
- # --- Other stuff
- # Set the background color
- if my_map.backgroundcolor:
- arcade.set_background_color(my_map.backgroundcolor)
-
- # Keep player from running through the wall_list layer
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- gravity_constant=GRAVITY)
-
- # Set the view port boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- self.game_over = False
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- self.frame_count += 1
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_list.draw()
- self.wall_list.draw()
- self.coin_list.draw()
-
- if self.last_time and self.frame_count % 60 == 0:
- fps = 1.0 / (time.time() - self.last_time) * 60
- self.fps_message = f"FPS: {fps:5.0f}"
-
- if self.fps_message:
- arcade.draw_text(self.fps_message, self.view_left + 10, self.view_bottom + 40, arcade.color.BLACK, 14)
-
- if self.frame_count % 60 == 0:
- self.last_time = time.time()
-
- # Put the text on the screen.
- # Adjust the text position based on the view port so that we don't
- # scroll the text too.
- distance = self.player_sprite.right
- output = f"Distance: {distance}"
- arcade.draw_text(output, self.view_left + 10, self.view_bottom + 20, arcade.color.BLACK, 14)
-
- if self.game_over:
- arcade.draw_text("Game Over", self.view_left + 200, self.view_bottom + 200, arcade.color.BLACK, 30)
-
- def on_key_press(self, key, modifiers):
- """
- Called whenever the mouse moves.
- """
- if key == arcade.key.UP:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = JUMP_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """
- Called when the user presses a mouse button.
- """
- if key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- if self.player_sprite.right >= self.end_of_map:
- self.game_over = True
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- if not self.game_over:
- self.physics_engine.update()
-
- coins_hit = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
- for coin in coins_hit:
- coin.kill()
- self.score += 1
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the view port
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_LEFT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - VIEWPORT_RIGHT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN_TOP
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN_BOTTOM
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- # If we need to scroll, go ahead and do it.
- if changed:
- self.view_left = int(self.view_left)
- self.view_bottom = int(self.view_bottom)
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/sprite_tiled_map_with_levels.py b/arcade/examples/sprite_tiled_map_with_levels.py
deleted file mode 100644
index 3d87d3c..0000000
--- a/arcade/examples/sprite_tiled_map_with_levels.py
+++ /dev/null
@@ -1,242 +0,0 @@
-"""
-Load a Tiled map file with Levels
-
-Artwork from: http://kenney.nl
-Tiled available from: http://www.mapeditor.org/
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.sprite_tiled_map_with_levels
-"""
-
-import arcade
-import os
-import time
-
-SPRITE_SCALING = 0.5
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Sprite Tiled Map with Levels Example"
-SPRITE_PIXEL_SIZE = 128
-GRID_PIXEL_SIZE = (SPRITE_PIXEL_SIZE * SPRITE_SCALING)
-
-# How many pixels to keep as a minimum margin between the character
-# and the edge of the screen.
-VIEWPORT_MARGIN_TOP = 60
-VIEWPORT_MARGIN_BOTTOM = 60
-VIEWPORT_RIGHT_MARGIN = 270
-VIEWPORT_LEFT_MARGIN = 270
-
-# Physics
-MOVEMENT_SPEED = 5
-JUMP_SPEED = 23
-GRAVITY = 1.1
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self):
- """
- Initializer
- """
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_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)
-
- # Sprite lists
- self.wall_list = None
- self.player_list = None
- self.coin_list = None
-
- # Set up the player
- self.score = 0
- self.player_sprite = None
-
- self.physics_engine = None
- self.view_left = 0
- self.view_bottom = 0
- self.game_over = False
- self.last_time = None
- self.frame_count = 0
- self.fps_message = None
-
- self.level = 1
- self.max_level = 2
-
- def setup(self):
- """ Set up the game and initialize the variables. """
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
-
- # Starting position of the player
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 64
- self.player_list.append(self.player_sprite)
-
- self.load_level(self.level)
-
- self.game_over = False
-
- def load_level(self, level):
- # Read in the tiled map
- my_map = arcade.tilemap.read_tmx(f"level_{level}.tmx")
-
- # --- Walls ---
-
- # Calculate the right edge of the my_map in pixels
- self.end_of_map = my_map.map_size.width * GRID_PIXEL_SIZE
-
- # Grab the layer of items we can't move through
- self.wall_list = arcade.tilemap.process_layer(my_map, 'Platforms', SPRITE_SCALING)
-
- self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
- self.wall_list,
- gravity_constant=GRAVITY)
-
- # --- Other stuff
- # Set the background color
- if my_map.background_color:
- arcade.set_background_color(my_map.background_color)
-
- # Set the view port boundaries
- # These numbers set where we have 'scrolled' to.
- self.view_left = 0
- self.view_bottom = 0
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- self.frame_count += 1
-
- # This command has to happen before we start drawing
- arcade.start_render()
-
- # Draw all the sprites.
- self.player_list.draw()
- self.wall_list.draw()
- self.coin_list.draw()
-
- if self.last_time and self.frame_count % 60 == 0:
- fps = 1.0 / (time.time() - self.last_time) * 60
- self.fps_message = f"FPS: {fps:5.0f}"
-
- if self.fps_message:
- arcade.draw_text(self.fps_message, self.view_left + 10, self.view_bottom + 40, arcade.color.BLACK, 14)
-
- if self.frame_count % 60 == 0:
- self.last_time = time.time()
-
- # Put the text on the screen.
- # Adjust the text position based on the view port so that we don't
- # scroll the text too.
- distance = self.player_sprite.right
- output = f"Distance: {distance}"
- arcade.draw_text(output, self.view_left + 10, self.view_bottom + 20, arcade.color.BLACK, 14)
-
- if self.game_over:
- arcade.draw_text("Game Over", self.view_left + 200, self.view_bottom + 200, arcade.color.BLACK, 30)
-
- def on_key_press(self, key, modifiers):
- """
- Called whenever the mouse moves.
- """
- if key == arcade.key.UP:
- if self.physics_engine.can_jump():
- self.player_sprite.change_y = JUMP_SPEED
- elif key == arcade.key.LEFT:
- self.player_sprite.change_x = -MOVEMENT_SPEED
- elif key == arcade.key.RIGHT:
- self.player_sprite.change_x = MOVEMENT_SPEED
-
- def on_key_release(self, key, modifiers):
- """
- Called when the user presses a mouse button.
- """
- if key == arcade.key.LEFT or key == arcade.key.RIGHT:
- self.player_sprite.change_x = 0
-
- def update(self, delta_time):
- """ Movement and game logic """
-
- if self.player_sprite.right >= self.end_of_map:
- if self.level < self.max_level:
- self.level += 1
- self.load_level(self.level)
- self.player_sprite.center_x = 64
- self.player_sprite.center_y = 64
- self.player_sprite.change_x = 0
- self.player_sprite.change_y = 0
- else:
- self.game_over = True
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- if not self.game_over:
- self.physics_engine.update()
-
- coins_hit = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
- for coin in coins_hit:
- coin.kill()
- self.score += 1
-
- # --- Manage Scrolling ---
-
- # Track if we need to change the view port
-
- changed = False
-
- # Scroll left
- left_bndry = self.view_left + VIEWPORT_LEFT_MARGIN
- if self.player_sprite.left < left_bndry:
- self.view_left -= left_bndry - self.player_sprite.left
- changed = True
-
- # Scroll right
- right_bndry = self.view_left + SCREEN_WIDTH - VIEWPORT_RIGHT_MARGIN
- if self.player_sprite.right > right_bndry:
- self.view_left += self.player_sprite.right - right_bndry
- changed = True
-
- # Scroll up
- top_bndry = self.view_bottom + SCREEN_HEIGHT - VIEWPORT_MARGIN_TOP
- if self.player_sprite.top > top_bndry:
- self.view_bottom += self.player_sprite.top - top_bndry
- changed = True
-
- # Scroll down
- bottom_bndry = self.view_bottom + VIEWPORT_MARGIN_BOTTOM
- if self.player_sprite.bottom < bottom_bndry:
- self.view_bottom -= bottom_bndry - self.player_sprite.bottom
- changed = True
-
- # If we need to scroll, go ahead and do it.
- if changed:
- self.view_left = int(self.view_left)
- self.view_bottom = int(self.view_bottom)
- arcade.set_viewport(self.view_left,
- SCREEN_WIDTH + self.view_left,
- self.view_bottom,
- SCREEN_HEIGHT + self.view_bottom)
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/standard_tileset.tsx b/arcade/examples/standard_tileset.tsx
deleted file mode 100644
index b66af37..0000000
--- a/arcade/examples/standard_tileset.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/arcade/examples/stars.jpg b/arcade/examples/stars.jpg
deleted file mode 100644
index 4c847ef..0000000
Binary files a/arcade/examples/stars.jpg and /dev/null differ
diff --git a/arcade/examples/starting_template.py b/arcade/examples/starting_template.py
deleted file mode 100644
index db7fab4..0000000
--- a/arcade/examples/starting_template.py
+++ /dev/null
@@ -1,99 +0,0 @@
-"""
-Starting Template
-
-Once you have learned how to use classes, you can begin your program with this
-template.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.starting_template
-"""
-import arcade
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Starting Template"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
-
- NOTE: Go ahead and delete the methods you don't need.
- If you do need a method, delete the 'pass' and replace it
- with your own code. Don't leave 'pass' in this program.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.AMAZON)
-
- # If you have sprite lists, you should create them here,
- # and set them to None
-
- def setup(self):
- # Create your sprites and sprite lists here
- pass
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command should happen before we start drawing. It will clear
- # the screen to the background color, and erase what we drew last frame.
- arcade.start_render()
-
- # Call draw() on all your sprite lists below
-
- def update(self, delta_time):
- """
- All the logic to move, and the game logic goes here.
- Normally, you'll call update() on the sprite lists that
- need it.
- """
- pass
-
- def on_key_press(self, key, key_modifiers):
- """
- Called whenever a key on the keyboard is pressed.
-
- For a full list of keys, see:
- http://arcade.academy/arcade.key.html
- """
- pass
-
- def on_key_release(self, key, key_modifiers):
- """
- Called whenever the user lets off a previously pressed key.
- """
- pass
-
- def on_mouse_motion(self, x, y, delta_x, delta_y):
- """
- Called whenever the mouse moves.
- """
- pass
-
- def on_mouse_press(self, x, y, button, key_modifiers):
- """
- Called when the user presses a mouse button.
- """
- pass
-
- def on_mouse_release(self, x, y, button, key_modifiers):
- """
- Called when a user releases a mouse button.
- """
- pass
-
-
-def main():
- """ Main method """
- game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- game.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/starting_template_simple.py b/arcade/examples/starting_template_simple.py
deleted file mode 100644
index 716283d..0000000
--- a/arcade/examples/starting_template_simple.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""
-Starting Template Simple
-
-Once you have learned how to use classes, you can begin your program with this
-template.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.starting_template_simple
-"""
-import arcade
-
-SCREEN_WIDTH = 500
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Starting Template Simple"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.WHITE)
-
- def setup(self):
- """ Set up the game here. Call this function to restart the game. """
- pass
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- arcade.start_render()
-
- def on_mouse_press(self, x, y, button, key_modifiers):
- """
- Called when the user presses a mouse button.
- """
- pass
-
-
-def main():
- """ Main method """
- window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/tetris.py b/arcade/examples/tetris.py
deleted file mode 100644
index 8d2f049..0000000
--- a/arcade/examples/tetris.py
+++ /dev/null
@@ -1,276 +0,0 @@
-"""
-Tetris
-
-Tetris clone, with some ideas from silvasur's code:
-https://gist.github.com/silvasur/565419/d9de6a84e7da000797ac681976442073045c74a4
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.tetris
-"""
-import arcade
-import random
-import PIL
-
-# Set how many rows and columns we will have
-ROW_COUNT = 24
-COLUMN_COUNT = 10
-
-# This sets the WIDTH and HEIGHT of each grid location
-WIDTH = 30
-HEIGHT = 30
-
-# This sets the margin between each cell
-# and on the edges of the screen.
-MARGIN = 5
-
-# Do the math to figure out our screen dimensions
-SCREEN_WIDTH = (WIDTH + MARGIN) * COLUMN_COUNT + MARGIN
-SCREEN_HEIGHT = (HEIGHT + MARGIN) * ROW_COUNT + MARGIN
-SCREEN_TITLE = "Tetris"
-
-colors = [
- (0, 0, 0 ),
- (255, 0, 0 ),
- (0, 150, 0 ),
- (0, 0, 255),
- (255, 120, 0 ),
- (255, 255, 0 ),
- (180, 0, 255),
- (0, 220, 220)
- ]
-
-# Define the shapes of the single parts
-tetris_shapes = [
- [[1, 1, 1],
- [0, 1, 0]],
-
- [[0, 2, 2],
- [2, 2, 0]],
-
- [[3, 3, 0],
- [0, 3, 3]],
-
- [[4, 0, 0],
- [4, 4, 4]],
-
- [[0, 0, 5],
- [5, 5, 5]],
-
- [[6, 6, 6, 6]],
-
- [[7, 7],
- [7, 7]]
-]
-
-
-def create_textures():
- """ Create a list of images for sprites based on the global colors. """
- texture_list = []
- for color in colors:
- image = PIL.Image.new('RGB', (WIDTH, HEIGHT), color)
- texture_list.append(arcade.Texture(str(color), image=image))
- return texture_list
-
-
-texture_list = create_textures()
-
-
-def rotate_clockwise(shape):
- """ Rotates a matrix clockwise """
- return [[shape[y][x] for y in range(len(shape))] for x in range(len(shape[0]) - 1, -1, -1)]
-
-
-def check_collision(board, shape, offset):
- """
- See if the matrix stored in the shape will intersect anything
- on the board based on the offset. Offset is an (x, y) coordinate.
- """
- off_x, off_y = offset
- for cy, row in enumerate(shape):
- for cx, cell in enumerate(row):
- if cell and board[cy + off_y][cx + off_x]:
- return True
- return False
-
-
-def remove_row(board, row):
- """ Remove a row from the board, add a blank row on top. """
- del board[row]
- return [[0 for i in range(COLUMN_COUNT)]] + board
-
-
-def join_matrixes(matrix_1, matrix_2, matrix_2_offset):
- """ Copy matrix 2 onto matrix 1 based on the passed in x, y offset coordinate """
- offset_x, offset_y = matrix_2_offset
- for cy, row in enumerate(matrix_2):
- for cx, val in enumerate(row):
- matrix_1[cy + offset_y - 1][cx + offset_x] += val
- return matrix_1
-
-
-def new_board():
- """ Create a grid of 0's. Add 1's to the bottom for easier collision detection. """
- # Create the main board of 0's
- board = [[0 for x in range(COLUMN_COUNT)] for y in range(ROW_COUNT)]
- # Add a bottom border of 1's
- board += [[1 for x in range(COLUMN_COUNT)]]
- return board
-
-
-class MyGame(arcade.Window):
- """ Main application class. """
-
- def __init__(self, width, height, title):
- """ Set up the application. """
-
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.WHITE)
-
- self.board = None
- self.frame_count = 0
- self.game_over = False
- self.paused = False
- self.board_sprite_list = None
-
- def new_stone(self):
- """
- Randomly grab a new stone and set the stone location to the top.
- If we immediately collide, then game-over.
- """
- self.stone = random.choice(tetris_shapes)
- self.stone_x = int(COLUMN_COUNT / 2 - len(self.stone[0]) / 2)
- self.stone_y = 0
-
- if check_collision(self.board, self.stone, (self.stone_x, self.stone_y)):
- self.game_over = True
-
- def setup(self):
- self.board = new_board()
-
- self.board_sprite_list = arcade.SpriteList()
- for row in range(len(self.board)):
- for column in range(len(self.board[0])):
- sprite = arcade.Sprite()
- for texture in texture_list:
- sprite.append_texture(texture)
- sprite.set_texture(0)
- sprite.center_x = (MARGIN + WIDTH) * column + MARGIN + WIDTH // 2
- sprite.center_y = SCREEN_HEIGHT - (MARGIN + HEIGHT) * row + MARGIN + HEIGHT // 2
-
- self.board_sprite_list.append(sprite)
-
- self.new_stone()
- self.update_board()
-
- def drop(self):
- """
- Drop the stone down one place.
- Check for collision.
- If collided, then
- join matrixes
- Check for rows we can remove
- Update sprite list with stones
- Create a new stone
- """
- if not self.game_over and not self.paused:
- self.stone_y += 1
- if check_collision(self.board, self.stone, (self.stone_x, self.stone_y)):
- self.board = join_matrixes(self.board, self.stone, (self.stone_x, self.stone_y))
- while True:
- for i, row in enumerate(self.board[:-1]):
- if 0 not in row:
- self.board = remove_row(self.board, i)
- break
- else:
- break
- self.update_board()
- self.new_stone()
-
- def rotate_stone(self):
- """ Rotate the stone, check collision. """
- if not self.game_over and not self.paused:
- new_stone = rotate_clockwise(self.stone)
- if not check_collision(self.board, new_stone, (self.stone_x, self.stone_y)):
- self.stone = new_stone
-
- def update(self, dt):
- """ Update, drop stone if warrented """
- self.frame_count += 1
- if self.frame_count % 10 == 0:
- self.drop()
-
- def move(self, delta_x):
- """ Move the stone back and forth based on delta x. """
- if not self.game_over and not self.paused:
- new_x = self.stone_x + delta_x
- if new_x < 0:
- new_x = 0
- if new_x > COLUMN_COUNT - len(self.stone[0]):
- new_x = COLUMN_COUNT - len(self.stone[0])
- if not check_collision(self.board, self.stone, (new_x, self.stone_y)):
- self.stone_x = new_x
-
- def on_key_press(self, key, modifiers):
- """
- Handle user key presses
- User goes left, move -1
- User goes right, move 1
- Rotate stone,
- or drop down
- """
- if key == arcade.key.LEFT:
- self.move(-1)
- elif key == arcade.key.RIGHT:
- self.move(1)
- elif key == arcade.key.UP:
- self.rotate_stone()
- elif key == arcade.key.DOWN:
- self.drop()
-
- def draw_grid(self, grid, offset_x, offset_y):
- """
- Draw the grid. Used to draw the falling stones. The board is drawn
- by the sprite list.
- """
- # Draw the grid
- for row in range(len(grid)):
- for column in range(len(grid[0])):
- # Figure out what color to draw the box
- if grid[row][column]:
- color = colors[grid[row][column]]
- # Do the math to figure out where the box is
- x = (MARGIN + WIDTH) * (column + offset_x) + MARGIN + WIDTH // 2
- y = SCREEN_HEIGHT - (MARGIN + HEIGHT) * (row + offset_y) + MARGIN + HEIGHT // 2
-
- # Draw the box
- arcade.draw_rectangle_filled(x, y, WIDTH, HEIGHT, color)
-
- def update_board(self):
- """
- Update the sprite list to reflect the contents of the 2d grid
- """
- for row in range(len(self.board)):
- for column in range(len(self.board[0])):
- v = self.board[row][column]
- i = row * COLUMN_COUNT + column
- self.board_sprite_list[i].set_texture(v)
-
- def on_draw(self):
- """ Render the screen. """
-
- # This command has to happen before we start drawing
- arcade.start_render()
- self.board_sprite_list.draw()
- self.draw_grid(self.stone, self.stone_x, self.stone_y)
-
-
-def main():
- """ Create the game window, setup, run """
- my_game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- my_game.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/text_loc_example.po b/arcade/examples/text_loc_example.po
deleted file mode 100644
index 558ad7d..0000000
--- a/arcade/examples/text_loc_example.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2019-05-06 12:19-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: pygettext.py 1.5\n"
-
-
-#: text_loc_example.py:46
-msgid "Simple line of text in 12 point"
-msgstr "Línea simple de texto en 12 puntos."
-
diff --git a/arcade/examples/text_loc_example_done.py b/arcade/examples/text_loc_example_done.py
deleted file mode 100644
index 672b2b0..0000000
--- a/arcade/examples/text_loc_example_done.py
+++ /dev/null
@@ -1,70 +0,0 @@
-"""
-Example showing how to draw text to the screen.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.text_loc_example_done
-"""
-import arcade
-import gettext
-import os
-
-# 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)
-
-# Try to auto-detect the user's language and translate to it
-gettext.install('text_loc_example', localedir='text_loc_example_locale')
-
-SCREEN_WIDTH = 500
-SCREEN_HEIGHT = 500
-SCREEN_TITLE = "Localizing Text Example"
-_ = gettext.gettext
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.WHITE)
- self.text_angle = 0
- self.time_elapsed = 0.0
-
- def update(self, delta_time):
- self.text_angle += 1
- self.time_elapsed += delta_time
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command should happen before we start drawing. It will clear
- # the screen to the background color, and erase what we drew last frame.
- arcade.start_render()
-
- # start_x and start_y make the start point for the text.
- # We draw a dot to make it easy too see
- # the text in relation to its start x and y.
- start_x = 50
- start_y = 450
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text(
- _("Simple line of text in 12 point"), start_x, start_y, arcade.color.BLACK, 12
- )
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
-
diff --git a/arcade/examples/text_loc_example_start.py b/arcade/examples/text_loc_example_start.py
deleted file mode 100644
index d6ea5e9..0000000
--- a/arcade/examples/text_loc_example_start.py
+++ /dev/null
@@ -1,65 +0,0 @@
-"""
-Example showing how to draw text to the screen.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.text_loc_example_start
-"""
-import arcade
-import os
-
-# 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)
-
-SCREEN_WIDTH = 500
-SCREEN_HEIGHT = 500
-SCREEN_TITLE = "Localizing Text Example"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self, width, height, title):
- super().__init__(width, height, title)
-
- arcade.set_background_color(arcade.color.WHITE)
- self.text_angle = 0
- self.time_elapsed = 0.0
-
- def update(self, delta_time):
- self.text_angle += 1
- self.time_elapsed += delta_time
-
- def on_draw(self):
- """
- Render the screen.
- """
-
- # This command should happen before we start drawing. It will clear
- # the screen to the background color, and erase what we drew last frame.
- arcade.start_render()
-
- # start_x and start_y make the start point for the text.
- # We draw a dot to make it easy too see
- # the text in relation to its start x and y.
- start_x = 50
- start_y = 450
- arcade.draw_point(start_x, start_y, arcade.color.BLUE, 5)
- arcade.draw_text(
- "Simple line of text in 12 point", start_x, start_y, arcade.color.BLACK, 12
- )
-
-
-def main():
- MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
-
diff --git a/arcade/examples/timer.py b/arcade/examples/timer.py
deleted file mode 100644
index 9cad2d8..0000000
--- a/arcade/examples/timer.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""
-Show a timer on-screen.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.timer
-"""
-
-import arcade
-
-SCREEN_WIDTH = 800
-SCREEN_HEIGHT = 600
-SCREEN_TITLE = "Timer Example"
-
-
-class MyGame(arcade.Window):
- """
- Main application class.
- """
-
- def __init__(self):
- super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
- self.total_time = 0.0
-
- def setup(self):
- """
- Set up the application.
- """
- arcade.set_background_color(arcade.color.WHITE)
- self.total_time = 0.0
-
- def on_draw(self):
- """ Use this function to draw everything to the screen. """
-
- # Start the render. This must happen before any drawing
- # commands. We do NOT need an stop render command.
- arcade.start_render()
-
- # Calculate minutes
- minutes = int(self.total_time) // 60
-
- # Calculate seconds by using a modulus (remainder)
- seconds = int(self.total_time) % 60
-
- # Figure out our output
- output = f"Time: {minutes:02d}:{seconds:02d}"
-
- # Output the timer text.
- arcade.draw_text(output, 300, 300, arcade.color.BLACK, 30)
-
- def update(self, delta_time):
- """
- All the logic to move, and the game logic goes here.
- """
- self.total_time += delta_time
-
-
-def main():
- window = MyGame()
- window.setup()
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/view_instructions_and_game_over.py b/arcade/examples/view_instructions_and_game_over.py
deleted file mode 100644
index ffea7ed..0000000
--- a/arcade/examples/view_instructions_and_game_over.py
+++ /dev/null
@@ -1,185 +0,0 @@
-"""
-This program shows how to:
- * Have one or more instruction screens
- * Show a 'Game over' text and halt the game
- * Allow the user to restart the game
-
-Make a separate class for each view (screen) in your game.
-The class will inherit from arcade.View. The structure will
-look like an arcade.Window as each view will need to have its own draw,
-update and window event methods. To switch a view, simply create a view
-with `view = MyView()` and then use the view.show() method.
-
-This example shows how you can set data from one View on another View to pass data
-around (see: time_taken), or you can store data on the Window object to share data between
-all Views (see: total_score).
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.view_instructions_and_game_over.py
-"""
-
-import arcade
-import random
-import os
-
-
-file_path = os.path.dirname(os.path.abspath(__file__))
-os.chdir(file_path)
-
-
-WIDTH = 800
-HEIGHT = 600
-SPRITE_SCALING = 0.5
-
-
-class MenuView(arcade.View):
- def on_show(self):
- arcade.set_background_color(arcade.color.WHITE)
-
- def on_draw(self):
- arcade.start_render()
- arcade.draw_text("Menu Screen", WIDTH/2, HEIGHT/2,
- arcade.color.BLACK, font_size=50, anchor_x="center")
- arcade.draw_text("Click to advance", WIDTH/2, HEIGHT/2-75,
- arcade.color.GRAY, font_size=20, anchor_x="center")
-
- def on_mouse_press(self, x, y, button, modifiers):
- instructions_view = InstructionView()
- self.window.show_view(instructions_view)
-
-
-class InstructionView(arcade.View):
- def on_show(self):
- arcade.set_background_color(arcade.color.ORANGE_PEEL)
-
- def on_draw(self):
- arcade.start_render()
- arcade.draw_text("Instructions Screen", WIDTH/2, HEIGHT/2,
- arcade.color.BLACK, font_size=50, anchor_x="center")
- arcade.draw_text("Click to advance", WIDTH/2, HEIGHT/2-75,
- arcade.color.GRAY, font_size=20, anchor_x="center")
-
- def on_mouse_press(self, x, y, button, modifiers):
- game_view = GameView()
- self.window.show_view(game_view)
-
-
-class GameView(arcade.View):
- def __init__(self):
- super().__init__()
-
- self.time_taken = 0
-
- # Sprite lists
- self.player_list = arcade.SpriteList()
- self.coin_list = arcade.SpriteList()
-
- # Set up the player
- self.score = 0
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_list.append(self.player_sprite)
-
- for i in range(5):
-
- # Create the coin instance
- coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING / 3)
-
- # Position the coin
- coin.center_x = random.randrange(WIDTH)
- coin.center_y = random.randrange(HEIGHT)
-
- # Add the coin to the lists
- self.coin_list.append(coin)
-
- def on_show(self):
- arcade.set_background_color(arcade.color.AMAZON)
-
- # Don't show the mouse cursor
- self.window.set_mouse_visible(False)
-
- def on_draw(self):
- arcade.start_render()
- # Draw all the sprites.
- self.player_list.draw()
- self.coin_list.draw()
-
- # Put the text on the screen.
- output = f"Score: {self.score}"
- arcade.draw_text(output, 10, 30, arcade.color.WHITE, 14)
- output_total = f"Total Score: {self.window.total_score}"
- arcade.draw_text(output_total, 10, 10, arcade.color.WHITE, 14)
-
- def update(self, delta_time):
- self.time_taken += delta_time
-
- # Call update on all sprites (The sprites don't do much in this
- # example though.)
- self.coin_list.update()
- self.player_list.update()
-
- # Generate a list of all sprites that collided with the player.
- hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list)
-
- # Loop through each colliding sprite, remove it, and add to the
- # score.
- for coin in hit_list:
- coin.kill()
- self.score += 1
- self.window.total_score += 1
-
- # If we've collected all the games, then move to a "GAME_OVER"
- # state.
- if len(self.coin_list) == 0:
- game_over_view = GameOverView()
- game_over_view.time_taken = self.time_taken
- self.window.set_mouse_visible(True)
- self.window.show_view(game_over_view)
-
- def on_mouse_motion(self, x, y, dx, dy):
- """
- Called whenever the mouse moves.
- """
- self.player_sprite.center_x = x
- self.player_sprite.center_y = y
-
-
-class GameOverView(arcade.View):
- def on_show(self):
- arcade.set_background_color(arcade.color.BLACK)
-
- def on_draw(self):
- arcade.start_render()
- """
- Draw "Game over" across the screen.
- """
- arcade.draw_text("Game Over", 240, 400, arcade.color.WHITE, 54)
- arcade.draw_text("Click to restart", 310, 300, arcade.color.WHITE, 24)
-
- time_taken_formatted = f"{round(self.time_taken, 2)} seconds"
- arcade.draw_text(f"Time taken: {time_taken_formatted}",
- WIDTH/2,
- 200,
- arcade.color.GRAY,
- font_size=15,
- anchor_x="center")
-
- output_total = f"Total Score: {self.window.total_score}"
- arcade.draw_text(output_total, 10, 10, arcade.color.WHITE, 14)
-
- def on_mouse_press(self, x, y, button, modifiers):
- game_view = GameView()
- self.window.show_view(game_view)
-
-
-def main():
- window = arcade.Window(WIDTH, HEIGHT, "Different Views Example")
- window.total_score = 0
- menu_view = MenuView()
- window.show_view(menu_view)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/view_pause_screen.py b/arcade/examples/view_pause_screen.py
deleted file mode 100644
index 5b00217..0000000
--- a/arcade/examples/view_pause_screen.py
+++ /dev/null
@@ -1,142 +0,0 @@
-"""
-This program shows how to have a pause screen without resetting the game.
-
-Make a separate class for each view (screen) in your game.
-The class will inherit from arcade.View. The structure will
-look like an arcade.Window as each View will need to have its own draw,
-update and window event methods. To switch a View, simply create a view
-with `view = MyView()` and then use the "self.window.set_view(view)" method.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.view_pause_screen
-"""
-
-import arcade
-import random
-import os
-
-
-file_path = os.path.dirname(os.path.abspath(__file__))
-os.chdir(file_path)
-
-
-WIDTH = 800
-HEIGHT = 600
-SPRITE_SCALING = 0.5
-
-
-class MenuView(arcade.View):
- def on_show(self):
- arcade.set_background_color(arcade.color.WHITE)
-
- def on_draw(self):
- arcade.start_render()
- arcade.draw_text("Menu Screen", WIDTH/2, HEIGHT/2,
- arcade.color.BLACK, font_size=50, anchor_x="center")
- arcade.draw_text("Click to advance.", WIDTH/2, HEIGHT/2-75,
- arcade.color.GRAY, font_size=20, anchor_x="center")
-
- def on_mouse_press(self, x, y, button, modifiers):
- game = GameView()
- self.window.show_view(game)
-
-
-class GameView(arcade.View):
- def __init__(self):
- super().__init__()
- self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING)
- self.player_sprite.center_x = 50
- self.player_sprite.center_y = 50
- self.player_sprite.velocity = [3, 3]
-
- def on_show(self):
- arcade.set_background_color(arcade.color.AMAZON)
-
- def on_draw(self):
- arcade.start_render()
- # Draw all the sprites.
- self.player_sprite.draw()
-
- # Show tip to pause screen
- arcade.draw_text("Press Esc. to pause",
- WIDTH/2,
- HEIGHT-100,
- arcade.color.BLACK,
- font_size=20,
- anchor_x="center")
-
- def update(self, delta_time):
- # Call update on all sprites
- self.player_sprite.update()
-
- # Bounce off the edges
- if self.player_sprite.left < 0 or self.player_sprite.right > WIDTH:
- self.player_sprite.change_x *= -1
- if self.player_sprite.bottom < 0 or self.player_sprite.top > HEIGHT:
- self.player_sprite.change_y *= -1
-
- def on_key_press(self, key, modifiers):
- if key == arcade.key.ESCAPE:
- # pass self, the current view, to preserve this view's state
- pause = PauseView(self)
- self.window.show_view(pause)
-
-
-class PauseView(arcade.View):
- def __init__(self, game_view):
- super().__init__()
- self.game_view = game_view
-
- def on_show(self):
- arcade.set_background_color(arcade.color.ORANGE)
-
- def on_draw(self):
- arcade.start_render()
-
- # Draw player, for effect, on pause screen.
- # The previous View (GameView) was passed in
- # and saved in self.game_view.
- player_sprite = self.game_view.player_sprite
- player_sprite.draw()
-
- # draw an orange filter over him
- arcade.draw_lrtb_rectangle_filled(left=player_sprite.left,
- right=player_sprite.right,
- top=player_sprite.top,
- bottom=player_sprite.bottom,
- color=(*arcade.color.ORANGE, 200))
-
- arcade.draw_text("PAUSED", WIDTH/2, HEIGHT/2+50,
- arcade.color.BLACK, font_size=50, anchor_x="center")
-
- # Show tip to return or reset
- arcade.draw_text("Press Esc. to return",
- WIDTH/2,
- HEIGHT/2,
- arcade.color.BLACK,
- font_size=20,
- anchor_x="center")
- arcade.draw_text("Press Enter to reset",
- WIDTH/2,
- HEIGHT/2-30,
- arcade.color.BLACK,
- font_size=20,
- anchor_x="center")
-
- def on_key_press(self, key, modifiers):
- if key == arcade.key.ESCAPE: # resume game
- self.window.show_view(self.game_view)
- elif key == arcade.key.ENTER: # reset game
- game = GameView()
- self.window.show_view(game)
-
-
-def main():
- window = arcade.Window(WIDTH, HEIGHT, "Instruction and Game Over Views Example")
- menu = MenuView()
- window.show_view(menu)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/examples/view_screens_minimal.py b/arcade/examples/view_screens_minimal.py
deleted file mode 100644
index 580f243..0000000
--- a/arcade/examples/view_screens_minimal.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""
-This program shows how to:
- * Display a sequence of screens in your game. The "arcade.View"
- class makes it easy to separate the code for each screen into
- its own class.
- * This example shows the absolute basics of using "arcade.View".
- See the "different_screens_example.py" for how to handle
- screen-specific data.
-
-Make a separate class for each view (screen) in your game.
-The class will inherit from arcade.View. The structure will
-look like an arcade.Window as each View will need to have its own draw,
-update and window event methods. To switch a View, simply create a View
-with `view = MyView()` and then use the "self.window.set_view(view)" method.
-
-If Python and Arcade are installed, this example can be run from the command line with:
-python -m arcade.examples.view_screens_minimal
-"""
-
-import arcade
-import os
-
-
-file_path = os.path.dirname(os.path.abspath(__file__))
-os.chdir(file_path)
-
-
-WIDTH = 800
-HEIGHT = 600
-
-
-class MenuView(arcade.View):
- def on_show(self):
- arcade.set_background_color(arcade.color.WHITE)
-
- def on_draw(self):
- arcade.start_render()
- arcade.draw_text("Menu Screen - click to advance", WIDTH/2, HEIGHT/2,
- arcade.color.BLACK, font_size=30, anchor_x="center")
-
- def on_mouse_press(self, x, y, button, modifiers):
- game_view = GameView()
- self.window.show_view(game_view)
-
-
-class GameView(arcade.View):
- def on_show(self):
- arcade.set_background_color(arcade.color.ORANGE_PEEL)
-
- def on_draw(self):
- arcade.start_render()
- arcade.draw_text("Game - press SPACE to advance", WIDTH/2, HEIGHT/2,
- arcade.color.BLACK, font_size=30, anchor_x="center")
-
- def on_key_press(self, key, modifiers):
- if key == arcade.key.SPACE:
- game_over_view = GameOverView()
- self.window.show_view(game_over_view)
-
-
-class GameOverView(arcade.View):
- def on_show(self):
- arcade.set_background_color(arcade.color.BLACK)
-
- def on_draw(self):
- arcade.start_render()
- arcade.draw_text("Game Over - press ESCAPE to advance", WIDTH/2, HEIGHT/2,
- arcade.color.WHITE, 30, anchor_x="center")
-
- def on_key_press(self, key, modifiers):
- if key == arcade.key.ESCAPE:
- menu_view = MenuView()
- self.window.show_view(menu_view)
-
-
-def main():
- window = arcade.Window(WIDTH, HEIGHT, "Different Views Minimal Example")
- menu_view = MenuView()
- window.show_view(menu_view)
- arcade.run()
-
-
-if __name__ == "__main__":
- main()
diff --git a/arcade/geometry.py b/arcade/geometry.py
deleted file mode 100644
index 4379210..0000000
--- a/arcade/geometry.py
+++ /dev/null
@@ -1,196 +0,0 @@
-"""
-Functions for calculating geometry.
-"""
-
-from arcade.sprite import Sprite
-from arcade.sprite_list import SpriteList
-from typing import List
-from arcade.arcade_types import PointList
-from arcade.arcade_types import Point
-
-PRECISION = 2
-
-
-def are_polygons_intersecting(poly_a: PointList,
- poly_b: PointList) -> bool:
- """
- Return True if two polygons intersect.
-
- :param PointList poly_a: List of points that define the first polygon.
- :param PointList poly_b: List of points that define the second polygon.
- :Returns: True or false depending if polygons intersect
-
- :rtype bool:
- """
-
- for polygon in (poly_a, poly_b):
-
- for i1 in range(len(polygon)):
- i2 = (i1 + 1) % len(polygon)
- projection_1 = polygon[i1]
- projection_2 = polygon[i2]
-
- normal = (projection_2[1] - projection_1[1],
- projection_1[0] - projection_2[0])
-
- min_a, max_a, min_b, max_b = (None,) * 4
-
- for poly in poly_a:
- projected = normal[0] * poly[0] + normal[1] * poly[1]
-
- if min_a is None or projected < min_a:
- min_a = projected
- if max_a is None or projected > max_a:
- max_a = projected
-
- for poly in poly_b:
- projected = normal[0] * poly[0] + normal[1] * poly[1]
-
- if min_b is None or projected < min_b:
- min_b = projected
- if max_b is None or projected > max_b:
- max_b = projected
-
- if max_a <= min_b or max_b <= min_a:
- return False
-
- return True
-
-
-def check_for_collision(sprite1: Sprite, sprite2: Sprite) -> bool:
- """
- Check for a collision between two sprites.
-
- :param sprite1: First sprite
- :param sprite2: Second sprite
-
- :Returns: True or False depending if the sprites intersect.
- """
- if not isinstance(sprite1, Sprite):
- raise TypeError("Parameter 1 is not an instance of the Sprite class.")
- if isinstance(sprite2, SpriteList):
- raise TypeError("Parameter 2 is a instance of the SpriteList instead of a required Sprite. See if you meant to "
- "call check_for_collision_with_list instead of check_for_collision.")
- elif not isinstance(sprite2, Sprite):
- raise TypeError("Parameter 2 is not an instance of the Sprite class.")
-
- return _check_for_collision(sprite1, sprite2)
-
-
-def _check_for_collision(sprite1: Sprite, sprite2: Sprite) -> bool:
- """
- Check for collision between two sprites.
-
- :param Sprite sprite1: Sprite 1
- :param Sprite sprite2: Sprite 2
-
- :returns: Boolean
- """
- collision_radius_sum = sprite1.collision_radius + sprite2.collision_radius
-
- diff_x = sprite1.position[0] - sprite2.position[0]
- diff_x2 = diff_x * diff_x
-
- if diff_x2 > collision_radius_sum * collision_radius_sum:
- return False
-
- diff_y = sprite1.position[1] - sprite2.position[1]
- diff_y2 = diff_y * diff_y
- if diff_y2 > collision_radius_sum * collision_radius_sum:
- return False
-
- distance = diff_x2 + diff_y2
- if distance > collision_radius_sum * collision_radius_sum:
- return False
-
- return are_polygons_intersecting(sprite1.points, sprite2.points)
-
-
-def check_for_collision_with_list(sprite: Sprite,
- sprite_list: SpriteList) -> List[Sprite]:
- """
- Check for a collision between a sprite, and a list of sprites.
-
- :param Sprite sprite: Sprite to check
- :param SpriteList sprite_list: SpriteList to check against
-
- :returns: List of sprites colliding, or an empty list.
- """
- if not isinstance(sprite, Sprite):
- raise TypeError("Parameter 1 is not an instance of the Sprite class.")
- if not isinstance(sprite_list, SpriteList):
- raise TypeError(f"Parameter 2 is a {type(sprite_list)} instead of expected SpriteList.")
-
- if sprite_list.use_spatial_hash:
- sprite_list_to_check = sprite_list.spatial_hash.get_objects_for_box(sprite)
- # checks_saved = len(sprite_list) - len(sprite_list_to_check)
- else:
- sprite_list_to_check = sprite_list
-
- collision_list = [sprite2
- for sprite2 in sprite_list_to_check
- if sprite is not sprite2 and _check_for_collision(sprite, sprite2)]
-
- # collision_list = []
- # for sprite2 in sprite_list_to_check:
- # if sprite1 is not sprite2 and sprite2 not in collision_list:
- # if _check_for_collision(sprite1, sprite2):
- # collision_list.append(sprite2)
- return collision_list
-
-
-def is_point_in_polygon(x, y, polygon_point_list):
- """
- Use ray-tracing to see if point is inside a polygon
-
- Args:
- x:
- y:
- polygon_point_list:
-
- Returns: bool
-
- """
-
- n = len(polygon_point_list)
- inside = False
-
- p1x, p1y = polygon_point_list[0]
- for i in range(n+1):
- p2x, p2y = polygon_point_list[i % n]
- if y > min(p1y, p2y):
- if y <= max(p1y, p2y):
- if x <= max(p1x, p2x):
- if p1y != p2y:
- xints = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x
- if p1x == p2x or x <= xints:
- inside = not inside
- p1x, p1y = p2x, p2y
-
- return inside
-
-
-def get_sprites_at_point(point: Point,
- sprite_list: SpriteList) -> List[Sprite]:
- """
- Get a list of sprites at a particular point
-
- :param Point point: Point to check
- :param SpriteList sprite_list: SpriteList to check against
-
- :returns: List of sprites colliding, or an empty list.
- """
- if not isinstance(sprite_list, SpriteList):
- raise TypeError(f"Parameter 2 is a {type(sprite_list)} instead of expected SpriteList.")
-
- if sprite_list.use_spatial_hash:
- sprite_list_to_check = sprite_list.spatial_hash.get_objects_for_point(point)
- # checks_saved = len(sprite_list) - len(sprite_list_to_check)
- else:
- sprite_list_to_check = sprite_list
-
- collision_list = [sprite2
- for sprite2 in sprite_list_to_check
- if is_point_in_polygon(point[0], point[1], sprite2.points)]
-
- return collision_list
diff --git a/arcade/isometric.py b/arcade/isometric.py
deleted file mode 100644
index 5af2464..0000000
--- a/arcade/isometric.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from arcade import ShapeElementList
-from arcade.buffered_draw_commands import create_line
-
-
-def isometric_grid_to_screen(tile_x, tile_y, width, height, tile_width, tile_height):
- screen_x = tile_width * tile_x // 2 + height * tile_width // 2 - tile_y * tile_width // 2
- screen_y = (height - tile_y - 1) * tile_height // 2 + width * tile_height // 2 - tile_x * tile_height // 2
- return screen_x, screen_y
-
-
-def screen_to_isometric_grid(screen_x, screen_y, width, height, tile_width, tile_height):
- x2 = (1 / tile_width * screen_x / 2 - 1 / tile_height * screen_y / 2 + width / 2) * 2 - (width / 2 + 0.5)
- y2 = (height - 1) - ((1 / tile_width * screen_x / 2 + 1 / tile_height * screen_y / 2) * 2 - (width / 2 + 0.5))
- x2 = round(x2)
- y2 = round(y2)
- return x2, y2
-
-
-def create_isometric_grid_lines(width, height, tile_width, tile_height, color, line_width):
-
- # Grid lines 1
- shape_list = ShapeElementList()
-
- for tile_row in range(-1, height):
- tile_x = 0
- start_x, start_y = isometric_grid_to_screen(tile_x, tile_row, width, height, tile_width, tile_height)
- tile_x = width - 1
- end_x, end_y = isometric_grid_to_screen(tile_x, tile_row, width, height, tile_width, tile_height)
-
- start_x -= tile_width // 2
- end_y -= tile_height // 2
-
- line = create_line(start_x, start_y, end_x, end_y, color, line_width=line_width)
- shape_list.append(line)
-
- # Grid lines 2
- for tile_column in range(-1, width):
- tile_y = 0
- start_x, start_y = isometric_grid_to_screen(tile_column, tile_y, width, height, tile_width, tile_height)
- tile_y = height - 1
- end_x, end_y = isometric_grid_to_screen(tile_column, tile_y, width, height, tile_width, tile_height)
-
- start_x += tile_width // 2
- end_y -= tile_height // 2
-
- line = create_line(start_x, start_y, end_x, end_y, color, line_width=line_width)
- shape_list.append(line)
-
- return shape_list
diff --git a/arcade/joysticks.py b/arcade/joysticks.py
deleted file mode 100644
index 0ea3d15..0000000
--- a/arcade/joysticks.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import pyglet.input
-
-
-def get_joysticks():
- """
- Get a list of all the game controllers
-
- This is an alias of ``get_game_controllers``, which is better worded.
-
- :return: List of game controllers
- """
- return pyglet.input.get_joysticks()
-
-
-def get_game_controllers():
- """
- Get a list of all the game controllers
-
- :return: List of game controllers
- """
- return get_joysticks()
diff --git a/arcade/key/__init__.py b/arcade/key/__init__.py
deleted file mode 100644
index d572bb6..0000000
--- a/arcade/key/__init__.py
+++ /dev/null
@@ -1,211 +0,0 @@
-"""
-Constants used to signify what keys on the keyboard were pressed.
-"""
-
-# Key modifiers
-# Done in powers of two, so you can do a bit-wise 'and' to detect
-# multiple modifiers.
-MOD_SHIFT = 1
-MOD_CTRL = 2
-MOD_ALT = 4
-MOD_CAPSLOCK = 8
-MOD_NUMLOCK = 16
-MOD_WINDOWS = 32
-MOD_COMMAND = 64
-MOD_OPTION = 128
-MOD_SCROLLLOCK = 256
-MOD_ACCEL = 2
-
-# Keys
-BACKSPACE = 65288
-TAB = 65289
-LINEFEED = 65290
-CLEAR = 65291
-RETURN = 65293
-ENTER = 65293
-PAUSE = 65299
-SCROLLLOCK = 65300
-SYSREQ = 65301
-ESCAPE = 65307
-HOME = 65360
-LEFT = 65361
-UP = 65362
-RIGHT = 65363
-DOWN = 65364
-PAGEUP = 65365
-PAGEDOWN = 65366
-END = 65367
-BEGIN = 65368
-DELETE = 65535
-SELECT = 65376
-PRINT = 65377
-EXECUTE = 65378
-INSERT = 65379
-UNDO = 65381
-REDO = 65382
-MENU = 65383
-FIND = 65384
-CANCEL = 65385
-HELP = 65386
-BREAK = 65387
-MODESWITCH = 65406
-SCRIPTSWITCH = 65406
-MOTION_UP = 65362
-MOTION_RIGHT = 65363
-MOTION_DOWN = 65364
-MOTION_LEFT = 65361
-MOTION_NEXT_WORD = 1
-MOTION_PREVIOUS_WORD = 2
-MOTION_BEGINNING_OF_LINE = 3
-MOTION_END_OF_LINE = 4
-MOTION_NEXT_PAGE = 65366
-MOTION_PREVIOUS_PAGE = 65365
-MOTION_BEGINNING_OF_FILE = 5
-MOTION_END_OF_FILE = 6
-MOTION_BACKSPACE = 65288
-MOTION_DELETE = 65535
-NUMLOCK = 65407
-NUM_SPACE = 65408
-NUM_TAB = 65417
-NUM_ENTER = 65421
-NUM_F1 = 65425
-NUM_F2 = 65426
-NUM_F3 = 65427
-NUM_F4 = 65428
-NUM_HOME = 65429
-NUM_LEFT = 65430
-NUM_UP = 65431
-NUM_RIGHT = 65432
-NUM_DOWN = 65433
-NUM_PRIOR = 65434
-NUM_PAGE_UP = 65434
-NUM_NEXT = 65435
-NUM_PAGE_DOWN = 65435
-NUM_END = 65436
-NUM_BEGIN = 65437
-NUM_INSERT = 65438
-NUM_DELETE = 65439
-NUM_EQUAL = 65469
-NUM_MULTIPLY = 65450
-NUM_ADD = 65451
-NUM_SEPARATOR = 65452
-NUM_SUBTRACT = 65453
-NUM_DECIMAL = 65454
-NUM_DIVIDE = 65455
-
-# Numbers on the numberpad
-NUM_0 = 65456
-NUM_1 = 65457
-NUM_2 = 65458
-NUM_3 = 65459
-NUM_4 = 65460
-NUM_5 = 65461
-NUM_6 = 65462
-NUM_7 = 65463
-NUM_8 = 65464
-NUM_9 = 65465
-
-F1 = 65470
-F2 = 65471
-F3 = 65472
-F4 = 65473
-F5 = 65474
-F6 = 65475
-F7 = 65476
-F8 = 65477
-F9 = 65478
-F10 = 65479
-F11 = 65480
-F12 = 65481
-F13 = 65482
-F14 = 65483
-F15 = 65484
-F16 = 65485
-LSHIFT = 65505
-RSHIFT = 65506
-LCTRL = 65507
-RCTRL = 65508
-CAPSLOCK = 65509
-LMETA = 65511
-RMETA = 65512
-LALT = 65513
-RALT = 65514
-LWINDOWS = 65515
-RWINDOWS = 65516
-LCOMMAND = 65517
-RCOMMAND = 65518
-LOPTION = 65488
-ROPTION = 65489
-SPACE = 32
-EXCLAMATION = 33
-DOUBLEQUOTE = 34
-HASH = 35
-POUND = 35
-DOLLAR = 36
-PERCENT = 37
-AMPERSAND = 38
-APOSTROPHE = 39
-PARENLEFT = 40
-PARENRIGHT = 41
-ASTERISK = 42
-PLUS = 43
-COMMA = 44
-MINUS = 45
-PERIOD = 46
-SLASH = 47
-
-# Numbers on the main keyboard
-KEY_0 = 48
-KEY_1 = 49
-KEY_2 = 50
-KEY_3 = 51
-KEY_4 = 52
-KEY_5 = 53
-KEY_6 = 54
-KEY_7 = 55
-KEY_8 = 56
-KEY_9 = 57
-COLON = 58
-SEMICOLON = 59
-LESS = 60
-EQUAL = 61
-GREATER = 62
-QUESTION = 63
-AT = 64
-BRACKETLEFT = 91
-BACKSLASH = 92
-BRACKETRIGHT = 93
-ASCIICIRCUM = 94
-UNDERSCORE = 95
-GRAVE = 96
-QUOTELEFT = 96
-A = 97
-B = 98
-C = 99
-D = 100
-E = 101
-F = 102
-G = 103
-H = 104
-I = 105
-J = 106
-K = 107
-L = 108
-M = 109
-N = 110
-O = 111
-P = 112
-Q = 113
-R = 114
-S = 115
-T = 116
-U = 117
-V = 118
-W = 119
-X = 120
-Y = 121
-Z = 122
-BRACELEFT = 123
-BAR = 124
-BRACERIGHT = 125
-ASCIITILDE = 126
diff --git a/arcade/particle.py b/arcade/particle.py
deleted file mode 100644
index 6e0656d..0000000
--- a/arcade/particle.py
+++ /dev/null
@@ -1,134 +0,0 @@
-"""
-Particle - Object produced by an Emitter. Often used in large quantity to produce visual effects effects
-"""
-
-from arcade.sprite import Sprite
-from arcade.draw_commands import Texture
-import arcade.utils
-from arcade.arcade_types import Point, Vector
-from typing import Union
-
-FilenameOrTexture = Union[str, Texture]
-
-
-class Particle(Sprite):
- """Sprite that is emitted from an Emitter"""
-
- def __init__(
- self,
- filename_or_texture: FilenameOrTexture,
- change_xy: Vector,
- center_xy: Point = (0.0, 0.0),
- angle: float = 0,
- change_angle: float = 0,
- scale: float = 1.0,
- alpha: int = 255,
- mutation_callback=None
- ):
- if isinstance(filename_or_texture, Texture):
- super().__init__(None, scale=scale)
- self.append_texture(filename_or_texture)
- self.set_texture(0)
- else:
- super().__init__(filename_or_texture, scale=scale)
-
- self.center_x = center_xy[0]
- self.center_y = center_xy[1]
- self.change_x = change_xy[0]
- self.change_y = change_xy[1]
- self.angle = angle
- self.change_angle = change_angle
- self.alpha = alpha
- self.mutation_callback = mutation_callback
-
- def update(self):
- """Advance the Particle's simulation"""
- super().update()
- if self.mutation_callback:
- self.mutation_callback(self)
-
- # def draw(self):
- # raise NotImplementedError("Particle.draw needs to be implemented")
-
- def can_reap(self):
- """Determine if Particle can be deleted"""
- raise NotImplementedError("Particle.can_reap needs to be implemented")
-
-
-class EternalParticle(Particle):
- """Particle that has no end to its life"""
-
- def __init__(
- self,
- filename_or_texture: FilenameOrTexture,
- change_xy: Vector,
- center_xy: Point = (0.0, 0.0),
- angle: float = 0,
- change_angle: float = 0,
- scale: float = 1.0,
- alpha: int = 255,
- mutation_callback=None
- ):
- super().__init__(filename_or_texture, change_xy, center_xy, angle, change_angle, scale, alpha,
- mutation_callback)
-
- def can_reap(self):
- """Determine if Particle can be deleted"""
- return False
-
-
-class LifetimeParticle(Particle):
- """Particle that lives for a given amount of time and is then deleted"""
-
- def __init__(
- self,
- filename_or_texture: FilenameOrTexture,
- change_xy: Vector,
- lifetime: float,
- center_xy: Point = (0.0, 0.0),
- angle: float = 0,
- change_angle: float = 0,
- scale: float = 1.0,
- alpha: int = 255,
- mutation_callback=None
- ):
- super().__init__(filename_or_texture, change_xy, center_xy, angle, change_angle, scale, alpha,
- mutation_callback)
- self.lifetime_original = lifetime
- self.lifetime_elapsed = 0.0
-
- def update(self):
- """Advance the Particle's simulation"""
- super().update()
- self.lifetime_elapsed += 1 / 60
-
- def can_reap(self):
- """Determine if Particle can be deleted"""
- return self.lifetime_elapsed >= self.lifetime_original
-
-
-class FadeParticle(LifetimeParticle):
- """Particle that animates its alpha between two values during its lifetime"""
-
- def __init__(
- self,
- filename_or_texture: FilenameOrTexture,
- change_xy: Vector,
- lifetime: float,
- center_xy: Point = (0.0, 0.0),
- angle: float = 0,
- change_angle: float = 0,
- scale: float = 1.0,
- start_alpha: int = 255,
- end_alpha: int = 0,
- mutation_callback=None
- ):
- super().__init__(filename_or_texture, change_xy, lifetime, center_xy, angle, change_angle, scale, start_alpha,
- mutation_callback)
- self.start_alpha = start_alpha
- self.end_alpha = end_alpha
-
- def update(self):
- """Advance the Particle's simulation"""
- super().update()
- self.alpha = arcade.utils.lerp(self.start_alpha, self.end_alpha, self.lifetime_elapsed / self.lifetime_original)
diff --git a/arcade/physics_engines.py b/arcade/physics_engines.py
deleted file mode 100644
index 6241036..0000000
--- a/arcade/physics_engines.py
+++ /dev/null
@@ -1,307 +0,0 @@
-"""
-Physics engines for top-down or platformers.
-"""
-# pylint: disable=too-many-arguments, too-many-locals, too-few-public-methods
-
-from arcade.geometry import check_for_collision_with_list
-from arcade.geometry import check_for_collision
-from arcade.sprite import Sprite
-from arcade.sprite_list import SpriteList
-
-
-class PhysicsEngineSimple:
- """
- This class will move everything, and take care of collisions.
- """
-
- def __init__(self, player_sprite: Sprite, walls: SpriteList):
- """
- Constructor.
- """
- assert(isinstance(player_sprite, Sprite))
- assert(isinstance(walls, SpriteList))
- self.player_sprite = player_sprite
- self.walls = walls
-
- def update(self):
- """
- Move everything and resolve collisions.
- """
- # --- Move in the x direction
- self.player_sprite.center_x += self.player_sprite.change_x
-
- # Check for wall hit
- hit_list = \
- check_for_collision_with_list(self.player_sprite,
- self.walls)
-
- # If we hit a wall, move so the edges are at the same point
- if len(hit_list) > 0:
- if self.player_sprite.change_x > 0:
- for item in hit_list:
- self.player_sprite.right = min(item.left,
- self.player_sprite.right)
- elif self.player_sprite.change_x < 0:
- for item in hit_list:
- self.player_sprite.left = max(item.right,
- self.player_sprite.left)
- else:
- print("Error, collision while player wasn't moving.")
-
- # --- Move in the y direction
- self.player_sprite.center_y += self.player_sprite.change_y
-
- # Check for wall hit
- hit_list = \
- check_for_collision_with_list(self.player_sprite,
- self.walls)
-
- # If we hit a wall, move so the edges are at the same point
- if len(hit_list) > 0:
- if self.player_sprite.change_y > 0:
- for item in hit_list:
- self.player_sprite.top = min(item.bottom,
- self.player_sprite.top)
- elif self.player_sprite.change_y < 0:
- for item in hit_list:
- self.player_sprite.bottom = max(item.top,
- self.player_sprite.bottom)
- else:
- print("Error, collision while player wasn't moving.")
-
-
-class PhysicsEnginePlatformer:
- """
- This class will move everything, and take care of collisions.
- """
-
- def __init__(self,
- player_sprite: Sprite,
- platforms: SpriteList,
- gravity_constant: float = 0.5,
- ladders: SpriteList = None,
- ):
- """
- Constructor.
- """
- if ladders is not None and not isinstance(ladders, SpriteList):
- raise TypeError("Fourth parameter should be a SpriteList of ladders")
-
- self.player_sprite = player_sprite
- self.platforms = platforms
- self.gravity_constant = gravity_constant
- self.jumps_since_ground = 0
- self.allowed_jumps = 1
- self.allow_multi_jump = False
- self.ladders = ladders
-
- def is_on_ladder(self):
- # Check for touching a ladder
- if self.ladders:
- hit_list = check_for_collision_with_list(self.player_sprite, self.ladders)
- if len(hit_list) > 0:
- return True
- return False
-
- def can_jump(self, y_distance=5) -> bool:
- """
- Method that looks to see if there is a floor under
- the player_sprite. If there is a floor, the player can jump
- and we return a True.
-
- :returns: True if there is a platform below us
- :rtype: bool
- """
-
- # Check for touching a ladder
- if self.is_on_ladder():
- return False
-
- # Move down to see if we are on a platform
- self.player_sprite.center_y -= y_distance
-
- # Check for wall hit
- hit_list = check_for_collision_with_list(self.player_sprite, self.platforms)
-
- self.player_sprite.center_y += y_distance
-
- if len(hit_list) > 0:
- self.jumps_since_ground = 0
-
- if len(hit_list) > 0 or self.allow_multi_jump and self.jumps_since_ground < self.allowed_jumps:
- return True
- else:
- return False
-
- def enable_multi_jump(self, allowed_jumps: int):
- """
- Enables multi-jump.
- allowed_jumps should include the initial jump.
- (1 allows only a single jump, 2 enables double-jump, etc)
-
- If you enable multi-jump, you MUST call increment_jump_counter()
- every time the player jumps. Otherwise they can jump infinitely.
-
- :param int allowed_jumps:
- """
- self.allowed_jumps = allowed_jumps
- self.allow_multi_jump = True
-
- def disable_multi_jump(self):
- """
- Disables multi-jump.
-
- Calling this function also removes the requirement to
- call increment_jump_counter() every time the player jumps.
- """
- self.allow_multi_jump = False
- self.allowed_jumps = 1
- self.jumps_since_ground = 0
-
- def jump(self, velocity: int):
- self.player_sprite.change_y = velocity
- self.increment_jump_counter()
-
- def increment_jump_counter(self):
- """
- Updates the jump counter for multi-jump tracking
- """
- if self.allow_multi_jump:
- self.jumps_since_ground += 1
-
- def update(self):
- """
- Move everything and resolve collisions.
- """
- # print(f"Spot A ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
-
- # --- Add gravity if we aren't on a ladder
- if not self.is_on_ladder():
- self.player_sprite.change_y -= self.gravity_constant
-
- # --- Move in the y direction
- self.player_sprite.center_y += self.player_sprite.change_y
-
- # Check for wall hit
- hit_list = check_for_collision_with_list(self.player_sprite, self.platforms)
-
- # If we hit a wall, move so the edges are at the same point
- if len(hit_list) > 0:
- if self.player_sprite.change_y > 0:
- for item in hit_list:
- self.player_sprite.top = min(item.bottom,
- self.player_sprite.top)
- # print(f"Spot X ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
- elif self.player_sprite.change_y < 0:
- # Reset number of jumps
- for item in hit_list:
- while check_for_collision(self.player_sprite, item):
- # self.player_sprite.bottom = item.top <- Doesn't work for ramps
- self.player_sprite.bottom += 0.25
-
- if item.change_x != 0:
- self.player_sprite.center_x += item.change_x
- # print(f"Spot Y ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
- else:
- pass
- # TODO: The code below can't execute, as "item" doesn't
- # exist. In theory, this condition should never be arrived at.
- # Collision while player wasn't moving, most likely
- # moving platform.
- # if self.player_sprite.center_y >= item.center_y:
- # self.player_sprite.bottom = item.top
- # else:
- # self.player_sprite.top = item.bottom
- self.player_sprite.change_y = min(0.0, hit_list[0].change_y)
-
- # print(f"Spot B ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
- self.player_sprite.center_y = round(self.player_sprite.center_y, 2)
- # print(f"Spot Q ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
-
- # --- Move in the x direction
- self.player_sprite.center_x += self.player_sprite.change_x
-
- check_again = True
- while check_again:
- check_again = False
- # Check for wall hit
- hit_list = check_for_collision_with_list(self.player_sprite, self.platforms)
-
- # If we hit a wall, move so the edges are at the same point
- if len(hit_list) > 0:
- change_x = self.player_sprite.change_x
- if change_x > 0:
- for item in hit_list:
- # print(f"Spot 1 ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
- # See if we can "run up" a ramp
- self.player_sprite.center_y += change_x
- if len(check_for_collision_with_list(self.player_sprite, self.platforms)) > 0:
- self.player_sprite.center_y -= change_x
- self.player_sprite.right = min(item.left, self.player_sprite.right)
- # print(f"Spot R ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
- check_again = True
- break
- # else:
- # print("Run up ok 1")
- # print(f"Spot 2 ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
-
- elif change_x < 0:
- for item in hit_list:
- # See if we can "run up" a ramp
- self.player_sprite.center_y -= change_x
- if len(check_for_collision_with_list(self.player_sprite, self.platforms)) > 0:
- # Can't run up the ramp, reverse
- self.player_sprite.center_y += change_x
- self.player_sprite.left = max(item.right, self.player_sprite.left)
- # print(f"Reverse 1 {item.right}, {self.player_sprite.left}")
- # Ok, if we were shoved back to the right, we need to check this whole thing again.
- check_again = True
- break
- # print(f"Spot 4 ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
-
- else:
- print("Error, collision while player wasn't moving.\n"
- "Make sure you aren't calling multiple updates, like "
- "a physics engine update and an all sprites list update.")
-
- # print(f"Spot E ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
-
- for platform in self.platforms:
- if platform.change_x != 0 or platform.change_y != 0:
- platform.center_x += platform.change_x
-
- if platform.boundary_left is not None \
- and platform.left <= platform.boundary_left:
- platform.left = platform.boundary_left
- if platform.change_x < 0:
- platform.change_x *= -1
-
- if platform.boundary_right is not None \
- and platform.right >= platform.boundary_right:
- platform.right = platform.boundary_right
- if platform.change_x > 0:
- platform.change_x *= -1
-
- if check_for_collision(self.player_sprite, platform):
- if platform.change_x < 0:
- self.player_sprite.right = platform.left
- if platform.change_x > 0:
- self.player_sprite.left = platform.right
-
- platform.center_y += platform.change_y
-
- if platform.boundary_top is not None \
- and platform.top >= platform.boundary_top:
- platform.top = platform.boundary_top
- if platform.change_y > 0:
- platform.change_y *= -1
-
- if platform.boundary_bottom is not None \
- and platform.bottom <= platform.boundary_bottom:
- platform.bottom = platform.boundary_bottom
- if platform.change_y < 0:
- platform.change_y *= -1
-
- # self.player_sprite.center_x = round(self.player_sprite.center_x, 2)
- # print(f"Spot C ({self.player_sprite.center_x}, {self.player_sprite.center_y})")
- # print()
diff --git a/arcade/read_tiled_map.py b/arcade/read_tiled_map.py
deleted file mode 100644
index b16a688..0000000
--- a/arcade/read_tiled_map.py
+++ /dev/null
@@ -1,351 +0,0 @@
-"""
-Functions and classes for managing a map created in the "Tiled Map Editor"
-"""
-
-import xml.etree.ElementTree as ElementTree
-import base64
-import zlib
-import gzip
-
-from pathlib import Path
-
-from arcade.isometric import isometric_grid_to_screen
-from arcade import Sprite
-from arcade import SpriteList
-
-
-class TiledMap:
- """ This class holds a tiled map, and tile set from the map. """
- def __init__(self):
- self.global_tile_set = {}
- self.layers_int_data = {}
- self.layers = {}
- self.version = None
- self.orientation = None
- self.renderorder = None
- self.width = None
- self.height = None
- self.tilewidth = None
- self.tileheight = None
- self.backgroundcolor = None
- self.nextobjectid = None
-
-
-class Tile:
- """ This class represents an individual tile from a tileset. """
- def __init__(self):
- self.local_id = 0
- self.width = 0
- self.height = 0
- self.source = None
- self.points = None
-
-
-class GridLocation:
- """ This represents a location on the grid. Contains the x/y of the
- grid location, and the tile that is on it. """
- def __init__(self):
- self.tile = None
- self.center_x = 0
- self.center_y = 0
-
-
-def _process_csv_encoding(data_text):
- layer_grid_ints = []
- lines = data_text.split("\n")
- for line in lines:
- line_list = line.split(",")
- while '' in line_list:
- line_list.remove('')
- line_list_int = [int(item) for item in line_list]
- layer_grid_ints.append(line_list_int)
-
- return layer_grid_ints
-
-
-def _process_base64_encoding(data_text, compression, layer_width):
- layer_grid_ints = [[]]
-
- unencoded_data = base64.b64decode(data_text)
- if compression == "zlib":
- unzipped_data = zlib.decompress(unencoded_data)
- elif compression == "gzip":
- unzipped_data = gzip.decompress(unencoded_data)
- elif compression is None:
- unzipped_data = unencoded_data
- else:
- raise ValueError(f"Unsupported compression type '{compression}'.")
-
- # Turn bytes into 4-byte integers
- byte_count = 0
- int_count = 0
- int_value = 0
- row_count = 0
- for byte in unzipped_data:
- int_value += byte << (byte_count * 8)
- byte_count += 1
- if byte_count % 4 == 0:
- byte_count = 0
- int_count += 1
- layer_grid_ints[row_count].append(int_value)
- int_value = 0
- if int_count % layer_width == 0:
- row_count += 1
- layer_grid_ints.append([])
-
- layer_grid_ints.pop()
- return layer_grid_ints
-
-
-def _parse_points(point_text: str):
- result = []
- point_list = point_text.split(" ")
- for point in point_list:
- z = point.split(",")
- result.append([round(float(z[0])), round(float(z[1]))])
-
- return result
-
-
-def read_tiled_map(tmx_file: str, scaling: float = 1, tsx_file: str = None) -> TiledMap:
- """
- read_tiled_map has been deprecated. Use arcade.tilemap.read_tmx instead.
-
- Given a tmx_file, this will read in a tiled map, and return
- a TiledMap object.
-
- Given a tsx_file, the map will use it as the tileset.
- If tsx_file is not specified, it will use the tileset specified
- within the tmx_file.
-
- Important: Tiles must be a "collection" of images.
-
- Hitboxes can be drawn around tiles in the tileset editor,
- but only polygons are supported.
- (This is a great area for PR's to improve things.)
-
- :param str tmx_file: String with name of our TMX file
- :param float scaling: Scaling factor. 0.5 will half all widths and heights
- :param str tsx_file: Tileset to use (can be specified in TMX file)
-
- :returns: Map
- :rtype: TiledMap
- """
- from warnings import warn
- warn('read_tiled_map has been deprecated. Use arcade.tilemap.read_tmx instead.', DeprecationWarning)
-
- # Create a map object to store this stuff in
- my_map = TiledMap()
-
- # Read in and parse the file
- tree = ElementTree.parse(tmx_file)
-
- # Root node should be 'map'
- map_tag = tree.getroot()
-
- # Pull attributes that should be in the file for the map
- my_map.version = map_tag.attrib["version"]
- my_map.orientation = map_tag.attrib["orientation"]
- my_map.renderorder = map_tag.attrib["renderorder"]
- my_map.width = int(map_tag.attrib["width"])
- my_map.height = int(map_tag.attrib["height"])
- my_map.tilewidth = int(map_tag.attrib["tilewidth"])
- my_map.tileheight = int(map_tag.attrib["tileheight"])
-
- # Background color is optional, and may or may not be in there
- if "backgroundcolor" in map_tag.attrib:
- # Decode the background color string
- background_color_string = map_tag.attrib["backgroundcolor"]
- red_hex = "0x" + background_color_string[1:3]
- green_hex = "0x" + background_color_string[3:5]
- blue_hex = "0x" + background_color_string[5:7]
- red = int(red_hex, 16)
- green = int(green_hex, 16)
- blue = int(blue_hex, 16)
- my_map.backgroundcolor = (red, green, blue)
-
- my_map.nextobjectid = map_tag.attrib["nextobjectid"]
-
- # Grab all the tilesets
- tileset_tag_list = map_tag.findall('./tileset')
-
- # --- Tileset Data ---
-
- # Loop through each tileset
- for tileset_tag in tileset_tag_list:
- firstgid = int(tileset_tag.attrib["firstgid"])
- if tsx_file is not None or "source" in tileset_tag.attrib:
- if tsx_file is not None:
- tileset_tree = ElementTree.parse(tsx_file)
- else:
- source = tileset_tag.attrib["source"]
- try:
- tileset_tree = ElementTree.parse(source)
- except FileNotFoundError:
- source = Path(tmx_file).parent / Path(source)
- tileset_tree = ElementTree.parse(source)
- # Root node should be 'map'
- tileset_root = tileset_tree.getroot()
- tile_tag_list = tileset_root.findall("tile")
- else:
- # Grab each tile
- tile_tag_list = tileset_tag.findall("tile")
-
- # Loop through each tile
- for tile_tag in tile_tag_list:
- # Make a tile object
- my_tile = Tile()
- image = tile_tag.find("image")
- my_tile.local_id = tile_tag.attrib["id"]
- my_tile.width = int(image.attrib["width"])
- my_tile.height = int(image.attrib["height"])
- my_tile.source = image.attrib["source"]
- key = str(int(my_tile.local_id) + 1)
- my_map.global_tile_set[key] = my_tile
- firstgid += 1
-
- objectgroup = tile_tag.find("objectgroup")
- if objectgroup:
- my_object = objectgroup.find("object")
- if my_object:
- offset_x = round(float(my_object.attrib['x']))
- offset_y = round(float(my_object.attrib['y']))
-
- polygon = my_object.find("polygon")
- if polygon is not None:
- point_list = _parse_points(polygon.attrib['points'])
- for point in point_list:
- point[0] += offset_x
- point[1] += offset_y
- point[1] = my_tile.height - point[1]
- point[0] -= my_tile.width // 2
- point[1] -= my_tile.height // 2
- point[0] *= scaling
- point[1] *= scaling
- point[0] = int(point[0])
- point[1] = int(point[1])
-
- my_tile.points = point_list
-
- polygon = my_object.find("polyline")
- if polygon is not None:
- point_list = _parse_points(polygon.attrib['points'])
- for point in point_list:
- point[0] += offset_x
- point[1] += offset_y
- point[1] = my_tile.height - point[1]
- point[0] -= my_tile.width // 2
- point[1] -= my_tile.height // 2
- point[0] *= scaling
- point[1] *= scaling
- point[0] = int(point[0])
- point[1] = int(point[1])
-
- if point_list[0][0] != point_list[-1][0] or point_list[0][1] != point_list[-1][1]:
- point_list.append([point_list[0][0], point_list[0][1]])
-
- my_tile.points = point_list
-
- # --- Map Data ---
-
- # Grab each layer
- layer_tag_list = map_tag.findall('./layer')
- for layer_tag in layer_tag_list:
- layer_width = int(layer_tag.attrib['width'])
-
- # Unzip and unencode each layer
- data = layer_tag.find("data")
- data_text = data.text.strip()
- encoding = data.attrib['encoding']
- if 'compression' in data.attrib:
- compression = data.attrib['compression']
- else:
- compression = None
-
- if encoding == "csv":
- layer_grid_ints = _process_csv_encoding(data_text)
- elif encoding == "base64":
- layer_grid_ints = _process_base64_encoding(data_text, compression, layer_width)
- else:
- print(f"Error, unexpected encoding: {encoding}.")
- break
-
- # Great, we have a grid of ints. Save that according to the layer name
- my_map.layers_int_data[layer_tag.attrib["name"]] = layer_grid_ints
-
- # Now create grid objects for each tile
- layer_grid_objs = []
- for row_index, row in enumerate(layer_grid_ints):
- layer_grid_objs.append([])
- for column_index, column in enumerate(row):
- grid_loc = GridLocation()
- if layer_grid_ints[row_index][column_index] != 0:
- key = str(layer_grid_ints[row_index][column_index])
-
- if key not in my_map.global_tile_set:
- print(f"Warning, tried to load '{key}' and it is not in the tileset.")
- else:
- grid_loc.tile = my_map.global_tile_set[key]
-
- if my_map.renderorder == "right-down":
- adjusted_row_index = my_map.height - row_index - 1
- else:
- adjusted_row_index = row_index
-
- if my_map.orientation == "orthogonal":
- grid_loc.center_x = column_index * my_map.tilewidth + my_map.tilewidth // 2
- grid_loc.center_y = adjusted_row_index * my_map.tileheight + my_map.tilewidth // 2
- else:
- grid_loc.center_x, grid_loc.center_y = isometric_grid_to_screen(column_index,
- row_index,
- my_map.width,
- my_map.height,
- my_map.tilewidth,
- my_map.tileheight)
-
- layer_grid_objs[row_index].append(grid_loc)
-
- my_map.layers[layer_tag.attrib["name"]] = layer_grid_objs
-
- return my_map
-
-
-def generate_sprites(map_object: TiledMap, layer_name: str, scaling: float, base_directory="") -> SpriteList:
- """
- generate_sprites has been deprecated. Use arcade.tilemap.process_layer instead.
- Generate the sprites for a layer in a map.
-
- :param TiledMap map_object: Map previously read in from read_tiled_map function
- :param layer_name: Name of the layer we want to generate sprites from. Case sensitive.
- :param scaling: Scaling factor.
- :param base_directory: Directory to read images from. Defaults to current directory.
- :return: List of sprites
- :rtype: SpriteList
- """
- from warnings import warn
- sprite_list = SpriteList()
-
- if layer_name not in map_object.layers_int_data:
- print(f"Warning, no layer named '{layer_name}'.")
- return sprite_list
-
- map_array = map_object.layers_int_data[layer_name]
-
- # Loop through the layer and add in the wall list
- for row_index, row in enumerate(map_array):
- for column_index, item in enumerate(row):
- if str(item) in map_object.global_tile_set:
- tile_info = map_object.global_tile_set[str(item)]
- tmx_file = base_directory + tile_info.source
-
- my_sprite = Sprite(tmx_file, scaling)
- my_sprite.right = column_index * (map_object.tilewidth * scaling)
- my_sprite.top = (map_object.height - row_index) * (map_object.tileheight * scaling)
-
- if tile_info.points is not None:
- my_sprite.set_points(tile_info.points)
- sprite_list.append(my_sprite)
- elif item != 0:
- print(f"Warning, could not find {item} image to load.")
-
- return sprite_list
diff --git a/arcade/shader.py b/arcade/shader.py
deleted file mode 100644
index e9f9b55..0000000
--- a/arcade/shader.py
+++ /dev/null
@@ -1,549 +0,0 @@
-"""Utilities for dealing with Shaders in OpenGL 3.3+.
-"""
-
-from ctypes import *
-from collections import namedtuple
-import weakref
-from typing import Tuple, Iterable
-
-from pyglet.gl import *
-from pyglet import gl
-
-import numpy as np
-
-
-class ShaderException(Exception):
- pass
-
-
-# Thank you Benjamin Moran for writing part of this code!
-# https://bitbucket.org/HigashiNoKaze/pyglet/src/shaders/pyglet/graphics/shader.py
-
-_uniform_getters = {
- GLint: glGetUniformiv,
- GLfloat: glGetUniformfv,
-}
-
-_uniform_setters = {
- # uniform type: (gl_type, setter, length, count)
- GL_INT: (GLint, glUniform1iv, 1, 1),
- GL_INT_VEC2: (GLint, glUniform2iv, 2, 1),
- GL_INT_VEC3: (GLint, glUniform3iv, 3, 1),
- GL_INT_VEC4: (GLint, glUniform4iv, 4, 1),
-
- GL_FLOAT: (GLfloat, glUniform1fv, 1, 1),
- GL_FLOAT_VEC2: (GLfloat, glUniform2fv, 2, 1),
- GL_FLOAT_VEC3: (GLfloat, glUniform3fv, 3, 1),
- GL_FLOAT_VEC4: (GLfloat, glUniform4fv, 4, 1),
-
- GL_SAMPLER_2D: (GLint, glUniform1iv, 1, 1),
-
- GL_FLOAT_MAT2: (GLfloat, glUniformMatrix2fv, 4, 1),
- GL_FLOAT_MAT3: (GLfloat, glUniformMatrix3fv, 6, 1),
- GL_FLOAT_MAT4: (GLfloat, glUniformMatrix4fv, 16, 1),
-
- # TODO: test/implement these:
- # GL_FLOAT_MAT2x3: glUniformMatrix2x3fv,
- # GL_FLOAT_MAT2x4: glUniformMatrix2x4fv,
- #
- # GL_FLOAT_MAT3x2: glUniformMatrix3x2fv,
- # GL_FLOAT_MAT3x4: glUniformMatrix3x4fv,
- #
- # GL_FLOAT_MAT4x2: glUniformMatrix4x2fv,
- # GL_FLOAT_MAT4x3: glUniformMatrix4x3fv,
-}
-
-
-def _create_getter_func(program_id, location, gl_getter, c_array, length):
-
- if length == 1:
- def getter_func():
- gl_getter(program_id, location, c_array)
- return c_array[0]
- else:
- def getter_func():
- gl_getter(program_id, location, c_array)
- return c_array[:]
-
- return getter_func
-
-
-def _create_setter_func(location, gl_setter, c_array, length, count, ptr, is_matrix):
-
- if is_matrix:
- def setter_func(value):
- c_array[:] = value
- gl_setter(location, count, GL_FALSE, ptr)
-
- elif length == 1 and count == 1:
- def setter_func(value):
- c_array[0] = value
- gl_setter(location, count, ptr)
- elif length > 1 and count == 1:
- def setter_func(values):
- c_array[:] = values
- gl_setter(location, count, ptr)
-
- else:
- raise NotImplementedError("Uniform type not yet supported.")
-
- return setter_func
-
-
-Uniform = namedtuple('Uniform', 'getter, setter')
-ShaderCode = str
-ShaderType = GLuint
-Shader = type(Tuple[ShaderCode, ShaderType])
-
-
-class Program:
- """Compiled and linked shader program.
-
- Access Uniforms via the [] operator.
- Example:
- program['MyUniform'] = value
- For Matrices, pass the flatten array.
- Example:
- matrix = np.array([[...]])
- program['MyMatrix'] = matrix.flatten()
- """
- def __init__(self, *shaders: Shader):
- self.prog_id = prog_id = glCreateProgram()
- shaders_id = []
- for shader_code, shader_type in shaders:
- shader = compile_shader(shader_code, shader_type)
- glAttachShader(self.prog_id, shader)
- shaders_id.append(shader)
-
- glLinkProgram(self.prog_id)
-
- for shader in shaders_id:
- # Flag shaders for deletion. Will only be deleted once detached from program.
- glDeleteShader(shader)
-
- self._uniforms = {}
- self._introspect_uniforms()
- weakref.finalize(self, Program._delete, shaders_id, prog_id)
-
- @staticmethod
- def _delete(shaders_id, prog_id):
- # Check to see if the context was already cleaned up from program
- # shut down. If so, we don't need to delete the shaders.
- if gl.current_context is None:
- return
-
- for shader_id in shaders_id:
- glDetachShader(prog_id, shader_id)
-
- glDeleteProgram(prog_id)
-
- def release(self):
- if self.prog_id != 0:
- glDeleteProgram(self.prog_id)
- self.prog_id = 0
-
- def __getitem__(self, item):
- try:
- uniform = self._uniforms[item]
- except KeyError:
- raise ShaderException(f"Uniform with the name `{item}` was not found.")
-
- return uniform.getter()
-
- def __setitem__(self, key, value):
- try:
- uniform = self._uniforms[key]
- except KeyError:
- raise ShaderException(f"Uniform with the name `{key}` was not found.")
-
- uniform.setter(value)
-
- def __enter__(self):
- glUseProgram(self.prog_id)
-
- def __exit__(self, exception_type, exception_value, traceback):
- glUseProgram(0)
-
- def get_num_active(self, variable_type: GLenum) -> int:
- """Get the number of active variables of the passed GL type.
-
- variable_type can be GL_ACTIVE_ATTRIBUTES, GL_ACTIVE_UNIFORMS, etc.
- """
- num_active = GLint(0)
- glGetProgramiv(self.prog_id, variable_type, byref(num_active))
- return num_active.value
-
- def _introspect_uniforms(self):
- for index in range(self.get_num_active(GL_ACTIVE_UNIFORMS)):
- uniform_name, u_type, u_size = self.query_uniform(index)
- loc = glGetUniformLocation(self.prog_id, uniform_name.encode('utf-8'))
-
- if loc == -1: # Skip uniforms that may be in Uniform Blocks
- continue
-
- try:
- gl_type, gl_setter, length, count = _uniform_setters[u_type]
- except KeyError:
- raise ShaderException(f"Unsupported Uniform type {u_type}")
-
- gl_getter = _uniform_getters[gl_type]
-
- is_matrix = u_type in (GL_FLOAT_MAT2, GL_FLOAT_MAT3, GL_FLOAT_MAT4)
-
- # Create persistant mini c_array for getters and setters:
- c_array = (gl_type * length)()
- ptr = cast(c_array, POINTER(gl_type))
-
- # Create custom dedicated getters and setters for each uniform:
- getter = _create_getter_func(self.prog_id, loc, gl_getter, c_array, length)
- setter = _create_setter_func(loc, gl_setter, c_array, length, count, ptr, is_matrix)
-
- # print(f"Found uniform: {uniform_name}, type: {u_type}, size: {u_size}, "
- # f"location: {loc}, length: {length}, count: {count}")
-
- self._uniforms[uniform_name] = Uniform(getter, setter)
-
- def query_uniform(self, index: int) -> Tuple[str, int, int]:
- """Retrieve Uniform information at given location.
-
- Returns the name, the type as a GLenum (GL_FLOAT, ...) and the size. Size is
- greater than 1 only for Uniform arrays, like an array of floats or an array
- of Matrices.
- """
- usize = GLint()
- utype = GLenum()
- buf_size = 192
- uname = create_string_buffer(buf_size)
- glGetActiveUniform(self.prog_id, index, buf_size, None, usize, utype, uname)
- return uname.value.decode(), utype.value, usize.value
-
-
-def program(vertex_shader: str, fragment_shader: str) -> Program:
- """Create a new program given the vertex_shader and fragment shader code.
- """
- return Program(
- (vertex_shader, GL_VERTEX_SHADER),
- (fragment_shader, GL_FRAGMENT_SHADER)
- )
-
-
-def compile_shader(source: str, shader_type: GLenum) -> GLuint:
- """Compile the shader code of the given type.
-
- `shader_type` could be GL_VERTEX_SHADER, GL_FRAGMENT_SHADER, ...
-
- Returns the shader id as a GLuint
- """
- shader = glCreateShader(shader_type)
- source = source.encode('utf-8')
- # Turn the source code string into an array of c_char_p arrays.
- strings = byref(
- cast(
- c_char_p(source),
- POINTER(c_char)
- )
- )
- # Make an array with the strings lengths
- lengths = pointer(c_int(len(source)))
- glShaderSource(shader, 1, strings, lengths)
- glCompileShader(shader)
- result = c_int()
- glGetShaderiv(shader, GL_COMPILE_STATUS, byref(result))
- if result.value == GL_FALSE:
- msg = create_string_buffer(512)
- length = c_int()
- glGetShaderInfoLog(shader, 512, byref(length), msg)
- raise ShaderException(
- f"Shader compile failure ({result.value}): {msg.value.decode('utf-8')}")
- return shader
-
-
-class Buffer:
- """OpenGL Buffer object of type GL_ARRAY_BUFFER.
-
- Apparently it's possible to initialize a GL_ELEMENT_ARRAY_BUFFER with
- GL_ARRAY_BUFFER, provided we later on bind to it with the right type.
-
- The buffer knows its id `buffer_id` and its `size` in bytes.
- """
- usages = {
- 'static': GL_STATIC_DRAW,
- 'dynamic': GL_DYNAMIC_DRAW,
- 'stream': GL_STREAM_DRAW
- }
-
- def __init__(self, data: bytes, usage: str = 'static'):
- self.buffer_id = buffer_id = GLuint()
- self.size = len(data)
-
- glGenBuffers(1, byref(self.buffer_id))
- if self.buffer_id.value == 0:
- raise ShaderException("Cannot create Buffer object.")
-
- glBindBuffer(GL_ARRAY_BUFFER, self.buffer_id)
- self.usage = Buffer.usages[usage]
- glBufferData(GL_ARRAY_BUFFER, self.size, data, self.usage)
- weakref.finalize(self, Buffer.release, buffer_id)
-
- @classmethod
- def create_with_size(cls, size: int, usage: str = 'static'):
- """Create an empty Buffer storage of the given size."""
- buffer = Buffer(b"", usage=usage)
- glBindBuffer(GL_ARRAY_BUFFER, buffer.buffer_id)
- glBufferData(GL_ARRAY_BUFFER, size, None, Buffer.usages[usage])
- buffer.size = size
- return buffer
-
- @staticmethod
- def release(buffer_id):
-
- # If we have no context, then we are shutting down, so skip this
- if gl.current_context is None:
- return
-
- if buffer_id.value != 0:
- glDeleteBuffers(1, byref(buffer_id))
- buffer_id.value = 0
-
- def write(self, data: bytes, offset: int = 0):
- glBindBuffer(GL_ARRAY_BUFFER, self.buffer_id)
- glBufferSubData(GL_ARRAY_BUFFER, GLintptr(offset), len(data), data)
- # print(f"Writing data:\n{data[:60]}")
- # ptr = glMapBufferRange(GL_ARRAY_BUFFER, GLintptr(0), 20, GL_MAP_READ_BIT)
- # print(f"Reading back from buffer:\n{string_at(ptr, size=60)}")
- # glUnmapBuffer(GL_ARRAY_BUFFER)
-
- def orphan(self):
- glBindBuffer(GL_ARRAY_BUFFER, self.buffer_id)
- glBufferData(GL_ARRAY_BUFFER, self.size, None, self.usage)
-
- def _read(self, size):
- """ Debug method to read data from the buffer. """
-
- glBindBuffer(GL_ARRAY_BUFFER, self.buffer_id)
- ptr = glMapBufferRange(GL_ARRAY_BUFFER, GLintptr(0), size, GL_MAP_READ_BIT)
- print(f"Reading back from buffer:\n{string_at(ptr, size=size)}")
- glUnmapBuffer(GL_ARRAY_BUFFER)
-
-
-def buffer(data: bytes, usage: str = 'static') -> Buffer:
- """Create a new OpenGL Buffer object.
- """
- return Buffer(data, usage)
-
-
-class BufferDescription:
- """Vertex Buffer Object description, allowing easy use with VAOs.
-
- This class provides a Buffer object with a description of its content, allowing
- a VertexArray object to correctly enable its shader attributes with the
- vertex Buffer object.
-
- The formats is a string providing the number and type of each attribute. Currently
- we only support f (float), i (integer) and B (unsigned byte).
-
- `normalized` enumerates the attributes which must have their values normalized.
- This is useful for instance for colors attributes given as unsigned byte and
- normalized to floats with values between 0.0 and 1.0.
-
- `instanced` allows this buffer to be used as instanced buffer. Each value will
- be used once for the whole geometry. The geometry will be repeated a number of
- times equal to the number of items in the Buffer.
- """
- GL_TYPES_ENUM = {
- 'B': GL_UNSIGNED_BYTE,
- 'f': GL_FLOAT,
- 'i': GL_INT,
- }
- GL_TYPES = {
- 'B': GLubyte,
- 'f': GLfloat,
- 'i': GLint,
- }
-
- def __init__(self,
- buffer: Buffer,
- formats: str,
- attributes: Iterable[str],
- normalized: Iterable[str] = None,
- instanced: bool = False):
- self.buffer = buffer
- self.attributes = list(attributes)
- self.normalized = set() if normalized is None else set(normalized)
- self.instanced = instanced
-
- if self.normalized > set(self.attributes):
- raise ShaderException("Normalized attribute not found in attributes.")
-
- formats = formats.split(" ")
-
- if len(formats) != len(self.attributes):
- raise ShaderException(
- f"Different lengths of formats ({len(formats)}) and "
- f"attributes ({len(self.attributes)})"
- )
-
- self.formats = []
- for i, fmt in enumerate(formats):
- size, type_ = fmt
- if size not in '1234' or type_ not in 'fiB':
- raise ShaderException("Wrong format {fmt}.")
- size = int(size)
- gl_type_enum = BufferDescription.GL_TYPES_ENUM[type_]
- gl_type = BufferDescription.GL_TYPES[type_]
- attribsize = size * sizeof(gl_type)
- self.formats.append((size, attribsize, gl_type_enum))
-
-
-class VertexArray:
- """Vertex Array Object (VAO) is holding all the different OpenGL objects
- together.
-
- A VAO is the glue between a Shader program and buffers data.
-
- Buffer information is provided through a list of tuples `content`
- content = [
- (buffer, 'format str', 'attrib1', 'attrib2', ...),
- ]
- The first item is a Buffer object. Then comes a format string providing information
- about the count and type of data in the buffer. Type can be `f` for floats or `i`
- for integers. Count can be 1, 2, 3 or 4.
- Finally comes the strings representing the attributes found in the shader.
-
- Example:
- Providing a buffer with data of interleaved positions (x, y) and colors
- (r, g, b, a):
- content = [(buffer, '2f 4f', 'in_pos', 'in_color')]
-
- You can use the VAO as a context manager. This is required for setting Uniform
- variables or for rendering.
-
- vao = VertexArrax(...)
- with vao:
- vao['MyUniform'] = value
- vao.render
- """
-
- def __init__(self,
- program: Program,
- content: Iterable[BufferDescription],
- index_buffer: Buffer = None):
- self.program = program.prog_id
- self.vao = vao = GLuint()
- self.num_vertices = -1
- self.ibo = index_buffer
-
- glGenVertexArrays(1, byref(self.vao))
- glBindVertexArray(self.vao)
-
- for buffer_desc in content:
- self._enable_attrib(buffer_desc)
-
- if self.ibo is not None:
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.ibo.buffer_id)
- weakref.finalize(self, VertexArray.release, vao)
-
- @staticmethod
- def release(vao):
- # If we have no context, then we are shutting down, so skip this
- if gl.current_context is None:
- return
-
- if vao.value != 0:
- glDeleteVertexArrays(1, byref(vao))
- vao.value = 0
-
- def __enter__(self):
- glBindVertexArray(self.vao)
- glUseProgram(self.program)
-
- def __exit__(self, exception_type, exception_value, traceback):
- glUseProgram(0)
-
- def _enable_attrib(self, buf_desc: BufferDescription):
- buffer = buf_desc.buffer
- stride = sum(attribsize for _, attribsize, _ in buf_desc.formats)
-
- if buf_desc.instanced:
- if self.num_vertices == -1:
- raise ShaderException(
- "The first vertex attribute cannot be a per instance attribute."
- )
- else:
- self.num_vertices = max(self.num_vertices, buffer.size // stride)
- # print(f"Number of vertices: {self.num_vertices}")
-
- glBindBuffer(GL_ARRAY_BUFFER, buffer.buffer_id)
- offset = 0
- for (size, attribsize, gl_type_enum), attrib in zip(buf_desc.formats, buf_desc.attributes):
- loc = glGetAttribLocation(self.program, attrib.encode('utf-8'))
- if loc == -1:
- raise ShaderException(f"Attribute {attrib} not found in shader program")
- normalized = GL_TRUE if attrib in buf_desc.normalized else GL_FALSE
- glVertexAttribPointer(
- loc, size, gl_type_enum,
- normalized, stride, c_void_p(offset)
- )
- # print(f"{attrib} of size {size} with stride {stride} and offset {offset}")
- if buf_desc.instanced:
- glVertexAttribDivisor(loc, 1)
- offset += attribsize
- glEnableVertexAttribArray(loc)
-
- def render(self, mode: GLuint, instances: int = 1):
- if self.ibo is not None:
- count = self.ibo.size // 4
- glDrawElementsInstanced(mode, count, GL_UNSIGNED_INT, None, instances)
- else:
- glDrawArraysInstanced(mode, 0, self.num_vertices, instances)
-
-
-def vertex_array(program: GLuint, content, index_buffer=None):
- """Create a new Vertex Array.
- """
- return VertexArray(program, content, index_buffer)
-
-
-class Texture:
- def __init__(self, size: Tuple[int, int], component: int, data: np.array):
- self.width, self.height = size
- sized_format = (GL_R8, GL_RG8, GL_RGB8, GL_RGBA8)[component - 1]
- self.format = (GL_R, GL_RG, GL_RGB, GL_RGBA)[component - 1]
- glActiveTexture(GL_TEXTURE0 + 0) # If we need other texture unit...
- self.texture_id = texture_id = GLuint()
- glGenTextures(1, byref(self.texture_id))
-
- if self.texture_id.value == 0:
- raise ShaderException("Cannot create Texture.")
-
- glBindTexture(GL_TEXTURE_2D, self.texture_id)
- glPixelStorei(GL_PACK_ALIGNMENT, 1)
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
- try:
- glTexImage2D(
- GL_TEXTURE_2D, 0, sized_format, self.width, self.height, 0,
- self.format, GL_UNSIGNED_BYTE, data.ctypes.data_as(c_void_p)
- )
- except GLException:
- raise GLException(f"Unable to create texture. {GL_MAX_TEXTURE_SIZE} {size}")
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
- weakref.finalize(self, Texture.release, texture_id)
-
- @staticmethod
- def release(texture_id):
- # If we have no context, then we are shutting down, so skip this
- if gl.current_context is None:
- return
-
- if texture_id.value != 0:
- glDeleteTextures(1, byref(texture_id))
-
- def use(self, texture_unit: int = 0):
- glActiveTexture(GL_TEXTURE0 + texture_unit)
- glBindTexture(GL_TEXTURE_2D, self.texture_id)
-
-
-def texture(size: Tuple[int, int], component: int, data: np.array) -> Texture:
- return Texture(size, component, data)
diff --git a/arcade/sound.py b/arcade/sound.py
deleted file mode 100644
index 9227d39..0000000
--- a/arcade/sound.py
+++ /dev/null
@@ -1,97 +0,0 @@
-"""
-Sound library.
-"""
-
-from platform import system
-import typing
-import pyglet
-from pathlib import Path
-
-
-class Sound:
-
- def __init__(self, file_name: str):
- if not Path(file_name).is_file():
- raise FileNotFoundError(f"The sound file '{file_name}' is not a file or can't be read")
- self.file_name = file_name
- self.player = pyglet.media.load(file_name)
-
- def play(self):
- if self.player.is_queued:
- player = pyglet.media.load(self.file_name)
- player.play()
- else:
- self.player.play()
-
-
-class PlaysoundException(Exception):
- pass
-
-
-def _load_sound_library():
- """
- Special code for Windows so we grab the proper avbin from our directory.
- Otherwise hope the correct package is installed.
- """
-
- # lazy loading
- if not _load_sound_library._sound_library_loaded:
- _load_sound_library._sound_library_loaded = True
- else:
- return
-
- import pyglet_ffmpeg2
- pyglet_ffmpeg2.load_ffmpeg()
-
-
-# Initialize static function variable
-_load_sound_library._sound_library_loaded = False
-
-
-def load_sound(file_name: str):
- """
- Load a sound. Support for .wav files. If ffmpeg is available, will work
- with ogg and mp3 as well.
-
- :param str file_name: Name of the sound file to load.
-
- :returns: Sound object
- :rtype: Sound
- """
-
- try:
- sound = Sound(file_name)
- return sound
- except Exception as e:
- print("Unable to load {str}.", e)
- return None
-
-
-def play_sound(sound: Sound):
- """
- Play a sound.
-
- :param Sound sound: Sound loaded by load_sound. Do NOT use a string here for the filename.
- """
- if sound is None:
- print("Unable to play sound, no data passed in.")
- elif isinstance(sound, str):
- msg = "Error, passed in a string as a sound. " +\
- "Make sure to use load_sound first, and use that result in play_sound."
- raise Exception(msg)
- try:
- sound.play()
- except Exception as e:
- print("Error playing sound.", e)
-
-
-def stop_sound(sound: pyglet.media.Source):
- """
- Stop a sound that is currently playing.
-
- :param sound:
- """
- sound.pause()
-
-
-_load_sound_library()
diff --git a/arcade/sprite.py b/arcade/sprite.py
deleted file mode 100644
index 6c45b92..0000000
--- a/arcade/sprite.py
+++ /dev/null
@@ -1,900 +0,0 @@
-"""
-This module manages all of the code around Sprites.
-
-For information on Spatial Hash Maps, see:
-https://www.gamedev.net/articles/programming/general-and-gameplay-programming/spatial-hashing-r2697/
-"""
-
-import math
-import dataclasses
-
-import PIL.Image
-
-from arcade.draw_commands import load_texture
-from arcade.draw_commands import draw_texture_rectangle
-from arcade.draw_commands import Texture
-from arcade.draw_commands import rotate_point
-from arcade.arcade_types import RGB, Point
-
-from typing import Sequence
-from typing import Tuple
-
-FACE_RIGHT = 1
-FACE_LEFT = 2
-FACE_UP = 3
-FACE_DOWN = 4
-
-
-class Sprite:
- """
- Class that represents a 'sprite' on-screen.
-
- Attributes:
- :alpha: Transparency of sprite. 0 is invisible, 255 is opaque.
- :angle: Rotation angle in degrees.
- :radians: Rotation angle in radians.
- :bottom: Set/query the sprite location by using the bottom coordinate. \
- This will be the 'y' of the bottom of the sprite.
- :boundary_left: Used in movement. Left boundary of moving sprite.
- :boundary_right: Used in movement. Right boundary of moving sprite.
- :boundary_top: Used in movement. Top boundary of moving sprite.
- :boundary_bottom: Used in movement. Bottom boundary of moving sprite.
- :center_x: X location of the center of the sprite
- :center_y: Y location of the center of the sprite
- :change_x: Movement vector, in the x direction.
- :change_y: Movement vector, in the y direction.
- :change_angle: Change in rotation.
- :color: Color tint the sprite
- :collision_radius: Used as a fast-check to see if this item is close \
- enough to another item. If this check works, we do a slower more accurate check.
- :cur_texture_index: Index of current texture being used.
- :guid: Unique identifier for the sprite. Useful when debugging.
- :height: Height of the sprite.
- :force: Force being applied to the sprite. Useful when used with Pymunk \
- for physics.
- :left: Set/query the sprite location by using the left coordinate. This \
- will be the 'x' of the left of the sprite.
- :points: Points, in relation to the center of the sprite, that are used \
- for collision detection. Arcade defaults to creating points for a rectangle \
- that encompass the image. If you are creating a ramp or making better \
- hit-boxes, you can custom-set these.
- :position: A list with the (x, y) of where the sprite is.
- :repeat_count_x: Unused
- :repeat_count_y: Unused
- :right: Set/query the sprite location by using the right coordinate. \
- This will be the 'y=x' of the right of the sprite.
- :sprite_lists: List of all the sprite lists this sprite is part of.
- :texture: `Texture` class with the current texture.
- :textures: List of textures associated with this sprite.
- :top: Set/query the sprite location by using the top coordinate. This \
- will be the 'y' of the top of the sprite.
- :scale: Scale the image up or down. Scale of 1.0 is original size, 0.5 \
- is 1/2 height and width.
- :velocity: Change in x, y expressed as a list. (0, 0) would be not moving.
- :width: Width of the sprite
-
- It is common to over-ride the `update` method and provide mechanics on
- movement or other sprite updates.
-
- """
-
- def __init__(self,
- filename: str = None,
- scale: float = 1,
- image_x: float = 0, image_y: float = 0,
- image_width: float = 0, image_height: float = 0,
- center_x: float = 0, center_y: float = 0,
- repeat_count_x: int = 1, repeat_count_y: int = 1):
- """
- Create a new sprite.
-
- Args:
- filename (str): Filename of an image that represents the sprite.
- scale (float): Scale the image up or down. Scale of 1.0 is none.
- image_x (float): Scale the image up or down. Scale of 1.0 is none.
- image_y (float): Scale the image up or down. Scale of 1.0 is none.
- image_width (float): Width of the sprite
- image_height (float): Height of the sprite
- center_x (float): Location of the sprite
- center_y (float): Location of the sprite
-
- """
-
- if image_width < 0:
- raise ValueError("Width of image can't be less than zero.")
-
- if image_height < 0:
- raise ValueError("Height entered is less than zero. Height must be a positive float.")
-
- if image_width == 0 and image_height != 0:
- raise ValueError("Width can't be zero.")
-
- if image_height == 0 and image_width != 0:
- raise ValueError("Height can't be zero.")
-
- self.sprite_lists = []
-
- if filename is not None:
- self._texture = load_texture(filename, image_x, image_y,
- image_width, image_height)
-
- self.textures = [self._texture]
- self._width = self._texture.width * scale
- self._height = self._texture.height * scale
- self._texture.scale = scale
- else:
- self.textures = []
- self._texture = None
- self._width = 0
- self._height = 0
-
- self.cur_texture_index = 0
-
- self._scale = scale
- self._position = [center_x, center_y]
- self._angle = 0.0
-
- self.velocity = [0, 0]
- self.change_angle = 0
-
- self.boundary_left = None
- self.boundary_right = None
- self.boundary_top = None
- self.boundary_bottom = None
-
- self.properties = {}
-
- self._alpha = 255
- self._collision_radius = None
- self._color = (255, 255, 255)
-
- self._points = None
- self._point_list_cache = None
-
- self.force = [0, 0]
- self.guid = None
-
- self.repeat_count_x = repeat_count_x
- self.repeat_count_y = repeat_count_y
-
- def append_texture(self, texture: Texture):
- """
- Appends a new texture to the list of textures that can be
- applied to this sprite.
-
- :param Texture texture: Texture to add ot the list of available textures
-
- """
- self.textures.append(texture)
-
- def _get_position(self) -> (float, float):
- """
- Get the center x coordinate of the sprite.
-
- Returns:
- (width, height)
- """
- return self._position
-
- def _set_position(self, new_value: (float, float)):
- """
- Set the center x coordinate of the sprite.
-
- Args:
- new_value:
-
- Returns:
-
- """
- if new_value[0] != self._position[0] or new_value[1] != self._position[1]:
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._position[0], self._position[1] = new_value
- self.add_spatial_hashes()
-
- for sprite_list in self.sprite_lists:
- sprite_list.update_location(self)
-
- position = property(_get_position, _set_position)
-
- def set_position(self, center_x: float, center_y: float):
- """
- Set a sprite's position
-
- :param float center_x: New x position of sprite
- :param float center_y: New y position of sprite
- """
- self._set_position((center_x, center_y))
-
- def set_points(self, points: Sequence[Sequence[float]]):
- """
- Set a sprite's position
- """
- self._points = points
-
- def forward(self, speed: float = 1.0):
- """
- Set a Sprite's position to speed by its angle
- :param speed: speed factor
- """
- self.change_x += math.cos(self.radians) * speed
- self.change_y += math.sin(self.radians) * speed
-
- def reverse(self, speed: float = 1.0):
- self.forward(-speed)
-
- def strafe(self, speed: float = 1.0):
- """
- Set a sprites position perpendicular to its angle by speed
- :param speed: speed factor
- """
- self.change_x += -math.sin(self.radians) * speed
- self.change_y += math.cos(self.radians) * speed
-
- def turn_right(self, theta: float = 90):
- self.angle -= theta
-
- def turn_left(self, theta: float = 90):
- self.angle += theta
-
- def stop(self):
- """
- Stop the Sprite's motion
- """
- self.change_x = 0
- self.change_y = 0
- self.change_angle = 0
-
- def get_points(self) -> Tuple[Tuple[float, float]]:
- """
- Get the corner points for the rect that makes up the sprite.
- """
- if self._point_list_cache is not None:
- return self._point_list_cache
-
- if self._points is not None:
- point_list = []
- for point in range(len(self._points)):
- point = (self._points[point][0] + self.center_x,
- self._points[point][1] + self.center_y)
- point_list.append(point)
- self._point_list_cache = tuple(point_list)
- else:
- x1, y1 = rotate_point(self.center_x - self.width / 2,
- self.center_y - self.height / 2,
- self.center_x,
- self.center_y,
- self.angle)
- x2, y2 = rotate_point(self.center_x + self.width / 2,
- self.center_y - self.height / 2,
- self.center_x,
- self.center_y,
- self.angle)
- x3, y3 = rotate_point(self.center_x + self.width / 2,
- self.center_y + self.height / 2,
- self.center_x,
- self.center_y,
- self.angle)
- x4, y4 = rotate_point(self.center_x - self.width / 2,
- self.center_y + self.height / 2,
- self.center_x,
- self.center_y,
- self.angle)
-
- self._point_list_cache = ((x1, y1), (x2, y2), (x3, y3), (x4, y4))
-
- return self._point_list_cache
-
- points = property(get_points, set_points)
-
- def _set_collision_radius(self, collision_radius: float):
- """
- Set the collision radius.
-
- .. note:: Final collision checking is done via geometry that was
- set in get_points/set_points. These points are used in the
- check_for_collision function. This collision_radius variable
- is used as a "pre-check." We do a super-fast check with
- collision_radius and see if the sprites are close. If they are,
- then we look at the geometry and figure if they really are colliding.
-
- :param float collision_radius: Collision radius
- """
- self._collision_radius = collision_radius
-
- def _get_collision_radius(self):
- """
- Get the collision radius.
-
- .. note:: Final collision checking is done via geometry that was
- set in get_points/set_points. These points are used in the
- check_for_collision function. This collision_radius variable
- is used as a "pre-check." We do a super-fast check with
- collision_radius and see if the sprites are close. If they are,
- then we look at the geometry and figure if they really are colliding.
-
- """
- if not self._collision_radius:
- self._collision_radius = max(self.width, self.height)
- return self._collision_radius
-
- collision_radius = property(_get_collision_radius, _set_collision_radius)
-
- def __lt__(self, other):
- return self._texture.texture_id.value < other.texture.texture_id.value
-
- def clear_spatial_hashes(self):
- """
- Search the sprite lists this sprite is a part of, and remove it
- from any spatial hashes it is a part of.
-
- """
- for sprite_list in self.sprite_lists:
- if sprite_list.use_spatial_hash and sprite_list.spatial_hash is not None:
- try:
- sprite_list.spatial_hash.remove_object(self)
- except ValueError:
- print("Warning, attempt to remove item from spatial hash that doesn't exist in the hash.")
-
- def add_spatial_hashes(self):
- for sprite_list in self.sprite_lists:
- if sprite_list.use_spatial_hash:
- sprite_list.spatial_hash.insert_object_for_box(self)
-
- def _get_bottom(self) -> float:
- """
- Return the y coordinate of the bottom of the sprite.
- """
- points = self.get_points()
- my_min = points[0][1]
- for point in range(1, len(points)):
- my_min = min(my_min, points[point][1])
- return my_min
-
- def _set_bottom(self, amount: float):
- """
- Set the location of the sprite based on the bottom y coordinate.
- """
- lowest = self._get_bottom()
- diff = lowest - amount
- self.center_y -= diff
-
- bottom = property(_get_bottom, _set_bottom)
-
- def _get_top(self) -> float:
- """
- Return the y coordinate of the top of the sprite.
- """
- points = self.get_points()
- my_max = points[0][1]
- for i in range(1, len(points)):
- my_max = max(my_max, points[i][1])
- return my_max
-
- def _set_top(self, amount: float):
- """ The highest y coordinate. """
- highest = self._get_top()
- diff = highest - amount
- self.center_y -= diff
-
- top = property(_get_top, _set_top)
-
- def _get_width(self) -> float:
- """ Get the width of the sprite. """
- return self._width
-
- def _set_width(self, new_value: float):
- """ Set the width in pixels of the sprite. """
- if new_value != self._width:
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._width = new_value
- self.add_spatial_hashes()
-
- for sprite_list in self.sprite_lists:
- sprite_list.update_position(self)
-
- width = property(_get_width, _set_width)
-
- def _get_height(self) -> float:
- """ Get the height in pixels of the sprite. """
- return self._height
-
- def _set_height(self, new_value: float):
- """ Set the center x coordinate of the sprite. """
- if new_value != self._height:
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._height = new_value
- self.add_spatial_hashes()
-
- for sprite_list in self.sprite_lists:
- sprite_list.update_position(self)
-
- height = property(_get_height, _set_height)
-
- def _get_scale(self) -> float:
- """ Get the scale of the sprite. """
- return self._scale
-
- def _set_scale(self, new_value: float):
- """ Set the center x coordinate of the sprite. """
- if new_value != self._height:
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._scale = new_value
- if self._texture:
- self._width = self._texture.width * self._scale
- self._height = self._texture.height * self._scale
- self.add_spatial_hashes()
-
- for sprite_list in self.sprite_lists:
- sprite_list.update_position(self)
-
- scale = property(_get_scale, _set_scale)
-
- def _get_center_x(self) -> float:
- """ Get the center x coordinate of the sprite. """
- return self._position[0]
-
- def _set_center_x(self, new_value: float):
- """ Set the center x coordinate of the sprite. """
- if new_value != self._position[0]:
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._position[0] = new_value
- self.add_spatial_hashes()
-
- for sprite_list in self.sprite_lists:
- sprite_list.update_location(self)
-
- center_x = property(_get_center_x, _set_center_x)
-
- def _get_center_y(self) -> float:
- """ Get the center y coordinate of the sprite. """
- return self._position[1]
-
- def _set_center_y(self, new_value: float):
- """ Set the center y coordinate of the sprite. """
- if new_value != self._position[1]:
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._position[1] = new_value
- self.add_spatial_hashes()
-
- for sprite_list in self.sprite_lists:
- sprite_list.update_location(self)
-
- center_y = property(_get_center_y, _set_center_y)
-
- def _get_change_x(self) -> float:
- """ Get the velocity in the x plane of the sprite. """
- return self.velocity[0]
-
- def _set_change_x(self, new_value: float):
- """ Set the velocity in the x plane of the sprite. """
- self.velocity[0] = new_value
-
- change_x = property(_get_change_x, _set_change_x)
-
- def _get_change_y(self) -> float:
- """ Get the velocity in the y plane of the sprite. """
- return self.velocity[1]
-
- def _set_change_y(self, new_value: float):
- """ Set the velocity in the y plane of the sprite. """
- self.velocity[1] = new_value
-
- change_y = property(_get_change_y, _set_change_y)
-
- def _get_angle(self) -> float:
- """ Get the angle of the sprite's rotation. """
- return self._angle
-
- def _set_angle(self, new_value: float):
- """ Set the angle of the sprite's rotation. """
- if new_value != self._angle:
- self.clear_spatial_hashes()
- self._angle = new_value
- self._point_list_cache = None
- self.add_spatial_hashes()
-
- for sprite_list in self.sprite_lists:
- sprite_list.update_angle(self)
-
- angle = property(_get_angle, _set_angle)
-
- def _to_radians(self) -> float:
- """
- Converts the degrees representation of self.angle into radians.
- :return: float
- """
- return self.angle / 180.0 * math.pi
-
- def _from_radians(self, new_value: float):
- """
- Converts a radian value into degrees and stores it into angle.
- """
- self.angle = new_value * 180.0 / math.pi
-
- radians = property(_to_radians, _from_radians)
-
- def _get_left(self) -> float:
- """
- Left-most coordinate.
- """
- points = self.get_points()
- my_min = points[0][0]
- for i in range(1, len(points)):
- my_min = min(my_min, points[i][0])
- return my_min
-
- def _set_left(self, amount: float):
- """ The left most x coordinate. """
- leftmost = self._get_left()
- diff = amount - leftmost
- self.center_x += diff
-
- left = property(_get_left, _set_left)
-
- def _get_right(self) -> float:
- """
- Return the x coordinate of the right-side of the sprite.
- """
-
- points = self.get_points()
- my_max = points[0][0]
- for point in range(1, len(points)):
- my_max = max(my_max, points[point][0])
- return my_max
-
- def _set_right(self, amount: float):
- """ The right most x coordinate. """
- rightmost = self._get_right()
- diff = rightmost - amount
- self.center_x -= diff
-
- right = property(_get_right, _set_right)
-
- def set_texture(self, texture_no: int):
- """
- Sets texture by texture id. Should be renamed because it takes
- a number rather than a texture, but keeping
- this for backwards compatibility.
- """
- if self.textures[texture_no] == self._texture:
- return
-
- texture = self.textures[texture_no]
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._texture = texture
- self._width = texture.width * texture.scale
- self._height = texture.height * texture.scale
- self.add_spatial_hashes()
- for sprite_list in self.sprite_lists:
- sprite_list.update_texture(self)
-
- def _set_texture2(self, texture: Texture):
- """ Sets texture by texture id. Should be renamed but keeping
- this for backwards compatibility. """
- if texture == self._texture:
- return
-
- self.clear_spatial_hashes()
- self._point_list_cache = None
- self._texture = texture
- self._width = texture.width * texture.scale
- self._height = texture.height * texture.scale
- self.add_spatial_hashes()
- for sprite_list in self.sprite_lists:
- sprite_list.update_texture(self)
-
- def _get_texture(self):
- return self._texture
-
- texture = property(_get_texture, _set_texture2)
-
- def _get_color(self) -> RGB:
- """
- Return the RGB color associated with the sprite.
- """
- return self._color
-
- def _set_color(self, color: RGB):
- """
- Set the current sprite color as a RGB value
- """
- self._color = color
- for sprite_list in self.sprite_lists:
- sprite_list.update_position(self)
-
- color = property(_get_color, _set_color)
-
- def _get_alpha(self) -> int:
- """
- Return the alpha associated with the sprite.
- """
- return self._alpha
-
- def _set_alpha(self, alpha: int):
- """
- Set the current sprite color as a value
- """
- self._alpha = alpha
- for sprite_list in self.sprite_lists:
- sprite_list.update_position(self)
-
- alpha = property(_get_alpha, _set_alpha)
-
- def register_sprite_list(self, new_list):
- """
- Register this sprite as belonging to a list. We will automatically
- remove ourselves from the the list when kill() is called.
- """
- self.sprite_lists.append(new_list)
-
- def draw(self):
- """ Draw the sprite. """
-
- draw_texture_rectangle(self.center_x, self.center_y,
- self.width, self.height,
- self._texture, self.angle, self.alpha, # TODO: review this function
- repeat_count_x=self.repeat_count_x,
- repeat_count_y=self.repeat_count_y)
-
- def update(self):
- """
- Update the sprite.
- """
- self.position = [self._position[0] + self.change_x, self._position[1] + self.change_y]
- self.angle += self.change_angle
-
- def update_animation(self):
- """
- Override this to add code that will change
- what image is shown, so the sprite can be
- animated.
- """
- pass
-
- def remove_from_sprite_lists(self):
- """
- Remove the sprite from all sprite lists.
- """
- for sprite_list in self.sprite_lists:
- if self in sprite_list:
- sprite_list.remove(self)
- self.sprite_lists.clear()
-
- def kill(self):
- """
- Alias of `remove_from_sprite_lists`
- """
- self.remove_from_sprite_lists()
-
- def collides_with_point(self, point: Point) -> bool:
- """Check if point is within the current sprite.
-
- Args:
- self: Current sprite
- point: Point to check.
-
- Returns:
- True if the point is contained within the sprite's boundary.
- """
- from arcade.geometry import is_point_in_polygon
-
- x, y = point
- return is_point_in_polygon(x, y, self.points)
-
- def collides_with_sprite(self, other: 'Sprite') -> bool:
- """Will check if a sprite is overlapping (colliding) another Sprite.
-
- Args:
- self: Current Sprite.
- other: The other sprite to check against.
-
- Returns:
- True or False, whether or not they are overlapping.
- """
- from arcade.geometry import check_for_collision
-
- return check_for_collision(self, other)
-
- def collides_with_list(self, sprite_list: list) -> list:
- """Check if current sprite is overlapping with any other sprite in a list
-
- Args:
- self: current Sprite
- sprite_list: SpriteList to check against
-
- Returns:
- SpriteList of all overlapping Sprites from the original SpriteList
- """
- from arcade.geometry import check_for_collision_with_list
- return check_for_collision_with_list(self, sprite_list)
-
-
-class AnimatedTimeSprite(Sprite):
- """
- Sprite for platformer games that supports animations.
- """
-
- def __init__(self, scale: float = 1,
- image_x: float = 0, image_y: float = 0,
- center_x: float = 0, center_y: float = 0):
-
- super().__init__(scale=scale, image_x=image_x, image_y=image_y,
- center_x=center_x, center_y=center_y)
- self.state = FACE_RIGHT
- self.cur_texture_index = 0
- self.texture_change_frames = 5
- self.frame = 0
-
- def update_animation(self):
- """
- Logic for selecting the proper texture to use.
- """
- if self.frame % self.texture_change_frames == 0:
- self.cur_texture_index += 1
- if self.cur_texture_index >= len(self.textures):
- self.cur_texture_index = 0
- self.set_texture(self.cur_texture_index)
- self.frame += 1
-
-
-@dataclasses.dataclass
-class AnimationKeyframe:
- tile_id: int
- duration: int
- image: PIL.Image
-
-
-class AnimatedTimeBasedSprite(Sprite):
- """
- Sprite for platformer games that supports animations.
- """
-
- def __init__(self,
- filename: str = None,
- scale: float = 1,
- image_x: float = 0, image_y: float = 0,
- image_width: float = 0, image_height: float = 0,
- center_x: float = 0, center_y: float = 0,
- repeat_count_x=1, repeat_count_y=1):
-
- super().__init__(filename=filename, scale=scale, image_x=image_x, image_y=image_y,
- image_width=image_width, image_height=image_height,
- center_x=center_x, center_y=center_y)
- self.cur_frame = 0
- self.frames = []
- self.time_counter = 0.0
-
- def update_animation(self, delta_time: float):
- """
- Logic for selecting the proper texture to use.
- """
- self.time_counter += delta_time
- while self.time_counter > self.frames[self.cur_frame].duration / 1000.0:
- self.time_counter -= self.frames[self.cur_frame].duration / 1000.0
- self.cur_frame += 1
- if self.cur_frame >= len(self.frames):
- self.cur_frame = 0
- source = self.frames[self.cur_frame].image.source
- # print(f"Advance to frame {self.cur_frame}: {source}")
- self.texture = load_texture(source, scale=self.scale)
-
-
-class AnimatedWalkingSprite(Sprite):
- """
- Sprite for platformer games that supports animations.
- """
-
- def __init__(self, scale: float = 1,
- image_x: float = 0, image_y: float = 0,
- center_x: float = 0, center_y: float = 0):
- super().__init__(scale=scale, image_x=image_x, image_y=image_y,
- center_x=center_x, center_y=center_y)
- self.state = FACE_RIGHT
- self.stand_right_textures = None
- self.stand_left_textures = None
- self.walk_left_textures = None
- self.walk_right_textures = None
- self.walk_up_textures = None
- self.walk_down_textures = None
- self.cur_texture_index = 0
- self.texture_change_distance = 20
- self.last_texture_change_center_x = 0
- self.last_texture_change_center_y = 0
-
- def update_animation(self):
- """
- Logic for selecting the proper texture to use.
- """
- x1 = self.center_x
- x2 = self.last_texture_change_center_x
- y1 = self.center_y
- y2 = self.last_texture_change_center_y
- distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
- texture_list = []
-
- change_direction = False
- if self.change_x > 0 \
- and self.change_y == 0 \
- and self.state != FACE_RIGHT \
- and self.walk_right_textures \
- and len(self.walk_right_textures) > 0:
- self.state = FACE_RIGHT
- change_direction = True
- elif self.change_x < 0 and self.change_y == 0 and self.state != FACE_LEFT \
- and self.walk_left_textures and len(self.walk_left_textures) > 0:
- self.state = FACE_LEFT
- change_direction = True
- elif self.change_y < 0 and self.change_x == 0 and self.state != FACE_DOWN \
- and self.walk_down_textures and len(self.walk_down_textures) > 0:
- self.state = FACE_DOWN
- change_direction = True
- elif self.change_y > 0 and self.change_x == 0 and self.state != FACE_UP \
- and self.walk_up_textures and len(self.walk_up_textures) > 0:
- self.state = FACE_UP
- change_direction = True
-
- if self.change_x == 0 and self.change_y == 0:
- if self.state == FACE_LEFT:
- self.texture = self.stand_left_textures[0]
- elif self.state == FACE_RIGHT:
- self.texture = self.stand_right_textures[0]
- elif self.state == FACE_UP:
- self.texture = self.walk_up_textures[0]
- elif self.state == FACE_DOWN:
- self.texture = self.walk_down_textures[0]
-
- elif change_direction or distance >= self.texture_change_distance:
- self.last_texture_change_center_x = self.center_x
- self.last_texture_change_center_y = self.center_y
-
- if self.state == FACE_LEFT:
- texture_list = self.walk_left_textures
- if texture_list is None or len(texture_list) == 0:
- raise RuntimeError("update_animation was called on a sprite that doesn't have a "
- "list of walk left textures.")
- elif self.state == FACE_RIGHT:
- texture_list = self.walk_right_textures
- if texture_list is None or len(texture_list) == 0:
- raise RuntimeError("update_animation was called on a sprite that doesn't have a list of "
- "walk right textures.")
- elif self.state == FACE_UP:
- texture_list = self.walk_up_textures
- if texture_list is None or len(texture_list) == 0:
- raise RuntimeError("update_animation was called on a sprite that doesn't have a list of "
- "walk up textures.")
- elif self.state == FACE_DOWN:
- texture_list = self.walk_down_textures
- if texture_list is None or len(texture_list) == 0:
- raise RuntimeError(
- "update_animation was called on a sprite that doesn't have a list of walk down textures.")
-
- self.cur_texture_index += 1
- if self.cur_texture_index >= len(texture_list):
- self.cur_texture_index = 0
-
- self.texture = texture_list[self.cur_texture_index]
-
- if self._texture is None:
- print("Error, no texture set")
- else:
- self.width = self._texture.width * self.scale
- self.height = self._texture.height * self.scale
-
-
-def get_distance_between_sprites(sprite1: Sprite, sprite2: Sprite) -> float:
- """
- Returns the distance between the center of two given sprites
- :param Sprite sprite1: Sprite one
- :param Sprite sprite2: Sprite two
- :return: Distance
- :rtype: float
- """
- distance = math.sqrt((sprite1.center_x - sprite2.center_x) ** 2 + (sprite1.center_y - sprite2.center_y) ** 2)
- return distance
diff --git a/arcade/sprite_list.py b/arcade/sprite_list.py
deleted file mode 100644
index 021dbc1..0000000
--- a/arcade/sprite_list.py
+++ /dev/null
@@ -1,688 +0,0 @@
-"""
-This module provides functionality to manage Sprites in a list.
-
-"""
-
-from typing import Iterable
-from typing import TypeVar
-from typing import Generic
-from typing import List
-
-import pyglet.gl as gl
-
-import math
-import numpy as np
-
-from PIL import Image
-
-from arcade.sprite import Sprite
-from arcade.sprite import get_distance_between_sprites
-from arcade.sprite import AnimatedTimeBasedSprite
-
-from arcade.draw_commands import rotate_point
-from arcade.window_commands import get_projection
-from arcade import shader
-from arcade.arcade_types import Point
-
-VERTEX_SHADER = """
-#version 330
-uniform mat4 Projection;
-
-// per vertex
-in vec2 in_vert;
-in vec2 in_texture;
-
-// per instance
-in vec2 in_pos;
-in float in_angle;
-in vec2 in_scale;
-in vec4 in_sub_tex_coords;
-in vec4 in_color;
-
-out vec2 v_texture;
-out vec4 v_color;
-
-void main() {
- mat2 rotate = mat2(
- cos(in_angle), sin(in_angle),
- -sin(in_angle), cos(in_angle)
- );
- vec2 pos;
- pos = in_pos + vec2(rotate * (in_vert * in_scale));
- gl_Position = Projection * vec4(pos, 0.0, 1.0);
-
- vec2 tex_offset = in_sub_tex_coords.xy;
- vec2 tex_size = in_sub_tex_coords.zw;
-
- v_texture = (in_texture * tex_size + tex_offset) * vec2(1, -1);
- v_color = in_color;
-}
-"""
-
-FRAGMENT_SHADER = """
-#version 330
-uniform sampler2D Texture;
-
-in vec2 v_texture;
-in vec4 v_color;
-
-out vec4 f_color;
-
-void main() {
- vec4 basecolor = texture(Texture, v_texture);
- basecolor = basecolor * v_color;
- if (basecolor.a == 0.0){
- discard;
- }
- f_color = basecolor;
-}
-"""
-
-
-def _create_rects(rect_list: Iterable[Sprite]) -> List[float]:
- """
- Create a vertex buffer for a set of rectangles.
- """
-
- v2f = []
- for shape in rect_list:
- x1 = -shape.width / 2 + shape.center_x
- x2 = shape.width / 2 + shape.center_x
- y1 = -shape.height / 2 + shape.center_y
- y2 = shape.height / 2 + shape.center_y
-
- p1 = x1, y1
- p2 = x2, y1
- p3 = x2, y2
- p4 = x1, y2
-
- if shape.angle:
- p1 = rotate_point(p1[0], p1[1], shape.center_x, shape.center_y, shape.angle)
- p2 = rotate_point(p2[0], p2[1], shape.center_x, shape.center_y, shape.angle)
- p3 = rotate_point(p3[0], p3[1], shape.center_x, shape.center_y, shape.angle)
- p4 = rotate_point(p4[0], p4[1], shape.center_x, shape.center_y, shape.angle)
-
- v2f.extend([p1[0], p1[1],
- p2[0], p2[1],
- p3[0], p3[1],
- p4[0], p4[1]])
-
- return v2f
-
-
-class _SpatialHash:
- """
- Structure for fast collision checking.
-
- See: https://www.gamedev.net/articles/programming/general-and-gameplay-programming/spatial-hashing-r2697/
- """
-
- def __init__(self, cell_size):
- self.cell_size = cell_size
- self.contents = {}
-
- def _hash(self, point):
- return int(point[0] / self.cell_size), int(point[1] / self.cell_size)
-
- def reset(self):
- self.contents = {}
-
- def insert_object_for_box(self, new_object: Sprite):
- """
- Insert a sprite.
- """
- # Get the corners
- min_x = new_object.left
- max_x = new_object.right
- min_y = new_object.bottom
- max_y = new_object.top
-
- # print(f"New - Center: ({new_object.center_x}, {new_object.center_y}), Angle: {new_object.angle}, "
- # f"Left: {new_object.left}, Right {new_object.right}")
-
- min_point = (min_x, min_y)
- max_point = (max_x, max_y)
-
- # print(f"Add 1: {min_point} {max_point}")
-
- # hash the minimum and maximum points
- min_point, max_point = self._hash(min_point), self._hash(max_point)
-
- # print(f"Add 2: {min_point} {max_point}")
- # print("Add: ", min_point, max_point)
-
- # iterate over the rectangular region
- for i in range(min_point[0], max_point[0] + 1):
- for j in range(min_point[1], max_point[1] + 1):
- # append to each intersecting cell
- bucket = self.contents.setdefault((i, j), [])
- if new_object in bucket:
- # print(f"Error, {new_object.guid} already in ({i}, {j}) bucket. ")
- pass
- else:
- bucket.append(new_object)
- # print(f"Adding {new_object.guid} to ({i}, {j}) bucket. "
- # f"{new_object._position} {min_point} {max_point}")
-
- def remove_object(self, sprite_to_delete: Sprite):
- """
- Remove a Sprite.
-
- :param Sprite sprite_to_delete: Pointer to sprite to be removed.
- """
- # Get the corners
- min_x = sprite_to_delete.left
- max_x = sprite_to_delete.right
- min_y = sprite_to_delete.bottom
- max_y = sprite_to_delete.top
-
- # print(f"Del - Center: ({sprite_to_delete.center_x}, {sprite_to_delete.center_y}), "
- # f"Angle: {sprite_to_delete.angle}, Left: {sprite_to_delete.left}, Right {sprite_to_delete.right}")
-
- min_point = (min_x, min_y)
- max_point = (max_x, max_y)
-
- # print(f"Remove 1: {min_point} {max_point}")
-
- # hash the minimum and maximum points
- min_point, max_point = self._hash(min_point), self._hash(max_point)
-
- # print(f"Remove 2: {min_point} {max_point}")
- # print("Remove: ", min_point, max_point)
-
- # iterate over the rectangular region
- for i in range(min_point[0], max_point[0] + 1):
- for j in range(min_point[1], max_point[1] + 1):
- bucket = self.contents.setdefault((i, j), [])
- try:
- bucket.remove(sprite_to_delete)
- # print(f"Removing {sprite_to_delete.guid} from ({i}, {j}) bucket. {sprite_to_delete._position} "
- # f"{min_point} {max_point}")
-
- except ValueError:
- print(f"Warning, tried to remove item {sprite_to_delete.guid} from spatial hash {i} {j} when "
- f"it wasn't there. {min_point} {max_point}")
-
- def get_objects_for_box(self, check_object: Sprite) -> List[Sprite]:
- """
- Returns colliding Sprites.
-
- :param Sprite check_object: Sprite we are checking to see if there are
- other sprites in the same box(es)
-
- :return: List of close-by sprites
- :rtype: List
-
-
- """
- # Get the corners
- min_x = check_object.left
- max_x = check_object.right
- min_y = check_object.bottom
- max_y = check_object.top
-
- min_point = (min_x, min_y)
- max_point = (max_x, max_y)
-
- # hash the minimum and maximum points
- min_point, max_point = self._hash(min_point), self._hash(max_point)
-
- close_by_sprites = []
- # iterate over the rectangular region
- for i in range(min_point[0], max_point[0] + 1):
- for j in range(min_point[1], max_point[1] + 1):
- # print(f"Checking {i}, {j}")
- # append to each intersecting cell
- new_items = self.contents.setdefault((i, j), [])
- # for item in new_items:
- # print(f"Found {item.guid} in {i}, {j}")
- close_by_sprites.extend(new_items)
-
- return close_by_sprites
-
- def get_objects_for_point(self, check_point: Point) -> List[Sprite]:
- """
- Returns Sprites at or close to a point.
-
- :param Point check_point: Point we are checking to see if there are
- other sprites in the same box(es)
-
- :return: List of close-by sprites
- :rtype: List
-
-
- """
-
- hash_point = self._hash(check_point)
-
- close_by_sprites = []
- new_items = self.contents.setdefault(hash_point, [])
- close_by_sprites.extend(new_items)
-
- return close_by_sprites
-
-
-T = TypeVar('T', bound=Sprite)
-
-
-class SpriteList(Generic[T]):
-
- next_texture_id = 0
-
- def __init__(self, use_spatial_hash=False, spatial_hash_cell_size=128, is_static=False):
- """
- Initialize the sprite list
-
- :param bool use_spatial_hash: If set to True, this will make moving a sprite
- in the SpriteList slower, but it will speed up collision detection
- with items in the SpriteList. Great for doing collision detection
- with walls/platforms.
- :param int spatial_hash_cell_size:
- :param bool is_static: Speeds drawing if this list won't change.
- """
- # List of sprites in the sprite list
- self.sprite_list = []
- self.sprite_idx = dict()
-
- # Used in drawing optimization via OpenGL
- self.program = None
-
- self.sprite_data = None
- self.sprite_data_buf = None
- self.texture_id = None
- self._texture = None
- self.vao = None
- self.vbo_buf = None
-
- self.array_of_texture_names = []
- self.array_of_images = []
-
- # Used in collision detection optimization
- self.is_static = is_static
- self.use_spatial_hash = use_spatial_hash
- if use_spatial_hash:
- self.spatial_hash = _SpatialHash(cell_size=spatial_hash_cell_size)
- else:
- self.spatial_hash = None
-
- def append(self, item: T):
- """
- Add a new sprite to the list.
-
- :param Sprite item: Sprite to add to the list.
- """
- idx = len(self.sprite_list)
- self.sprite_list.append(item)
- self.sprite_idx[item] = idx
- item.register_sprite_list(self)
- self.vao = None
- if self.use_spatial_hash:
- self.spatial_hash.insert_object_for_box(item)
-
- def _recalculate_spatial_hash(self, item: T):
- """ Recalculate the spatial hash for a particular item. """
- if self.use_spatial_hash:
- self.spatial_hash.remove_object(item)
- self.spatial_hash.insert_object_for_box(item)
-
- def _recalculate_spatial_hashes(self):
- if self.use_spatial_hash:
- self.spatial_hash.reset()
- for sprite in self.sprite_list:
- self.spatial_hash.insert_object_for_box(sprite)
-
- def remove(self, item: T):
- """
- Remove a specific sprite from the list.
- :param Sprite item: Item to remove from the list
- """
- self.sprite_list.remove(item)
-
- # Rebuild index list
- self.sprite_idx[item] = dict()
- for idx, sprite in enumerate(self.sprite_list):
- self.sprite_idx[sprite] = idx
-
- self.vao = None
- if self.use_spatial_hash:
- self.spatial_hash.remove_object(item)
-
- def update(self):
- """
- Call the update() method on each sprite in the list.
- """
- for sprite in self.sprite_list:
- sprite.update()
-
- def update_animation(self, delta_time=1/60):
- for sprite in self.sprite_list:
- if isinstance(sprite, AnimatedTimeBasedSprite):
- sprite.update_animation(delta_time)
- else:
- sprite.update_animation()
-
- def move(self, change_x: float, change_y: float):
- """
- Moves all Sprites in the list by the same amount.
-
- :param float change_x: Amount to change all x values by
- :param float change_y: Amount to change all y values by
- """
- for sprite in self.sprite_list:
- sprite.center_x += change_x
- sprite.center_y += change_y
-
- def preload_textures(self, texture_names: List):
- """
- Preload a set of textures that will be used for sprites in this
- sprite list.
-
- :param array texture_names: List of file names to load in as textures.
- """
- self.array_of_texture_names.extend(texture_names)
- self.array_of_images = None
-
- def _calculate_sprite_buffer(self):
-
- if len(self.sprite_list) == 0:
- return
-
- # Loop through each sprite and grab its position, and the texture it will be using.
- array_of_positions = []
- array_of_sizes = []
- array_of_colors = []
- array_of_angles = []
-
- for sprite in self.sprite_list:
- array_of_positions.append([sprite.center_x, sprite.center_y])
- array_of_angles.append(math.radians(sprite.angle))
- size_h = sprite.height / 2
- size_w = sprite.width / 2
- array_of_sizes.append([size_w, size_h])
- array_of_colors.append(sprite.color + (sprite.alpha, ))
-
- new_array_of_texture_names = []
- new_array_of_images = []
- new_texture = False
- if self.array_of_images is None:
- new_texture = True
-
- # print()
- # print("New texture start: ", new_texture)
-
- for sprite in self.sprite_list:
-
- if sprite._texture is None:
- raise Exception("Error: Attempt to draw a sprite without a texture set.")
-
- name_of_texture_to_check = sprite._texture.name
- if name_of_texture_to_check not in self.array_of_texture_names:
- new_texture = True
- # print("New because of ", name_of_texture_to_check)
-
- if name_of_texture_to_check not in new_array_of_texture_names:
- new_array_of_texture_names.append(name_of_texture_to_check)
- image = sprite._texture.image
- new_array_of_images.append(image)
-
- # print("New texture end: ", new_texture)
- # print(new_array_of_texture_names)
- # print(self.array_of_texture_names)
- # print()
-
- if new_texture:
- # Add back in any old textures. Chances are we'll need them.
- for index, old_texture_name in enumerate(self.array_of_texture_names):
- if old_texture_name not in new_array_of_texture_names and self.array_of_images is not None:
- new_array_of_texture_names.append(old_texture_name)
- image = self.array_of_images[index]
- new_array_of_images.append(image)
-
- self.array_of_texture_names = new_array_of_texture_names
-
- self.array_of_images = new_array_of_images
- # print(f"New Texture Atlas with names {self.array_of_texture_names}")
-
- # Get their sizes
- widths, heights = zip(*(i.size for i in self.array_of_images))
-
- # Figure out what size a composite would be
- total_width = sum(widths)
- max_height = max(heights)
-
- if new_texture:
-
- # TODO: This code isn't valid, but I think some releasing might be in order.
- # if self.texture is not None:
- # shader.Texture.release(self.texture_id)
-
- # Make the composite image
- new_image = Image.new('RGBA', (total_width, max_height))
-
- x_offset = 0
- for image in self.array_of_images:
- new_image.paste(image, (x_offset, 0))
- x_offset += image.size[0]
-
- # Create a texture out the composite image
- self._texture = shader.texture(
- (new_image.width, new_image.height),
- 4,
- np.asarray(new_image)
- )
-
- if self.texture_id is None:
- self.texture_id = SpriteList.next_texture_id
-
- # Create a list with the coordinates of all the unique textures
- tex_coords = []
- start_x = 0.0
- for image in self.array_of_images:
- end_x = start_x + (image.width / total_width)
- normalized_width = image.width / total_width
- start_height = 1 - (image.height / max_height)
- normalized_height = image.height / max_height
- tex_coords.append([start_x, start_height, normalized_width, normalized_height])
- start_x = end_x
-
- # Go through each sprite and pull from the coordinate list, the proper
- # coordinates for that sprite's image.
- array_of_sub_tex_coords = []
- for sprite in self.sprite_list:
- index = self.array_of_texture_names.index(sprite._texture.name)
- array_of_sub_tex_coords.append(tex_coords[index])
-
- # Create numpy array with info on location and such
- buffer_type = np.dtype([('position', '2f4'), ('angle', 'f4'), ('size', '2f4'),
- ('sub_tex_coords', '4f4'), ('color', '4B')])
- self.sprite_data = np.zeros(len(self.sprite_list), dtype=buffer_type)
- self.sprite_data['position'] = array_of_positions
- self.sprite_data['angle'] = array_of_angles
- self.sprite_data['size'] = array_of_sizes
- self.sprite_data['sub_tex_coords'] = array_of_sub_tex_coords
- self.sprite_data['color'] = array_of_colors
-
- if self.is_static:
- usage = 'static'
- else:
- usage = 'stream'
-
- self.sprite_data_buf = shader.buffer(
- self.sprite_data.tobytes(),
- usage=usage
- )
-
- vertices = np.array([
- # x, y, u, v
- -1.0, -1.0, 0.0, 0.0,
- -1.0, 1.0, 0.0, 1.0,
- 1.0, -1.0, 1.0, 0.0,
- 1.0, 1.0, 1.0, 1.0,
- ], dtype=np.float32
- )
- self.vbo_buf = shader.buffer(vertices.tobytes())
- vbo_buf_desc = shader.BufferDescription(
- self.vbo_buf,
- '2f 2f',
- ('in_vert', 'in_texture')
- )
- pos_angle_scale_buf_desc = shader.BufferDescription(
- self.sprite_data_buf,
- '2f 1f 2f 4f 4B',
- ('in_pos', 'in_angle', 'in_scale', 'in_sub_tex_coords', 'in_color'),
- normalized=['in_color'], instanced=True)
-
- vao_content = [vbo_buf_desc, pos_angle_scale_buf_desc]
-
- # Can add buffer to index vertices
- self.vao = shader.vertex_array(self.program, vao_content)
-
- def dump(self):
- buffer = self.sprite_data.tobytes()
- record_size = len(buffer) / len(self.sprite_list)
- for i, char in enumerate(buffer):
- if i % record_size == 0:
- print()
- print(f"{char:02x} ", end="")
-
- def _update_positions(self):
- """ Called by the Sprite class to update position, angle, size and color
- of all sprites in the list.
- Necessary for batch drawing of items. """
-
- if self.vao is None:
- return
-
- for i, sprite in enumerate(self.sprite_list):
- self.sprite_data[i]['position'] = [sprite.center_x, sprite.center_y]
- self.sprite_data[i]['angle'] = math.radians(sprite.angle)
- self.sprite_data[i]['size'] = [sprite.width / 2, sprite.height / 2]
- self.sprite_data[i]['color'] = sprite.color + (sprite.alpha, )
-
- def update_texture(self, sprite):
- """ Make sure we update the texture for this sprite for the next batch
- drawing"""
- if self.vao is None:
- return
-
- self._calculate_sprite_buffer()
-
- def update_position(self, sprite: Sprite):
- """
- Called by the Sprite class to update position, angle, size and color
- of the specified sprite.
- Necessary for batch drawing of items.
-
- :param Sprite sprite: Sprite to update.
- """
- if self.vao is None:
- return
-
- i = self.sprite_idx[sprite]
-
- self.sprite_data[i]['position'] = [sprite.center_x, sprite.center_y]
- self.sprite_data[i]['angle'] = math.radians(sprite.angle)
- self.sprite_data[i]['size'] = [sprite.width / 2, sprite.height / 2]
- self.sprite_data[i]['color'] = sprite.color + (sprite.alpha, )
-
- def update_location(self, sprite: Sprite):
- """
- Called by the Sprite class to update the location in this sprite.
- Necessary for batch drawing of items.
-
- :param Sprite sprite: Sprite to update.
- """
- if self.vao is None:
- return
-
- i = self.sprite_idx[sprite]
-
- self.sprite_data[i]['position'] = sprite.position
-
- def update_angle(self, sprite: Sprite):
- """
- Called by the Sprite class to update the angle in this sprite.
- Necessary for batch drawing of items.
-
- :param Sprite sprite: Sprite to update.
- """
- if self.vao is None:
- return
-
- i = self.sprite_idx[sprite]
- self.sprite_data[i]['angle'] = math.radians(sprite.angle)
-
- def draw(self):
- """ Draw this list of sprites. """
- if self.program is None:
- # Used in drawing optimization via OpenGL
- self.program = shader.program(
- vertex_shader=VERTEX_SHADER,
- fragment_shader=FRAGMENT_SHADER
- )
-
- if len(self.sprite_list) == 0:
- return
-
- if self.vao is None:
- self._calculate_sprite_buffer()
-
- self._texture.use(0)
-
- gl.glEnable(gl.GL_BLEND)
- gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
- # gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST)
- # gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
-
- with self.vao:
- self.program['Texture'] = self.texture_id
- self.program['Projection'] = get_projection().flatten()
-
- if not self.is_static:
- self.sprite_data_buf.write(self.sprite_data.tobytes())
-
- self.vao.render(gl.GL_TRIANGLE_STRIP, instances=len(self.sprite_list))
-
- if not self.is_static:
- self.sprite_data_buf.orphan()
-
- def __len__(self) -> int:
- """ Return the length of the sprite list. """
- return len(self.sprite_list)
-
- def __iter__(self) -> Iterable[T]:
- """ Return an iterable object of sprites. """
- return iter(self.sprite_list)
-
- def __getitem__(self, i):
- return self.sprite_list[i]
-
- def pop(self) -> Sprite:
- """
- Pop off the last sprite in the list.
- """
- self.program = None
- return self.sprite_list.pop()
-
-
-def get_closest_sprite(sprite: Sprite, sprite_list: SpriteList) -> (Sprite, float):
- """
- Given a Sprite and SpriteList, returns the closest sprite, and its distance.
-
- :param Sprite sprite: Target sprite
- :param SpriteList sprite_list: List to search for closest sprite.
-
- :return: Closest sprite.
- :rtype: Sprite
- """
- if len(sprite_list) == 0:
- return None
-
- min_pos = 0
- min_distance = get_distance_between_sprites(sprite, sprite_list[min_pos])
- for i in range(1, len(sprite_list)):
- distance = get_distance_between_sprites(sprite, sprite_list[i])
- if distance < min_distance:
- min_pos = i
- min_distance = distance
- return sprite_list[min_pos], min_distance
diff --git a/arcade/text.py b/arcade/text.py
deleted file mode 100644
index ec35e51..0000000
--- a/arcade/text.py
+++ /dev/null
@@ -1,293 +0,0 @@
-# --- BEGIN TEXT FUNCTIONS # # #
-
-import PIL.Image
-import PIL.ImageDraw
-import PIL.ImageFont
-
-from arcade.sprite import Sprite
-from arcade.arcade_types import Color
-from arcade.draw_commands import Texture
-
-
-class Text:
- """ Class used for managing text. """
-
- def __init__(self):
- self.size = (0, 0)
- self.text_sprite_list = None
-
-
-class CreateText:
- """ Class used for managing text """
-
- def __init__(self,
- text: str,
- color: Color,
- font_size: float = 12,
- width: int = 20,
- align="left",
- font_name=('Calibri', 'Arial'),
- bold: bool = False,
- italic: bool = False,
- anchor_x="left",
- anchor_y="baseline",
- rotation=0):
- self.text = text
- self.color = color
- self.font_size = font_size
- self.width = width
- self.align = align
- self.font_name = font_name
- self.bold = bold
- self.italic = italic
- self.anchor_x = anchor_x
- self.anchor_y = anchor_y
- self.rotation = rotation
-
-
-def create_text(text: str,
- color: Color,
- font_size: float = 12,
- width: int = 0,
- align="left",
- font_name=('Calibri', 'Arial'),
- bold: bool = False,
- italic: bool = False,
- anchor_x: str = "left",
- anchor_y: str = "baseline",
- rotation=0):
- """ Deprecated. Two step text drawing for backwards compatibility. """
-
- import warnings
- warnings.warn("create_text has been deprecated, please use draw_text instead.", DeprecationWarning)
- my_text = CreateText(text, color, font_size, width, align, font_name, bold, italic, anchor_x, anchor_y, rotation)
- return my_text
-
-
-def render_text(text: CreateText, start_x: float, start_y: float):
- """ Deprecated. Two step text drawing for backwards compatibility. """
-
- import warnings
- warnings.warn("render_text has been deprecated, please use draw_text instead.", DeprecationWarning)
-
- draw_text(text.text,
- start_x,
- start_y,
- color=text.color,
- font_size=text.font_size,
- width=text.width,
- align=text.align,
- font_name=text.font_name,
- bold=text.bold,
- italic=text.italic,
- anchor_x=text.anchor_x,
- anchor_y=text.anchor_y,
- rotation=text.rotation)
-
-
-def draw_text(text: str,
- start_x: float, start_y: float,
- color: Color,
- font_size: float = 12,
- width: int = 0,
- align: str = "left",
- font_name=('calibri', 'arial'),
- bold: bool = False,
- italic: bool = False,
- anchor_x: str = "left",
- anchor_y: str = "baseline",
- rotation: float = 0
- ):
- """
-
- :param str text: Text to draw
- :param float start_x:
- :param float start_y:
- :param Color color: Color of the text
- :param float font_size: Size of the text
- :param float width:
- :param str align:
- :param str font_name:
- :param bool bold:
- :param bool italic:
- :param str anchor_x:
- :param str anchor_y:
- :param float rotation:
- """
-
- # Scale the font up, so it matches with the sizes of the old code back
- # when Pyglet drew the text.
- font_size *= 1.25
-
- # Text isn't anti-aliased, so we'll draw big, and then shrink
- scale_up = 1
- scale_down = 1
-
- # font_size *= scale_up
-
- # If the cache gets too large, dump it and start over.
- if len(draw_text.cache) > 5000:
- draw_text.cache = {}
-
- key = f"{text}{color}{font_size}{width}{align}{font_name}{bold}{italic}"
- if key in draw_text.cache:
- label = draw_text.cache[key]
- text_sprite = label.text_sprite_list[0]
-
- if anchor_x == "left":
- text_sprite.center_x = start_x + text_sprite.width / 2
- elif anchor_x == "center":
- text_sprite.center_x = start_x
- elif anchor_x == "right":
- text_sprite.right = start_x
- else:
- raise ValueError(f"anchor_x should be 'left', 'center', or 'right'. Not '{anchor_x}'")
-
- if anchor_y == "top":
- text_sprite.center_y = start_y - text_sprite.height / 2
- elif anchor_y == "center":
- text_sprite.center_y = start_y
- elif anchor_y == "bottom" or anchor_y == "baseline":
- text_sprite.bottom = start_y
- else:
- raise ValueError(f"anchor_x should be 'left', 'center', or 'right'. Not '{anchor_y}'")
-
- text_sprite.angle = rotation
- else:
- label = Text()
-
- # Figure out the font to use
- font = None
-
- # Font was specified with a string
- if isinstance(font_name, str):
- try:
- font = PIL.ImageFont.truetype(font_name, int(font_size))
- except OSError:
- # print(f"1 Can't find font: {font_name}")
- pass
-
- if font is None:
- try:
- temp_font_name = f"{font_name}.ttf"
- font = PIL.ImageFont.truetype(temp_font_name, int(font_size))
- except OSError:
- # print(f"2 Can't find font: {temp_font_name}")
- pass
-
- # We were instead given a list of font names, in order of preference
- else:
- for font_string_name in font_name:
- try:
- font = PIL.ImageFont.truetype(font_string_name, int(font_size))
- # print(f"3 Found font: {font_string_name}")
- except OSError:
- # print(f"3 Can't find font: {font_string_name}")
- pass
-
- if font is None:
- try:
- temp_font_name = f"{font_name}.ttf"
- font = PIL.ImageFont.truetype(temp_font_name, int(font_size))
- except OSError:
- # print(f"4 Can't find font: {temp_font_name}")
- pass
-
- if font is not None:
- break
-
- # Default font if no font
- if font is None:
- font_names = ("arial.ttf",
- 'NotoSans-Regular.ttf',
- "/usr/share/fonts/truetype/freefont/FreeMono.ttf",
- '/System/Library/Fonts/SFNSDisplay.ttf')
- for font_string_name in font_names:
- try:
- font = PIL.ImageFont.truetype(font_string_name, int(font_size))
- break
- except OSError:
- # print(f"5 Can't find font: {font_string_name}")
- pass
-
- # This is stupid. We have to have an image to figure out what size
- # the text will be when we draw it. Of course, we don't know how big
- # to make the image. Catch-22. So we just make a small image we'll trash
- text_image_size = (10, 10)
- image = PIL.Image.new("RGBA", text_image_size)
- draw = PIL.ImageDraw.Draw(image)
-
- # Get size the text will be
- text_image_size = draw.multiline_textsize(text, font=font)
-
- # Create image of proper size
- text_height = text_image_size[1]
- text_width = text_image_size[0]
-
- image_start_x = 0
- if width == 0:
- width = text_image_size[0]
- else:
- # Wait! We were given a field width.
- if align == "center":
- # Center text on given field width
- field_width = width * scale_up
- text_image_size = field_width, text_height
- image_start_x = (field_width - text_width) // 2
- width = field_width
- else:
- image_start_x = 0
-
- # If we draw a y at 0, then the text is drawn with a baseline of 0,
- # cutting off letters that drop below the baseline. This shoves it
- # up a bit.
- image_start_y = - font_size * scale_up * 0.02
- image = PIL.Image.new("RGBA", text_image_size)
- draw = PIL.ImageDraw.Draw(image)
-
- # Convert to tuple if needed, because the multiline_text does not take a
- # list for a color
- if isinstance(color, list):
- color = tuple(color)
- draw.multiline_text((image_start_x, image_start_y), text, color, align=align, font=font)
- # image = image.resize((width // scale_down, text_height // scale_down), resample=PIL.Image.LANCZOS)
-
- text_sprite = Sprite()
- text_sprite._texture = Texture(key)
- text_sprite._texture.image = image
-
- text_sprite.image = image
- text_sprite.texture_name = key
- text_sprite.width = image.width
- text_sprite.height = image.height
-
- if anchor_x == "left":
- text_sprite.center_x = start_x + text_sprite.width / 2
- elif anchor_x == "center":
- text_sprite.center_x = start_x
- elif anchor_x == "right":
- text_sprite.right = start_x
- else:
- raise ValueError(f"anchor_x should be 'left', 'center', or 'right'. Not '{anchor_x}'")
-
- if anchor_y == "top":
- text_sprite.center_y = start_y + text_sprite.height / 2
- elif anchor_y == "center":
- text_sprite.center_y = start_y
- elif anchor_y == "bottom" or anchor_y == "baseline":
- text_sprite.bottom = start_y
- else:
- raise ValueError(f"anchor_x should be 'top', 'center', 'bottom', or 'baseline'. Not '{anchor_y}'")
-
- text_sprite.angle = rotation
-
- from arcade.sprite_list import SpriteList
- label.text_sprite_list = SpriteList()
- label.text_sprite_list.append(text_sprite)
-
- draw_text.cache[key] = label
-
- label.text_sprite_list.draw()
-
-
-draw_text.cache = {}
diff --git a/arcade/tilemap.py b/arcade/tilemap.py
deleted file mode 100644
index 9c761c7..0000000
--- a/arcade/tilemap.py
+++ /dev/null
@@ -1,321 +0,0 @@
-"""
-Functions and classes for managing a map saved in the .tmx format.
-
-Typically these .tmx maps are created using the `Tiled Map Editor`_.
-
-For more information, see the `Platformer Tutorial`_.
-
-.. _Tiled Map Editor: https://www.mapeditor.org/
-.. _Platformer Tutorial: http://arcade.academy/examples/platform_tutorial/index.html
-
-
-"""
-
-from typing import Optional
-import math
-import copy
-import pytiled_parser
-
-from arcade import Sprite
-from arcade import AnimatedTimeBasedSprite
-from arcade import AnimationKeyframe
-from arcade import SpriteList
-
-FLIPPED_HORIZONTALLY_FLAG = 0x80000000
-FLIPPED_VERTICALLY_FLAG = 0x40000000
-FLIPPED_DIAGONALLY_FLAG = 0x20000000
-
-
-def read_tmx(tmx_file: str) -> pytiled_parser.objects.TileMap:
- """
- Given a .tmx, this will read in a tiled map, and return
- a TiledMap object.
-
- Given a tsx_file, the map will use it as the tileset.
- If tsx_file is not specified, it will use the tileset specified
- within the tmx_file.
-
- Important: Tiles must be a "collection" of images.
-
- Hitboxes can be drawn around tiles in the tileset editor,
- but only polygons are supported.
- (This is a great area for PR's to improve things.)
-
- :param str tmx_file: String with name of our TMX file
-
- :returns: Map
- :rtype: TiledMap
- """
-
- tile_map = pytiled_parser.parse_tile_map(tmx_file)
-
- return tile_map
-
-
-def get_tilemap_layer(map_object: pytiled_parser.objects.TileMap,
- layer_name: str) -> Optional[pytiled_parser.objects.Layer]:
- """
- Given a TileMap and a layer name, this returns the TileLayer.
-
- :param pytiled_parser.objects.TileMap map_object: The map read in by the read_tmx function.
- :param str layer_name: A string to match the layer name. Case sensitive.
-
- :returns: A TileLayer, or None if no layer was found.
-
- """
-
- assert isinstance(map_object, pytiled_parser.objects.TileMap)
- assert isinstance(layer_name, str)
-
- for layer in map_object.layers:
- if layer.name == layer_name:
- return layer
-
- return None
-
-
-def _get_tile_by_gid(map_object: pytiled_parser.objects.TileMap,
- tile_gid: int) -> Optional[pytiled_parser.objects.Tile]:
-
- flipped_diagonally = False
- flipped_horizontally = False
- flipped_vertically = False
-
- if tile_gid & FLIPPED_HORIZONTALLY_FLAG:
- flipped_horizontally = True
- tile_gid -= FLIPPED_HORIZONTALLY_FLAG
-
- if tile_gid & FLIPPED_DIAGONALLY_FLAG:
- flipped_diagonally = True
- tile_gid -= FLIPPED_DIAGONALLY_FLAG
-
- if tile_gid & FLIPPED_VERTICALLY_FLAG:
- flipped_vertically = True
- tile_gid -= FLIPPED_VERTICALLY_FLAG
-
- for tileset_key, tileset in map_object.tile_sets.items():
- for tile_key, tile in tileset.tiles.items():
- cur_tile_gid = tile.id_ + tileset_key
- # print(f"-- {tile_gid} {cur_tile_gid} {tile.image.source}")
- if cur_tile_gid == tile_gid:
- my_tile = copy.copy(tile)
- my_tile.tileset = tileset
- my_tile.flipped_vertically = flipped_vertically
- my_tile.flipped_diagonally = flipped_diagonally
- my_tile.flipped_horizontally = flipped_horizontally
- return my_tile
- return None
-
-
-def _get_tile_by_id(map_object: pytiled_parser.objects.TileMap,
- tileset: pytiled_parser.objects.TileSet,
- tile_id: int) -> Optional[pytiled_parser.objects.Tile]:
- for tileset_key, cur_tileset in map_object.tile_sets.items():
- if cur_tileset is tileset:
- for tile_key, tile in cur_tileset.tiles.items():
- if tile_id == tile.id_:
- return tile
- return None
-
-
-def _create_sprite_from_tile(map_object, tile: pytiled_parser.objects.Tile,
- scaling,
- base_directory: str = ""):
-
- tmx_file = base_directory + tile.image.source
-
- # print(f"Creating tile: {tmx_file}")
- if tile.animation:
- # my_sprite = AnimatedTimeSprite(tmx_file, scaling)
- my_sprite = AnimatedTimeBasedSprite(tmx_file, scaling)
- else:
- my_sprite = Sprite(tmx_file, scaling)
-
- if tile.properties is not None and len(tile.properties) > 0:
- for my_property in tile.properties:
- my_sprite.properties[my_property.name] = my_property.value
-
- # print(tile.image.source, my_sprite.center_x, my_sprite.center_y)
- if tile.objectgroup is not None:
-
- if len(tile.objectgroup) > 1:
- print(f"Warning, only one hit box supported for tile with image {tile.image.source}.")
-
- for hitbox in tile.objectgroup:
- half_width = map_object.tile_size.width / 2
- half_height = map_object.tile_size.height / 2
- points = []
- if isinstance(hitbox, pytiled_parser.objects.RectangleObject):
- if hitbox.size is None:
- print(f"Warning: Rectangle hitbox created for without a "
- f"height or width for {tile.image.source}. Ignoring.")
- continue
-
- p1 = [hitbox.location[0] - half_width, half_height - hitbox.location[0]]
- p2 = [hitbox.location[0] + hitbox.size[0] - half_width, half_height - hitbox.size[0]]
- p3 = [hitbox.location[0] + hitbox.size[0] - half_width, half_height
- - (hitbox.location[1] + hitbox.size[1])]
- p4 = [hitbox.location[0] - half_width, half_height - (hitbox.location[1] + hitbox.size[1])]
- points = [p4, p3, p2, p1]
-
- elif isinstance(hitbox, pytiled_parser.objects.PolygonObject):
- for point in hitbox.points:
- adj_x = point[0] + hitbox.location[0] - half_width
- adj_y = half_height - (point[1] + hitbox.location[1])
- adj_point = [adj_x, adj_y]
- points.append(adj_point)
-
- elif isinstance(hitbox, pytiled_parser.objects.PolylineObject):
- for point in hitbox.points:
- adj_x = point[0] + hitbox.location[0] - half_width
- adj_y = half_height - (point[1] + hitbox.location[1])
- adj_point = [adj_x, adj_y]
- points.append(adj_point)
-
- # If we have a polyline, and it is closed, we need to
- # remove the duplicate end-point
- if points[0][0] == points[-1][0] and points[0][1] == points[-1][1]:
- points.pop()
-
- elif isinstance(hitbox, pytiled_parser.objects.ElipseObject):
- if hitbox.size is None:
- print(f"Warning: Ellipse hitbox created for without a height "
- f"or width for {tile.image.source}. Ignoring.")
- continue
- w = hitbox.size[0] / 2
- h = hitbox.size[1] / 2
- cx = (hitbox.location[0] + hitbox.size[0] / 2) - half_width
- cy = map_object.tile_size.height - (hitbox.location[1] + hitbox.size[1] / 2) - half_height
- total_steps = 8
- angles = [step / total_steps * 2 * math.pi for step in range(total_steps)]
- for angle in angles:
- x = w * math.cos(angle) + cx
- y = h * math.sin(angle) + cy
- point = [x, y]
- points.append(point)
-
- else:
- print(f"Warning: Hitbox type {type(hitbox)} not supported.")
-
- # Scale the points to our sprite scaling
- for point in points:
- point[0] *= scaling
- point[1] *= scaling
- my_sprite.points = points
-
- if tile.animation is not None:
- key_frame_list = []
- for frame in tile.animation:
- frame_tile = _get_tile_by_id(map_object, tile.tileset, frame.tile_id)
- key_frame = AnimationKeyframe(frame.tile_id, frame.duration, frame_tile.image)
- key_frame_list.append(key_frame)
-
- my_sprite.frames = key_frame_list
-
- return my_sprite
-
-
-def _process_object_layer(map_object: pytiled_parser.objects.TileMap,
- layer: pytiled_parser.objects.Layer,
- scaling: float = 1,
- base_directory: str = "") -> SpriteList:
- sprite_list = SpriteList()
-
- for cur_object in layer.tiled_objects:
- if cur_object.gid is None:
- print("Warning: Currently only tiles (not objects) are supported in object layers.")
- continue
-
- tile = _get_tile_by_gid(map_object, cur_object.gid)
- my_sprite = _create_sprite_from_tile(map_object, tile, scaling=scaling,
- base_directory=base_directory)
-
- my_sprite.right = cur_object.location.x * scaling
- my_sprite.top = (map_object.map_size.height * map_object.tile_size[1] - cur_object.location.y) * scaling
-
- if cur_object.properties is not None and 'change_x' in cur_object.properties:
- my_sprite.change_x = float(cur_object.properties['change_x'])
-
- if cur_object.properties is not None and 'change_y' in cur_object.properties:
- my_sprite.change_y = float(cur_object.properties['change_y'])
-
- if cur_object.properties is not None and 'boundary_bottom' in cur_object.properties:
- my_sprite.boundary_bottom = float(cur_object.properties['boundary_bottom'])
-
- if cur_object.properties is not None and 'boundary_top' in cur_object.properties:
- my_sprite.boundary_top = float(cur_object.properties['boundary_top'])
-
- if cur_object.properties is not None and 'boundary_left' in cur_object.properties:
- my_sprite.boundary_left = float(cur_object.properties['boundary_left'])
-
- if cur_object.properties is not None and 'boundary_right' in cur_object.properties:
- my_sprite.boundary_right = float(cur_object.properties['boundary_right'])
-
- my_sprite.properties.update(cur_object.properties)
- # sprite.properties
- sprite_list.append(my_sprite)
- return sprite_list
-
-
-def _process_tile_layer(map_object: pytiled_parser.objects.TileMap,
- layer: pytiled_parser.objects.TileLayer,
- scaling: float = 1,
- base_directory: str = "") -> SpriteList:
- sprite_list = SpriteList()
- map_array = layer.data
-
- # Loop through the layer and add in the wall list
- for row_index, row in enumerate(map_array):
- for column_index, item in enumerate(row):
- # Check for empty square
- if item == 0:
- continue
-
- tile = _get_tile_by_gid(map_object, item)
- if tile is None:
- print(f"Warning, couldn't find tile for item {item} in layer "
- f"'{layer.name}' in file '{map_object.tmx_file}'.")
- continue
-
- my_sprite = _create_sprite_from_tile(map_object, tile, scaling=scaling,
- base_directory=base_directory)
-
- my_sprite.right = column_index * (map_object.tile_size[0] * scaling)
- my_sprite.top = (map_object.map_size.height - row_index - 1) * (map_object.tile_size[1] * scaling)
-
- sprite_list.append(my_sprite)
-
- return sprite_list
-
-
-def process_layer(map_object: pytiled_parser.objects.TileMap,
- layer_name: str,
- scaling: float = 1,
- base_directory: str = "") -> SpriteList:
- """
- This takes a map layer returned by the read_tmx function, and creates Sprites for it.
-
- :param map_object: The TileMap read in by read_tmx.
- :param layer_name: The name of the layer that we are creating sprites for.
- :param scaling: Scaling the layer up or down.
- (Note, any number besides 1 can create a tearing effect,
- if numbers don't evenly divide.)
- :param base_directory: Base directory of the file, that we start from to
- load images.
- :returns: A SpriteList.
-
- """
-
- if len(base_directory) > 0 and not base_directory.endswith("/"):
- base_directory += "/"
-
- layer = get_tilemap_layer(map_object, layer_name)
- if layer is None:
- print(f"Warning, no layer named '{layer_name}'.")
- return SpriteList()
-
- if isinstance(layer, pytiled_parser.objects.TileLayer):
- return _process_tile_layer(map_object, layer, scaling, base_directory)
-
- elif isinstance(layer, pytiled_parser.objects.ObjectLayer):
- return _process_object_layer(map_object, layer, scaling, base_directory)
diff --git a/arcade/utils.py b/arcade/utils.py
deleted file mode 100644
index 0aab2bf..0000000
--- a/arcade/utils.py
+++ /dev/null
@@ -1,139 +0,0 @@
-import math
-import random
-from arcade.arcade_types import Point, Vector
-
-
-def lerp(v1: float, v2: float, u: float) -> float:
- """linearly interpolate between two values"""
- return v1 + ((v2 - v1) * u)
-
-
-def lerp_vec(v1: Vector, v2: Vector, u: float) -> Vector:
- return (
- lerp(v1[0], v2[0], u),
- lerp(v1[1], v2[1], u)
- )
-
-
-def rand_in_rect(bottom_left: Point, width: float, height: float) -> Point:
- return (
- random.uniform(bottom_left[0], bottom_left[0] + width),
- random.uniform(bottom_left[1], bottom_left[1] + height)
- )
-
-
-def rand_in_circle(center: Point, radius: float):
- """
- Generate a point in a circle, or can think of it as a vector pointing
- a random direction with a random magnitude <= radius
- Reference: http://stackoverflow.com/a/30564123
- Note: This algorithm returns a higher concentration of points around the center of the circle
- """
- # random angle
- angle = 2 * math.pi * random.random()
- # random radius
- r = radius * random.random()
- # calculating coordinates
- return (
- r * math.cos(angle) + center[0],
- r * math.sin(angle) + center[1]
- )
-
-
-def rand_on_circle(center: Point, radius: float) -> Point:
- """Note: by passing a random value in for float, you can achieve what rand_in_circle() does"""
- angle = 2 * math.pi * random.random()
- return (
- radius * math.cos(angle) + center[0],
- radius * math.sin(angle) + center[1]
- )
-
-
-def rand_on_line(pos1: Point, pos2: Point) -> Point:
- u = random.uniform(0.0, 1.0)
- return lerp_vec(pos1, pos2, u)
-
-
-def rand_angle_360_deg():
- return random.uniform(0.0, 360.0)
-
-
-def rand_angle_spread_deg(angle: float, half_angle_spread: float) -> float:
- s = random.uniform(-half_angle_spread, half_angle_spread)
- return angle + s
-
-
-def rand_vec_spread_deg(angle: float, half_angle_spread: float, length: float) -> Vector:
- a = rand_angle_spread_deg(angle, half_angle_spread)
- vel = _Vec2.from_polar(a, length)
- return vel.as_tuple()
-
-
-def rand_vec_magnitude(angle: float, lo_magnitude: float, hi_magnitude: float) -> Vector:
- mag = random.uniform(lo_magnitude, hi_magnitude)
- vel = _Vec2.from_polar(angle, mag)
- return vel.as_tuple()
-
-
-class _Vec2:
- """
- 2D vector used to do operate points and vectors
-
- Note: intended to be used for internal implementations only. Should not be part of public interfaces
- (ex: function parameters or return values).
- """
-
- __slots__ = ['x', 'y']
-
- def __init__(self, x, y=None):
- try:
- # see if first argument is an iterable with two items
- self.x = x[0]
- self.y = x[1]
- except TypeError:
- self.x = x
- self.y = y
-
- @staticmethod
- def from_polar(angle, radius):
- rads = math.radians(angle)
- return _Vec2(radius * math.cos(rads), radius * math.sin(rads))
-
- def __add__(self, other):
- return _Vec2(self.x + other.x, self.y + other.y)
-
- def __sub__(self, other):
- return _Vec2(self.x - other.x, self.y - other.y)
-
- def __mul__(self, other):
- return _Vec2(self.x * other.x, self.y * other.y)
-
- def __truediv__(self, other):
- return _Vec2(self.x / other.x, self.y / other.y)
-
- def __iter__(self):
- yield self.x
- yield self.y
-
- def length(self):
- """return the length (magnitude) of the vector"""
- return math.sqrt(self.x**2 + self.y**2)
-
- def dot(self, other):
- return self.x * other.x + self.y * other.y
-
- def __repr__(self):
- return f"Vec2({self.x},{self.y})"
-
- def rotated(self, angle):
- """Returns the new vector resulting when this vector is rotated by the given angle in degrees"""
- rads = math.radians(angle)
- cosine = math.cos(rads)
- sine = math.sin(rads)
- return _Vec2(
- (self.x*cosine) - (self.y*sine),
- (self.y*cosine) + (self.x*sine)
- )
-
- def as_tuple(self) -> Point:
- return self.x, self.y
diff --git a/arcade/version.py b/arcade/version.py
deleted file mode 100644
index fe318a9..0000000
--- a/arcade/version.py
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-
-BUILD = 0
-VERSION = "2.1.3"
-RELEASE = VERSION
diff --git a/arcade/window_commands.py b/arcade/window_commands.py
deleted file mode 100644
index 89169b8..0000000
--- a/arcade/window_commands.py
+++ /dev/null
@@ -1,295 +0,0 @@
-"""
-This submodule has functions that control opening, closing, rendering, and otherwise managing windows.
-It also has commands for scheduling pauses and scheduling interval functions.
-"""
-
-import gc
-import time
-import os
-
-import pyglet.gl as gl
-import pyglet
-
-import numpy as np
-
-from numbers import Number
-from typing import Callable
-from typing import Union
-from arcade.arcade_types import Color
-
-_left = -1
-_right = 1
-_bottom = -1
-_top = 1
-_scaling = None
-
-_window = None
-
-_projection = None
-_opengl_context = None
-
-
-def get_projection():
- """
- Returns the current projection.
-
- :return: Numpy array with projection.
-
- """
- return _projection
-
-
-def create_orthogonal_projection(
- left,
- right,
- bottom,
- top,
- near,
- far,
- dtype=None
-):
- """
- Creates an orthogonal projection matrix. Used internally with the
- OpenGL shaders.
-
- :param float left: The left of the near plane relative to the plane's centre.
- :param float right: The right of the near plane relative to the plane's centre.
- :param float top: The top of the near plane relative to the plane's centre.
- :param float bottom: The bottom of the near plane relative to the plane's centre.
- :param float near: The distance of the near plane from the camera's origin.
- It is recommended that the near plane is set to 1.0 or above to avoid
- rendering issues at close range.
- :param float far: The distance of the far plane from the camera's origin.
- :param dtype:
- :return: A projection matrix representing the specified orthogonal perspective.
- :rtype: numpy.array
-
- .. seealso:: http://msdn.microsoft.com/en-us/library/dd373965(v=vs.85).aspx
- """
-
- rml = right - left
- tmb = top - bottom
- fmn = far - near
-
- a = 2. / rml
- b = 2. / tmb
- c = -2. / fmn
- tx = -(right + left) / rml
- ty = -(top + bottom) / tmb
- tz = -(far + near) / fmn
-
- return np.array((
- (a, 0., 0., 0.),
- (0., b, 0., 0.),
- (0., 0., c, 0.),
- (tx, ty, tz, 1.),
- ), dtype=dtype)
-
-
-def pause(seconds: Number):
- """
- Pause for the specified number of seconds. This is a convenience function that just calls time.sleep()
-
- :param float seconds: Time interval to pause in seconds.
- """
- time.sleep(seconds)
-
-
-def get_window() -> Union[pyglet.window.Window, None]:
- """
- Return a handle to the current window.
-
- :return: Handle to the current window.
- """
- global _window
- return _window
-
-
-def set_window(window: pyglet.window.Window):
- """
- Set a handle to the current window.
-
- :param Window window: Handle to the current window.
- """
- global _window
- _window = window
-
-
-def get_scaling_factor(window):
- """
- Tries to get the scaling factor of the given Window. Currently works
- on MacOS only. Useful in figuring out what's going on with Retina and
- high-res displays.
-
- :param Window window: Handle to window we want to get scaling factor of.
-
- :return: Scaling factor. E.g., 2 would indicate scaled up twice.
- :rtype: int
-
- """
- from pyglet import compat_platform
- if compat_platform == 'darwin':
- from pyglet.libs.darwin.cocoapy import NSMakeRect
- view = window.context._nscontext.view()
- content_rect = NSMakeRect(0, 0, window._width, window._height) # Get size, possibly scaled
- bounds = view.convertRectFromBacking_(content_rect) # Convert to actual pixel sizes
- return int(content_rect.size.width / bounds.size.width)
- else:
- return 1
-
-
-def set_viewport(left: Number, right: Number, bottom: Number, top: Number):
- """
- This sets what coordinates the window will cover.
-
- By default, the lower left coordinate will be (0, 0) and the top y
- coordinate will be the height of the window in pixels, and the right x
- coordinate will be the width of the window in pixels.
-
- If a program is making a game where the user scrolls around a larger
- world, this command can help out.
-
- Note: It is recommended to only set the view port to integer values that
- line up with the pixels on the screen. Otherwise if making a tiled game
- the blocks may not line up well, creating rectangle artifacts.
-
- :param Number left: Left-most (smallest) x value.
- :param Number right: Right-most (largest) x value.
- :param Number bottom: Bottom (smallest) y value.
- :param Number top: Top (largest) y value.
- """
- global _left
- global _right
- global _bottom
- global _top
- global _projection
- global _scaling
-
- _left = left
- _right = right
- _bottom = bottom
- _top = top
-
- # Needed for sprites
- if _scaling is None:
- _scaling = get_scaling_factor(_window)
- gl.glViewport(0, 0, _window.width * _scaling, _window.height * _scaling)
-
- # Needed for drawing
- # gl.glMatrixMode(gl.GL_PROJECTION)
- # gl.glLoadIdentity()
- # gl.glOrtho(_left, _right, _bottom, _top, -1, 1)
- # gl.glMatrixMode(gl.GL_MODELVIEW)
- # gl.glLoadIdentity()
-
- _projection = create_orthogonal_projection(left=_left, right=_right,
- bottom=_bottom, top=_top,
- near=-1000, far=100, dtype=np.float32)
-
-
-def get_viewport() -> (float, float, float, float):
- """
- Get the current viewport settings.
-
- :return: Tuple of floats, with left, right, bottom, top
-
- """
- return _left, _right, _bottom, _top
-
-
-def close_window():
- """
- Closes the current window, and then runs garbage collection. The garbage collection
- is necessary to prevent crashing when opening/closing windows rapidly (usually during
- unit tests).
- """
- global _window
-
- _window.close()
- _window = None
-
- # Have to do a garbage collection or Python will crash
- # if we do a lot of window open and closes. Like for
- # unit tests.
- gc.collect()
-
-
-def finish_render():
- """
- Swap buffers and displays what has been drawn.
- If programs use derive from the Window class, this function is
- automatically called.
- """
- global _window
-
- _window.flip()
-
-
-def run():
- """
- Run the main loop.
- After the window has been set up, and the event hooks are in place, this is usually one of the last
- commands on the main program.
- """
- if 'ARCADE_TEST' in os.environ and os.environ['ARCADE_TEST'].upper() == "TRUE":
- # print("Testing!!!")
- window = get_window()
- if window:
- window.update(1/60)
- window.on_draw()
- else:
- pyglet.app.run()
-
-
-def quick_run(time_to_pause: Number):
- """
- Only run the application for the specified time in seconds.
- Useful for unit testing or continuous integration (CI) testing
- where there is no user interaction.
-
- :param Number time_to_pause: Number of seconds to pause before automatically
- closing.
-
- """
- pause(time_to_pause)
- close_window()
-
-
-def start_render():
- """
- Get set up to render. Required to be called before drawing anything to the
- screen.
- """
- gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
- # gl.glMatrixMode(gl.GL_MODELVIEW)
- # gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
-
-
-def set_background_color(color: Color):
- """
- This specifies the background color of the window.
-
- :param Color color: List of 3 or 4 bytes in RGB/RGBA format.
- """
-
- gl.glClearColor(color[0]/255, color[1]/255, color[2]/255, 1)
-
-
-def schedule(function_pointer: Callable, interval: Number):
- """
- Schedule a function to be automatically called every ``interval``
- seconds.
-
- :param Callable function_pointer: Pointer to the function to be called.
- :param Number interval: Interval to call the function.
- """
- pyglet.clock.schedule_interval(function_pointer, interval)
-
-
-def unschedule(function_pointer: Callable):
- """
- Unschedule a function being automatically called.
-
- :param Callable function_pointer: Pointer to the function to be unscheduled.
- """
- pyglet.clock.unschedule(function_pointer)
diff --git a/requirements.txt b/requirements.txt
index 91af332..ab9354e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1 @@
-numpy
-Pillow
-Pyglet>=1.4.2
-pyglet-ffmpeg2
-pytiled_parser
-pytest
-pymunk
-matplotlib
\ No newline at end of file
+arcade
diff --git a/tetrarcade.py b/tetrarcade.py
index 21e8e1c..9f0a28f 100644
--- a/tetrarcade.py
+++ b/tetrarcade.py
@@ -16,15 +16,36 @@ import time
# Constants
# Window
-WINDOW_WIDTH = 600
+WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
WINDOW_TITLE = "TETRARCADE"
# Text
TEXT_COLOR = arcade.color.BUBBLES
FONT_NAME = "joystix monospace.ttf"
-TEXT_MARGIN = 20
-FONT_SIZE = 8
+TEXT_MARGIN = 40
+FONT_SIZE = 10
+TEXT_HEIGHT = 13.2
+TEXT = """SCORE
+HIGH SCORE
+TIME
+LEVEL
+GOAL
+LINES
+
+
+
+
+MOVE LEFT ←
+MOVE RIGHT →
+SOFT DROP ↓
+HARD DROP SPACE
+ROTATE ↑
+CLOCKWISE
+ROTATE Z
+COUNTERCLOCKWISE
+HOLD C
+PAUSE ESC"""
# Sprites paths
WINDOW_BG = "images/bg.jpg"
@@ -39,17 +60,18 @@ MINOES_SPRITES_PATHS = {
"magenta": "images/magenta_mino.png"
}
-# Mino transparency
+# Transparency (0=invisible, 255=opaque)
NORMAL_ALPHA = 200
PRELOCKED_ALPHA = 127
GHOST_ALPHA = 50
+MATRIX_SRITE_ALPHA = 100
# Matrix
NB_LINES = 20
NB_COLS = 10
NB_NEXT_PIECES = 5
-# Delays
+# Delays (seconds)
AUTOREPEAT_DELAY = 0.170 # Official : 0.300
AUTOREPEAT_INTERVAL = 0.010 # Official : 0.010
LOCK_DELAY = 0.5
@@ -57,7 +79,7 @@ FALL_DELAY = 1
class Coord:
-
+
def __init__(self, x, y):
self.x = x
self.y = y
@@ -77,7 +99,7 @@ HELD_I_POSITION = Coord(-5, NB_LINES-3)
class Status:
-
+
STARTING = "starting"
PLAYING = "playing"
PAUSED = "paused"
@@ -85,28 +107,28 @@ class Status:
class Movement:
-
+
LEFT = Coord(-1, 0)
RIGHT = Coord(1, 0)
DOWN = Coord(0, -1)
class Rotation:
-
+
CLOCKWISE = -1
COUNTERCLOCKWISE = 1
-
-
+
+
class T_Spin:
-
+
NO_T_SPIN = ""
MINI_T_SPIN = "MINI T-SPIN"
T_SPIN = "T-SPIN"
-
-
+
+
class Tetromino:
-
-
+
+
class TetrominoBase:
# Super rotation system
SRS = {
@@ -125,7 +147,7 @@ class Tetromino:
}
lock_delay = LOCK_DELAY
fall_delay = FALL_DELAY
-
+
def __init__(self):
self.position = NEXT_PIECES_POSITIONS[-1]
self.minoes_positions = self.MINOES_POSITIONS
@@ -133,26 +155,26 @@ class Tetromino:
self.last_rotation_point_used = None
self.hold_enabled = True
self.prelocked = False
-
+
def ghost(self):
return self.__class__()
-
-
+
+
class O(TetrominoBase):
-
+
SRS = {
Rotation.COUNTERCLOCKWISE: (tuple(), tuple(), tuple(), tuple()),
Rotation.CLOCKWISE: (tuple(), tuple(), tuple(), tuple())
}
MINOES_POSITIONS = (Coord(0, 0), Coord(1, 0), Coord(0, 1), Coord(1, 1))
MINOES_COLOR = "yellow"
-
+
def rotate(self, direction):
return False
-
-
+
+
class I(TetrominoBase):
-
+
SRS = {
Rotation.COUNTERCLOCKWISE: (
(Coord(0, -1), Coord(-1, -1), Coord(2, -1), Coord(-1, 1), Coord(2, -2)),
@@ -169,50 +191,50 @@ class Tetromino:
}
MINOES_POSITIONS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(2, 0))
MINOES_COLOR = "cyan"
-
-
+
+
class T(TetrominoBase):
-
+
MINOES_POSITIONS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 0))
MINOES_COLOR = "magenta"
-
-
+
+
class L(TetrominoBase):
-
+
MINOES_POSITIONS = (Coord(-1, 0), Coord(0, 0), Coord(1, 0), Coord(1, 1))
MINOES_COLOR = "orange"
-
-
+
+
class J(TetrominoBase):
-
+
MINOES_POSITIONS = (Coord(-1, 1), Coord(-1, 0), Coord(0, 0), Coord(1, 0))
MINOES_COLOR = "blue"
-
-
+
+
class S(TetrominoBase):
-
+
MINOES_POSITIONS = (Coord(-1, 0), Coord(0, 0), Coord(0, 1), Coord(1, 1))
MINOES_COLOR = "green"
-
-
+
+
class Z(TetrominoBase):
-
+
MINOES_POSITIONS = (Coord(-1, 1), Coord(0, 1), Coord(0, 0), Coord(1, 0))
MINOES_COLOR = "red"
-
-
+
+
TETROMINOES = (O, I, T, L, J, S, Z)
random_bag = []
-
+
def __new__(cls):
if not cls.random_bag:
cls.random_bag = list(cls.TETROMINOES)
random.shuffle(cls.random_bag)
return cls.random_bag.pop()()
-
-
+
+
class GameLogic():
-
+
T_SLOT = (Coord(-1, 1), Coord(1, 1), Coord(1, -1), Coord(-1, -1))
SCORES = (
{"name": "", T_Spin.NO_T_SPIN: 0, T_Spin.MINI_T_SPIN: 1, T_Spin.T_SPIN: 4},
@@ -221,7 +243,7 @@ class GameLogic():
{"name": "TRIPLE", T_Spin.NO_T_SPIN: 5, T_Spin.T_SPIN: 16},
{"name": "TETRIS", T_Spin.NO_T_SPIN: 8}
)
-
+
def __init__(self, ui):
self.ui = ui
self.high_score = 0
@@ -231,17 +253,17 @@ class GameLogic():
self.current_piece = None
self.held_piece = None
self.time = 0
-
+
def new_game(self):
self.level = 0
self.score = 0
self.nb_lines = 0
self.goal = 0
self.time = 0
-
+
self.lock_delay = LOCK_DELAY
self.fall_delay = FALL_DELAY
-
+
self.matrix = [
[None for x in range(NB_COLS)]
for y in range(NB_LINES+3)
@@ -252,7 +274,7 @@ class GameLogic():
self.status = Status.PLAYING
self.new_level()
self.new_current_piece()
-
+
def new_level(self):
self.level += 1
self.goal += 5 * self.level
@@ -260,8 +282,7 @@ class GameLogic():
self.fall_delay = pow(0.8 - ((self.level-1)*0.007), self.level-1)
if self.level > 15:
self.lock_delay = 0.5 * pow(0.9, self.level-15)
- self.ui.display_new_level(self.level)
-
+
def new_current_piece(self):
self.current_piece = self.next_pieces.pop(0)
self.current_piece.position = MATRIX_PIECE_INIT_POSITION
@@ -286,13 +307,13 @@ class GameLogic():
and 0 <= position.y
and not self.matrix[position.y][position.x]
)
-
+
def can_move(self, potential_position, minoes_positions):
return all(
self.cell_is_free(potential_position+mino_position)
for mino_position in minoes_positions
)
-
+
def move(self, movement, prelock_on_stuck=True):
potential_position = self.current_piece.position + movement
if self.can_move(potential_position, self.current_piece.minoes_positions):
@@ -334,7 +355,7 @@ class GameLogic():
return True
else:
return False
-
+
def move_ghost(self):
self.ghost_piece.position = self.current_piece.position
self.ghost_piece.minoes_positions = self.current_piece.minoes_positions
@@ -343,13 +364,12 @@ class GameLogic():
self.ghost_piece.minoes_positions
):
self.ghost_piece.position += Movement.DOWN
-
+
def add_to_score(self, ds):
self.score += ds
if self.score > self.high_score:
self.high_score = self.score
- self.ui.update_score()
-
+
def soft_drop(self):
if self.move(Movement.DOWN):
self.add_to_score(1)
@@ -363,12 +383,12 @@ class GameLogic():
drop_score += 2
self.add_to_score(drop_score)
return drop_score
-
+
def lock(self):
if self.move(Movement.DOWN):
self.ui.cancel_prelock()
return
-
+
if all(
(mino_position + self.current_piece.position).y >= NB_LINES
for mino_position in self.current_piece.minoes_positions
@@ -377,9 +397,9 @@ class GameLogic():
self.ui.update_current_piece()
self.game_over()
return
-
+
self.ui.stop_fall()
-
+
for mino_position in self.current_piece.minoes_positions:
position = mino_position + self.current_piece.position
if position.y <= NB_LINES+3:
@@ -390,9 +410,10 @@ class GameLogic():
if all(mino for mino in line):
nb_lines_cleared += 1
self.matrix.pop(y)
- self.matrix.append([None for x in range(NB_COLS)])
- self.ui.update_matrix()
-
+ self.matrix.append([None for x in range(NB_COLS)])
+ if nb_lines_cleared:
+ self.nb_lines += nb_lines_cleared
+
if (
self.current_piece.__class__ == Tetromino.T
and self.current_piece.last_rotation_point_used is not None
@@ -404,7 +425,7 @@ class GameLogic():
b = not self.cell_is_free(position+self.T_SLOT[(orientation-1)%nb_orientations])
c = not self.cell_is_free(position+self.T_SLOT[(orientation-3)%nb_orientations])
d = not self.cell_is_free(position+self.T_SLOT[(orientation-2)%nb_orientations])
-
+
if self.current_piece.last_rotation_point_used == 5 or (a and b and (c or d)):
t_spin = T_Spin.T_SPIN
elif c and d and (a or b):
@@ -413,7 +434,7 @@ class GameLogic():
t_spin = T_Spin.NO_T_SPIN
else:
t_spin = T_Spin.NO_T_SPIN
-
+
if t_spin:
self.ui.display(t_spin)
if nb_lines_cleared:
@@ -421,28 +442,27 @@ class GameLogic():
self.combo += 1
else:
self.combo = -1
-
+
lock_score = 0
-
+
if nb_lines_cleared or t_spin:
- self.nb_lines += nb_lines_cleared
ds = self.SCORES[nb_lines_cleared][t_spin]
self.goal -= ds
ds *= 100 * self.level
lock_score += ds
self.ui.display(str(ds))
-
+
if self.combo >= 1:
self.ui.display("COMBO x%d" % self.combo)
ds = (20 if nb_lines_cleared==1 else 50) * self.combo * self.level
lock_score += ds
self.ui.display(str(ds))
-
+
if self.goal <= 0:
self.new_level()
-
+
self.add_to_score(lock_score)
-
+
self.new_current_piece()
def swap(self):
@@ -458,25 +478,27 @@ class GameLogic():
self.held_piece.position = HELD_PIECE_POSITION
self.held_piece.minoes_positions = self.held_piece.MINOES_POSITIONS
self.ui.new_held_piece()
- if not self.current_piece:
- self.new_current_piece()
- else:
+ if self.current_piece:
self.current_piece.position = MATRIX_PIECE_INIT_POSITION
+ self.ghost_piece = self.current_piece.ghost()
+ self.move_ghost()
self.ui.new_current_piece()
self.ui.start_fall()
-
+ else:
+ self.new_current_piece()
+
def game_over(self):
print("GAME OVER")
self.status = Status.OVER
self.ui.game_over()
-
+
class UI(arcade.Window):
-
+
def __init__(self):
locale.setlocale(locale.LC_ALL, '')
self.game = GameLogic(self)
-
+
self.actions = {
Status.PLAYING: {
arcade.key.LEFT: self.move_left,
@@ -507,12 +529,13 @@ class UI(arcade.Window):
}
}
self.autorepeatable_actions = (self.move_left, self.move_right, self.soft_drop)
-
+
super().__init__(
width = WINDOW_WIDTH,
height = WINDOW_HEIGHT,
title = WINDOW_TITLE,
- resizable = False
+ resizable = False,
+ antialiasing = False
)
self.bg_sprite = arcade.Sprite(WINDOW_BG)
self.matrix_minoes_sprites = arcade.SpriteList()
@@ -521,11 +544,19 @@ class UI(arcade.Window):
self.ghost_piece_sprites = arcade.SpriteList()
self.next_pieces_sprites = arcade.SpriteList()
self.matrix_sprite = arcade.Sprite(MATRIX_SPRITE_PATH)
- self.matrix_sprite.alpha = 100
+ self.matrix_sprite.alpha = MATRIX_SRITE_ALPHA
self.on_resize(self.width, self.height)
-
+ self.general_text = arcade.create_text(
+ text = TEXT,
+ color = TEXT_COLOR,
+ font_size = FONT_SIZE,
+ font_name = FONT_NAME,
+ anchor_x = 'right'
+ )
+
+
self.new_game()
-
+
def on_resize(self, width, height):
center_x = self.width / 2
center_y = self.height / 2
@@ -536,20 +567,17 @@ class UI(arcade.Window):
self.matrix_sprite.left = int(self.matrix_sprite.left)
self.matrix_sprite.top = int(self.matrix_sprite.top)
self.update_matrix()
- self.update_current_piece()
- self.update_held_piece()
- self.update_next_pieces()
-
+ if self.game.status in (Status.PLAYING, Status.OVER):
+ self.update_current_piece()
+ self.update_held_piece()
+ self.update_next_pieces()
+
def new_game(self):
self.pressed_actions = []
self.auto_repeat = False
- self.game.new_game()
- self.update_text()
arcade.schedule(self.clock, 1)
-
- def display_new_level(self, level):
- print("Level", level)
-
+ self.game.new_game()
+
def new_piece(self, piece):
piece_sprites = arcade.SpriteList()
for mino_position in piece.minoes_positions:
@@ -558,11 +586,11 @@ class UI(arcade.Window):
mino_sprite.alpha = NORMAL_ALPHA
piece_sprites.append(mino_sprite)
return piece_sprites
-
+
def new_held_piece(self):
self.held_piece_sprites = self.new_piece(self.game.held_piece)
self.update_held_piece()
-
+
def new_next_pieces(self):
self.next_pieces_sprites = arcade.SpriteList()
for piece in self.game.next_pieces:
@@ -572,12 +600,15 @@ class UI(arcade.Window):
mino_sprite.alpha = NORMAL_ALPHA
self.next_pieces_sprites.append(mino_sprite)
self.update_next_pieces()
-
+
def new_current_piece(self):
self.current_piece_sprites = self.new_piece(self.game.current_piece)
self.ghost_piece_sprites = self.new_piece(self.game.ghost_piece)
self.update_current_piece()
-
+ if self.pressed_actions:
+ self.stop_autorepeat()
+ arcade.schedule(self.repeat_action, AUTOREPEAT_DELAY)
+
def on_key_press(self, key, modifiers):
for key_or_modifier in (key, modifiers):
try:
@@ -590,7 +621,7 @@ class UI(arcade.Window):
self.stop_autorepeat()
self.pressed_actions.append(action)
arcade.schedule(self.repeat_action, AUTOREPEAT_DELAY)
-
+
def on_key_release(self, key, modifiers):
try:
action = self.actions[self.game.status][key]
@@ -602,7 +633,7 @@ class UI(arcade.Window):
if not self.pressed_actions:
self.stop_autorepeat()
arcade.schedule(self.repeat_action, AUTOREPEAT_DELAY)
-
+
def repeat_action(self, delta_time=0):
if self.pressed_actions:
self.pressed_actions[-1]()
@@ -613,59 +644,60 @@ class UI(arcade.Window):
else:
self.auto_repeat = False
arcade.unschedule(self.repeat_action)
-
+
def stop_autorepeat(self):
self.auto_repeat = False
arcade.unschedule(self.repeat_action)
-
+
def move_left(self, delta_time=0):
if self.game.move(Movement.LEFT):
self.update_current_piece()
-
+
def move_right(self, delta_time=0):
if self.game.move(Movement.RIGHT):
self.update_current_piece()
-
+
def soft_drop(self, delta_time=0):
if self.game.soft_drop():
self.update_current_piece()
-
+
def hard_drop(self, delta_time=0):
self.game.hard_drop()
self.lock()
-
+
def rotate_counterclockwise(self, delta_time=0):
if self.game.rotate(Rotation.COUNTERCLOCKWISE):
self.update_current_piece()
-
+
def rotate_clockwise(self, delta_time=0):
if self.game.rotate(Rotation.CLOCKWISE):
self.update_current_piece()
-
+
def fall(self, delta_time=0):
if self.game.move(Movement.DOWN):
self.update_current_piece()
-
+
def start_fall(self):
arcade.schedule(self.fall, self.game.fall_delay)
-
+
def stop_fall(self):
arcade.unschedule(self.fall)
-
+
def prelock(self, restart=False):
if restart:
self.cancel_prelock()
arcade.schedule(self.lock, self.game.lock_delay)
-
+
def cancel_prelock(self):
arcade.unschedule(self.lock)
-
+
def lock(self, delta_time=0):
self.game.lock()
-
+ self.update_matrix()
+
def swap(self, delta_time=0):
self.game.swap()
-
+
def pause(self, delta_time=0):
print("pause")
self.game.status = "paused"
@@ -673,73 +705,25 @@ class UI(arcade.Window):
self.cancel_prelock()
self.pressed_actions = []
self.stop_autorepeat()
-
+
def resume(self, delta_time=0):
self.game.status = "playing"
self.start_fall()
if self.game.current_piece.prelocked:
arcade.schedule(self.lock, self.game.lock_delay)
-
+
+ def game_over(self):
+ arcade.unschedule(self.repeat_action)
+ self.cancel_prelock()
+ self.stop_fall()
+ print("game over")
+
def display(self, string):
print(string)
-
- def on_draw(self):
- arcade.start_render()
- self.bg_sprite.draw()
- self.matrix_sprite.draw()
- if not self.game.status == "paused":
- self.matrix_minoes_sprites.draw()
- self.held_piece_sprites.draw()
- self.current_piece_sprites.draw()
- self.ghost_piece_sprites.draw()
- self.next_pieces_sprites.draw()
- arcade.render_text(
- self.text,
- self.matrix_sprite.left - TEXT_MARGIN,
- self.matrix_sprite.bottom
- )
-
+
def clock(self, delta_time=0):
- self.game.time += 1
- self.update_text()
-
- def update_text(self):
- t = time.localtime(self.game.time)
- text = """
-score{:>13n}
-high score{:>8n}
-time {:02d}:{:02d}:{:02d}
-leveL{:>13n}
-lines{:>13n}
-goal{:>14n}
+ self.game.time += delta_time
-
-move left ←
-move right →
-soft drop ↓
-hard drop SPACE
-rotate ↑
-clockwise
-rotate Z
-counterclockwise
-hold C
-pause ESC""".format(
- self.game.score,
- self.game.high_score,
- t.tm_hour-1, t.tm_min, t.tm_sec,
- self.game.level,
- self.game.nb_lines,
- self.game.goal
- )
- self.text = arcade.create_text(
- text = text,
- color = TEXT_COLOR,
- font_size = FONT_SIZE,
- font_name = FONT_NAME,
- anchor_x = 'right'
- )
- update_score = update_text
-
def update_matrix(self):
if self.game.matrix:
self.matrix_minoes_sprites = arcade.SpriteList()
@@ -752,7 +736,7 @@ pause ESC""".format(
mino_sprite.bottom = self.matrix_sprite.bottom + y*(mino_sprite.height-1)
mino_sprite.alpha = 200
self.matrix_minoes_sprites.append(mino_sprite)
-
+
def update_piece(self, piece, piece_sprites):
if piece:
for mino_sprite, mino_position in zip(
@@ -761,7 +745,7 @@ pause ESC""".format(
mino_position += piece.position
mino_sprite.left = self.matrix_sprite.left + mino_position.x*(mino_sprite.width-1)
mino_sprite.bottom = self.matrix_sprite.bottom + mino_position.y*(mino_sprite.height-1)
-
+
def update_next_pieces(self):
for n, piece in enumerate(self.game.next_pieces):
for mino_sprite, mino_position in zip(
@@ -770,10 +754,10 @@ pause ESC""".format(
mino_position += piece.position
mino_sprite.left = self.matrix_sprite.left + mino_position.x*(mino_sprite.width-1)
mino_sprite.bottom = self.matrix_sprite.bottom + mino_position.y*(mino_sprite.height-1)
-
+
def update_held_piece(self):
self.update_piece(self.game.held_piece, self.held_piece_sprites)
-
+
def update_current_piece(self):
if self.game.current_piece:
self.update_piece(self.game.current_piece, self.current_piece_sprites)
@@ -784,18 +768,49 @@ pause ESC""".format(
self.update_piece(self.game.ghost_piece, self.ghost_piece_sprites)
for mino_sprite in self.ghost_piece_sprites:
mino_sprite.alpha = GHOST_ALPHA
-
- def game_over(self):
- arcade.unschedule(self.repeat_action)
- self.cancel_prelock()
- self.stop_fall()
- print("game over")
-
+ def on_draw(self):
+ arcade.start_render()
+ self.bg_sprite.draw()
+ self.matrix_sprite.draw()
+ if not self.game.status == Status.PAUSED:
+ self.matrix_minoes_sprites.draw()
+ self.held_piece_sprites.draw()
+ self.current_piece_sprites.draw()
+ self.ghost_piece_sprites.draw()
+ self.next_pieces_sprites.draw()
+ arcade.render_text(
+ self.general_text,
+ self.matrix_sprite.left - TEXT_MARGIN,
+ self.matrix_sprite.bottom
+ )
+ t = time.localtime(self.game.time)
+ for y, text in enumerate(
+ (
+ "{:n}".format(self.game.nb_lines),
+ "{:n}".format(self.game.goal),
+ "{:n}".format(self.game.level),
+ "{:02d}:{:02d}:{:02d}".format(t.tm_hour-1, t.tm_min, t.tm_sec),
+ "{:n}".format(self.game.high_score),
+ "{:n}".format(self.game.score)
+ ),
+ start=14
+ ):
+ arcade.draw_text(
+ text = text,
+ start_x = self.matrix_sprite.left - TEXT_MARGIN,
+ start_y = self.matrix_sprite.bottom + y*TEXT_HEIGHT,
+ color = TEXT_COLOR,
+ font_size = FONT_SIZE,
+ align = 'right',
+ font_name = FONT_NAME,
+ anchor_x = 'right'
+ )
+
+
def main():
UI()
arcade.run()
-
+
if __name__ == "__main__":
main()
-
\ No newline at end of file