Python 如何检索pymunk圆的坐标?

Python 如何检索pymunk圆的坐标?,python,pygame,pymunk,Python,Pygame,Pymunk,我是python新手,如果我给pygame对象命名错误,请原谅。我的任务是建立一个虚拟弹球游戏机。当球从窗口落下时,我很难得到它的坐标。我需要坐标来跟踪得分和重置循环,这样用户可以在球触底后再投下一个球 这是我的源代码 #Project specific libraries import pygame #https://www.pygame.org/news import pymunk #http://www.pymunk.

我是python新手,如果我给pygame对象命名错误,请原谅。我的任务是建立一个虚拟弹球游戏机。当球从窗口落下时,我很难得到它的坐标。我需要坐标来跟踪得分和重置循环,这样用户可以在球触底后再投下一个球

这是我的源代码

#Project specific libraries
import pygame                   #https://www.pygame.org/news
import pymunk                   #http://www.pymunk.org/en/latest/
import pymunk.util
import pymunk.pygame_util
import tkinter                  #https://docs.python.org/2/library/tkinter.html

#Standard libraries
import sys
import math
import random
import os
import time

#Import ALL tools from tkinter & pygame libraies
from tkinter import *
from pygame import *

#Constants for object to object interaction
COLLTYPE_FLOOR = 3
COLLTYPE_BOUNCER = 2
COLLTYPE_BALL = 1

#****************************************************************************
def goal_reached(arbiter, space1, data):

    ball_i, floor_i  = arbiter.shapes

    space_i = space1

    space_i.remove(ball_i, ball_i.body)
    remove_from_ball_list(ball_i)
    return True
#*************************************************************

main = Tk()
main.resizable(width=False, height=False)
main.title("Pachinko")
embed = Frame(main, width = 500, height = 500) 

embed.pack() #packs window to the left
os.environ['SDL_WINDOWID'] = str(embed.winfo_id())

screen = pygame.display.set_mode((500,500))
screen.fill(pygame.Color(255,215,255))
clock = pygame.time.Clock()

#List of ball "objects"
balls = []

#might not need balls_to_remove List
balls_to_remove = []

#velocity, gravity
space = pymunk.Space()
space.gravity = 0, -200

#Floor boundaries
floor = pymunk.Segment(space.static_body, (0.0, 10.0), (500.0, 10.0), 1.0)
floor.collision_type = COLLTYPE_FLOOR
space.add(floor)

#Left wall boundaries
left_wall = pymunk.Segment(space.static_body, (0.0, 500.0), (0.0, 0.0), 1.0)
left_wall.friction = 1.0
left_wall.elasticity = 0.9
left_wall.collision_type = COLLTYPE_BOUNCER
space.add(left_wall)

#Right wall boundaries
right_wall = pymunk.Segment(space.static_body, (500.0, 500.0), (500.0, 0.0), 1.0)
right_wall.friction = 1.0
right_wall.elasticity = 0.9
right_wall.collision_type = COLLTYPE_BOUNCER
space.add(right_wall)

draw_options = pymunk.pygame_util.DrawOptions(screen)
space.debug_draw(draw_options)

#Generate a fixed field of pins
done = 0
x_shift = 45
y_shift = 150
step = 0
tier = 0
while(done == 0):
    variance = random.randint(1, 15) 
    pin_radius = random.randint(14, 17)
    newPin = pymunk.Body(body_type=pymunk.Body.KINEMATIC)
    x = x_shift + variance
    y = y_shift + variance
    newPin.position = x, y
    shape = pymunk.Circle(newPin, pin_radius)
    shape.collision_type = COLLTYPE_BOUNCER
    space.add(newPin, shape)
    x_shift += 85
    step += 1
    if(step == 5):          #Tier one
        x_shift = 100
        y_shift += 60
    if(step == 10):         #Tier two
        x_shift = 50
        y_shift += 60
    if(step == 15):         #Tier three
        x_shift = 100
        y_shift += 60
    if(step == 20):         #Tier four
        x_shift =50
        y_shift += 60
    if(step == 25):         #Tier five
        x_shift = 100
        y_shift += 60
        done = 1

    #Generate the five poles (left to right)
step = 0
x_shift = 100
while(step < 4):
    pole0 = pymunk.Segment(space.static_body, (x_shift, 100.0), (x_shift, 10.0), 5.0)
    pole0.friction = 1.0
    pole0.elasticity = 0.9
    pole0.collision_type = COLLTYPE_BOUNCER
    space.add(pole0)
    step += 1
    x_shift += 100


pygame.display.flip()
pygame.display.init()
pygame.display.update()

#https://stackoverflow.com/questions/23410161/pygame-collision-code
h = space.add_collision_handler(COLLTYPE_BALL, COLLTYPE_FLOOR)

h.begin = goal_reached

def remove_from_ball_list(temp1):
    #print("where in list is it?")
    for ball in balls:
        if temp1 == ball:
            #print("Time to remove from the list")
            balls.remove(ball)



#Primary game loop
ticks = 50
play = True
while play == True:
    mouseClick = pygame.event.get()
    dropHeight = 440

    for event in mouseClick:
        if event.type == pygame.MOUSEBUTTONUP:
            mouseX, mouseY = pygame.mouse.get_pos()
            ticks = 0

    #keep making new balls & pins
    if ticks == 0:
        step = 0
        x_shift = 0
        y_shift = 0

        #Generate the new ball
        mass = 1
        inertia = pymunk.moment_for_circle(mass, 0, 14, (0, 0))
        radius = 12
        ball = pymunk.Body(mass, inertia)

        #Keep the ball in bounds when user drops
        if(mouseX < 25):
            mouseX = 10
        if(mouseX > 480):
            mouseX = 490
        ball.position = mouseX, dropHeight
        shape = pymunk.Circle(ball, radius)
        shape.collision_type = COLLTYPE_BALL
        space.add(ball, shape)
        balls.append(shape)
        ticks = 50
    pygame.draw.line(screen, (255,0,255), (20,60), (480,60), 2)
    space.step(1/50.0)
    space.debug_draw(draw_options)
    pygame.display.update()
    pygame.display.flip()
    screen.fill(pygame.Color(255,215,255))
    clock.tick(50)
    #ticks -= 1
    main.update()
#特定于项目的库
导入pygame#https://www.pygame.org/news
进口皮芒克#http://www.pymunk.org/en/latest/
导入pymunk.util
导入pymunk.pygame_util
进口tkinter#https://docs.python.org/2/library/tkinter.html
#标准库
导入系统
输入数学
随机输入
导入操作系统
导入时间
#从tkinter和pygame库导入所有工具
从tkinter进口*
从pygame导入*
#对象到对象交互的常量
COLLTYPE_楼层=3
COLLTYPE_弹跳器=2
COLLTYPE_BALL=1
#****************************************************************************
def目标_已达到(仲裁员,space1,数据):
ball_i,floor_i=仲裁人形状
空间i=空间1
空间i.移除(球i,球体)
从球列表中删除球(球i)
返回真值
#*************************************************************
main=Tk()
main.可调整大小(宽度=False,高度=False)
主标题(“弹球”)
嵌入=框架(主,宽度=500,高度=500)
embed.pack()#左侧的packs窗口
os.environ['SDL_WINDOWID']=str(embed.winfo_id())
screen=pygame.display.set_模式((500500))
屏幕填充(pygame.Color(255215255))
clock=pygame.time.clock()
#球“对象”列表
球=[]
#可能不需要删除列表
球到球移除=[]
#速度,重力
space=pymunk.space()
space.gravity=0,-200
#楼层边界
地板=pymunk.段(空间静止体,(0.0,10.0),(500.0,10.0),1.0)
floor.collision\u type=COLLTYPE\u floor
空间。添加(楼层)
#左墙边界
左墙=pymunk.段(空间静态体,(0.0500.0),(0.0,0.0),1.0)
左墙摩擦=1.0
左墙弹性=0.9
左墙碰撞类型=COLLTYPE防弹跳器
添加空间(左墙)
#右墙边界
右墙=pymunk.段(空间静态体,(500.0500.0),(500.0,0.0),1.0)
右墙摩擦=1.0
右墙弹性=0.9
右\u墙。碰撞\u类型=COLLTYPE\u弹跳器
添加空间(右墙)
draw\u options=pymunk.pygame\u util.DrawOptions(屏幕)
space.debug\u draw(draw\u选项)
#生成固定的管脚字段
完成=0
x_移位=45
y_移位=150
步长=0
层=0
而(完成==0):
方差=random.randint(1,15)
pin_半径=random.randint(14,17)
newPin=pymunk.Body(Body_type=pymunk.Body.kinetic)
x=x_移位+方差
y=y_移位+方差
newPin.position=x,y
形状=pymunk圆(新销、销半径)
shape.collision\u type=COLLTYPE\u BOUNCER
空格.添加(newPin,shape)
x_移位+=85
步骤+=1
如果(步骤==5):#第一层
x_移位=100
y_移位+=60
如果(步骤==10):#第二层
x_移位=50
y_移位+=60
如果(步骤==15):#第三层
x_移位=100
y_移位+=60
如果(步骤==20):#第四层
x_移位=50
y_移位+=60
如果(步骤==25):#第五层
x_移位=100
y_移位+=60
完成=1
#生成五个极点(从左到右)
步长=0
x_移位=100
而(步骤<4):
pole0=pymunk.段(空间静态体,(x_移位,100.0),(x_移位,10.0),5.0)
pole0.摩擦力=1.0
pole0.弹性=0.9
pole0.collision\u type=COLLTYPE\u BOUNCER
空格.add(pole0)
步骤+=1
x_移位+=100
pygame.display.flip()
pygame.display.init()
pygame.display.update()
#https://stackoverflow.com/questions/23410161/pygame-collision-code
h=空间。添加碰撞处理程序(COLLTYPE\u BALL,COLLTYPE\u FLOOR)
h、 开始=达到目标
def从球列表中删除球(temp1):
#打印(“它在列表中的什么位置?”)
对于球中球:
如果temp1==球:
#打印(“从列表中删除的时间”)
球。移除(球)
#初级游戏循环
滴答声=50
播放=正确
当播放=真时:
mouseClick=pygame.event.get()
落差高度=440
对于鼠标中的事件,单击:
如果event.type==pygame.MOUSEBUTTONUP:
mouseX,mouseY=pygame.mouse.get_pos()
滴答声=0
#继续制造新的球和别针
如果刻度==0:
步长=0
x_移位=0
y_移位=0
#生成新球
质量=1
惯性=pymunk.圆的力矩(质量,0,14,(0,0))
半径=12
球体=pymunk.物体(质量、惯性)
#当用户下落时,将球保持在界内
如果(mouseX<25):
mouseX=10
如果(鼠标>480):
mouseX=490
ball.position=鼠标,下降高度
形状=pymunk圆(球,半径)
shape.collision\u type=COLLTYPE\u BALL
添加(球、形状)
球。附加(形状)
滴答声=50
pygame.draw.line(屏幕,(255,0255),(20,60),(480,60),2)
空间步长(1/50.0)
space.debug\u draw(draw\u选项)
pygame.display.update()
pygame.display.flip()
屏幕填充(pygame.Color(255215255))
时钟滴答(50)
#滴答声-=1
main.update()
下面是我想添加此功能的特定代码:

#Primary game loop
ticks = 50
play = True
while play == True:
    mouseClick = pygame.event.get()
    dropHeight = 440

    for event in mouseClick:
        if event.type == pygame.MOUSEBUTTONUP:
            mouseX, mouseY = pygame.mouse.get_pos()
            ticks = 0

    #keep making new balls & pins
    if ticks == 0:
        step = 0
        x_shift = 0
        y_shift = 0

        #Generate the new ball
        mass = 1
        inertia = pymunk.moment_for_circle(mass, 0, 14, (0, 0))
        radius = 12
        ball = pymunk.Body(mass, inertia)

        #Keep the ball in bounds when user drops
        if(mouseX < 25):
            mouseX = 10
        if(mouseX > 480):
            mouseX = 490
        ball.position = mouseX, dropHeight
        shape = pymunk.Circle(ball, radius)
        shape.collision_type = COLLTYPE_BALL
        space.add(ball, shape)
        balls.append(shape)
        ticks = 50
    pygame.draw.line(screen, (255,0,255), (20,60), (480,60), 2)
    space.step(1/50.0)
    space.debug_draw(draw_options)
    pygame.display.update()
    pygame.display.flip()
    screen.fill(pygame.Color(255,215,255))
    clock.tick(50)
    #ticks -= 1
    main.update()
#主要游戏循环
滴答声=50
播放=正确
当播放=真时:
mouseClick=pygame.event.get()
落差高度=440
对于鼠标中的事件,单击:
如果event.type==pygame.MOUSEBUTTONUP:
mouseX,mouseY=pygame.mouse.get_pos()
滴答声=0
#继续制造新的球和别针
如果刻度==0:
步长=0
x_移位=0
y_移位=0
#生成新球
质量=1
惯性=pymunk.圆的力矩(质量,0,14,(0,0))
半径=12
球体=pymunk.物体(质量、惯性)
#当用户下落时,将球保持在界内
for b in balls:
  print("ball position", b.body.position)