简体   繁体   English

如何在PyGame中旋转对象

[英]How do I rotate the object in PyGame

Ok. 好。 So i have so far found a code for a snake game on python. 因此,到目前为止,我已经找到了在python上进行蛇游戏的代码。 So far the game is working but now I have started changing the BNP's from squares to circular objects and what I want to know is how to rotate the body and head at the input of lets say the arrow keys making the body parts change. 到目前为止,该游戏正在运行,但是现在我已经开始将BNP的形状从正方形更改为圆形对象,而我想知道的是如何在输入时说出使主体部分发生变化的箭头键来旋转身体和头部。 I don't know if this is possible, well it is, but not in the way I want it. 我不知道这是否可行,但不是我想要的方式。 Ill post the code below. 病态发布下面的代码。

import pygame
import sys
from pygame.locals import *
import random
import time

left = -20
right = 20
up = 10
down = -10

size = width, height = 640, 480
block_size = 20

class Food:
    def __init__(self, screen, snake):
        self.snake = snake
        self.screen = screen
        self.image = pygame.image.load('food.bmp').convert()
        self.spawn()

    def spawn(self):
        collision = True

        while collision:
            random_x = random.randrange(0, width, block_size)
            random_y = random.randrange(0, height, block_size)

           collision = False

            for each in snake.parts:
                if each.position.x == random_x and each.position.y == random_y:
                    collision = True
                    break

        self.position = self.image.get_rect().move(random_x, random_y)

        self.blit()

    def blit(self):
        self.screen.blit(self.image, self.position)

class Part:
    def __init__(self, x=0, y=0, direction=right):
        self.direction = direction
    self.image = pygame.image.load('part.bmp').convert()
    self.position = self.image.get_rect().move(x, y)
    self.speed = block_size

def change_direction(self, direction):
    if self.direction + direction == 0:
            return

        self.direction = direction

    def move(self):
        if self.position.x >= width - block_size and self.direction == right:
            return False

        if self.position.y >= height - block_size and self.direction == down:
            return False

        if self.position.x <= 0 and self.direction == left:
            return False

    if self.position.y <= 0 and self.direction == up:
        return False

        if self.direction == up:
            self.position = self.position.move(0, -self.speed)
        elif self.direction == down:
            self.position = self.position.move(0, self.speed)
        elif self.direction == right:
            self.position = self.position.move(self.speed, 0)
        elif self.direction == left:
            self.position = self.position.move(-self.speed, 0)

        return True

class Parthead:
    def __init__(self, x=0, y=0, direction=right):
        self.direction = direction
        self.image = pygame.image.load('parthead.bmp').convert()
        self.position = self.image.get_rect().move(x, y)
        self.speed = block_size

    def change_direction(self, direction):
        if self.direction + direction == 0:
            return

        self.direction = direction

    def move(self):
        if self.position.x >= width - block_size and self.direction == right:
            return False

        if self.position.y >= height - block_size and self.direction == down:
            return False

        if self.position.x <= 0 and self.direction == left:
            return False

        if self.position.y <= 0 and self.direction == up:
            return False

        if self.direction == up:
            self.position = self.position.move(0, -self.speed)
        elif self.direction == down:
            self.position = self.position.move(0, self.speed)
        elif self.direction == right:
        self.position = self.position.move(self.speed, 0)
        elif self.direction == left:
            self.position = self.position.move(-self.speed, 0)

        return True

class Snake:

    def __init__(self, screen, x=0, y=0):
        self.screen = screen
        self.head = Parthead(x, y)
        self.direction = right
        self.length = 1
        self.parts = []
        self.parts.append(self.head)
        self.extend_flag = False

    def change_direction(self, direction):
        self.direction = direction

    def move(self, food):
        new_direction = self.direction
        old_direction = None
        new_part = None

        if self.extend_flag:
            last_part = self.parts[-1]
            new_part = Part(last_part.position.x, last_part.position.y, last_part.direction)

        for each in self.parts:
            old_direction = each.direction
            each.change_direction(new_direction)

            if not each.move():
               return False

            new_direction = old_direction

        if self.extend_flag:
            self.extend(new_part)

        for each in self.parts[1:]:
            if each.position.x == self.head.position.x and each.position.y == self.head.position.y:
                return False

        if food.position.x == self.head.position.x and food.position.y == self.head.position.y:
            food.spawn()
            self.extend_flag = True



        return True



    def extend(self, part):
        self.parts.append(part)
        self.length += 1
        self.extend_flag = False

    def blit(self):
        for each in self.parts:
            self.screen.blit(each.image, each.position)


black = 0, 0, 0

pygame.init()
pygame.display.set_caption('Snake by Jonathan Dring')
screen = pygame.display.set_mode(size)

game = True

while True:
    snake = Snake(screen)
    food = Food(screen, snake)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()

            if event.type == KEYDOWN:
                if (event.key == K_RIGHT):
                    snake.change_direction(right)
                elif (event.key == K_LEFT):
                    snake.change_direction(left)
                elif (event.key == K_UP):
                    snake.change_direction(up)
                elif (event.key == K_DOWN):
                    snake.change_direction(down)
                elif (event.key == K_SPACE):
                    snake.extend_flag = True

        if not snake.move(food):
            game = False
            break

        screen.fill(black)
        print ("Snake - The Game")
        snake.blit()
        food.blit()
        pygame.display.update()
        pygame.time.delay(100)

    while not game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()

            if event.type == KEYDOWN:
                if (event.key == K_SPACE):
                    game = True
                elif (event.key == K_RETURN):
                    game = True
                elif event.key == K_ESCAPE:
                    pygame.quit()






        background = pygame.image.load('gameover.bmp').convert()
        screen.blit(background, (0, 0))
        pygame.display.flip()
        pygame.time.delay(100)

If you know how to do it please reply! 如果您知道该怎么做,请回复!

Seeing as there is still no answer, here is how to rotate a sprite. 看到仍然没有答案,这是如何旋转精灵。 Naturally, you can only rotate the rect of the sprite. 自然地,您只能旋转精灵的矩形。 This function, when added to a sprite, will make it rotate when you send it an angle to point in: 将此功能添加到精灵后,当您将其发送一个角度以指向它时,它将使其旋转:

def rotate(self,angle):
    self.rect = pygame.transform.rotate(self.rect, angle)

This should work. 这应该工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM