问题描述
好的,所以我尝试在 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 (将#修改为@)