在 kivy 游戏中创建多个敌人
Creating multiple Enemies in kivy game
我目前正在 kivy 开发 space inavders 游戏。我有一艘 space 飞船,它向敌人发射子弹。敌人向右移动,当他们到达边界时他们向左转,这种情况一次又一次发生。一切都很完美。我可以射击,而敌人正在移动。但问题是我不能制造多个敌人。我必须为每个敌人放一个自己的 class 并一次又一次地编写相同的代码。我的想法是我将创建一个敌人列表,然后从列表中显示它们。以至于看起来有多个敌人。但是我不知道我该怎么做,当你有另一个想法时,我无法从一个 day.Also 做到这一点,如果你提出建议,那就太好了。这是我的代码。
敌人class:
class Enemy(Widget):
def collision(self,ball,enemy,enemy1):
if self.collide_widget(ball):
enemy.y = randint(300,500)
enemy1.y = randint(300,500)
ball.x = -1000
ball.y = self.height / self.width
我的主游戏Class:
class SapceGame(Widget):
enemy = ObjectProperty(None)
enemy = ObjectProperty(None)
x_change = NumericProperty(3)
y_change = NumericProperty(-50)
def enemy_movement(self, *args):
self.enemy.x -= self.x_change
if self.enemy.x >= self.width -64:
self.x_change = 3
self.enemy.y += self.y_change
elif self.enemy.x <=0:
self.x_change = -3
self.enemy.y += self.y_change
elif self.enemy.y < 0:
print('Game Over')
def update(self,dt):
self.enemy_movement()
我的kv文件:
<Enemy>:
size: 64,64
canvas:
Rectangle:
pos:self.pos
size: self.size
source:'alien.png'
<SpaceGame>:
ball: pong_ball
ship: space_ship
enemy: enemy_ship
Enemy:
id:enemy_ship
x:root.random_generator(2,root.width-64)
y:root.random_generator(300,550)
应用程序 class
class SpaceApp(App):
def build(self):
game = PongGame()
# pro second 60 frames are shown
Clock.schedule_interval(game.update, 1.0/60.0)
return game
SpaceApp().run()
Now when I want to create more enemies I have to write the same code again and again.
面向对象编程的主要概念之一是每个对象处理自己的行为。所以,你的 Enemy
对象应该知道如何移动。然后,您只需要保留 Enemy
个对象的列表,并告诉每个对象在每次更新时执行其移动行为。
这是您的代码的修改版本:
from random import randint
from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ObjectProperty, NumericProperty, ListProperty
from kivy.uix.widget import Widget
class Enemy(Widget):
x_change = NumericProperty(3)
y_change = NumericProperty(-50)
def collision(self,ball,enemy,enemy1):
if self.collide_widget(ball):
enemy.y = randint(300,500)
enemy1.y = randint(300,500)
ball.x = -1000
ball.y = self.height / self.width
def move(self, *args):
self.x -= self.x_change
if self.x >= self.parent.width -64:
self.x_change = 3
self.y += self.y_change
elif self.x <=0:
self.x_change = -3
self.y += self.y_change
if self.y < 0:
print('Game Over')
App.get_running_app().stop_game()
class SpaceGame(Widget):
enemies = ListProperty([])
def add_enemy(self, *args):
enemy = Enemy()
enemy.pos = (randint(0, self.width - 64), self.height - 64)
self.add_widget(enemy)
self.enemies.append(enemy)
def update(self,dt):
for enemy in self.enemies:
enemy.move()
Builder.load_string('''
<Enemy>:
size_hint: None, None
size: 64,64
canvas:
Rectangle:
pos:self.pos
size: self.size
source:'alien.png'
''')
class SpaceApp(App):
def build(self):
game = SpaceGame()
# add enemies at 5 second intervals
self.new_enemy_event = Clock.schedule_interval(game.add_enemy, 5)
# pro second 60 frames are shown
self.updateEvent = Clock.schedule_interval(game.update, 1.0/60.0)
return game
def stop_game(self):
self.updateEvent.cancel()
self.new_enemy_event.cancel()
SpaceApp().run()
我目前正在 kivy 开发 space inavders 游戏。我有一艘 space 飞船,它向敌人发射子弹。敌人向右移动,当他们到达边界时他们向左转,这种情况一次又一次发生。一切都很完美。我可以射击,而敌人正在移动。但问题是我不能制造多个敌人。我必须为每个敌人放一个自己的 class 并一次又一次地编写相同的代码。我的想法是我将创建一个敌人列表,然后从列表中显示它们。以至于看起来有多个敌人。但是我不知道我该怎么做,当你有另一个想法时,我无法从一个 day.Also 做到这一点,如果你提出建议,那就太好了。这是我的代码。
敌人class:
class Enemy(Widget):
def collision(self,ball,enemy,enemy1):
if self.collide_widget(ball):
enemy.y = randint(300,500)
enemy1.y = randint(300,500)
ball.x = -1000
ball.y = self.height / self.width
我的主游戏Class:
class SapceGame(Widget):
enemy = ObjectProperty(None)
enemy = ObjectProperty(None)
x_change = NumericProperty(3)
y_change = NumericProperty(-50)
def enemy_movement(self, *args):
self.enemy.x -= self.x_change
if self.enemy.x >= self.width -64:
self.x_change = 3
self.enemy.y += self.y_change
elif self.enemy.x <=0:
self.x_change = -3
self.enemy.y += self.y_change
elif self.enemy.y < 0:
print('Game Over')
def update(self,dt):
self.enemy_movement()
我的kv文件:
<Enemy>:
size: 64,64
canvas:
Rectangle:
pos:self.pos
size: self.size
source:'alien.png'
<SpaceGame>:
ball: pong_ball
ship: space_ship
enemy: enemy_ship
Enemy:
id:enemy_ship
x:root.random_generator(2,root.width-64)
y:root.random_generator(300,550)
应用程序 class
class SpaceApp(App):
def build(self):
game = PongGame()
# pro second 60 frames are shown
Clock.schedule_interval(game.update, 1.0/60.0)
return game
SpaceApp().run()
Now when I want to create more enemies I have to write the same code again and again.
面向对象编程的主要概念之一是每个对象处理自己的行为。所以,你的 Enemy
对象应该知道如何移动。然后,您只需要保留 Enemy
个对象的列表,并告诉每个对象在每次更新时执行其移动行为。
这是您的代码的修改版本:
from random import randint
from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ObjectProperty, NumericProperty, ListProperty
from kivy.uix.widget import Widget
class Enemy(Widget):
x_change = NumericProperty(3)
y_change = NumericProperty(-50)
def collision(self,ball,enemy,enemy1):
if self.collide_widget(ball):
enemy.y = randint(300,500)
enemy1.y = randint(300,500)
ball.x = -1000
ball.y = self.height / self.width
def move(self, *args):
self.x -= self.x_change
if self.x >= self.parent.width -64:
self.x_change = 3
self.y += self.y_change
elif self.x <=0:
self.x_change = -3
self.y += self.y_change
if self.y < 0:
print('Game Over')
App.get_running_app().stop_game()
class SpaceGame(Widget):
enemies = ListProperty([])
def add_enemy(self, *args):
enemy = Enemy()
enemy.pos = (randint(0, self.width - 64), self.height - 64)
self.add_widget(enemy)
self.enemies.append(enemy)
def update(self,dt):
for enemy in self.enemies:
enemy.move()
Builder.load_string('''
<Enemy>:
size_hint: None, None
size: 64,64
canvas:
Rectangle:
pos:self.pos
size: self.size
source:'alien.png'
''')
class SpaceApp(App):
def build(self):
game = SpaceGame()
# add enemies at 5 second intervals
self.new_enemy_event = Clock.schedule_interval(game.add_enemy, 5)
# pro second 60 frames are shown
self.updateEvent = Clock.schedule_interval(game.update, 1.0/60.0)
return game
def stop_game(self):
self.updateEvent.cancel()
self.new_enemy_event.cancel()
SpaceApp().run()