This commit is contained in:
Benjamín 2021-09-03 16:44:18 +02:00
parent 009e23ea7f
commit 90154e37a8
12 changed files with 98 additions and 26 deletions

2
.gitignore vendored

@ -128,3 +128,5 @@ dmypy.json
# Pyre type checker
.pyre/
UI/Render

@ -1,7 +1,8 @@
import copy
import math
import pygame
from numpy import array as a
from Objects.Scene import Scene
from UI.Objects.Scene import Scene
class Multiscene(Scene):
@ -71,6 +72,15 @@ class Multiscene(Scene):
self.resize_subscenes()
def update_mouse_events(self, mouse_pos, clicked):
mouse_pos = a(mouse_pos)
self.mouse_pos = self.inverse_matrix @ mouse_pos
self.clicked = clicked
for subscene in self.subscenes:
subscene.mouse_pos = (subscene.inverse_matrix @ (mouse_pos - (self.matrix @ subscene.position)))
subscene.clicked = clicked
def progress(self):
self.progress_subscenes()
@ -82,6 +92,14 @@ class Multiscene(Scene):
for subscene in self.subscenes:
subscene.progress()
def get_i_objects(self):
i_objects = copy.copy(self.i_objects)
for subscene in self.subscenes:
i_objects += subscene.get_i_objects()
return i_objects
@staticmethod
def to_ints(iterable):
for i in range(len(iterable)):

@ -1,5 +1,5 @@
import pygame.transform
from Objects.Screen import Screen
from UI.Objects.Screen import Screen
from numpy import array as a
@ -14,6 +14,8 @@ class Scene(Screen):
self.nrd_objects = [] # non-rescalable dynamic Objects
self.nrc_objects = [] # non-rescalable controllable Objects
self.i_objects = [] # interactive Objects
self.position = a([0, 0])
self.multiscene = None
@ -52,3 +54,6 @@ class Scene(Screen):
def progress(self):
pass
def get_i_objects(self):
return self.i_objects

@ -1,5 +1,5 @@
import math
from numpy import array as a
import math
import pygame

@ -12,13 +12,13 @@ class RopeInteractiveDot:
self.scene = scene
def blit(self):
pygame.draw.circle(self.scene.s, self.color, self.scene.matrix @ self.position, self.r)
pygame.draw.circle(self.scene.s, self.color, self.scene.matrix @ self.position, self.r * self.scene.pd_)
def input(self, mouse_pos, clicked):
self.position = mouse_pos
if clicked:
for object_ in self.scene.nrd_objects:
for object_ in self.scene.get_i_objects():
if object_.__class__.__name__ == "Rope":
for node in object_.nodes:
if node.locked is False:

@ -36,7 +36,7 @@ class Rope:
self.a.position = center - connection_vector
def __init__(self, position, length, nodes_n, nodes_r, rope_width, scene, gravity=2, start_angle=1,
balance_amount=20, node_color=(255, 100, 100), rope_color=(255, 160, 160)):
balance_amount=10, node_color=(255, 100, 100), rope_color=(255, 160, 160)):
self.position = position
self.length = length
self.nodes_n = nodes_n
@ -76,6 +76,8 @@ class Rope:
def blit(self):
if self.pd_ != self.scene.pd_:
self.pd_ = self.scene.pd_
self.rescaled_rope_segment_length = self.rope_segment_length * self.pd_
self.rescaled_nodes_r = self.nodes_r * self.pd_
self.rescaled_rope_width = self.rope_width * self.pd_
@ -87,10 +89,11 @@ class Rope:
pygame.draw.line(self.scene.s, self.rope_color,
self.scene.matrix @ self.nodes[i].position,
self.scene.matrix @ self.nodes[i + 1].position,
int(self.rescaled_rope_width))
max(1, int(self.rescaled_rope_width)))
for node in self.nodes:
pygame.draw.circle(self.scene.s, self.node_color, self.scene.matrix @ node.position, self.rescaled_nodes_r)
pygame.draw.circle(self.scene.s, self.node_color, self.scene.matrix @ node.position,
max(1, self.rescaled_nodes_r))
@staticmethod
def to_ints(iterable):

@ -1,6 +1,5 @@
from Objects.Multiscene import Multiscene
from Scenes.BasicScene import BasicScene
from Objects.r_objects import *
from UI.Objects.Multiscene import Multiscene
from UI.Scenes.BasicScene import BasicScene
from numpy import array as a
from UI.Objects.nr_objects.Line import Line

@ -1,5 +1,4 @@
from Objects.Scene import Scene
from Objects.r_objects import *
from UI.Objects.Scene import Scene
from numpy import array as a
from UI.Objects.nr_objects.Ellipse import Ellipse

@ -1,5 +1,5 @@
from Objects.Multiscene import Multiscene
from Scenes.BasicMultiscene import BasicMultiscene
from UI.Objects.Multiscene import Multiscene
from UI.Scenes.BasicMultiscene import BasicMultiscene
from numpy import array as a
from UI.Objects.nr_objects.Line import Line

@ -0,0 +1,43 @@
from numpy import array as a
from UI.Objects.Multiscene import Multiscene
from UI.Objects.nr_objects.Line import Line
from UI.Objects.nr_objects.controllable_objects.RopeInteractiveDot import RopeInteractiveDot
from UI.Scenes.RopeScene import RopeScene
class RopeMultiscene(Multiscene):
def __init__(self, scene_size):
self.s__size = [800, 400]
super().__init__(self.s__size[0], self.s__size[1], scene_size)
s0 = RopeScene([200, 400])
self.subscenes.append(s0)
s1 = RopeScene([600, 400])
s1.position = a([200, 0])
self.subscenes.append(s1)
l0 = Line(a([200, 0]), a([200, 400]), 10, (255, 100, 100), self)
self.nr_objects.append(l0)
rd0 = RopeInteractiveDot(a([0, 0]), 10, (100, 255, 100), 20, 100, self)
#self.nrc_objects.append(rd0)
self.i = 0
def progress(self):
if self.i == 1:
self.subscenes[0].subscene_size[0] += 2
self.subscenes[1].subscene_size[0] -= 2
self.subscenes[1].position[0] += 2
self.nr_objects[0].a[0] += 2
self.nr_objects[0].b[0] += 2
self.resize_subscenes()
self.i = 0
else:
self.i += 1

@ -1,4 +1,4 @@
from Objects.Scene import Scene
from UI.Objects.Scene import Scene
from numpy import array as a
import pygame
@ -9,14 +9,15 @@ from UI.Objects.nr_objects.controllable_objects.RopeInteractiveDot import RopeIn
class RopeScene(Scene):
def __init__(self, scene_size, bg=(60, 60, 60)):
s__size = [600, 400]
self.s__size = [600, 400]
super().__init__(s__size[0], s__size[1], scene_size, bg)
super().__init__(self.s__size[0], self.s__size[1], scene_size, bg)
r0 = Rope(a([300, 50]), 200, 40, 2, 2, self)
r0 = Rope(a([300, 50]), 200, 20, 2, 2, self)
self.nrd_objects.append(r0)
self.i_objects.append(r0)
rd0 = RopeInteractiveDot(a([100, 100]), 10, (100, 255, 100), 20, 100, self)
rd0 = RopeInteractiveDot(a([0, 0]), 10, (100, 255, 100), 20, 100, self)
self.nrc_objects.append(rd0)
pygame.mouse.set_visible(False)

@ -1,15 +1,17 @@
import pygame.mouse
from Scenes.BasicScene import BasicScene
from Scenes.BasicMultiscene import BasicMultiscene
from Scenes.MultisceneInMultiscene import MultisceneInMultiscene
from Scenes.RopeScene import RopeScene
from UI.Scenes.BasicScene import BasicScene
from UI.Scenes.BasicMultiscene import BasicMultiscene
from UI.Scenes.MultisceneInMultiscene import MultisceneInMultiscene
from UI.Scenes.RopeScene import RopeScene
from UI.Scenes.RopeMultiscene import RopeMultiscene
from numpy import array as a
import time
screen_size = a([200, 500])
scene = MultisceneInMultiscene(screen_size)
scene = RopeScene(screen_size)
mouse_pos = [0, 0]
clicked = False
@ -20,7 +22,7 @@ for i in range(400):
scene.update()
scene.update_mouse_events(pygame.mouse.get_pos(), pygame.mouse.get_pressed(3)[0])
scene.progress()
scene.save(f"Render/{i}.png", [800, 800])
#scene.save(f"Render/{i}.png", [800, 800])
if i < 150:
screen_size[0] += 3