回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
我是一个业余程序员,在Python和PyPoGAME中尝试制作游戏(我知道,不是最好的,但我知道如何比java和C++更好地使用它)。我遇到了一个有趣的问题:使用屏幕坐标在屏幕上定位一个特定的精灵,然后将它移动到另一个位置。<br/>
例如,我有一个库存,我的编码方式是让玩家把一个物品从他们的库存中取出,放回二维游戏场,这样玩家以后就可以拿起来了。<br/>
由于项目的数量不尽相同,因此将所有项目的坐标都固定到一个列表中并尝试以这种方式进行管理是有点低效的。试图将不断变化的项目列表与字段上的对象连接起来会变得太麻烦。在</p>
<p>我已经附上代码,我到目前为止,以防有帮助。我在网上查过了,但是没有找到任何关于如何做到这一点的建议,我找到的唯一的解决方案就是用<code>spritecollide()</code>和一个看不见的精灵找到这个对象,但是我需要帮助。在</p>
<p>drop函数是我现在正在研究的部分。<code>pos()</code>是一个由两个项目组成的列表,<code>x</code>和{<cd4>},它们是鼠标在屏幕上单击的坐标。在</p>
<p>创建库存的类:</p>
<pre><code>import pygame
from testRect import *
class Inventory(pygame.sprite.Sprite):
# Define colors
white = (255,255,255)
dgreen = (0,154,0)#useables
dblue = (0,0,154)#throwables
dred = (154,0,0)#holdables
def __init__(self,surface,pos,grid,gridItems,handsUsed):
for row in range(4):
# Add an empty array that will hold each cell
# in this row
grid.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>([])
for column in range(4):
grid[row].append(0) # Append a cell
gridItems.append([])
for column in range(4):
gridItems[row].append(0) # Append a cell
self.update(surface,pos,grid,gridItems,handsUsed)
def update(self,surface,pos,grid,gridItems,handsUsed):
width=40
height=40
margin=2
#convert click location to grid squares
column=pos[0] // (width+margin)-20
row=pos[1] // (height+margin)-7
#make grid selection (toggle if selected or not)
if row >-1 and row <4 and column >-1 and column < 4:
if grid[row][column] == 0 and handsUsed < 2:
grid[row][column] = 1
handsUsed += 1
elif grid[row][column] == 1 and handsUsed > 0:
grid[row][column] = 0
handsUsed -= 1
# Draw the grid and determine type of object
for row in range(4):
for column in range(4):
color = self.white
if grid[row][column] == 1 and gridItems[row][column] == 1:
color = self.dgreen
elif grid[row][column] == 1 and gridItems[row][column] == 2:
color = self.dblue
elif grid[row][column] == 1 and gridItems[row][column] == 3:
color = self.dred
pygame.draw.rect(surface,color,[((margin+width)*column+margin)+840,((margin+height)*row+margin)+295,width,height])
return handsUsed#return the variable so that the master handsUsed var will also update
def drop(self,pos,handsUsed,grid,staticsprites):
moved = False
if pos[0] > 838 and pos[0] < 1011 and pos[1] > 491 and pos[1] < 538 and handsUsed > 0:
width=40
height=40
margin=2
row = 0
column = 0
while row < 4 and moved == False:
if grid[row][column] == 1:
#items selected will set their coordinates to a space near the player.
#Will check to see if spot is open in this priority (high to low): below, above, left, right
#finds the item to be moved
itemSelectRow = row * (((height + margin)-7))+299
itemSelectColumn = (column * ((width + margin)+20))+845
collideList = pygame.sprite.spritecollide(testRect, staticsprites, False)
if collideList != None:
#will move the item to the location since nothing is in the way
print collideList
moved = True
break
elif row < 4 and column < 3:
print "hi"
column += 1
elif row < 4 and column >= 3:
column = 0
row += 1
else:
break
return handsUsed#return the variable so that the master handsUsed var will also update
</code></pre>