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()