получите массив строк с результатом mysqli

Таким образом, каждый астероид в вашей игре представлен как Rect, хранящийся в badguys.

С помощью Rect вы можете сохранить положение и размер (поскольку у Rect есть атрибуты x, y, width и height).

Теперь вы хотите сохранить дополнительную информацию / состояние для каждого астероида, поэтому недостаточно только использования Rect. Вам нужна другая структура данных, которая содержит больше полей.

Поскольку вы используете python, подходящая структура данных - это класс, который может содержать случайный вектор.

Но давайте подумаем немного дальше. Поскольку вы используете pygame, pygame уже предлагает класс для перерисовки игровых объектов, и этот класс называется Sprite .

Итак, начнем (обратите внимание на комментарии в коде):

import pygame
import random

screen = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

class Asteroid(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()

        # let's create an image of an asteroid by drawing some lines
        self.image = pygame.Surface((50, 50))
        self.image.set_colorkey((11, 12, 13))
        self.image.fill((11, 12, 13))
        pygame.draw.polygon(self.image, pygame.Color('grey'), [(0, 11), (20, 0), (50, 10), (15, 22), (27, 36), (10, 50), (0, 11)], 1)

        # Let's store a copy of that image to we can easily rotate the image
        self.org_image = self.image.copy()

        # The rect is used to store the position of the Sprite
        # this is required by pygame
        self.rect = self.image.get_rect(topleft=(x, y))

        # Let's create a random vector for the asteroid
        self.direction = pygame.Vector2(0, 0) 
        while self.direction.length() == 0:
            self.direction = pygame.Vector2(random.uniform(-1, 2), random.uniform(-1, 2))

        # Also we want a constant, random speed
        self.direction.normalize_ip()
        self.speed = random.uniform(0.1, 0.3)

        # we additionaly store the position in a vector, so the math is easy
        self.pos = pygame.Vector2(self.rect.center)

        # Aaaaaaaaaand a random rotation, because why not
        self.rotation = random.uniform(-0.3, 0.3)
        self.angle = 0

    def update(self, dt):
        # movement is easy, just add the position and direction vector
        self.pos += self.direction * self.speed * dt
        self.angle += self.rotation * dt
        self.image = pygame.transform.rotate(self.org_image, self.angle)

        # update the rect, because that's how pygame knows where to draw the sprite
        self.rect = self.image.get_rect(center=self.pos)

SPAWNENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(SPAWNENEMY, 800)

asteroids = pygame.sprite.Group()
dt = 0
while True:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            quit()
        if e.type == SPAWNENEMY:
            asteroids.add(Asteroid(random.randint(50, 200), random.randint(50, 200)))
    screen.fill(pygame.Color('black'))
    asteroids.draw(screen)
    asteroids.update(dt)
    pygame.display.flip()
    dt = clock.tick(60)

7
задан Dharman 25 November 2019 в 09:41
поделиться

2 ответа

У вас возникла небольшая синтаксическая проблема, а именно неправильная точка с запятой.

while($row = $result->fetch_row());

Примечание точка с запятой в конце? Это означает, что следующий блок не выполнялся в цикле. Избавьтесь от этого, и он должен сработать.

Также вы можете проверить, действительно ли запрос работает:

$sql = new mysqli($config['host'], $config['user'], $config['pass'], $config['db_name']);
if (mysqli_connect_errno()) {
  printf("Connect failed: %s\n", mysqli_connect_error());
  exit;
}
$query = "SELECT domain FROM services";
$result = $sql->query($query);     
if (!$result) {
  printf("Query failed: %s\n", $mysqli->error);
  exit;
}      
while($row = $result->fetch_row()) {
  $rows[]=$row;
}
$result->close();
$sql->close();
return $rows;
22
ответ дан 6 December 2019 в 07:27
поделиться

Новейшие версии mysqli имеют некоторые улучшения, которые могут упростить такую задачу.

Первый, всех, существует полезная функция для возврата массива со всеми строками, возвращенными запросом, mysqli_fetch_all()
Это означает в случае, если Вам нужен простой перечислимый массив, код был бы намного более простым:

$query = "SELECT domain FROM services";
$result = $sql->query($query);     
return $result->fetch_all(MYSQLI_ASSOC);

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

$query = "SELECT domain FROM services";
$result = $sql->query($query);
$data = [];
while($row = $result->fetch_assoc()) {
  $data[$row['id']]=$row;
}

Примечание, что необходимо всегда инициализировать массив перед заполнением его, потому что такая переменная могла уже существовать.

кроме того, mysqli_result класс теперь Проходим. Это означает, что можно использовать его в цикле foreach сразу же, как будто это - массив, содержит все строки от базы данных:

$query = "SELECT domain FROM services";
$result = $sql->query($query);
foreach($result as $row) {
    echo $row['name'];
}

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

Обязательные примечания.

Этим вопросом является старое десятилетие, и способ, которым установлена связь, и запрос выполняется, и в вопросе и в принятом ответе, obsoleted и осужденный в наше время.

, Когда связь установлена, существует несколько вещей иметь в виду. Я записал статья , которая предоставляет корректное подчеркивание соединения в качестве примера по следующим проблемам:

  • надлежащее режим сообщения об ошибке должен быть установлен
  • надлежащее , набор символов должен быть установлен
  • , никакой ручной код сообщения об ошибке никогда не должен использоваться (как die(mysqli_connect_error()))
  • , связь должна быть установлена только однажды , в отдельном файле, и затем просто включена в каждый сценарий, для которого нужно взаимодействие базы данных. в случае, если код базы данных используется в функции, переменная соединения должна быть передана в как параметр функции.

, Когда запрос выполняется, существует несколько вещей иметь в виду:

  • , когда, по крайней мере, единственная переменная используется в запросе, , подготовленный оператор должен использоваться вместо mysqli_query()
  • , никакой ручной код сообщения об ошибке никогда не должен использоваться (как die(mysqli_error())). благодаря надлежащему ошибочному режиму mysqli сообщит обо всех ошибках автоматически.
2
ответ дан 6 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

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