Môj problém v tom, ako to urobiť, myslím leží tu:
1/ Kreslím všetky objekty naraz pomocou draw:

def draw():
    window.clear()
ďalší kód
            # Draw
            main_batch.draw(

a tu:
window.push_handlers(
    on_draw=draw,
)


2/ main_batch plním do spritov tu:
main_batch = pyglet.graphics.Batch()

class SpaceObject():
    def __init__(self, ostatné veci)
        self.sprite = pyglet.sprite.Sprite(image, batch=main_batch)

3/ a potom konkrétny image, ktorý to má hodiť, vyberám v jednotlivých 
objektoch:

class Spaceship(SpaceObject) a class Asteroid(SpaceObject)

- keďže chcem každý kruh aby bral do úvahy hodnoty x, y, radium toho 
konkrétneho objektu, tak mi dáva zmsel tú draw_circle funkciu zavolať v 
rámci classy Spaceship a Asteroid.

Takže... kedže nejde nahradiť image v sprite tým kruhom, pretože sprite 
potrebuje png, a navyše ten kruh aj tak chceme okolo toho obrázku... tak mi 
ostáva už jedine to, aby som si zavolala draw_circle v rámci každého z tých 
objektov a použiť tam self.x, self.y a self.radium. Až na to, že to som 
skúšala, a vždy mi to napísalo, že x y a radium sú unidentified :(

Kde je v tejto mojej logike chyba? 

Druhá vec, čo ma napadla, je upraviť funkciu draw, a po main_batch.draw() 
zavolať draw_circle, ale v tom prípade predsa nemá odkiaľ vziať hodnoty x, 
y a radium... 

Veľmi ďakujem, kľudne si môžeš dať načas s odpovedaním, nechcem ťa preťažiť 
:) 

Heli






Dne pátek 8. května 2020 19:16:02 UTC+2 Petr Viktorin napsal(a):
>
> On 2020-05-08 18:06, Helena Zubčeková wrote: 
> > Ahoj, 
> > 
> > Prichádzam s ďalšou otázkou - tentokrát v záverečnom projekte Asteroids. 
> > Tu je zadanie: 
> > "Aby bylo vidět co si hra o objektech „myslí”, nakresli si nad každým 
> > objektem příslušné kolečko. Nejlepší je to udělat pomocí pyglet.gl 
> > <http://pyglet.readthedocs.org/en/latest/programming_guide/gl.html> a 
> > trochy matematiky; pro teď si jen opiš funkci |draw_circle| a pro každý 
> > objekt ji zavolej. Až to bude všechno fungovat, můžeš funkci dát pryč." 
> > 
> > Nie je problém nakresliť kruh... ale nakresliť kruh okolo objektu tak, 
> > aby sa pohyboval spolu s ním? Neviem na to prísť a googlenie nepomáha. 
> > "pro každý objekt ji zavolej" vyzerá jednoznačne, ale aj tak na to 
> > neviem prísť. 
> > Stripe každého objektu je to, kde je zaznamenaná jeho pozícia, takže tam 
> > by som čakala, že potrebujem pridať ten kuh.. ale stripe očakáva image 
> > objektu, nie funkciu... Ak mu miesto obrázku dám funkciu, tak mi spadne 
> > na tom, že pyglet nedostáva žiadnu texture (čo dáva zmysel, nie je to 
> > obrázok...) 
> > 
> > Alebo to zadanie nie je tak myslené, že okolo každého objektu (jeho 
> > obrázka) má byť kruh? Čiže majú mi tam "poletovať" normálne meteority a 
> > spaceship, akurát je okolo nich ešte kruh? 
>
> Presně tak. Mohlo by to vypadat třeba takhle: https://imgur.com/a/CP9pAsO 
>
> Nesnaž se kruhy dávat do Sprite; pro každý objekt nakresli napřed Sprite 
> a potom kruh. 
>

-- 
-- 
E-mailová skupina [email protected]
Správa: http://groups.google.cz/group/django-cs
--- 
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs 
ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete 
e-mail na adresu [email protected].
Chcete-li zobrazit tuto diskusi na webu, navštivte 
https://groups.google.com/d/msgid/django-cs/8aad8535-7786-403b-a714-db6294ae4c1a%40googlegroups.com.
import math
import random
import pyglet
from pyglet import gl
from pyglet.window import key

WIDTH = 800
HEIGHT = 600
ROTATION_SPEED = 200 # radians per second
ACCELERATION = 300
ASTEROID_SPEED = 100
ASTEROID_ROTATION_SPEED = 3
SPACESHIP_RADIUS = 40
ASTEROID_RADIUSES = {
	1: 8,
	2: 15,
	3: 20,
	4: 42,
}

def load_image(filename):
	image = pyglet.image.load(filename)
	image.anchor_x = image.width // 2
	image.anchor_y = image.height // 2
	return image

# Images from www.kenney.nl, thank you!
# Public Domain (Creative Commons CC-0)
spaceship_img = load_image('resources/SpaceShooterRedux/PNG/playerShip2_red.png')
space_img = load_image('resources/SpaceShooterRedux/Backgrounds/blue.png')
asteroid_images = {
	1: [load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_tiny1.png'),
		load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_tiny2.png'),
	   ],
	2: [load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_small1.png'),
		load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_small2.png'),
	   ],
	3: [load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_med1.png'),
		load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_med2.png'),
	   ],
	4: [load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_big1.png'),
		load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_big3.png'),
		load_image('resources/SpaceShooterRedux/PNG/Meteors/meteorGrey_big4.png'),
	   ],
}


pressed_keys = set()
objects = []
main_batch = pyglet.graphics.Batch()
window = pyglet.window.Window(width=WIDTH, height=HEIGHT)

def draw_circle(x, y, radius):
    iterations = 20
    s = math.sin(2*math.pi / iterations)
    c = math.cos(2*math.pi / iterations)

    dx, dy = radius, 0

    gl.glBegin(gl.GL_LINE_STRIP)
    for i in range(iterations+1):
        gl.glVertex2f(x+dx, y+dy)
        dx, dy = (dx*c - dy*s), (dy*c + dx*s)
    gl.glEnd()

class SpaceObject():
	kind = None

	def __init__(self, window, image, x, y, radius, 
				x_speed=0, y_speed=0,rotation=0, batch=main_batch):
		self.window = window
		self.x = x
		self.y = y
		self.x_speed = x_speed
		self.y_speed = y_speed
		self.radius = radius
		self.rotation = rotation
		self.sprite = pyglet.sprite.Sprite(image, batch=main_batch)
		# počiatočná pozícia objektu sa nastaví až v tick fcii, ie: self.sprite.x

	def tick(self, dt):		
		self.x += dt * self.x_speed
		self.y += dt * self.y_speed

		# aby sa objekt nestrácal v priestore za hranicami obrazovky
		if self.x < 0:
			self.x += self.window.width
		if self.y < 0:
			self.y += self.window.height
		if self.x > self.window.width:
			self.x -= self.window.width
		if self.y > self.window.height:
			self.y -= self.window.height

		# aby sa hrátky s x, y a rotation prejavili na vykreslenom objekte
		self.sprite.x = self.x
		self.sprite.y = self.y		
		""" funkce math.sin a math.cos používají radiány, 
		kdežto pyglet používá pro Sprite.rotation stupně. 
		(A k tomu je navíc 0° jinde, a otáčí se na opačnou stranu.) 
		Pro sprite je tedy potřeba úhel převést: """
		self.sprite.rotation = 90 - self.rotation 

class Spaceship(SpaceObject):
	def __init__(self, window, rotation=0):
		super().__init__(window=window,
						image=spaceship_img,
						x=window.width / 2,
						y=window.height / 2,
						rotation=rotation,
						radius=SPACESHIP_RADIUS
						)

	def tick(self, dt):
		if pyglet.window.key.LEFT in pressed_keys:
			self.rotation += dt * ROTATION_SPEED
		if pyglet.window.key.RIGHT in pressed_keys:
			self.rotation -= dt * ROTATION_SPEED
		if pyglet.window.key.UP in pressed_keys:
			rotation_radians = math.radians(self.rotation)
			self.x_speed += dt * ACCELERATION * math.cos(rotation_radians)
			self.y_speed += dt * ACCELERATION * math.sin(rotation_radians)
		if pyglet.window.key.DOWN in pressed_keys:
			rotation_radians = math.radians(self.rotation)
			self.x_speed -= dt * ACCELERATION * math.cos(rotation_radians)
			self.y_speed -= dt * ACCELERATION * math.sin(rotation_radians)	
		super().tick(dt)	

class Asteroid(SpaceObject):
	kind = "asteroid"
	def __init__(self, window, size):
		# Asteroids start at edges of the screen, so they don't
		# initially collide with the ship
		edge = random.choice(["horizontal", "vertical"])
		if edge == "horizontal":
			x = random.randrange(window.width)
			y = 0
		else:
			x = 0
			y = random.randrange(window.height)
		super().__init__(window=window,
						image=random.choice(asteroid_images[size]),
						x=x, y=y,
						x_speed=random.uniform(-ASTEROID_SPEED, ASTEROID_SPEED),
						y_speed=random.uniform(-ASTEROID_SPEED, ASTEROID_SPEED),
						rotation=random.uniform(0, 360),
						radius=ASTEROID_RADIUSES[size])
		self.size = size
		self.rotation_speed = random.uniform(-ASTEROID_ROTATION_SPEED, ASTEROID_ROTATION_SPEED)

	def tick(self, dt):
		self.rotation += self.rotation_speed
		super().tick(dt)	


def draw():
	window.clear()

	#draw background
	for x in range(0, window.width+space_img.width, space_img.width):
		for y in range(0, window.height+space_img.height, space_img.height):
			space_img.blit(x=x, y=y)

	#draw everything in batch
	for x_offset in (-window.width, 0, window.width):
		for y_offset in (-window.height, 0, window.height):
			# Remember the current state
			gl.glPushMatrix()
			# Move everything drawn from now on by (x_offset, y_offset, 0)
			gl.glTranslatef(x_offset, y_offset, 0)
			# Draw
			main_batch.draw()
			# Restore remembered state (this cancels the glTranslatef)
			gl.glPopMatrix()

def tick(dt):
	for obj in objects:
		obj.tick(dt)

def key_pressed(key, mod):
	pressed_keys.add(key)

def key_released(key, mod):
	pressed_keys.discard(key)	

def start_level():
	objects.append(Asteroid(window, 4))



window.push_handlers(
	on_draw=draw,
	on_key_press=key_pressed,
	on_key_release=key_released,
)

pyglet.clock.schedule(tick)

ship = Spaceship(window)
objects.append(ship)
start_level()

pyglet.app.run()

Reply via email to