如何使pygame中的窗口边缘的sprite反弹 [英] how to make a sprite bounce of the edges of the window in pygame

查看:212
本文介绍了如何使pygame中的窗口边缘的sprite反弹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

到目前为止,我的程序从左到右弹跳,但现在我想要在墙壁上弹跳。

  delta = 5 
u = 1#x坐标

u + = delta
如果u> = 440:#480是窗口大小,我把它停在440
delta = -5#返回5
elif u < 0:
delta = 5#增加5

有解决方案,但精灵离开屏幕,要运行的代码,请确保您有一个名为bird.png的图片或更改图片:

  import pygame 
import random
$ b class mySprite(pygame.sprite.Sprite):
def __init __(self):
pygame.sprite。 Sprite .__ init __(self)
self.image = pygame.image.load(bird.png)
self.rect = self.image.get_rect()
## slef.rect (50,50,self.image.get_width(),self.image.get_height())

def update(self,x,y):
self.rect.x = x
self.rect.y = y

class newSprite(pygame.sprite.Sprite):
def __init __(self):
pygame.sprite.Sprite .__ init__ (self)
self.image = pygame.image.load(ball.png)
self.rect = self.image.get_rect()

def update(self ,x,y):
self.rect.x = x
self.rect.y = y
$ b $ class otherSprite(pygame.sprite.Sprite):
def __init __(self):
pygame.sprite.Sprite .__ init __(self)
self.image = pygame.image.load(bird.png)
self.rect = self.image.get_rect()

def update(self,x,y ):
self.rect.x = x
self.rect.y = y

def main():
设置游戏并运行主循环
pygame.init()#准备pygame模块使用
surfaceSz = 480#所需的物理表面大小,以像素为单位。
#创建(宽度,高度)表面及其窗口。
main_surface = pygame.display.set_mode((surfaceSz,surfaceSz))

small_rect =(300,200,150,90)
some_color =(255,0,0)
main_surface.fill((0,200,255))
$ bs = mySprite()
all_sprites = pygame.sprite.Group()

s.add(all_sprites )

delta_x = 5
delta_y = 5
u = 1#x coord
v = 1#y coord

clock = pygame.time .Clock()
而真:
ev = pygame.event.poll()#查找任何事件
如果ev.type == pygame.QUIT:#window close button clicked?
break#...离开游戏循环

main_surface.fill((0,200,255))

#u + = delta
#if u> = 440:
#delta = -5
#elif u < 0:
#delta = 5

u + = delta_x
v + = delta_y
if(v> = 440):#你的y轴是440像素
delta_y = -5
elif v< = 0:
delta_y = 5

如果u> = 440:#440像素你有
delta = -5
elif u< 0:
delta = 5#增加5


all_sprites.update(u,50)
pos =(random.randint(0,surfaceSz), random.randint(0,surfaceSz))
all_sprites.draw(main_surface)

#现在表面已经准备就绪,告诉pygame显示它!
pygame.display.flip()
clock.tick(60)

pygame.quit()#一旦我们离开循环,关闭窗口。
$ b $ main()


解决方案

这是一个移动的鸟/球,从墙上反弹,
首先你只需要一个类型的精灵,只需创建不同的图像不同的实例。希望它有帮助

  import sys,pygame,random 

SIZE = width,height = 640,480
SPEED = [2,2]
black = 0,0,0

class mySprite(pygame.sprite.Sprite):
def __init __(self,image =ball.bmp,speed = [2,2]):

pygame.sprite.Sprite .__ init __(self)
self.speed = speed
self.image = pygame.image.load(image)
self.rect = self.image.get_rect()

def update(self):
global SIZE
#i (self.rect.x< 0)或(self.rect.x> 640-110)使用pygame
的rect属性是更好的,因为它是图像的大小。 :
self.speed [0] * = -1
if(self.rect.y <0)或(self.rect.y> 480-110):
self.speed [1] * = -1

self.rect.x = self.rect.x + self.speed [0]
self.rect.y = self.rect.y + self .speed [1]

#OR:self.rect = self.rect.move(se (自我,屏幕):
screen.blit(self.image,self.rect)


$ b b $ b pygame.init()
screen = pygame.display.set_mode(SIZE)
$ b iaka = mySprite()

1:
pygame.event.get()中的事件:
if event.type == pygame.QUIT:sys.exit()

screen.fill(black)
iaka。 draw(screen)
iaka.update()
pygame.display.flip()


So far I have my program bouncing from left to right, but now I want to have in bounce of the walls. How can I get to that?

delta = 5
u = 1 # x coordinate

u += delta
if u >= 440: #480 is the window size, I have it stopping at 440
   delta = -5 #Go back by 5
elif u < 0:
   delta = 5 #Go up by 5

Bigger Snip it of code, It has the solution but the sprite goes off the screen, To Run the code make sure you have a picture called "bird.png" or change the picture:

import pygame
import random

class mySprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bird.png")
        self.rect = self.image.get_rect()
##        slef.rect(50,50,self.image.get_width(), self.image.get_height())

    def update(self,x,y):
        self.rect.x = x
        self.rect.y = y

class newSprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("ball.png")
        self.rect = self.image.get_rect()

    def update(self,x,y):
        self.rect.x = x
        self.rect.y = y

class otherSprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bird.png")
        self.rect = self.image.get_rect()

    def update(self,x,y):
        self.rect.x = x
        self.rect.y = y

def main():
    """ Set up the game and run the main game loop """
    pygame.init() # prepare the pygame module for use
    surfaceSz = 480 # Desired physical surface size, in pixels.
    # Create surface of (width, height), and its window.
    main_surface = pygame.display.set_mode((surfaceSz, surfaceSz))

    small_rect = (300, 200, 150, 90)
    some_color = (255,0,0)
    main_surface.fill((0,200,255))

    s = mySprite()
    all_sprites = pygame.sprite.Group()

    s.add(all_sprites)

    delta_x = 5
    delta_y = 5
    u = 1 # x coord
    v = 1 # y coord

    clock = pygame.time.Clock()
    while True:
        ev = pygame.event.poll() # look for any event
        if ev.type == pygame.QUIT: # window close button clicked?
            break # ... leave game loop

        main_surface.fill((0,200,255))

        #u += delta
        #if u >= 440:
        #    delta = -5
        #elif u < 0:
        #    delta = 5

        u += delta_x
        v += delta_y
        if (v >=440): #assuming your y axis is 440 pixels
            delta_y = -5
        elif v<=0 :
            delta_y = 5

        if u >= 440: #440 pixels u have
            delta = -5
        elif u < 0:
            delta = 5 #Go up by 5


        all_sprites.update(u,50)
        pos =(random.randint(0, surfaceSz), random.randint(0, surfaceSz))
        all_sprites.draw(main_surface)

        # Now the surface is ready, tell pygame to display it!
        pygame.display.flip()
        clock.tick(60)

    pygame.quit() # once we leave the loop, close the window.

main()

解决方案

here's a moving bird/ball that is bouncing off the walls, first of all you need only one type of class for sprites, simply create different instances with different images. Hope it helps

import sys, pygame, random

SIZE = width, height = 640, 480
SPEED = [2, 2]
black = 0, 0, 0

class mySprite(pygame.sprite.Sprite):
    def __init__(self, image="ball.bmp", speed=[2,2]):

        pygame.sprite.Sprite.__init__(self)
        self.speed = speed
        self.image = pygame.image.load(image)
        self.rect = self.image.get_rect()

    def update(self):
        global SIZE
        #i used 110 px because it's the size of the image, but it's better to use the rect property of the pygame
        if (self.rect.x <0) or (self.rect.x > 640-110):
            self.speed[0] *= -1
        if (self.rect.y<0) or (self.rect.y > 480-110):
            self.speed[1] *= -1

        self.rect.x =self.rect.x + self.speed[0]
        self.rect.y =self.rect.y + self.speed[1]

#OR:        self.rect = self.rect.move(self.speed)

    def draw(self, screen):
        screen.blit(self.image, self.rect)


#    
pygame.init()
screen = pygame.display.set_mode(SIZE)

iaka = mySprite()

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

    screen.fill(black)
    iaka.draw(screen)
    iaka.update()
    pygame.display.flip()

这篇关于如何使pygame中的窗口边缘的sprite反弹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆