Python 当玩家通过键盘移动时,Pygame敌人随机显示
我正在制作一个足球游戏(美式),其中有一个玩家类通过键盘在一个程序中移动图像:Python 当玩家通过键盘移动时,Pygame敌人随机显示,python,pygame,sprite,Python,Pygame,Sprite,我正在制作一个足球游戏(美式),其中有一个玩家类通过键盘在一个程序中移动图像: import pygame import os import random black = (0,0,0) white = (255,255,255) red = (255, 0, 0) green = (0, 100, 0) # This class represents the bar at the bottom that the player controls class Player(object):
import pygame
import os
import random
black = (0,0,0)
white = (255,255,255)
red = (255, 0, 0)
green = (0, 100, 0)
# This class represents the bar at the bottom that the player controls
class Player(object):
def __init__(self):
self.image = pygame.image.load("player_one.png").convert()
self.image.set_colorkey(white)
self.width = 15
self.height = 15
self.x = 940
self.y = 240
def handle_keys(self):
key = pygame.key.get_pressed()
if key[pygame.K_DOWN]:
if self.y < 470:
self.y += self.height
elif key[pygame.K_UP]:
if self.y > 0:
self.y -= self.height
if key[pygame.K_RIGHT]:
if self.x < 940:
self.x += self.width
elif key[pygame.K_LEFT]:
if self.x > 0:
self.x -= self.width
def draw(self, surface):
surface.blit(self.image, (self.x, self.y))
pygame.init()
screen = pygame.display.set_mode((1000, 500))
player = Player()
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
running = False
player.handle_keys()
screen.fill(green)
for x in range(60,940,35):
pygame.draw.line(screen, white, [x, 0], [x, 500], 1)
player.draw(screen)
pygame.display.update()
clock.tick(20)
首先,感谢那些帮助我走到这一步的人。第二个-我需要将Player类合并到第二个程序中。我需要添加碰撞检测,这样,如果玩家进入左端区域,他的分数将增加+7,他将返回起点。此外,如果玩家遇到敌人,他会回到起点。我希望比赛有一个2分钟的计时器,所以目标是在比赛结束前的时间范围内得分
我知道很多人会推荐Sprites,我也希望如此,但请您提供代码/解释。附件是我的照片
我推荐雪碧!我不会把一切都告诉你,因为搞清楚游戏编程有一半的乐趣! 首先,您可以设置pygame组,如 player_list=pygame.sprite.Group() 玩家列表。添加(玩家) 对于玩家和敌人,使用pygame.sprite.spritecollide测试他们之间的碰撞,或者在球场左侧区域使用类似的东西。。 然后,正如furas提到的,只需复制或导入播放器类即可 另外,我建议您为计时器设置pygame.time.get_ticks(),尽管您可以通过其他方式实现。。 剩下的全靠你了!我希望这在某种程度上有所帮助,如果你不明白,可以问任何问题!
我在手机上做过这项工作,所以如果有人想编辑所有代码,那就太好了:)我有点不明白你在问什么,我希望这能回答你所有的问题: 首先,敌人不会在每次更新时“传送”到随机位置吗?我不确定你想要实现什么,但是如果你在init上随机选择他们的位置(你将他们的x和y设置为0),在更新中你应该创建一些人工智能(比如跟随英雄?)
类敌人():
定义初始化(自我,图像):
self.image=pygame.image.load(image.convert())
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.centerx=random.randint(60220+1)
self.rect.centery=random.randint(0475+1)
#------------
def提取(自身,屏幕):
screen.blit(self.image,self.rect)
#------------
def更新(self、heroX、heroY):
#让敌人跟随英雄(例如)
如果heroX>self.rect.centerx
self.rect.centerx+=10#10是示例值,设置您喜欢的示例值!
否则,如果heroX
只要确保在更新敌人时通过玩家的x和y
关于碰撞,有一个简单的算法是这样的:如果有objectA和objectB,它们只会碰撞如果objectA.right>objectB.left&&objectA.leftif (player.right > enemy.left && player.left < enemy.right && player.bottom > enemy.top && player.top < enemy.bottom)
player.reset()
enemy.reset()
if(player.right>敌军.left&&player.left<敌军.right&&player.bottom>敌军.top&&player.top<敌军.bottom)
player.reset()
敌人。重置()
对每个敌人(和英雄,如果有多个)应用此算法一次
关于计时器,您已经有了一个限制帧的计时器,您可以使用它来计算游戏中的秒数并创建限制(使用您的想象力!)我将代码分为3个文件
Player.py
,敌方.py
和game.py
Player.py
- 我添加了
以在新游戏和游戏重新启动时设置开始位置restart()
- 在
中,我使用event(检查键),以便在必要时可以检查鼠标事件和其他事件-它更通用handle\u event
returnhandle_事件
是否移动了玩家True/False
- 碰撞检测-它可以被使用,等等
- 为玩家和敌人得分
- 计时
- 游戏结束-
游戏结束后重新开始游戏退格
随机导入
导入pygame
从玩家导入*
从敌人进口*
白色=(255255)
黑色=(0,0,0)
红色=(255,0,0)
#----------------------------------------------------------------------
类游戏():
定义初始化(自):
pygame.init()
self.screen=pygame.display.set_模式((1400500))
self.background=pygame.image.load(“GameField1.png”).convert()
self.feeds=[]
#self.players=[]
self.player=player(self.screen.get_rect())
#创建3个敌人0…2
对于范围(3)中的i:
敌人=敌人(“敌人”+str(i)+.png”)
敌人。更新()#开始时设置随机位置
self.敌人.append(敌人)
self.font=pygame.font.SysFont(“,32”)
self.gameover_text=self.font.render(“游戏结束”,-1,红色)
self.gameover_rect=self.gameover_text.get_rect(center=self.screen.get_rect().center)
self.restart()
#------------
def重启(自我):
self.player_分数=0
self.u得分=0
#self.play_time=2*60#2分钟*60秒
self.play_time=30#30秒用于快速测试
self.change_time=pygame.time.get_ticks()+1000#1s
self.player.restart()
#------------
def更新时间(自我):
打印“(调试):时间:”,self.change\u time,pygame.time.get\u ticks()
如果pygame.time.get_ticks()>=self.change_time:
自我改变时间+=1000秒
self.play_time-=1
返回self.play\u time复制播放
class Enemy():
def __init__(self, image):
self.image = pygame.image.load(image).convert()
self.image.set_colorkey(WHITE)
self.rect = self.image.get_rect()
self.rect.centerx = random.randint(60,220+1)
self.rect.centery = random.randint( 0, 475+1)
#------------
def draw(self, screen):
screen.blit(self.image, self.rect)
#------------
def update(self, heroX, heroY):
#Make enemies follow hero (for example)
if heroX > self.rect.centerx
self.rect.centerx += 10; #10 is example value, set the one you like!
else if heroX < self.rect.centerx
self.rect.centerx -= 10;
#Do the same for y
#------------
def reset(self): #This is called when hero scores, or enemies touch hero (and you want to reset hero to starting point and enemies)
self.rect.centerx = random.randint(60,220+1)
self.rect.centery = random.randint( 0, 475+1)
if (player.right > enemy.left && player.left < enemy.right && player.bottom > enemy.top && player.top < enemy.bottom)
player.reset()
enemy.reset()
import pygame
#----------------------------------------------------------------------
class Player(object):
def __init__(self, surface_rect):
self.surface_rect = surface_rect
self.image = pygame.image.load("player_one.png").convert()
self.image.set_colorkey( (255,255,255) )
self.rect = self.image.get_rect() # you get image width, height
self.move_x = 15
self.move_y = 15
self.restart()
#------------
def restart(self):
self.rect.x = 940
self.rect.y = 240
#------------
def handle_events(self, event):
player_moves = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
if self.rect.bottom < self.surface_rect.bottom: #470
self.rect.y += self.move_y
player_moves = True
elif event.key == pygame.K_UP:
if self.rect.top > self.surface_rect.top:
self.rect.y -= self.move_y
player_moves = True
elif event.key == pygame.K_RIGHT:
if self.rect.right < self.surface_rect.right:
self.rect.x += self.move_x
player_moves = True
elif event.key == pygame.K_LEFT:
if self.rect.left > self.surface_rect.left:
self.rect.x -= self.move_x
player_moves = True
print "(debug): player: x, y:", self.rect.x, self.rect.y
return player_moves
#------------
def draw(self, surface):
surface.blit(self.image, self.rect)
#----------------------------------------------------------------------
import pygame
import random
#----------------------------------------------------------------------
class Enemy():
def __init__(self, image, x=0, y=0):
self.image = pygame.image.load(image).convert()
self.image.set_colorkey( (255,255,255) )
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.centery = y
#------------
def draw(self, screen):
screen.blit(self.image, self.rect)
#------------
def update(self):
# here change randomly positon
self.rect.topleft = random.randint(60, 220+1), random.randint(0, 475+1)
#----------------------------------------------------------------------
import random
import pygame
from Player import *
from Enemy import *
WHITE = (255,255,255)
BLACK = (0 ,0 ,0 )
RED = (255,0 ,0 )
#----------------------------------------------------------------------
class Game():
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((1400,500))
self.background = pygame.image.load("GameField1.png").convert()
self.enemies = []
#self.players = []
self.player = Player(self.screen.get_rect())
# create 3 enemies 0...2
for i in range(3):
enemy = Enemy("enemy_"+str(i)+".png")
enemy.update() # set random position on start
self.enemies.append(enemy)
self.font = pygame.font.SysFont("", 32)
self.gameover_text = self.font.render("GAME OVER", -1, RED)
self.gameover_rect = self.gameover_text.get_rect(center=self.screen.get_rect().center)
self.restart()
#------------
def restart(self):
self.player_score = 0
self.enemies_score = 0
#self.play_time = 2*60 # 2minutes * 60 seconds
self.play_time = 30 # 30 seconds for fast test
self.change_time = pygame.time.get_ticks() + 1000 # 1s
self.player.restart()
#------------
def update_time(self):
print "(debug): time:", self.change_time, pygame.time.get_ticks()
if pygame.time.get_ticks() >= self.change_time:
self.change_time += 1000 # 1s
self.play_time -= 1
return self.play_time <= 0 # GAME OVER ?
#------------
def draw_score(self, surface):
surface_rect = surface.get_rect()
self.player_score_text = self.font.render(str(self.player_score) + " :Player", -1, WHITE)
self.player_score_rect = self.player_score_text.get_rect(right=surface_rect.right-10, top=10)
surface.blit(self.player_score_text, self.player_score_rect)
self.enemies_score_text = self.font.render("Enemy: " + str(self.enemies_score), -1, WHITE)
self.enemies_score_rect = self.enemies_score_text.get_rect(left=surface_rect.left+10, top=10)
surface.blit(self.enemies_score_text, self.enemies_score_rect)
print "(debug): render scores:", self.player_score, self.player_score_rect, self.enemies_score, self.enemies_score_rect
#------------
def draw_time(self, surface):
surface_rect = surface.get_rect()
time_str = "%02d:%02d" % (self.play_time/60, self.play_time%60)
self.time_text = self.font.render(time_str, -1, RED )
self.time_rect = self.time_text.get_rect(centerx=surface_rect.centerx, top=10)
surface.blit(self.time_text, self.time_rect)
print "(debug): render time:", self.play_time, self.time_rect, (self.play_time/60, self.play_time%60), time_str
#------------
def run(self):
clock = pygame.time.Clock()
RUNNING = True
GAME_OVER = False
while RUNNING:
# --- events ---
PLAYER_MOVES = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
RUNNING = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
RUNNING = False
if event.key == pygame.K_BACKSPACE:
if GAME_OVER:
GAME_OVER = False
self.restart()
# player moves
if not GAME_OVER:
PLAYER_MOVES = self.player.handle_events(event)
# --- updates ----
if PLAYER_MOVES and not GAME_OVER:
# changes position when key is pressed
for enemy in self.enemies:
enemy.update()
# check collisions
collision = False
for enemy in self.enemies:
if pygame.sprite.collide_rect(self.player, enemy):
collision = True
break # first collision and I don't check rest enemies
if collision:
self.enemies_score += 7
print "(debug): game: collision:", self.player_score, self.enemies_score
self.player.restart()
# check touchdown
if self.player.rect.left <= 100:
self.player_score += 7
print "(debug): game: touchdown:", self.player_score, self.enemies_score
self.player.restart()
if not GAME_OVER:
GAME_OVER = self.update_time()
# --- draws ---
self.screen.fill(BLACK)
self.screen.blit(self.background, self.background.get_rect())
self.player.draw(self.screen)
for enemy in self.enemies:
enemy.draw(self.screen)
self.draw_time(self.screen)
self.draw_score(self.screen)
if GAME_OVER:
self.screen.blit(self.gameover_text, self.gameover_rect)
pygame.display.update()
# --- FPS ---
clock.tick(20)
#----------------------------------------------------------------------
Game().run()