Python 如何使用边缘检测

Python 如何使用边缘检测,python,pygame,Python,Pygame,所以我试图写一个边缘代码,但我似乎无法理解它 所以当我的船到达边缘时,它应该会转180度。对不起,我学习python才一个月左右,这是我的第一语言 import pygame,sys, random pygame.init() class Ship(pygame.sprite.Sprite): movepersec = 0 dx = 0 dy = 0 direction = "" imgarray = {} def __init__(self,

所以我试图写一个边缘代码,但我似乎无法理解它

所以当我的船到达边缘时,它应该会转180度。对不起,我学习python才一个月左右,这是我的第一语言

import pygame,sys, random
pygame.init()

class Ship(pygame.sprite.Sprite):
    movepersec = 0
    dx = 0
    dy = 0
    direction = ""
    imgarray = {}

    def __init__(self, imgarr, rect, speed, xpos, ypos, direct):
        pygame.sprite.Sprite.__init__(self)

        self.imgarray = imgarr
        self.rect = rect
        self.movepersec = speed
        self.dx = xpos
        self.dy = ypos
        self.rect.centerx = xpos
        self.rect.centery = ypos
        self.direction = direct
        self.image = self.imgarray[self.direction]

    def update(self,secs):
        #set the direction and calculate number of pixels to move
        movePix = self.movepersec*secs
        if self.direction == 'N': self.dy -= movePix
        if self.direction == 'S': self.dy += movePix
        if self.direction == 'E': self.dx += movePix
        if self.direction == 'W': self.dx -= movePix



        #move the image react
        self.rect.centerx = self.dx
        self.rect.centery = self.dy

        #set the image
        self.image = self.imgarray[self.direction]

    def setDirection(self, direct):
        self.direction = direct

    def setSpeed(self,speed):
        self.movepersec = speed

        ##Main Program##
        #setup data
background = pygame.image.load('sea.jpg')
#size = background.get_size()
width = int(1023)
height = int(682)
screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
imgarray = {}
imgarray['N']=pygame.image.load('shipNorth.png')
imgarray['S']=pygame.image.load('shipSouth.png')
imgarray['E']=pygame.image.load('shipEast.png')
imgarray['W']=pygame.image.load('shipWest.png')
imgrect = imgarray ['N'].get_rect()
shipHw = 172
shipHh = 108
shipVw = 108
shipVh = 172

movepersec = 150
keydownflag = False
allSpriteGroup = pygame.sprite.Group()

    #make a ship object and add it to the group
shipX = Ship(imgarray,imgrect,movepersec,150,150,'E')
allSpriteGroup.add(shipX)


    #display the background
screen.blit(background,(0,0))

#start game loop
while True:
    secs = clock.tick(30)/1000.0

    #get events
    for event in pygame.event.get():
        if event.type==pygame.QUIT: sys.exit(0)

        if event.type==pygame.KEYDOWN:
            keydownflag = True

            if event.key==pygame.K_LEFT:
                    shipX.setDirection('W')
            if event.key==pygame.K_RIGHT:
                    shipX.setDirection('E')
            if event.key==pygame.K_UP:
                    shipX.setDirection('N')
            if event.key==pygame.K_DOWN:
                    shipX.setDirection('S')
        if event.type==pygame.KEYUP:
            keydownflag = False


    if keydownflag:
        #update sprites
        allSpriteGroup.update(secs)

    #clear the sprite backgrounds
    allSpriteGroup.clear(screen,background)

        #draw sprites
    allSpriteGroup.draw(screen)

        #flip display
    pygame.display.flip()

一种简单的方法是简单地使用
contains()
检查您的飞船的rect是否仍在屏幕的rect中。如果不是,你知道你必须回头

下面是一个例子:

def update(self, secs, screen_rect):

    #set the direction and calculate number of pixels to move
    movePix = self.movepersec*secs

    def f():
        if self.direction == 'N': return (0, -movePix)
        if self.direction == 'S': return (0, movePix)
        if self.direction == 'W': return (-movePix, 0)
        if self.direction == 'E': return (movePix, 0)

    #check if we would leave the screen
    if not screen_rect.contains(self.rect.move(f())):
        # we're leaving the screen, so change direction
        change_dirs = {'N': 'S', 'S': 'N', 'E': 'W', 'W': 'E'}
        self.direction = change_dirs(self.direction)

    #move the image react
    self.rect.move_ip(f())

    #set the image
    self.image = self.imgarray[self.direction]
调用
update
时,您也必须通过屏幕rect

allSpriteGroup.update(secs, screen.get_rect())