Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >两个精灵之间的冲突- Python 3.5.2

两个精灵之间的冲突- Python 3.5.2
EN

Stack Overflow用户
提问于 2016-10-19 22:47:00
回答 1查看 376关注 0票数 0

我有一张ufo和导弹的图像。我试着把它弄到如果导弹击中ufo的地方,它们都会爆炸并消失,然后几分钟后,另一个ufo会重新出现,但碰撞代码不起作用。有人能给我解释一下如何让代码工作吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pygame.display.init()
pygame.font.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
ufo = pygame.image.load("ufo.png")
rocket = pygame.image.load("rocket.png")
done = False
debug = False
fontObj = pygame.font.SysFont("Courier New", 20)

#Making my Empty Lists
missiles = [] #[x,y]
ufo_list = [] #[x,y,hspeed]
particle_list = []

#UFO Respawn Info
ufoRespawn = True
ufoHits = 0
ufoSpawnTimer = 0.0
ufoSpeed = 500.0

#MISSILE Info
launchX = 400
launchY = 550
missileSpeed = 100.0
missileDirection = 0

#creating the Starfield
myStars = []            # An (initially) empty list
for i in range(1000):
    x = random.randint(0, 800)
    y = random.randint(0, 600)
    newStar = [x, y]    # A 2-element list
    myStars.append(newStar)
starSpeed = 100.0       # Rate of star movement (px / s)
starDirection = 0       # 0 = not moving, -1 = left, +1 = right

#input
while not done: 
    event = pygame.event.poll()
    if event.type == pygame.QUIT:
        done = True

    keys = pygame.key.get_pressed()
    if keys[pygame.K_ESCAPE]:
        done = True

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_d:
            debug = not debug


    dt = clock.tick() /1000.0

#the missile range (making it disappear after it hits the top)
    for missile in missiles:
        missile[1] -= missileSpeed * dt 
        if missile[1] < 0:    missiles.remove(missle)


#triangle following mouse position
    mx, my = pygame.mouse.get_pos()
    if mx > launchX:
        launchX += .3
    if mx < launchX:
        launchX -= .3


#bullets firing when pressing with mouse
    mbuttons = pygame.mouse.get_pressed()
    if mbuttons [0]:
        x = launchX
        y = launchY
        newMissiles = [x,y]
        missiles.append(newMissiles)

#Creating the UFOs
    ufoSpawnTimer -= dt
    if ufoSpawnTimer <= 0:
        if random.choice (("head", "tail")) == "head":
            x = 0
            hspeed = random.randint (10,50)
        else:
            x = 800
            hspeed = random.randint (-50, -10)
        y = random.randint (0,300)
        new_ufo = [x,y,hspeed]
        ufo_list.append(new_ufo)
        ufoSpawnTimer = 5.0


#Moving the Starfield
    for i in range(len(myStars)):
        myStars[i][0] += starSpeed * dt * starDirection
        if myStars[i][0] < 0:       myStars[i][0] = 800
        if myStars[i][0] > 800:     myStars[i][0] = 0   



    screen.fill ((0,0,0))
#drawing the triangle  a.k.a missle launcher :D
    pygame.draw.polygon(screen, (255,255,255), [[launchX, launchY], [launchX + 10, launchY + 10], \
                        [launchX - 10, launchY + 10]], 3)

    for missile in missiles:
        x = int(missile[0])
        y = int(missile[1])
        screen.blit(rocket, (x,y))


    #drawing the ufo
    for v in ufo_list:
        v[0] += v[2] * dt
        screen.blit(ufo,(v[0],v[1]))


    #Missle distance from UFO  - NEED HELP ON THIS PORTION
    #Hit Detection
    missileDist = ((x - v[0]) ** 2 + (y - v[1]) ** 2) ** 0.5
    if **????** :
        ufoRespawn = True
        ufoHits += 10

    #drawing th starfield
    for star in myStars:
        x = int(star[0])
        y = int(star[1])
        pygame.draw.circle(screen, (255,255,255), (x,y), 2)



    pygame.display.flip()
pygame.font.quit()
pygame.display.quit()
EN

回答 1

Stack Overflow用户

发布于 2016-10-19 23:41:38

有许多不同的方法来检测冲突,可能值得看看这样做的库,但到目前为止最简单的方法是使用pygame.sprite.spritecollide()

但是在我展示如何使用这个函数之前,您需要知道什么是pygame.sprite.Group()和什么是sprite类。

基本上,什么是pygame.sprite.Group(),是一种跟踪和保存多个精灵的方法。在你的情况下,似乎为你的导弹建立一个导弹群将是最好的选择。

所以我会创建一个小组来保存你的导弹:missiles_group = pygame.sprite.Group()。您可以通过说missiles_group.add(<sprite instance name>)将导弹添加到组中。

关于精灵类,请看我对一个问题的回答。简而言之,sprite类是一种创建Sprite的模块化方法。与仅使用普通图像不同,sprite类将包含sprite的必要方法和属性。我将在下面的示例中使用sprite类,因此如果需要更多详细信息,请阅读上面链接的答案。

这样就不会有太多的细节,下面是如何将每个函数参数填充到上面的函数中。

  • sprite:这是将针对一组sprites
  • group:进行测试的sprite,这是将用于测试sprite.
  • dokill:的组,这是一个布尔值。如果设置为true,则每次sprite参数与group参数中的内容发生冲突时,将删除group参数中的对象。如果dokill参数设置为false,则visa反之亦然。这是该函数需要的另一个参数,但对于您要执行的操作,并不需要此参数。

结合上述信息,下面是一个示例。该示例创建了一个子画面和一个子画面列表。每次精灵与组中的精灵发生碰撞时,HIT都会显示在屏幕上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pygame #import the pygame module into the namespace <module>

WIDTH = 640 # define a constant width for our window
HEIGHT = 480 # define a constant height for our window

#create a pygame window, and
#initialize it with our WIDTH and HEIGHT constants
display = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock() # create a game clock

class Sprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((20, 20))
        self.image.fill((255, 0, 0))
        self.rect = self.image.get_rect()
        self.rect.x = WIDTH / 2
        self.rect.y = HEIGHT / 2
        self.vx = 0
        self.vy = 0

    def update(self):
        self.vx = 0
        self.vy = 0
        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            self.vx = -1
        elif key[pygame.K_RIGHT]:
            self.vx = 1
        if key[pygame.K_UP]:
            self.vy = -1
        elif key[pygame.K_DOWN]:
            self.vy = 1
        self.rect.x += self.vx
        self.rect.y += self.vy

# cretae a player sprite
player = Sprite()

# create a group to hold all of our sprites
sprites = pygame.sprite.Group()

# create a group to hold sprites we want to
# test collions against. These sprites will
# still be added to the sprites list
# but we need a seperate group to test for
# collisions against
collision_sprites = pygame.sprite.Group()

# add a sprite to out collison sprite group
# We also add the sprite to our sprites group
# that holds all sprites
tmp = Sprite()
tmp.update = lambda: None
sprites.add(tmp)
collision_sprites.add(tmp)

# add a player sprites to the player group
player.rect.x = 10
sprites.add(player)


running = True # our variable for controlling our game loop
while running:
    for e in pygame.event.get(): # iterate ofver all the events pygame is tracking
        clock.tick(60) # make our clock keep pour game at 60 FPS
        if e.type == pygame.QUIT: # is the user trying to close the window?
            running = False # if so break the loop
            pygame.quit() # quit the pygame module
            quit() # quit is for IDLE friendliness

    sprites.update()

    # here is where we test for collision
    if pygame.sprite.spritecollide(player, collision_sprites, False):
        print("HIT!")

    display.fill((180, 180, 180)) # fill the pygame screen with white
    sprites.draw(display)
    pygame.display.flip() # update the screen

如果我的例子很大,那么请慢慢来,仔细地一步一步来看。我试着添加尽可能多的好的评论。祝好运!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40142731

复制
相关文章
如何为Nginx设置404页面?
这篇文章发布于2013年,介绍如何为nginx设置一个404页面,当客户端试图访问一个并不存在的资源时,nginx会返回代码为404的错误信息"404 Not Found",这个错误信息非常简陋并且不是很友好,建议根据实际需求设置一个专用的404错误页面(如果没有要求可以使用下面的“腾讯公益宝贝回家”404页面,也许一个微不足道的举动,却已帮助了别人。两全其美哈)。
用户1560186
2019/11/20
6.4K0
如何为Nginx设置404页面?
Nginx 和 Apache 配置 SSL 文件签名的不同
这是因为 Nginx 将 Apache 配置需要的 3 个文件中的 2 个文件合并成一个文件了。
HoneyMoose
2022/05/08
6050
Nginx 和 Apache 配置 SSL 文件签名的不同
从nginx返回404来看http1.0和http1.1的区别
所谓智慧,就是能区分自己能改变的部分,自己无法改变的部分,努力去做自己能改变的,而不要天天想着那些无法改变的东西,不然的话,就只能越来越消极了,消极的原因大部分也在于总是关注于自己无法改变的现实。
SRE运维实践
2024/07/12
4530
从nginx返回404来看http1.0和http1.1的区别
在PHP中如何为匿名函数指定this?
关于闭包匿名函数,在JS中有个很典型的问题就是要给它绑定一个 this 作用域。其实这个问题在PHP中也是存在的,比如下面这段代码:
硬核项目经理
2020/05/13
2.2K0
apache 和 nginx 的区别
2、抗并发—–nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
全栈程序员站长
2022/09/05
3960
nginx和apache的区别[通俗易懂]
简单的说apache httpd和nginx都是web服务器,但两者适应的场景不同,也就是两者专注于解决不同的问题。apache httpd:稳定、对动态请求处理强,但同时高并发时性能较弱,耗费资源多。nginx:高并发处理能力强、擅长处理静态请求、反向代理、均衡负载。在 这篇文章详细列出了apache与nginx的13个异同点,下面我们来一一分析其原理。
全栈程序员站长
2022/07/01
4.4K0
Apache 和 Nginx 的区别
2、抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
小手冰凉
2019/09/10
1K0
Apache和Nginx的区别
两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别)可以对应一个进程
全栈程序员站长
2022/07/08
3860
Nginx和Apache的区别
2、2019年五月份到2020年五月份的市场份额变化(由此可以看出apache的市场份额占有率在降低,nginx在上升)
北溟有鱼QAQ
2020/05/21
8840
Nginx和Apache的区别
Nginx 和 Apache 安装[通俗易懂]
※ 报错 rm: cannot remove 'libtoolT': No such file or directory
全栈程序员站长
2022/09/01
1K0
nginx php apache php 对比,Apache和nginx的比较「建议收藏」
● 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
全栈程序员站长
2022/09/06
1.6K0
nginx php apache php 对比,Apache和nginx的比较「建议收藏」
Apache配置403和404留住用户
1、如果你的服务器支持htaccess文件 在htaccess配置添加: ErrorDocument 403 /error/403.html#当然,你必须要确定error以及403和404页面存在 ErrorDocument 404 /404.html#当然你也可以写http://www.03377joyous.com/404.html 注意:千万不要直接把404或者403跳转成首页(这样会有可能会让蜘蛛丢掉你的首页抓取) htaccess功能不仅如此,还可以加上文件夹禁止访问以及密码保护等。慢慢摸索去吧~
苦咖啡
2018/05/07
9450
管理-Tomcat和Resin如何配置对指定后缀文件(如:.pptx)下载支持
1. Tomcat,只需要在apache-tomcat-7.0.75\conf\web.xml中配置对应的mime-mapping就行。
秋日芒草
2019/03/15
7690
管理-Tomcat和Resin如何配置对指定后缀文件(如:.pptx)下载支持
如何在Apache和Nginx中启用TLS 1.3
TLS 1.3是传输层安全性(TLS)协议的最新版本,它基于现有的1.2规范和适当的IETF标准:RFC 8446.它提供了比其前代产品更强的安全性和更高的性能改进。
星哥玩云
2022/07/28
3.1K0
如何在Apache和Nginx中启用TLS 1.3
apache 301重定向和禁止访问指定后缀文件
#301重定向 RewriteEngine on RewriteCond %{HTTP_HOST} www.phpfs.com$ [NC] RewriteRule ^(.*)$ http://blog.phpfs.com/$1 [L,R=301] #禁止访问.pem和.log后缀的文件 Order allow,deny Deny from all Deny From All
苦咖啡
2018/04/28
1.5K0
如何在git中删除指定的文件和目录
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113172.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
3.5K0
web服务:Nginx和Apache的区别
  2、抗并发,nginx以epollandkqueue作为开发模型,处理请求是异步非阻塞的,负载能力比apache高很多,而apache则是阻塞型的。在高并发下nginx能保持低资源低消耗高性能,而apache在PHP处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
全栈程序员站长
2022/09/05
6080
Ingress错误代码友好页面(一)
Ingress是Kubernetes中的一个重要资源对象,用于管理和配置应用程序的外部访问。然而,当Ingress出现问题时,Kubernetes的错误提示并不总是友好和清晰。为了提高用户的使用体验,可以通过自定义错误页面来增强Ingress的错误提示信息,以便更好地解决问题。本文将介绍如何为Ingress配置错误页面,并提供示例。
玖叁叁
2023/05/05
1.3K1
使用nginx error_page 对404 文件做冗余
源由:多个图片服务器图片有差异,可能会出现访问某一台服务器出现404,现在需要不管怎样访问都能访问到。
三杯水Plus
2018/11/14
1.5K0
Nginx和Apache中配置禁止PHP可执行权限
今天继续来说一说安全方面的知识,在项目完成开发后,我们要在测试环境测试,生产环境部署等一系列操作。我们以thinkphp5.1版本为例,在5.1版本中使用了单一入口模式,同时将动态文件和静态文件进行了分离。我们本次主要说一下目录权限和脚本权限。使用过thinkphp框架的知道,我们将index.php文件(入口文件)放置在public目录内。同时也将一些静态资源文件,如样式文件、图片文件及其他文件放置在其中,这里面对目录建议只设置读取和执行权限。对脚本文件只设置读取权限。
申霖
2020/06/18
1.6K0

相似问题

Apache 2.4.18随机为现有文件提供404

10

IIS 7.5返回现有PHP文件的404

10

Nginx子域返回404

10

如何使nginx在空文件上返回404?

10

返回XML文件时nginx与apache的比较

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文