- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我对创建游戏/编码相对较新,因此对于我将要带来的大量问题以及我的代码的糟糕组织,我很抱歉,我正在尝试让我的类(class)拥有一个功能来呈现自己游戏而不是使用外部资源
`class Animal(pygame.sprite.Sprite):
def __init__(Self,):
super().__init__()
Self.Image=pygame.image.load('Blank.png').convert_alpha()
Self.rect=Self.image.get_rect()
Self.x=x
Self.y=y
Self.Screen= screen
#Self.Width=Width
#Self.Height=Height
#Self.Energy=0
def BoundryX(entityX):
if entityX<=0:
entityX=0
elif entityX>=600:
entityX=600
def BoundryY(entityY):
if entityY<=0:
entityY=0
elif entityY>=800:
entityY=800
class Predator(Animal):
def __init__(Self):
#super().__init__()
Self.Img=pygame.image.load('Icon.png')
Self.PredatorX=0
Self.PredatorY=0
Self.Screen= screen
def Render(Self,Img,X,Y):
Self.screen.blit(Img,(X,Y))
`
我遇到了问题,因为它说该类没有属性“屏幕”,我不知道这意味着什么,顺便说一下,创建函数以在之后创建更多集合类的最佳方法是什么他们已经吃够了他们的食物链以及删除它们以及组织所有不同 Sprite 的功能(我知道这不是我的主要问题的一部分,所以如果没有得到答案也没关系)
#imports
import math
import random
import pygame,sys
import random
import pdb
from pygame.locals import *
timmer=1
class Animal(pygame.sprite.Sprite):
def __init__(Self,):
super().__init__()
Self.Image=pygame.image.load('Blank.png').convert_alpha()
Self.rect=Self.image.get_rect()
Self.x=x
Self.y=y
Self.Screen= screen
#Self.Width=Width
#Self.Height=Height
#Self.Energy=0
def BoundryX(entityX):
if entityX<=0:
entityX=0
elif entityX>=600:
entityX=600
def BoundryY(entityY):
if entityY<=0:
entityY=0
elif entityY>=800:
entityY=800
class Predator(Animal):
def __init__(Self):
#super().__init__()
Self.Img=pygame.image.load('Icon.png')
Self.PredatorX=0
Self.PredatorY=0
Self.Screen= screen
def Render(Self,Img,X,Y):
Self.screen.blit(Img,(X,Y))
class prey(pygame.sprite.Sprite):
def __init__():
Self.preyImg=pygame.image.load('Prey.png')
Self.preyX=300
Self.preyY=700
Self.PreyX_change=0
def Render(Self):
Self.screen.blit(preyImg,(preyX,preyY))
def delete(Self):
i.delete()
CarrotImg=pygame.image.load('carrot.png')
CarrotX=100
CarrotY=300
foodamount=7
def food():
#CarrotX=random.randint(10,950)
#CarrotY=random.randint(10,750)
screen.blit(CarrotImg,(CarrotX,CarrotY))
#setup pygame
pygame.init()
#caption and Icons
pygame.display.set_caption("Game Of Life")
#predator icon
predatorImg=pygame.image.load('Icon.png')
predatorX=900
predatorY=100
predatorX_change=0
#Prey Icon
preyImg=pygame.image.load('Prey.png')
preyX=300
preyY=700
PreyX_change=0
#def delete():
#prey.delete()
preyImg=pygame.image.load('Prey.png')
preyX=300
preyY=700
PreyX_change=0
#def Prey():
#screen.blit(preyImg,(preyX,preyY))
class setup():
def __init__():
x=1
def Predator1(Self):
screen.blit(predatorImg,(predatorX,predatorY))
#Finding closest prey
def FindClosestItem(AgressorX,DefenderX,AgressorY,DefenderY):
dist = math.sqrt((AgressorX-DefenderX)**2 + (AgressorY-DefenderY)**2)#finds distance in pixels
#create pop out for game
screen=pygame.display.set_mode((1000,800))
def Tracking(AgressorX,DefenderX,AgressorY,DefenderY):
global XMovement#make variables global so it actually works
global YMovement
if AgressorX > DefenderX:#finds whether its position then moves left/righ,up/down depending on its location
XMovement=-0.25
elif AgressorX< DefenderX:
XMovement=0.25
else:
XMovement=0
if AgressorY > DefenderY:
YMovement=-0.25
elif AgressorY < DefenderY:
YMovement=0.25
else:
YMovement=0
def EatPrey(predatorX,PreyX,predatorY,preyY):
dist = math.sqrt((predatorX-preyX)**2 + (predatorY-preyY)**2)
if dist < 20:
return True
else:
return False
#setup test
predator=Predator()
#Sprite groups
all_sprites_Wolves=pygame.sprite.Group()
all_sprites_Rabbits=pygame.sprite.Group()
all_sprites_Carrots=pygame.sprite.Group()
#game loop
running=True
while running:
#Back ground colour
screen.fill((0,128,0))
for event in pygame.event.get():
if event.type==pygame.QUIT:
running=False
predator.Render(pygame.image.load('Icon.png'),600,700)
#Prey.Render()
ClosestPrey=FindClosestItem(predatorX,preyX,predatorY,preyY)
food()
Track(predatorX,preyX,predatorY,preyY)
predatorX+=XMovement
predatorY+=YMovement
#predatorX=BoundryX(predatorX)
#predatorY=BoundryY(predatorY)
Track(preyX,CarrotX,preyY,CarrotY)
preyX+=XMovement
preyY+=YMovement
#preyX=BoundryX(preyX)
#preyY=BoundryY(preyY)
#Eat=EatPrey(preyX,preyY,predatorX,predatorY)
#if Eat==True:
#delete()
#T=1
#Boundry(prey)
if preyX<=0:
preyX=0
elif preyX>=950:
preyX=950
if preyY<=0:
preyY=0
elif preyY>=750:
preyY=750
#preyY-=1
#Boundry(predator)
if predatorX<=0:
predatorX=0
elif predatorX>=950:
predatorX=950
elif predatorY<=0:
predatorY=0
elif predatorY>=750:
predatorY=750
pygame.display.update()
timmer=timmer+1
最佳答案
你的代码很乱,但别担心,让我们一步一步地创建一个简单的 pygame 游戏。尝试了解每个步骤的作用。
首先,让我们从游戏的基本骨架开始,如下所示:
import pygame
def main():
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
screen.fill('grey')
pygame.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()
在这里,我们有一个简单的
main
函数和一个简单的游戏循环,它只听
QUIT
事件,将所有内容设为灰色并将帧率限制为 60。您不必拥有
main
函数和
__name__
检查但这样做是一种很好的做法,因为它允许您在不运行游戏的情况下导入文件。此外,我有助于不污染全局命名空间。
Sprites
:
import pygame
from random import randint, choice
class Animal(pygame.sprite.Sprite):
colors = ['lightblue', 'blue', 'darkblue', 'dodgerblue']
def __init__(self, pos=None, color=None):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill(color if color else choice(Animal.colors))
self.rect = self.image.get_rect(center = pos if pos else (randint(100, 540), randint(100, 380)))
def main():
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
animals = pygame.sprite.Group()
animals.add(Animal())
animals.add(Animal())
animals.add(Animal())
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
screen.fill('grey')
animals.draw(screen)
pygame.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()
使用
Sprite
pygame 中的类,该类需要一个
image
属性,这是一个
Surface
, 和
rect
属性,这是一个
Rect
并包含
Surface
的位置和大小.如果您创建一个
Sprite
像这样,您可以使用
Group
类(或其子类)来绘制和更新您的 Sprite 。为了画点东西,我在一个组中添加了三个动物
animals
并调用
draw
函数,通过
screen
表面作为参数所以
Group
知道在哪里 blit 动物的图像。
import pygame
from random import randint, choice
class Animal(pygame.sprite.Sprite):
colors = ['lightblue', 'blue', 'darkblue', 'dodgerblue']
def __init__(self, pos=None, color=None):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill(color if color else choice(Animal.colors))
self.rect = self.image.get_rect(center = pos if pos else (randint(100, 540), randint(100, 380)))
self.pos = pygame.Vector2(*self.rect.center)
self.speed = 3
self.direction = pygame.Vector2(1, 0).rotate(randint(0, 360))
def update(self, dt):
v = self.direction * self.speed
while not pygame.display.get_surface().get_rect().contains(self.rect.move(v)):
self.direction = pygame.Vector2(1, 0).rotate(randint(0, 360))
v = self.direction * self.speed
self.pos += v
self.rect.center = self.pos
def main():
screen = pygame.display.set_mode((640, 480))
clock, dt = pygame.time.Clock(), 0
animals = pygame.sprite.Group()
animals.add(Animal())
animals.add(Animal())
animals.add(Animal())
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
animals.update(dt/1000)
screen.fill('grey')
animals.draw(screen)
pygame.display.flip()
dt = clock.tick(60)
if __name__ == '__main__':
main()
如您所见,我们将所有移动逻辑保留在
Animal
中。类(class)。游戏循环中唯一改变的是我们跟踪增量时间
dt
确保恒定的帧速率(老实说,这在像这样的小例子中并不那么重要,但同样是一种很好的做法),并将其传递给组
update
函数,它将调用
update
它包含的每个 Sprite 的功能。
speed
和一个
direction
(这是一个向量);还有一个
pos
向量。使用向量改变位置很容易,因为我们可以做类似
pos = pos + direction * speed
的事情。 ,如果我们只是随机旋转方向向量,改变方向也很简单。
rect
的坐标处绘制的。 ,所以我们也需要更新矩形的位置。
Rect
class 也有一些方便的功能。看看我们如何检查 Sprite 是否会离开屏幕。我们可以简单地获取
Rect
的显示表面,移动 Sprite 的
Rect
并检查它是否仍在屏幕矩形内。如果没有,我们随机旋转我们的
direction
向量(好吧,它不是 100% 完美,而是 KISS)。
Animal
类,通过覆盖更新函数来改变速度和颜色以及行为:
import pygame
import pygame.freetype
from random import randint, choice
from math import hypot
class Animal(pygame.sprite.Sprite):
colors = ['lightblue', 'blue', 'darkblue', 'dodgerblue']
def __init__(self, pos=None, color=None, *grps):
super().__init__(*grps)
self.image = pygame.Surface((32, 32))
self.color = color if color else choice(Animal.colors)
self.image.fill(self.color)
self.rect = self.image.get_rect(center = pos if pos else (randint(100, 540), randint(100, 380)))
self.pos = pygame.Vector2(*self.rect.center)
self.speed = 3
self.direction = pygame.Vector2(1, 0).rotate(randint(0, 360))
def update(self, dt):
v = self.direction * self.speed
while not pygame.display.get_surface().get_rect().contains(self.rect.move(v)):
self.direction = pygame.Vector2(1, 0).rotate(randint(0, 360))
v = self.direction * self.speed
self.pos += v
self.rect.center = self.pos
class Preditor(Animal):
def __init__(self, animals, pos=None, color=None, *grps):
super().__init__(pos, color or 'red', *grps)
self.speed = 4
self.target = None
self.animals = animals
self.eaten = 0
self.font = pygame.freetype.SysFont(None, 16)
self.font.render_to(self.image, (10, 10), str(self.eaten), 'white')
def get_nearest_animal(self):
target = None
distance = None
for animal in self.animals:
pygame.draw.line(pygame.display.get_surface(), 'darkgrey', self.pos, animal.pos)
if not target:
target = animal
distance = hypot(animal.pos.x - self.pos.x, animal.pos.y - self.pos.y)
else:
new_distance = hypot(animal.pos.x - self.pos.x, animal.pos.y - self.pos.y)
if new_distance < distance:
target = animal
distance = new_distance
if target:
pygame.draw.line(pygame.display.get_surface(), 'green', self.pos, target.pos)
return target
def update(self, dt):
self.target = self.get_nearest_animal()
if self.target:
self.direction = (self.target.pos - self.pos).normalize()
else:
self.direction = pygame.Vector2(0, 0)
self.pos += self.direction * self.speed
self.rect.center = self.pos
if self.target and self.rect.colliderect(self.target.rect):
self.target.kill()
self.image.fill(self.color)
self.eaten += 1
self.font.render_to(self.image, (10, 10), str(self.eaten), 'white')
def main():
pygame.init()
screen = pygame.display.set_mode((640, 480))
clock, dt = pygame.time.Clock(), 0
animals = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
for _ in range(5):
Animal(None, None, animals, all_sprites)
Preditor(animals, None, None, all_sprites)
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
if e.type == pygame.KEYDOWN:
Animal(None, None, animals, all_sprites)
screen.fill('grey')
all_sprites.update(dt/1000)
all_sprites.draw(screen)
pygame.display.flip()
dt = clock.tick(60)
if __name__ == '__main__':
main()
Predator
它可以猎杀和吃掉的所有受害者的 list 。再次,看看所有的 Sprite 行为是如何在 Sprite 类中的。主循环所做的唯一一件事就是创建初始状态,告诉 Sprite 组更新和绘制它们的所有 Sprite (并通过按键添加新的动物,因为为什么不呢)。还要注意我们如何使用
kill
将其从所有 it 组中删除,基本上将其从游戏中删除。
import pygame
import pygame.freetype
from random import randint, choice
from math import hypot
from dataclasses import dataclass
class Plant(pygame.sprite.Sprite):
colors = ['green', 'lightgreen', 'darkgreen']
def __init__(self, pos=None, color=None, *grps):
self._layer = -10
super().__init__(*grps)
self.image = pygame.Surface((24, 24))
self.color = color if color else choice(Plant.colors)
self.image.fill(self.color)
self.rect = self.image.get_rect(center = pos if pos else (randint(10, 630), randint(10, 470)))
self.pos = pygame.Vector2(*self.rect.center)
class Animal(pygame.sprite.Sprite):
font = None
colors = ['lightblue', 'blue', 'darkblue', 'dodgerblue']
def __init__(self, system, pos=None, color=None, *grps):
super().__init__(*grps)
self.image = pygame.Surface((24, 24))
self.color = color if color else choice(Animal.colors)
self.image.fill(self.color)
self.rect = self.image.get_rect(center = pos if pos else (randint(100, 540), randint(100, 380)))
self.pos = pygame.Vector2(*self.rect.center)
self.speed = randint(20, 50) / 10
self.direction = pygame.Vector2(1, 0).rotate(randint(0, 360))
self.reproduce = randint(1, 5)
self.sleep = 0
self.eaten = 0
self.energy = 10
self.system = system
if not self.font:
Animal.font = pygame.freetype.SysFont(None, 16)
def base_update(self, dt):
self.energy -= dt * (self.speed / 2)
if self.energy <= 0:
self.kill()
return False
if self.sleep >= 0:
self.sleep -= dt
return False
self.reproduce -= dt
if self.reproduce <= 0 and self.energy >= 4:
self.reproduce = randint(1, 7)
self.__class__(self.system, self.pos, None, *self.groups())
self.sleep = 0.5
self.energy -= 1.5
return True
def update_image(self):
self.image.fill(self.color)
self.image.set_alpha(122 if self.sleep > 0 else 255)
pygame.draw.rect(self.image, 'green', (0, 0, self.rect.width * self.energy/10, 3))
self.font.render_to(self.image, (7, 7), str(self.eaten), 'white')
def get_nearest_target(self, targets, max_distance=250):
target = None
distance = None
for possible_target in targets:
if possible_target == self or hasattr(possible_target, 'speed') and possible_target.speed > self.speed:
continue
new_distance = hypot(possible_target.pos.x - self.pos.x, possible_target.pos.y - self.pos.y)
pygame.draw.line(pygame.display.get_surface(), 'darkgrey' if new_distance > max_distance else 'white', self.pos, possible_target.pos)
if new_distance <= max_distance:
if not target or new_distance < distance:
target = possible_target
distance = new_distance
if target:
pygame.draw.line(pygame.display.get_surface(), 'green', self.pos, target.pos)
return target
def update(self, dt):
if not self.base_update(dt) or len(self.groups()) == 0:
return
v = self.direction * self.speed
while not pygame.display.get_surface().get_rect().contains(self.rect.move(v)):
self.direction = pygame.Vector2(1, 0).rotate(randint(0, 360))
v = self.direction * self.speed
for plant in self.system.plants:
if plant.rect.colliderect(self.rect) and self.energy < 8:
plant.kill()
self.eaten += 1
self.energy = 10
continue
self.pos += v
self.rect.center = self.pos
self.update_image()
class Preditor(Animal):
def __init__(self, system, pos=None, color=None, *grps):
super().__init__(system, pos, color or 'red', *grps)
self.speed = randint(20, 40) / 10
self.target = None
self.update_image()
def update(self, dt):
if not self.base_update(dt) or len(self.groups()) == 0:
return
self.target = self.get_nearest_target(self.system.animals)
if not self.target:
self.target = self.get_nearest_target(self.system.preditors)
if not self.target:
self.target = self.get_nearest_target(self.system.plants)
if self.target:
self.direction = (self.target.pos - self.pos).normalize()
else:
self.direction = pygame.Vector2(0, 0)
self.pos += self.direction * self.speed
self.rect.center = self.pos
if self.target and self.rect.colliderect(self.target.rect):
self.target.kill()
self.eaten += 1
self.sleep = 0.5
self.energy += 3
if self.energy > 10:
self.energy = 10
self.update_image()
@dataclass
class System:
plants: object
animals: object
preditors: object
def main():
pygame.init()
screen = pygame.display.set_mode((640, 480))
clock, dt = pygame.time.Clock(), 0
GROW = pygame.USEREVENT + 1
pygame.time.set_timer(GROW, 1000)
animals = pygame.sprite.Group()
plants = pygame.sprite.Group()
preditors = pygame.sprite.Group()
all_sprites = pygame.sprite.LayeredUpdates()
system = System(plants, animals, preditors)
for _ in range(4):
Animal(system, None, None, animals, all_sprites)
for _ in range(5):
Plant(None, None, plants, all_sprites)
Preditor(system, None, None, preditors, all_sprites)
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
if e.type == pygame.KEYDOWN:
Animal(system, None, None, animals, all_sprites)
if e.type == GROW:
for _ in range(5):
Plant(None, None, plants, all_sprites)
screen.fill('grey')
all_sprites.update(dt/1000)
all_sprites.draw(screen)
pygame.display.flip()
dt = clock.tick(30)
if __name__ == '__main__':
main()
关于python - 在 pygame 的类/子类中设置和显示 Sprite 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65191469/
任何人都可以评论是否对图像使用 Sprite 的决定?我看到以下好处/权衡(其中一些可以减轻): 单个图像上的 Sprite 优点: 需要管理的图像更少 更容易实现主题图像 图像交换 (JS/CSS)
所以,我一直在 Unity 工作,但我决定是时候换成我更了解的东西了:JavaScript。我一直在考虑切换到 Phaser.js,但我有一些关于我什至在 Unity 中遇到的问题的问题,而且我在互联
所以我有一个木偶要在 Sprite Kit 中显示。木偶是由一堆不同的 body 部位组成的,当然每个部位都是一个.png。 所以我的过程是:我有一个 Marionette 对象(SKNode 子类)
我有一个 Sprite ,我将其初始化为 SKSPriteNode,它不断地从另一个 Sprite 上弹起,也以相同的方式初始化。 我无法弄清楚两者之间的冲突,并且到目前为止堆栈上没有任何帮助。 我将
标题说明了一切。我想知道 Sprite.getcontentsize、Sprite.gettexture、Sprite.getscale 之间有什么区别。以及它们是如何使用的。在这个问题之后我找不到任
我有兴趣尝试创建一些游戏,即在新的 sprite 工具包中。但是,对于我心目中的游戏,我宁愿使用方向键而不是操纵杆。因为我将从 Cocos 搬过来,所以我的旧程序不再有效(所以那个 dpad 也不会)
我正在 LibGdx 中开发 2D 射击游戏。 我不得不提一下,我是 LibGdx 的新手,我正在努力理解它是如何工作的。我有几年的Java和Android编程经验,所以我了解游戏概念。 我感兴趣的是
我正在使用 Compass 生成 CSS Sprite 。 我找到了一种方法来定义一次 Sprite 并在不同的 .scss 文件中使用它,但我不确定这是正确的解决方案。 到目前为止,我能找到的最好方
我在游戏中遇到背景音乐问题。当我从主菜单场景切换到游戏场景时,它停止,但是当游戏场景切换到gameOver场景时,它不停止。当我选择重播时,音乐也会重叠(从gameOver场景切换回游戏场景)。 要播
我是一名使用 libgdx 引擎的新程序员,想知道 Sprite 批处理的行为。特别是如何在程序生命周期中将 Sprite 添加到批处理中以进行绘制。到目前为止, Sprite 的所有示例都使用了一些
这可能是个愚蠢的问题,但如果有人能帮助我,我将不胜感激。 我有一个由 3 个垂直堆叠的不同图像组成的 Sprite ,但我试图让中间的图像(高度为 1px 和宽度为 194)重复,只是那条 1px 的
我正在尝试为我正在构建的菜单加载 spritesheet,但它不是一次显示一个图像,而是在元素的不同位置显示整个 spritesheet。 这是我使用两张图片的 CSS 代码: #mymenu ul.
我有两个 Sprite 组,ship_list 有 20 个飞船 Sprite ,all_sprites 有这 20 个 Sprite ,加上玩家 Sprite 。在主循环中,当检测到玩家与 ship
我制作了这个我可以抓取并四处移动的 Sprite 。我的问题是我希望能够“抛出” Sprite 。意思是,当我释放 Sprite 时,我希望它继续沿着我移动它的方向前进。就像扔球一样。 我该怎么办?
我目前正在开发 HTML/CSS 模板,我将实现以下社交媒体图标: http://www.premiumpixels.com/freebies/41-social-media-icons-png/ 它
在我的游戏中,我希望能够收集硬币。我有一个该硬币 Sprite 的数组列表,这样我就可以单独绘制多个硬币。这些硬币也随着背景移动(模拟汽车驾驶),我想要它,所以当硬币撞到汽车时,它会消失并被收集。感谢
我是 cocos2D 的新手,谁能提出一个简单的解决方案? 我有一个风车,风车上有 8 个条,每个条以 45 度隔开,其中风车的一半在屏幕上,一半在屏幕外。我想旋转风车,让它永远旋转。我还想在风车杆的
我使用的是主播中心分支,刚刚发现我的游戏出现的问题大部分都是这个原因。有没有一种方法可以使用 Sprite 的左下角而不是使用 (0, 0) 作为其中心来设置 Sprite ? 谢谢! 最佳答案 发现
我是 magic-importing我的 Sprite : // Creating a concatenated sprite image out of all sprites in the "/im
这个问题在这里已经有了答案: How do I detect collision in pygame? (5 个答案) 关闭去年。 想要创建一个包含 10 张图像的组。稍后屏幕上的图像不应重叠。我尝
我是一名优秀的程序员,十分优秀!