首页 > 其他分享 >pygame物体碰撞

pygame物体碰撞

时间:2024-08-22 15:14:58浏览次数:7  
标签:circleInfo min max 物体 碰撞 newdirect pygame position rect

代码:

#coding=utf-8

import os,sys,re,time
import pygame
import random
import math
from win32api import GetSystemMetrics
from tkinter import messagebox

pygame.init()
pygame.display.set_caption("我的游戏")

percent = 0.6
screen_width = GetSystemMetrics(0)
screen_height = GetSystemMetrics(1)
window_width = int(screen_width*percent)
window_height = int(screen_height*percent)

dt = 0
clock = pygame.time.Clock()

screen = pygame.display.set_mode((window_width, window_height))

#停止处理输入法事件
pygame.key.stop_text_input()

font_path = os.path.join(os.path.dirname(sys.argv[0]), 'simsun.ttc')
font = pygame.font.Font(font_path, 20)

rect_width = 50
rect_height = 50
rect_position = ((window_width-rect_width)//2, (window_height-rect_height)//2, rect_width, rect_height)
rect_position_x_min = 0
rect_position_x_max = window_width - rect_width
rect_position_y_min = 0
rect_position_y_max = window_height - rect_height

def getCircle(i = 0):
    circle_width = random.randint(25, 35)
    
    min_x = circle_width
    max_x = window_width - circle_width
    min_y = circle_width
    max_y = window_height - circle_width
    
    circle_position = [random.randint(min_x, max_x), random.randint(min_y, max_y)]
    circle_color = (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
    circle_direct = random.randint(0, 360)
    circle_speed = random.randint(200, 800)
    position_range = {'min_x' : min_x, 'max_x' : max_x, 'min_y' : min_y, 'max_y' : max_y}
    circle_text = font.render(str(i), 1, (255-circle_color[0], 255-circle_color[1], 255-circle_color[2]))
    
    return {
        'width' : circle_width, 
        'position' : circle_position, 
        'color' : circle_color, 
        'speed' : circle_speed,
        'position_range' : position_range,
        'direct' : circle_direct,
        'newdirect' : circle_direct,
        'name' : '第%s个球' % i,
        'text' : circle_text,
    }
    
def calculate_distance(point1, point2):
    x1, y1 = point1
    x2, y2 = point2
    ret = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
    return ret

#print(calculate_distance([1,2], [2,2]))
#sys.exit(0)

circleList = [] 
for i in range(0, 10):
    circleInfo = getCircle(i+1)
    circleList.append(circleInfo)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            
    keys_pressed = pygame.key.get_pressed()
    
    #ESC键
    if keys_pressed[pygame.K_ESCAPE]:
        running = False
        
    rect_position_value = list(rect_position)
    if keys_pressed[pygame.K_a]:
        rect_position_value[0] = rect_position_value[0] - 300 * dt
    if keys_pressed[pygame.K_d]:
        rect_position_value[0] = rect_position_value[0] + 300 * dt
    if keys_pressed[pygame.K_w]:
        rect_position_value[1] = rect_position_value[1] - 300 * dt
    if keys_pressed[pygame.K_s]:
        rect_position_value[1] = rect_position_value[1] + 300 * dt
        
    if rect_position_value[0] < rect_position_x_min:
        rect_position_value[0] = rect_position_x_min
    if rect_position_value[0] > rect_position_x_max:
        rect_position_value[0] = rect_position_x_max
    if rect_position_value[1] < rect_position_y_min:
        rect_position_value[1] = rect_position_y_min
    if rect_position_value[1] > rect_position_y_max:
        rect_position_value[1] = rect_position_y_max
        
    rect_position = tuple(rect_position_value)
    rect1 = pygame.Rect(rect_position_value[0], rect_position_value[1], rect_position_value[2], rect_position_value[3])
        
    for i,circleInfo in enumerate(circleList):
        name = circleInfo['name']
        width = circleInfo['width']
        speed = circleInfo['speed']
        direct = circleInfo['direct']
        newdirect = circleInfo['newdirect']
        position = circleInfo['position']
        oldposition = position
        color = circleInfo['color']
        position_range = circleInfo['position_range']
        text = circleInfo['text']
        
        min_x = position_range['min_x']
        max_x = position_range['max_x']
        min_y = position_range['min_y']
        max_y = position_range['max_y']
        truespeed_x = math.cos(direct) * speed * dt
        truespeed_y = math.sin(direct) * speed * dt
        
        if newdirect > 0 and newdirect < 90:
            position[0] += truespeed_x
            position[1] += truespeed_y
                
            if position[0] > max_x and position[1] < min_y:
                if abs(position[0] - max_x) > abs(position[1] - min_y):
                    newdirect = 180 - newdirect
                elif abs(position[0] - max_x) < abs(position[1] - min_y):
                    newdirect = 360 - newdirect
                elif random.randint(0, 1):
                    newdirect = 180 - newdirect
                else:
                    newdirect = 360 - newdirect
            elif position[0] > max_x:
                newdirect = 180 - newdirect
            elif position[1] < min_y:
                newdirect = 360 - newdirect
            else:
                pass
        elif newdirect > 90 and newdirect < 180:
            position[0] -= truespeed_x
            position[1] += truespeed_y
                
            if position[0] < min_x and position[1] < min_y:
                if abs(position[0] - min_x) > abs(position[1] - min_y):
                    newdirect = 180 - newdirect
                elif abs(position[0] - min_x) < abs(position[1] - min_y):
                    newdirect = 360 - newdirect
                elif random.randint(0, 1):
                    newdirect = 180 - newdirect
                else:
                    newdirect = 360 - newdirect
            elif position[0] < min_x:
                newdirect = 180 - newdirect
            elif position[1] < min_y:
                newdirect = 360 - newdirect
            else:
                pass
        elif newdirect > 180 and newdirect < 270:
            position[0] -= truespeed_x
            position[1] -= truespeed_y
                
            if position[0] < min_x and position[1] > max_y:
                if abs(position[0] - min_x) > abs(position[1] - max_y):
                    newdirect = 540 - newdirect
                elif abs(position[0] - min_x) < abs(position[1] - max_y):
                    newdirect = 360 - newdirect
                elif random.randint(0, 1):
                    newdirect = 540 - newdirect
                else:
                    newdirect = 360 - newdirect
            elif position[0] < min_x:
                newdirect = 540 - newdirect
            elif position[1] > max_y:
                newdirect = 360 - newdirect
            else:
                pass
        elif newdirect > 270 and newdirect < 360:
            position[0] += truespeed_x
            position[1] -= truespeed_y
                
            if position[0] > max_x and position[1] > max_y:
                if abs(position[0] - max_x) > abs(position[1] - max_y):
                    newdirect = 540 - newdirect
                elif abs(position[0] - max_x) < abs(position[1] - max_y):
                    newdirect = 360 - newdirect
                elif random.randint(0, 1):
                    newdirect = 540 - newdirect
                else:
                    newdirect = 360 - newdirect
            elif position[0] > max_x:
                newdirect = 540 - newdirect
            elif position[1] > max_y:
                newdirect = 360 - newdirect
            else:
                pass
        elif newdirect == 0 or newdirect == 360:
            newdirect = 180
        elif newdirect == 90:
            newdirect = 270
        elif newdirect == 180:
            newdirect = 0
        elif newdirect == 270:
            newdirect = 90
                
                
        if position[0] <= min_x:
            position[0] = min_x
            #color = (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
        if position[0] >= max_x:
            position[0] = max_x
            #color = (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
        if position[1] <= min_y:
            position[1] = min_y
            #color = (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
        if position[1] >= max_y:
            position[1] = max_y
            #color = (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
            
        circleInfo['position'] = position
        circleInfo['newdirect'] = newdirect
        circleInfo['color'] = color
        circleInfo['speed'] = speed
        circleList[i] = circleInfo
    
    pzFlag = False
    for i,circleInfo in enumerate(circleList):
        circle1 = pygame.Rect(circleInfo['position'][0], circleInfo['position'][1], circleInfo['width'], circleInfo['width'])
        if rect1.colliderect(circle1):
            pzFlag = True
            break
    
    if pzFlag:
        screen.fill("white")
    else:
        screen.fill("purple")
        
    pygame.draw.rect(screen, 'red', rect_position_value)
            
    for i,circleInfo in enumerate(circleList):
        pygame.draw.circle(screen, circleInfo['color'], circleInfo['position'], circleInfo['width'])
        
        
    #更新显示
    pygame.display.flip()
    #pygame.display.update()
    if pzFlag:
        messagebox.askokcancel ("提示"," 碰到了")
    
    dt = clock.tick(60) / 600
    
pygame.quit()

 

效果:

 

 

标签:circleInfo,min,max,物体,碰撞,newdirect,pygame,position,rect
From: https://www.cnblogs.com/xuxiaobo/p/18373954

相关文章

  • 使用 Pygame 创建简单的移动方块游戏
    Pygame是一个用于开发图形和多媒体应用的优秀Python库。下面,我们将逐步解释如何创建一个简单的游戏,其中一个蓝色方块可以在屏幕上移动。 安装Pygame首先,确保你已经安装了Pygame。可以通过以下命令安装:pipinstallpygame 游戏结构1.初始化Pygame开始时,需......
  • 《深入剖析原型模式:浅克隆、深克隆与单例模式的碰撞》
    3.原型模式一、引言在Java编程中,原型模式(Prototype)是一种创建对象的方式,通过拷贝原型实例来创建新的对象,为对象的创建提供了一种高效且灵活的途径。本文将详细探讨原型模式的概念、包含的角色、浅克隆与深克隆的实现,以及克隆对单例模式的影响和相应的解决办法。二、原......
  • 电商搜索革命:大模型如何重塑购物体验?
      随着电商行业的蓬勃发展,搜索技术作为连接用户与商品的桥梁,其重要性日益凸显。在技术不断革新的今天,电商搜索技术经历了哪些阶段?面对大模型的飞速发展,企业又将如何把握趋势,应对挑战?为了深入探讨这些问题,我和InfoQ栏目探讨了电商搜索技术的发展历程、当前的应用状况以及面临......
  • TransformControls 用于在网页中进行 3D 场景中物体的交互式操作
    demo案例:https://techbrood.com/threejs/examples/#misc_controls_transformTransformControls是Three.js中的一个类,用于在网页中进行3D场景中物体的交互式操作。让我们来详细讲解它的输入参数、输出、属性和方法:输入参数:TransformControls构造函数通常接受两个参数:camer......
  • pygame开发小游戏
    代码:#coding=utf-8importos,sys,re,timeimportpygameimportrandomfromwin32apiimportGetSystemMetricsfromtkinterimportmessageboxfromsqlparse.filtersimportright_margin#pyinstaller-F-wdaziyan.pypygame.init()pygame.display.set_caption(&......
  • 【Three.JS零基础入门教程】第六篇:物体详解
     前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助【Three.JS零基础入门教程】第四篇:基础变换【Three.JS零基础入门教程】第五篇:项目规划下面将进一步详解介绍Threejs中的常用......
  • 【python】pygame开发小游戏原来如此简单,掌握这几步就可以快速上手
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 剪辑物体的生长和消失
    要剪辑物体的生长和消失,以下是一些常见的操作步骤: 1. 素材准备:首先,您需要获取包含物体生长和消失过程的相关素材。这可以是通过拍摄、动画制作或者从现有素材库中选取。2. 软件选择:使用专业的视频剪辑软件,如AdobePremierePro、FinalCutPro等。3. 导入素材:将准备......
  • 基于人工智能的图像物体擦除与背景填充技术
    摘要:本文介绍了一种基于人工智能的图像处理技术,该技术能够自动识别并擦除图像中的指定物体,同时智能填充背景,以实现图像的自然恢复。该技术为用户提供了一种高效、简便的图像编辑工具,适用于多种应用场景。关键词:人工智能,图像编辑,物体擦除,背景填充1.引言在图像编辑领域,去......
  • Unity物理模块 之 ​2D碰撞器
    本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正1.碰撞器是什么在Unity中,碰撞器(Collider)是一种组件,用于检测物体之间的物理交互,注意他不是常规意义上物理反馈,而是利用碰撞检测进入函数中通过代码来控制效......