Skip to content

Commit cc434ba

Browse files
committed
Update
1 parent 9562c44 commit cc434ba

8 files changed

Lines changed: 136 additions & 23 deletions

File tree

assets/project.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"targets":[{"isStage":true,"name":"Stage","variables":{"`jEk@4|i[#Fk?(8x)AV.-my variable":["my variable",0]},"lists":{},"broadcasts":{},"blocks":{},"comments":{},"currentCostume":0,"costumes":[{"name":"backdrop1","dataFormat":"svg","assetId":"cd21514d0531fdffb22204e0ec5ed84a","md5ext":"cd21514d0531fdffb22204e0ec5ed84a.svg","rotationCenterX":240,"rotationCenterY":180}],"sounds":[],"volume":100,"layerOrder":0,"tempo":60,"videoTransparency":50,"videoState":"on","textToSpeechLanguage":"en"},{"isStage":false,"name":"Cosmicat","variables":{},"lists":{},"broadcasts":{},"blocks":{"KNkqO#ZRN@fbDVj=M78g":{"opcode":"motion_goto","next":"P/e)A725u]@f}wEHk?.n","parent":"*d+j3M@MRL0)j.{N/{Xq","inputs":{"TO":[1,"crRF9,OquYp)*m]if*h/"]},"fields":{},"shadow":false,"topLevel":false},"crRF9,OquYp)*m]if*h/":{"opcode":"motion_goto_menu","next":null,"parent":"KNkqO#ZRN@fbDVj=M78g","inputs":{},"fields":{"TO":["_random_",null]},"shadow":true,"topLevel":false},"*d+j3M@MRL0)j.{N/{Xq":{"opcode":"control_forever","next":null,"parent":"lG*7*6}d*sQN5:4`{r7[","inputs":{"SUBSTACK":[2,"KNkqO#ZRN@fbDVj=M78g"]},"fields":{},"shadow":false,"topLevel":false},"P/e)A725u]@f}wEHk?.n":{"opcode":"control_wait","next":null,"parent":"KNkqO#ZRN@fbDVj=M78g","inputs":{"DURATION":[1,[5,"0.25"]]},"fields":{},"shadow":false,"topLevel":false},"lG*7*6}d*sQN5:4`{r7[":{"opcode":"event_whenflagclicked","next":"*d+j3M@MRL0)j.{N/{Xq","parent":null,"inputs":{},"fields":{},"shadow":false,"topLevel":true,"x":180,"y":-100}},"comments":{},"currentCostume":0,"costumes":[{"name":"Cosmicat","bitmapResolution":1,"dataFormat":"svg","assetId":"9a4fb3ed82f74f5df24ade1a2aa48920","md5ext":"9a4fb3ed82f74f5df24ade1a2aa48920.svg","rotationCenterX":47.2514000162754,"rotationCenterY":57.860045289335886}],"sounds":[],"volume":100,"layerOrder":1,"visible":true,"x":0,"y":0,"size":100,"direction":90,"draggable":false,"rotationStyle":"all around"}],"monitors":[],"extensions":[],"meta":{"semver":"3.0.0","vm":"1.3.14","agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}}
1+
{"targets":[{"isStage":true,"name":"Stage","variables":{},"lists":{},"broadcasts":{},"blocks":{},"comments":{},"currentCostume":0,"costumes":[{"name":"backdrop1","dataFormat":"svg","assetId":"cd21514d0531fdffb22204e0ec5ed84a","md5ext":"cd21514d0531fdffb22204e0ec5ed84a.svg","rotationCenterX":240,"rotationCenterY":180}],"sounds":[],"volume":100,"layerOrder":0,"tempo":60,"videoTransparency":50,"videoState":"on","textToSpeechLanguage":"ro"},{"isStage":false,"name":"Cat 2","variables":{},"lists":{},"broadcasts":{},"blocks":{"?^q)qSDL?G9M_{|/iKKo":{"opcode":"event_whenflagclicked","next":"{$QhU(~Y{qa/r`=G{mGX","parent":null,"inputs":{},"fields":{},"shadow":false,"topLevel":true,"x":300,"y":340},"{$QhU(~Y{qa/r`=G{mGX":{"opcode":"control_repeat","next":"n?!h.4XtS|xZ{E!@:LIA","parent":"?^q)qSDL?G9M_{|/iKKo","inputs":{"TIMES":[1,[6,"24"]],"SUBSTACK":[2,"hqsMZs4WIfY8fR:Z$[V0"]},"fields":{},"shadow":false,"topLevel":false},"hqsMZs4WIfY8fR:Z$[V0":{"opcode":"motion_turnright","next":null,"parent":"{$QhU(~Y{qa/r`=G{mGX","inputs":{"DEGREES":[1,[4,"15"]]},"fields":{},"shadow":false,"topLevel":false},"n?!h.4XtS|xZ{E!@:LIA":{"opcode":"control_repeat","next":null,"parent":"{$QhU(~Y{qa/r`=G{mGX","inputs":{"TIMES":[1,[6,"24"]],"SUBSTACK":[2,"(n:YlSsRp5g^wzTXf%;G"]},"fields":{},"shadow":false,"topLevel":false},"(n:YlSsRp5g^wzTXf%;G":{"opcode":"motion_turnleft","next":null,"parent":"n?!h.4XtS|xZ{E!@:LIA","inputs":{"DEGREES":[1,[4,"15"]]},"fields":{},"shadow":false,"topLevel":false}},"comments":{},"currentCostume":0,"costumes":[{"name":"cat 2","bitmapResolution":1,"dataFormat":"svg","assetId":"a5be96044eb1c9e916de6d1c5818d89d","md5ext":"a5be96044eb1c9e916de6d1c5818d89d.svg","rotationCenterX":128.79883728212386,"rotationCenterY":36.22184985320345}],"sounds":[{"name":"meow2","assetId":"cf51a0c4088942d95bcc20af13202710","dataFormat":"wav","format":"","rate":44100,"sampleCount":26048,"md5ext":"cf51a0c4088942d95bcc20af13202710.wav"}],"volume":100,"layerOrder":1,"visible":true,"x":0,"y":0,"size":100,"direction":90,"draggable":false,"rotationStyle":"all around"}],"monitors":[],"extensions":[],"meta":{"semver":"3.0.0","vm":"1.2.54","agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"}}

background.png

777 Bytes
Loading

config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
# Project file name
2626
# If in test mode, set the Scratch project file to load.
27-
projectFileName: str = "projects/GtkPauseTest.sb3"
27+
projectFileName: str = "projects/Rotation2.sb3"
2828

2929
# Download cache size
3030
# Number of recent downloaded projects stored. 0 means infinity.

gui.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,11 @@
11
import gi
2-
from subprocess import PIPE, Popen
3-
from threading import Thread
4-
5-
from queue import Queue, Empty
2+
import os
3+
import sys
64

75
gi.require_version("Gtk", "3.0")
86
from gi.repository import Gtk
97

108

11-
def enqueue_output(out, queue):
12-
for line in iter(out.readline, b''):
13-
queue.put(line)
14-
out.close()
15-
16-
17-
p = Popen(['python', 'main.py'], stdout=PIPE, stdin=PIPE, bufsize=1, close_fds=True, universal_newlines=True)
18-
q = Queue()
19-
t = Thread(target=enqueue_output, args=(p.stdout, q))
20-
t.daemon = True # thread dies with the program
21-
t.start()
22-
23-
249
def pause(button):
2510
print("PAUSE", file=p.stdin)
2611
print("PAUSE")
@@ -44,5 +29,23 @@ def stop(button):
4429
window = builder.get_object("test")
4530
window.show_all()
4631

47-
if __name__ == '__main__':
32+
stdin = sys.stdin.fileno() # usually 0
33+
stdout = sys.stdout.fileno() # usually 1
34+
35+
parentStdin, childStdout = os.pipe()
36+
childStdin, parentStdout = os.pipe()
37+
pid = os.fork()
38+
if pid:
39+
# parent process
40+
os.close(childStdout)
41+
os.close(childStdin)
42+
os.dup2(parentStdin, stdin)
43+
os.dup2(parentStdout, stdout)
4844
Gtk.main()
45+
else:
46+
# child process
47+
os.close(parentStdin)
48+
os.close(parentStdout)
49+
os.dup2(childStdin, stdin)
50+
os.dup2(childStdout, stdout)
51+
os.execl("python", "main.py", "main.py")

projects/Time.sb3

41.7 KB
Binary file not shown.

sprite.png

3.15 KB
Loading

targetSprite.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,11 @@ def setXyDelta(self, dx, dy):
102102
def setRot(self, rot):
103103
self.direction = rot
104104
print(_("debug-prefix"), _("new-sprite-rotation", rot=rot, name=self.name), file=sys.stderr)
105-
center = self.sprite.get_rect().center
106-
self.sprite = pygame.transform.rotate(self.image, 90 - self.direction)
107-
self.rect = self.sprite.get_rect(center=center)
105+
center = self.sprite.get_rect().center # TODO get correct rotation centre of sprite
106+
print(center, (self.rect.x + center[0], self.rect.y + center[1]), (self.rect.x, self.rect.y), (self.x, self.y), self.direction)
107+
self.image = pygame.transform.rotate(self.sprite, 90 - self.direction)
108+
self.rect = self.image.get_rect(center=(self.rect.x + center[0], self.rect.y + center[1]))
109+
self.setXy(self.x, self.y)
108110

109111
# Relatively set self rotation (turn)
110112
def setRotDelta(self, drot):

test-gtk.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import pygame
2+
import os
3+
from gi.repository import GObject
4+
from gi.repository import Gtk
5+
from gi.repository import GdkX11
6+
7+
class GameWindow(Gtk.Window):
8+
def __init__(self):
9+
Gtk.Window.__init__(self)
10+
vbox = Gtk.VBox(False, 2)
11+
vbox.show()
12+
self.add(vbox)
13+
14+
#create the menu
15+
file_menu = Gtk.Menu()
16+
17+
accel_group = Gtk.AccelGroup()
18+
self.add_accel_group(accel_group)
19+
20+
dialog_item = Gtk.MenuItem()
21+
dialog_item.set_label("Dialog")
22+
dialog_item.show()
23+
dialog_item.connect("activate",self.show_dialog)
24+
file_menu.append(dialog_item)
25+
dialog_item.show()
26+
27+
quit_item = Gtk.MenuItem()
28+
quit_item.set_label("Quit")
29+
quit_item.show()
30+
quit_item.connect("activate",self.quit)
31+
file_menu.append(quit_item)
32+
quit_item.show()
33+
34+
menu_bar = Gtk.MenuBar()
35+
vbox.pack_start(menu_bar, False, False, 0)
36+
menu_bar.show()
37+
38+
file_item = Gtk.MenuItem()
39+
file_item.set_label("_File")
40+
file_item.set_use_underline(True)
41+
file_item.show()
42+
43+
file_item.set_submenu(file_menu)
44+
menu_bar.append(file_item)
45+
46+
#create the drawing area
47+
da = Gtk.DrawingArea()
48+
da.set_size_request(300,300)
49+
da.show()
50+
vbox.pack_end(da, False, False, 0)
51+
da.connect("realize",self._realized)
52+
53+
#set up the pygame objects
54+
self.image = pygame.image.load("sprite.png")
55+
self.background = pygame.image.load("background.png")
56+
self.x = 150
57+
self.y = 150
58+
59+
#collect key press events
60+
self.connect("key-press-event", self.key_pressed)
61+
62+
def key_pressed(self, widget, event, data=None):
63+
if event.keyval == 65361:
64+
self.x -= 5
65+
elif event.keyval == 65362:
66+
self.y -= 5
67+
elif event.keyval == 65363:
68+
self.x += 5
69+
elif event.keyval == 65364:
70+
self.y += 5
71+
72+
def show_dialog(self, widget, data=None):
73+
#prompts.info("A Pygtk Dialog", "See it works easy")
74+
title = "PyGame embedded in Gtk Example"
75+
dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL,(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK))
76+
content_area = dialog.get_content_area()
77+
label = Gtk.Label("See, it still works")
78+
label.show()
79+
content_area.add(label)
80+
response = dialog.run()
81+
dialog.destroy()
82+
83+
def quit(self, widget, data=None):
84+
self.destroy()
85+
86+
def draw(self):
87+
self.screen.blit(self.background,[0,0])
88+
89+
rect = self.image.get_rect()
90+
rect.x = self.x
91+
rect.y = self.y
92+
self.screen.blit(self.image, rect)
93+
pygame.display.flip()
94+
95+
return True
96+
97+
def _realized(self, widget, data=None):
98+
os.putenv('SDL_WINDOWID', str(widget.get_window().get_xid()))
99+
pygame.init()
100+
pygame.display.set_mode((300, 300), 0, 0)
101+
self.screen = pygame.display.get_surface()
102+
GObject.timeout_add(200, self.draw)
103+
104+
if __name__ == "__main__":
105+
window = GameWindow()
106+
window.connect("destroy",Gtk.main_quit)
107+
window.show()
108+
Gtk.main()

0 commit comments

Comments
 (0)