美文网首页
pygame小球碰撞

pygame小球碰撞

作者: 葡萄柚子茶 | 来源:发表于2018-09-05 11:50 被阅读0次

import pygame
import ymj_color
from random import randint
"""
游戏功能:点击屏幕在点击的地方产生一个球,球可以自由移动
撞到边界会弹回,撞到其他的球会吃掉

第一步:搭建游戏窗口
第二步:点击屏幕产生球
第三步:让球动起来,需要用列表保存所有的球,需要字典保存每个球的信息
第四步:

"""

#全局变量,后面都能用上
WINDOW_WIDTH=600 #屏幕宽度
WINDOW_HIGHT=400 #屏幕高度

key_ball_color = 'ball_color'
key_ball_center = 'ball_center'
key_ball_radius = 'ball_radius'
key_ball_xspeed = 'ball_xspeed'
key_ball_yspeed = 'ball_yspeed'
key_ball_alive = 'ball_alive'

all_balls=[] #保存所有的球

def ball_crash():
    """
    检测碰撞
    :return:
    """
    #看屏幕上的每个球是否和其他的球的圆心距小于等于半径和
    for ball in all_balls:
        #拿第一个球
        for other in all_balls:
            #拿另外一个球
            if ball == other or ball[key_ball_alive]==False or other[key_ball_alive]==False:
                # 判断两次拿到的球是否相同或已经消失的球都不需要再判断
                continue
            #判断两个球是否相撞
            x1,y1=ball[key_ball_center]
            x2,y2=other[key_ball_center]
            #算两个球的圆心距
            distance=((x1-x2)**2+(y1-y2)**2)**0.5
            if distance <= ball[key_ball_radius]+other[key_ball_radius]:
                #相撞后:
                if randint(0,1):
                    ball[key_ball_radius] += int(other[key_ball_radius]*0.4)#吸收比 一个球变大
                #all_balls.remove(other)#一个球消失
                    other[key_ball_alive]=False
                else:
                    other[key_ball_radius] += int(other[key_ball_radius] * 0.4)
                    ball[key_ball_alive] = False








def draw_all_ball(window):
    """
    画所有的球
    :return:
    """
    window.fill(ymj_color.white)
    for ball in all_balls[:]:
        #如果是活着的就画出来,死掉了就移除
        if ball[key_ball_alive]==True:
            pygame.draw.circle(window,ball[key_ball_color],ball[key_ball_center],ball[key_ball_radius])
        else:
            all_balls.remove(ball)

    pygame.display.update()
    pygame.time.delay(10)


def ball_move():
    """
    球动起来
    :return:
    """
    #拿到所有的球
    for ball in all_balls:
        #获取新的原点
        ball_x,ball_y=ball[key_ball_center]
        new_x=ball_x+ball[key_ball_xspeed]
        new_y=ball_y+ball[key_ball_yspeed]
        #检测x方向的边界
        if new_x < ball[key_ball_radius]:
            new_x = ball[key_ball_radius]
            ball[key_ball_xspeed] *= -1
        elif new_x > WINDOW_WIDTH -ball[key_ball_radius]:
            new_x = WINDOW_WIDTH-ball[key_ball_radius]
            ball[key_ball_xspeed] *= -1
        #检测y方向的边界
        if new_y<ball[key_ball_radius]:
            new_y=ball[key_ball_radius]
            ball[key_ball_yspeed] *= -1
        elif new_y>WINDOW_HIGHT-ball[key_ball_radius]:
            new_y=WINDOW_HIGHT-ball[key_ball_radius]
            ball[key_ball_yspeed] *= -1




        #3.修改圆心坐标
        ball[key_ball_center] = new_x,new_y




def creat_ball(window,pos):
    """
    在指定的位置产生一个随机颜色的球
    :param window:
    :param pos:
    :return:
    """
    ball_color = ymj_color.rand_color()
    ball_center = pos
    ball_radius = randint(10,30)

    #创建球对应的字典
    ball = {
        key_ball_color:ball_color,
        key_ball_center:ball_center,
        key_ball_radius:ball_radius,
        key_ball_xspeed:randint(-5,5),
        key_ball_yspeed:randint(-5,5),
        key_ball_alive:True
    }
    #保存球的信息
    all_balls.append(ball)

    #画球
    pygame.draw.circle(window,ball_color,ball_center,ball_radius)

    pygame.display.update()#第一次flip后面用update




def main_game():
    """
    游戏主系统
    :return:
    """
    pygame.time.delay(30)
    #初始化游戏
    pygame.init()
    window = pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HIGHT))#不写固定的,后面修改时要改很多,声明成全局变量
    window.fill(ymj_color.white)#白色用模块封装

    #进入游戏界面默认显示的内容和要执行的操作写到这...

    pygame.display.flip()  # 展示
    #游戏循环
    while True:

        #游戏循环执行的代码写在这....
        ball_move() #修改球的位置

        ball_crash()#检测球的碰撞

        draw_all_ball(window)#重新画改变后所有的球

        #事件检测
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
            #事件发生要执行的操作写到下面...
            #1.鼠标按下
            elif event.type==pygame.MOUSEBUTTONDOWN:
                creat_ball(window,event.pos)


if __name__ == '__main__':
    main_game()

相关文章

  • pygame小球碰撞

    import pygameimport ymj_colorfrom random import randint""...

  • day12作业

    使用Pygame,做一个小游戏。鼠标点击的位置生成一个随机大小、颜色和运动方向的小球,小球碰撞后,半径大的小球吃掉...

  • Day12—作业

    pygame大球吃小球

  • pygame事件

    pygame事件 鼠标事件的应用 pygame动画 ballgame 小球游戏

  • Java 小球碰撞

    小球碰撞的关键是 判断小球是否碰撞过:1.当两小球间距小于小球直径时发生碰撞。2.当小球碰到边缘时发生碰撞。

  • day-11-pygame的应用

    小球碰撞,大球碰击小球,小球消失

  • 小球碰撞

  • 055_wz_hm_项目实战——飞机大战之碰撞检测

    了解碰撞检测方法 pygame提供了两个非常方便的方法可以实现碰撞检测: pygame.sprite.groupc...

  • 2018-09-04 Day12-pygame小游戏

    1、小球碰撞 2、接球游戏 3、大球吃小球

  • day12-作业

    实现鼠标点击屏幕产生小球,小球自动移动,与屏幕碰撞会反弹。小球之间碰撞,会随机吃掉。 定义部分颜色的模块

网友评论

      本文标题:pygame小球碰撞

      本文链接:https://www.haomeiwen.com/subject/hrcawftx.html