微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在矩阵pygame中移动多个对象

如何解决在矩阵pygame中移动多个对象

好的,所以我尝试在 pygame 中分隔入侵者,我决定在屏幕中间以矩形形状对多个敌人进行 blit,我也想移动它们,首先我创建了一个类似于屏幕使用敌人的宽度和高度,我设法做到了,当我想让他们都移动但不知道我如何已经有了一个移动功能,它在一个类的实例上工作得很好,但现在我不知道了不知道如何在多个对象上执行此操作,期望创建大量实例,这可能不是最有效和最好的方法,这是我的代码

绘制函数

    def draw(self):

    tile_width = enemy1.enemyImg_resize.get_width()
    tile_height = enemy1.enemyImg_resize.get_height()
    enemy_grid = [
        [0,0],[0,1,0]
    ]
    # Note: The matrix wasn't created manually but using numpy zeros() function
    y1 = 0
    for row in enemy_grid:
        x1 = 0
        for tile in row:
            if tile == 1:
                screen.blit(self.enemyImg_resize,(x1 * tile_width,y1 * tile_height))

            x1 += 1
        y1 += 1

移动功能

def move(self):
    # global variable enemy_vel was declared above and I don't usually use globals I kNow they bad 
    
    # enemy is a rect version of enemyImg_resize,The problem is that even move function is able to 
    # handle only one object and I have no idea how to transform it to be able to handle more and 
    # move all of the enemies
    Global enemy_vel
    self.enemy.x += enemy_vel
    if self.enemy.x == 0:
        enemy_vel = 1
        self.enemy.y += self.enemyImg_resize.get_height()
    elif self.enemy.x == width - self.enemyImg_resize.get_width():
        enemy_vel = -1
        self.enemy.y += self.enemyImg_resize.get_height()

如果需要完整代码

import pygame
import os
import numpy as np


pygame.init()
pygame.time.delay(30)

# Screen Variables
width,height = 1440,900
screen = pygame.display.set_mode((width,height))
bg = pygame.image.load(os.path.join('Space Invader Game Assets','Backgrounds','maxresdefault.jpg'))
bg_resize = pygame.transform.scale(bg,(width,height))
pygame.display.set_caption('Space Invaders')

# Colors
black = (0,0)

# Game Variables
FPS = 60
clock = pygame.time.Clock()
vel = 2.1
bullet_vel = 2.9
enemy_vel = 1
matrica = np.zeros((26,16),dtype=int)

class Player:

    def __init__(self):
        # Player
        self.playerImg = pygame.image.load(os.path.join('Space Invader Game Assets','Game Basic Assets','player.png'))
        self.playerImg_resize = pygame.transform.scale(self.playerImg,(130,130))
        self.player = self.playerImg_resize.get_rect()
        self.player.center = (width // 2,height // 1.1)

    def draw(self):
        screen.blit(self.playerImg_resize,self.player)

    def move(self):
        key = pygame.key.get_pressed()
        if key[pygame.K_d]:
            self.player.x += vel
            if self.player.x > width + 20:  # so it lets you go from the window borders a bit
                self.player.x = -80
        if key[pygame.K_a]:
            self.player.x -= vel
            if self.player.x < - 80:  # so it lets you go from the window borders a bit
                self.player.x = width

        # Upwards and Downwards movement,Note: may be re-added and un-added

        if keys[pygame.K_w] and self.player.y > -20:  # reason for -20 because hitBox of ship
            self.player.y -= vel
        if keys[pygame.K_s] and self.player.y < height - 100:  # idfk why it isn't working properly
            self.player.y += vel


class Bullet(Player):

    def __init__(self,x,y):
        Player.__init__(self)
        self.bulletImg = pygame.image.load(
            os.path.join('Space Invader Game Assets','Bullet.png'))
        self.bullet = pygame.transform.scale(self.bulletImg,(50,50))
        self.bullet_rect = self.bullet.get_rect()
        self.x = x
        self.y = y

    def show(self):
        screen.blit(self.bullet,(self.x,self.y))


class Enemy:

    def __init__(self,y):
        self.enemyImg = pygame.image.load(os.path.join('Space Invader Game Assets','Enemy1.png'))
        self.enemyImg_resize = pygame.transform.scale(self.enemyImg,(55,55))
        self.enemy = self.enemyImg_resize.get_rect()
        self.enemy.x = x
        self.enemy.y = y

    def draw(self):

        tile_width = enemy1.enemyImg_resize.get_width()
        tile_height = enemy1.enemyImg_resize.get_height()
        enemy_grid = [
            [0,0]
        ]

        y1 = 0
        for row in enemy_grid:
            x1 = 0
            for tile in row:
                if tile == 1:
                    screen.blit(self.enemyImg_resize,y1 * tile_height))

                x1 += 1
            y1 += 1

    def move(self):
        global enemy_vel
        self.enemy.x += enemy_vel

        if self.enemy.x == 0:
            enemy_vel = 1
            self.enemy.y += self.enemyImg_resize.get_height()
        elif self.enemy.x == width - self.enemyImg_resize.get_width():
            enemy_vel = -1
            self.enemy.y += self.enemyImg_resize.get_height()


player = Player()
enemy1 = Enemy(-1,height // 60)
bullet1 = Bullet(player.player.x + 27,player.player.y + 5)


def is_collision(object1,object2):
    return object1.colliderect(object2)


def graphics():
    screen.blit(bg_resize,(0,0))
    player.draw()
    player.move()
    enemy1.draw()
    enemy1.move()
    for projectile in bullets:
        projectile.show()

    pygame.display.update()


clock.tick(FPS)
bullets = []
run = True
while run:
    keys = pygame.key.get_pressed()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    for bullet in bullets:
        # Defining x and y of bullet rect so we can check collision
        bullet1.bullet_rect.x = bullet.x
        bullet1.bullet_rect.y = bullet.y

        if not is_collision(bullet1.bullet_rect,enemy1.enemy) and bullet.y > -5:
            bullet.y -= bullet_vel

            # Debug Tool

            # print(bullet1.bullet_rect.x,enemy1.enemy.x,bullet1.bullet_rect.y,enemy1.enemy.y)

        else:
            bullets.remove(bullets[-1])

    if keys[pygame.K_SPACE]:
        if len(bullets) < 1:
            # Adding 27 and 5 numbers to adjust bullet position to it's hitBox
            bullets.append(Bullet(player.player.x + 27,player.player.y + 5))

    graphics()

pygame.quit()

提前致谢:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。