Obracanie postaci w poziomie

0

Chciałbym zrobić ,że gdy kliknę strzałkę w prawo (Porusza ona entity 'gladiator' w prawo) to wtedy postać obraca się w prawo (domyślnie jest obrócona w lewo)
Kod to:

from ursina import*


def update():
    if held_keys['left arrow']:
        gladiator.x -= 1 * 0.1
    if held_keys['right arrow']:
        gladiator.x += 1 * 0.1
    if held_keys['down arrow']:
        gladiator.y -= 1 * 0.1
    if held_keys['up arrow']:
        gladiator.y += 1 * 0.1
    if held_keys['a']:
        gladiator2.x -= 1 * 0.1
    if held_keys['d']:
        gladiator2.x += 1 * 0.1
    if held_keys['s']:
        gladiator2.y -= 1 * 0.1
    if held_keys['w']:
        gladiator2.y += 1 * 0.1


app = Ursina()


window.borderless = False
window.title = 'Gladiator fight'
window.fullscreen = True
gladiator_texture = load_texture(r'assets\gladiator-left.gif')
gladiator = Entity(model='quad', texture=gladiator_texture, scale=(4, 4), position=(3, 0))
gladiator2_texture = load_texture(r'assets\gladiator - right.gif')
gladiator2 = Entity(model='quad', texture=gladiator2_texture, scale=(4, 4), position=(-3, 0))



app.run()
1

Wiesz już jak obracać postać: Jak obracać postać w Ursinie gdy zmienia kierunek?

Widocznie nie rozumiesz jak działa obrót obiektu w przestrzeni 3D i nie potrafisz sobie wyobrazić pod jakim kątem trzeba obrócić obrazek, aby uzyskać zamierzony efekt.

Jeśli postać będzie domyślnie obrócona w prawo, to będzie zgodnie ze sztuką, bo tak wygląda 0 stopni w układzie współrzędnych.

Jeśli nie chce Ci się modyfikować grafiki postaci, to po prostu obrót wokół osi Z będzie się zawsze różnił o 180 stopni.
W lewo to 0 stopni. W prawo to 180 stopni. W górę to -90 stopni. W dół to 90 stopni.

Zrobiłbyś trochę eksperymentów z kodem, który Ci podałem w poprzednim wątku i byś doszedł do odpowiednich wartości.

0

@Spine: Problem jest w tym ,że próbowałem; 180 to do góry nogami, 90, do góry itd. to gdy postać jest obrócona w lewo, ja chciałbym uzyskać efekt odbicia lustrzanego. Wiem że można dać rotation_y, ale wtedy obraca sie stopniowo i potem znika, a na y = 180 to znika gdy kliknę przycisk który odpowiada za ten ruch

1

Nie napisałeś w jakim Świecie porusza się Twoja postać.
Z Twojego kodu wynika, że masz widok Top Down (jak np. w GTA 2) - bo postać porusza się strzałkami w górę i w dół.

na y = 180 to znika gdy kliknę przycisk który odpowiada za ten ruch

Czemu nie używasz Sprite zamiast Entity?
https://www.ursinaengine.org/entity_basics.html - nagłówek Texture.

Pytam, bo pewnie Ursina renderuje Twoje obrazki tylko na jednej stronie prostokąta. Dlatego po obrocie o 180 stopni wokół osi Y nic nie widać.
Być może Sprite ma dwustronny rendering i to by załatwiło sprawę.

W ostateczności możesz użyć skalowania.

    if held_keys['left arrow']:
        gladiator.x -= 1 * 0.1
        gladiator.scale_x = 4
    if held_keys['right arrow']:
        gladiator.x += 1 * 0.1
        gladiator.scale_x = -4

Tylko nie jestem pewien, czy to będzie działać, bo tutaj pokazują tylko jeden sposób ustawiania skali: https://www.ursinaengine.org/entity_basics.html
Ale analogicznie do obrotu to powinno działać.

0

@Spine: Niewiem jak użyć sprita, a teraz to mi kompletnie program świruje, świata nie zmieniałem

0
XokoKnight napisał(a):

świata nie zmieniałem

Chodziło mi o to, że nie wiem co się robi w Twojej grze.
Np. jak chodzisz i skaczesz, to masz normalną platformówkę.
Ale jak chodzisz w dowolnym kierunku, to masz widok z góry.

XokoKnight napisał(a):

a teraz to mi kompletnie program świruje

Bez konkretów ciężko cokolwiek doradzić...
Kod źródłowy, screenshot, opis problemu.

XokoKnight napisał(a):

@Spine: Niewiem jak użyć sprita

Napisałem Ci już. Tutaj masz napisane jak użyć sprita:
https://www.ursinaengine.org/entity_basics.html - nagłówek Texture.

0

@Spine: po prostu chodzę w dowolnym kierunku, gdy używam twojego kodu ze skalowaniem postać co chwilę znika i się pojawia. Kod źródłowy:

from ursina import*


def update():
    if held_keys['left arrow']:
        gladiator.x -= 1 * 0.1
    if held_keys['right arrow']:
        gladiator.x += 1 * 0.1
    if held_keys['down arrow']:
        gladiator.y -= 1 * 0.1
    if held_keys['up arrow']:
        gladiator.y += 1 * 0.1
    if held_keys['a']:
        gladiator2.x -= 1 * 0.1
    if held_keys['d']:
        gladiator2.x += 1 * 0.1
    if held_keys['s']:
        gladiator2.y -= 1 * 0.1
    if held_keys['w']:
        gladiator2.y += 1 * 0.1
    if held_keys['left arrow']:
        gladiator.x -= 1 * 0.1
        gladiator.rotation_z = 0
    if held_keys['right arrow']:
        gladiator.x += 1 * 0.1
        gladiator.rotation_z = 90
    if held_keys['down arrow']:
        gladiator.y -= 1 * 0.1
        gladiator.rotation_z = 0
    if held_keys['left arrow']:
        gladiator.x -= 1 * 0.1
        gladiator.scale_x = 4
    if held_keys['right arrow']:
        gladiator.x += 1 * 0.1
        gladiator.scale_x = -4



app = Ursina()


window.borderless = False
window.title = 'Gladiator fight'
window.fullscreen = True
gladiator_texture = load_texture(r'assets\gladiator-left.gif')
gladiator = Entity(model='quad', texture=gladiator_texture, scale=(4, 4), position=(3, 0))
gladiator2_texture = load_texture(r'assets\gladiator - right.gif')
gladiator2 = Entity(model='quad', texture=gladiator2_texture, scale=(4, 4), position=(-3, 0))


app.run()
0

Dopisz do twoich Entity, że są dwustronne.
Wtedy nawet rotacja wokół osi Y powinna działać.
Pewnie to skalowanie ma ten sam problem.

gladiator_texture = load_texture(r'assets\gladiator-left.gif')
gladiator = Entity(model='quad', texture=gladiator_texture, scale=(4, 4), position=(3, 0), double_sided = True)
gladiator2_texture = load_texture(r'assets\gladiator - right.gif')
gladiator2 = Entity(model='quad', texture=gladiator2_texture, scale=(4, 4), position=(-3, 0), double_sided = True)

Tutaj znalazłem parametry Entity: https://www.ursinaengine.org/cheat_sheet.html

0

@Spine: Popróbuje z tym, a jest jakaś opcja żeby po prostu obrócić w poziomie? Bo ja ogólnie jestem dosyć nowy w programowaniu, a zwłaszcza w ursinie
Obracanie w osi y nic mi nie dało żeby uzyskać ten efekt

0
XokoKnight napisał(a):

@Spine: Popróbuje z tym, a jest jakaś opcja żeby po prostu obrócić w poziomie?
...
Obracanie w osi y nic mi nie dało żeby uzyskać ten efekt

Znalazłem też, że Entity ma metodę flip_faces().
Tylko jeśli to robi to co myślę, to będzie trzeba jakoś zabezpieczyć, żeby wykonywała się tylko raz przy zmianie kierunku.

Mniejsza z tym. Zauważyłem, że nie wprowadzałeś moich poprawek, tylko doklejałeś kolejne linijki obsługi tych samych klawiszy...
Miałeś np. zamienić kod pod if held_keys['left arrow']: na to co napisałem, a nie doklejać pod spodem.
Tak więc jak ktoś przy Twoim obecnym kodzie wciśnie strzałkę w lewo, to wykona się:

gladiator.x -= 1 * 0.1
gladiator.x -= 1 * 0.1
gladiator.rotation_z = 0
gladiator.x -= 1 * 0.1
gladiator.scale_x = 4

Usuń nadmiarowe obsługi klawiszy. Każdy klawisz obsługuj raz. Obracanie sprite wykonuj ALBO przez rotację, ALBO przez skalowanie. Teraz masz obie rzeczy na raz. Jak np. idziesz w prawo, to postać "obraca się" dwa razy, więc to wygląda jakby obrót nie nastąpił.

XokoKnight napisał(a):

Bo ja ogólnie jestem dosyć nowy w programowaniu, a zwłaszcza w ursinie

Jeśli nikt Cię nie zmusza do używania tego silnika, to uciekaj.
Ciężko w ogóle coś wygooglować na ten temat.
Wygląda to na jakąś niszową technologię, która nie zdobyła i prawdopodobnie nie zdobędzie dużej społeczności.

Jakbyś robił grę w Unity i wpisałbyś w google swoje pytania o obracanie, to znalazłbyś bardzo dużo tematów na forach oraz filmiki pokazujące jak to zrobić.

Jeśli chcesz zostać przy Pythonie i robisz grę 2D, to znacznie łatwiej będzie Ci osiągać rezultaty w pygame, albo nawet pobaw się pygame zero.

https://www.pygame.org/
https://pygame-zero.readthedocs.io/en/stable/introduction.html

pygame ma wieloletnią historię. Przez co jakaś tam społeczność powstała i jest pełno materiałów dla początkujących.
Ursina ma raptem 4 lata.

1 użytkowników online, w tym zalogowanych: 0, gości: 1