Как сделать два отдельных поворота совпадения объектов в Pygame - PullRequest
0 голосов
/ 18 января 2019

Я делаю своего рода римейк астероида, одним из самых важных вещей в астероидах является тот факт, что пули вращаются, чтобы соответствовать направлению объектов. Мне удалось заставить пули выходить из корабля, но он остается в том же вертикальном положении. Я хотел бы сделать вращение пули в соответствии с кораблем, чтобы было похоже, что пули выходят из корабля. Мой код, к сожалению, длинный, но я не знаю, что взять, чтобы сделать его более компактным. Я просто попытался добавить комментарии и надеюсь, что я думаю. Любая помощь очень ценится. Подавляющее большинство действий происходит в коде «MOUSEBUTTONDOWN». У меня уже есть функция «поворота» для корабля, я думаю, может быть, нам просто нужно это использовать, но я не могу ее реализовать.

Изображение для корабля

Изображение для пули, которую я хочу повернуть

import pygame as game
import pygame.math as math
import random as r

'''
Here I defined things

'''
game.init()


game.display.set_caption("Asteroids")
screen = game.display.set_mode([800,600])
gameon=True
bgcolor = game.color.Color("#FFFFFF")
ship = game.image.load("ship.png")
ship = game.transform.scale(ship, (50, 50))
rect = ship.get_rect()
rect.x=400
rect.y=400
shipdir = 0
newship = ship

auto = False

arrow = game.image.load("bullet.png")
shiphitbox = ship.get_rect()
shiphitbox.x = 100
shiphitbox.y = 100

arrows=[]




#code to rotate the ship
def rotateship(shipdir):
    newship = game.transform.rotate(ship, shipdir)
    newrect = rect.copy()
    newrect.center  = newship.get_rect().center
    return newship.subsurface(newrect).copy()


def getmove():
    #returns x-y movement based on directrion facing
    global shipdir
    d=shipdir
    if d >= 349 or d < 11:

        return [0, -2]
    elif d >=11 and d < 34:
        return [-1,-2]
    elif d >=34 and d < 56:
        return [-2,-2] #
    elif d >=56 and d < 79:
        return [-2,-1]
    elif d >=79 and d < 102:
        return [-2,0]
    elif d >=102 and d < 125:
        return [-2,1]
    elif d >=125 and d < 147:
        return [-2,2] #
    elif d >=147 and d < 170:
        return [-1,2]
    elif d >=170 and d < 191:
        return [0,2]
    elif d >=191 and d < 214:
        return [1,2]
    elif d >=214 and d < 237:
        return [2,2] #
    elif d >=237 and d < 260:
        return [2,1]
    elif d >=260 and d < 282:
        return [2,0]
    elif d >=282 and d < 305:
        return [2,-1]
    elif d >=305 and d < 328:
        return [2,-2] #
    elif d >=328 and d < 349:
        return [1,-2]



##main loop of the game
while gameon:
    screen.fill(bgcolor)
    screen.blit(newship,(rect.x,rect.y))


    key = game.key.get_pressed()
    event=game.event.poll()
    #controls

    if key[game.K_a]:
        if shipdir==0: shipdir=360
        shipdir -= 1
        newship = rotateship(shipdir)

    if key[game.K_d]:
        if shipdir==360: shipdir=0
        shipdir += 1
        newship = rotateship(shipdir)



    if auto==True or key[game.K_SPACE] or key[game.K_w] :
        move = getmove()
        rect.x +=  move[0]
        rect.y +=  move[1]

    game.time.delay(5)

    #shooting
    if event.type==game.MOUSEBUTTONDOWN:
        '''
        This is where the shooting happens
        '''
        arrowbox = arrow.get_rect()
        arrowbox.x = rect.x;
        arrowbox.y = rect.y;
        move = getmove()
        data = [arrowbox, move[0], move[1]]
        arrows.append(data)


    if event.type==game.QUIT:
        gameon=False;

    #spawning projectiles 
    for bullet in arrows:
        bullet[0].x += bullet[1]
        bullet[0].y += bullet[2]

        if bullet[0].x > 700 or bullet[0].x<0:
            arrows.remove(bullet)



    for bullet in arrows:
        screen.blit(arrow,(bullet[0].x,bullet[0].y))




    game.display.flip() #redraws / refreshes screen



##comes here when game is over
while True:
    screen.fill(bgcolor)
    game.display.flip()
    event=game.event.poll()
    if event.type == game.QUIT:
        break

game.quit()

1 Ответ

0 голосов
/ 19 января 2019

Я бы хотел сделать вращение пули в соответствии с кораблем, чтобы было похоже, что пули выходят из корабля.

Вы должны знать угол поворота для каждой отдельной пули. Добавьте угол поворота к данным пули:

data = (arrowbox, move[0], move[1], shipdir)
arrows.append(data)

Создание повернутых пуль по pygame.transform.rotate и blit it:

for bullet in arrows:
    rotBullet = pygame.transform.rotate(arrow, bullet[3])
    screen.blit(rotBullet, (bullet[0].x, bullet[0].y))
...