Набор XmlSerialization как массив

Я думаю, что реальная проблема в том, что код не добавляет playerSprite в all_sprites_list. Если спрайта нет в этом списке, обновление спрайта и вызовы рисования не включают его. Сначала я думал, что начальное положение спрайта может быть вне экрана, поэтому я параметризовал размеры экрана и поместил спрайт посередине.

В коде вопроса также есть куча других проблем с отступами, но я думаю, что это может быть из-за вставки вопроса в SO.

Я очистил и реорганизовал код, кажется, он запускается, и нажатие влево / вправо перемещает коричневую рамку.

Я объединил оба файла, чтобы облегчить отладку, извинения.

import pygame, random

pygame.init()
BROWN     = (205,192,176)
DEEPBROWN = (139,131,120)
CL        = (156,102,31)
WHITE     = (255,255,255)

WINDOW_WIDTH=500
WINDOW_HEIGHT=500

# Setup the pyGame window
size = (WINDOW_WIDTH, WINDOW_HEIGHT)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Adventure")

class LittleMan (pygame.sprite.Sprite):

    def __init__(self, color, width, height):
        super().__init__()
        self.image = pygame.Surface([50, 75])
        self.image.fill(CL)
        self.image.set_colorkey(WHITE)
        self.rect = self.image.get_rect()
        self.rect.center = ( WINDOW_WIDTH//2 , WINDOW_HEIGHT//2 )

    def moveRight(self, pixels):
        self.rect.x += pixels

    def moveLeft(self, pixels):
        self.rect.x -= pixels

# Create the player sprite
playerSprite = LittleMan(CL, 200, 300)

# Add user sprite into PyGame sprites list
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(playerSprite);

clock = pygame.time.Clock()
carryOn = True
while carryOn:

    # Handle user input
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            carryOn = False

        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_x: #Pressing the x Key will quit the game
                carryOn=False
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT]:
                playerSprite.moveLeft(5)
            if keys[pygame.K_RIGHT]:
                playerSprite.moveRight(5)

    # Update and Reapint the screen
    screen.fill(BROWN)
    pygame.draw.rect(screen, DEEPBROWN, [55, 250, 900, 70],0)
    all_sprites_list.update()
    all_sprites_list.draw(screen)
    pygame.display.flip()
    clock.tick(60)

Класс LittleMan не включает функцию update(), которую обычно вызывал бы all_sprites_list.update(). Я полагаю, вам просто не нужна эта часть.

РЕДАКТИРОВАТЬ: Дополнительные примечания к функции обновления спрайта () ~

Функция спрайта update() вызывается pygame во время функции all_sprites_list.update(). Таким образом, это означает, что любой спрайт, добавленный в эту группу, будет автоматически обновляться. В идеале все спрайты имеют функцию обновления, которая обрабатывает внешний вид, положение и столкновения (и т. Д.) Спрайта.

Идея этой функции заключается в том, чтобы обновлять спрайт. Итак, у вас был спрайт, который двигался, эта функция рассчитала следующую позицию и установила спрайт self.rect. Или, возможно, этот спрайт анимирован - функция обновления установит для спрайта image следующий кадр анимации, основанный на времени.

Очевидно, что вся эта работа может быть выполнена вне функции обновления. Но он предоставляет простой и чистый механизм программирования для механики спрайтов.

5
задан John Saunders 28 July 2009 в 21:30
поделиться

2 ответа

Попытка просто с помощью [XmlElement("trees")]:

[Serializable(), XmlRoot("root")]
public class test
{
    [XmlElement("trees")]
    public List<string> MyProp1 = new List<string>();

    public test()
    {
        MyProp1.Add("some text");
        MyProp1.Add("some more text");
    }
}

Обратите внимание, что я изменился ArrayList кому: List<string> очищать вывод; в 1,1, StringCollection была бы другая опция, хотя это имеет различные правила чувствительности к регистру.

7
ответ дан 14 December 2019 в 09:02
поделиться

(редактирование: obsoleted - мое второе сообщение ([XmlElement]) путь состоит в том, чтобы пойти - я оставляю это для потомства в использовании xsd.exe)

xsd.exe Ваш друг. Скопируйте xml, который Вы хотите в файл (foo.xml), затем используйте:

xsd foo.xml
xsd foo.xsd /classes

Теперь читайте foo.cs; можно использовать это или непосредственно, или только для вдохновения.

(редактирование: отрезанный вывод - не полезный больше)

0
ответ дан 14 December 2019 в 09:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: