pygame简单动态图 & 动态图片的移动

          之前在学pygame 时看了一些博客(来自http://eyehere.net/2011/python-pygame-novice-professional-plant-zombie-1/),觉得写得挺不错的,这篇博客写了 如何在pygame里制作动态效果。其中,用了植物大战僵尸的向日葵作为例子。这里有一个点,就是,他是用sprite的,而我的呢,是不用sprite,之所以要这样做,就是要看一下行不行,以及效果怎么样,然后,就是要了解一下原理。

          这里的素材来自http://www.easyicon.net/。我p了一张这样的图:



         代码是用python2.7.6和相应版本的pygame 写的,直接上代码:

# -*- coding: cp936 -*-
import os,sys,pygame
from pygame.locals import *
size=(600,580)     #对话框大小
white=(255,255,255) 

#游戏主角是机器人android
class Android():  
    def __init__(self,img,rect,speed):
        #full_img 是整张图,imgs 是full_img的surface 
        #rect 是机器人的位置,speed则是移动速度
        self.ful_img = img
        self.imgs = [self.ful_img.subsurface(Rect((i*64.5,0),(64.5,64)))
                         for i in xrange(11)]
        self.rect = rect
        self.speed = speed
        self.num = 0
    def update(self,screen,press_keys):
        #根据按下的方向键来移动机器人
        if press_keys[K_LEFT]:
            self.rect.left -= self.speed
            if self.rect.left <= 55:
                self.rect.left = 55
        if press_keys[K_RIGHT]:
            self.rect.left += self.speed
            if self.rect.right >= 545:                
                self.rect.right = 545
        if press_keys[K_UP]:
            self.rect.top -= self.speed
            if self.rect.top <= 2:
                  self.rect.top = 2
        if press_keys[K_DOWN]:
            self.rect.top += self.speed
            if self.rect.bottom >= 578:
                  self.rect.bottom = 578
        #num是surface的编号,根据编号来轮流显示surface
        self.num += 1
        if self.num%11 == 0:
            self.num = 0
        screen.blit(self.imgs[self.num],self.rect)
        return 0
def game():
    #使窗口居中
    os.environ['SDL_VIDEO_CENTERED'] = '1' 
    speed_android = 50
    dwTime = 6
    r_android = Rect(250,200,64.5,64)    
    pygame.init()    
    clock = pygame.time.Clock()
    screen = pygame.display.set_mode(size, 0, 32)
    android=pygame.image.load('11_androids.png').convert_alpha()
    #定义一个Android
    Andr = Android(android,r_android,speed_android)
    pygame.display.set_caption("Test")
    while True:
        screen.fill(white)
        for event in pygame.event.get():  
            if event.type == QUIT:  
                pygame.quit()
                sys.exit()
        press_keys=pygame.key.get_pressed()
        Andr.update(screen,press_keys) 
        pygame.display.update()
        clock.tick(dwTime)


if __name__ == "__main__":  
    game()  
                  运行,结果如图:


           动态效果出来了,移动方向键,就可以看到机器人移动了。不过,这里是看不到动态效果的,代码在这里下载 

http://download.csdn.net/detail/kamsau/6873565, 对了,这个链接里的代码有个bug ,要在前面添加


import sys
                不用sprite也是可以的,不过,可能在需要大量图片的情况下,sprite 会更好。



版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/Rex7/p/4752585.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要删除屏幕上的图片,可以使用pygame的`sprite`模块。`sprite`模块提供了一个`Sprite`类,它表示屏幕上的一个可见的、可移动的对象。你可以创建一个自定义的`Sprite`子类,并在其中实现`update()`方法,用来更新对象的位置或状态。当你需要删除一个`Sprite`对象时,可以调用`kill()`方法,从而将其从所有`sprite`组中移除。 以下是一个简单的例子,演示如何使用`sprite`模块来实现图片图片碰撞后的删除: ```python import pygame # 定义一个自定义的Sprite子类 class MySprite(pygame.sprite.Sprite): def __init__(self, image, x, y): pygame.sprite.Sprite.__init__(self) self.image = image self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y def update(self): # 在这个例子中,Sprite不需要更新位置或状态 pass # 初始化pygame pygame.init() # 创建屏幕 screen = pygame.display.set_mode((640, 480)) # 加载两张图片 img1 = pygame.image.load("image1.png").convert_alpha() img2 = pygame.image.load("image2.png").convert_alpha() # 创建两个sprite对象 sprite1 = MySprite(img1, 100, 100) sprite2 = MySprite(img2, 200, 200) # 创建一个sprite组,并将两个sprite对象添加到组中 sprites = pygame.sprite.Group() sprites.add(sprite1) sprites.add(sprite2) # 游戏循环 running = True while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 检测sprite1和sprite2是否相交(即碰撞) if pygame.sprite.collide_rect(sprite1, sprite2): # 如果相交,就将两个sprite对象从组中移除 sprite1.kill() sprite2.kill() # 绘制屏幕 screen.fill((255, 255, 255)) sprites.draw(screen) pygame.display.flip() # 退出pygame pygame.quit() ``` 在这个例子中,我们创建了一个自定义的`MySprite`类,继承了`Sprite`类,并实现了`update()`方法。在游戏循环中,我们检测`sprite1`和`sprite2`是否相交,如果相交,则调用它们的`kill()`方法,将它们从`sprites`组中移除。最后,我们调用`sprites`组的`draw()`方法,将组中的所有sprite对象绘制到屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值