1

私は python と pygame でゲームを作ろうとしているアマチュア プログラマーです (私は知っていますが、最高ではありませんが、Java や C++ よりも優れた使い方を知っています)。画面座標を使用して特定のスプライトを画面上に配置し、そのスプライトを別の場所に移動するという興味深い問題に遭遇しました。
たとえば、在庫があり、プレーヤーが在庫からアイテムをドロップし、プレーヤーが後でそれを拾うことができるように 2 次元の競技場に戻す方法でコーディングしています。
さまざまな量のアイテムがあるため、すべての座標をリストに追加してそのように管理しようとするのは、非効率的です。絶えず変化するアイテムリストをフィールド上のオブジェクトに接続しようとすると、面倒です.

それが役立つ場合に備えて、これまでに持っているコードを添付しました。私はオンラインで調べましたが、これを行う方法についての提案は見つかりませんでした。私が見つけた他の唯一の解決策はspritecollide()、目に見えないスプライトを使用してオブジェクトを見つけることですが、そのための助けが必要です.

ドロップ機能は私が今取り組んでいる部分です。は、画面上のクリックした場所のマウス座標であるとpos()の 2 つの項目のリストです。xy

インベントリを作成するクラス:

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.append([])
        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
4

2 に答える 2

0

アイテムを地面に置き、できるだけプレイヤーに近づける方法が必要であり、アイテムをドロップするために可能な位置を試す方法が必要だと思います. 私は正しいですか?

私は 1 年間の python exp と、ゲーム プログラミングのいくつかの exp を持っています。

これが事です:

ゲーム プログラミングは科学ではありません。最初はこれを行う簡単な方法を見つけて、ゲームが形を成すようになると、より適切に行うことができます。あなたのゲームがどのように見えるかはわかりませんが、地面に散らばるアイテム (Diablo2 アイテムのドロップか何かを考えているのでしょうか?) は、ほとんどのゲームのスイート スポットではないと思います。計算負荷の高いスプライト衝突テストの代わりに、単純な x、y グリッドを使用した論理マップ マトリックスを使用して衝突テストを実行できます。

処理できるように十分に単純にしてください。数週間 (または数年) 後にコードが何をするかを思い出すことができます。複雑すぎると害があります。

頑張って素晴らしいゲームを作ってください:)

于 2012-08-27T07:16:57.697 に答える