2015-12-12 3 views
1

Я работаю над симуляцией для бизнес-задачи, но я пытаюсь построить 2d-игру, чтобы продемонстрировать моделируемые движения.Python Game Movement

Для этого я начинаю с реальной игры на питоне, в которой я нашел код для онлайн.

Цель состоит в том, чтобы создать 100 симулированных движений (вверх, вниз, влево, вправо, стоп) с помощью случайного целого. Например, random = 1, затем переместите влево.

По какой-то причине я могу отправить первое движение, но от второго до 100-го движений игнорируется игра.

Может кто-нибудь, пожалуйста, дайте мне подсказку о том, что я делаю неправильно?

Я бы очень признателен за чей-то опыт.

GitHub Ссылка :: https://github.com/deacons2016/pygame

from __future__ import division 

import random 
from cocos.actions import AccelDeccel 
from cocos.actions import Delay 
from cocos.actions import JumpBy 
from cocos.actions import Move 
from cocos.actions import MoveBy 
from cocos.actions import Repeat 
from cocos.actions import Reverse 
from cocos.actions import RotateBy 
from pyglet.window import key 

import cocos 
import cocos.collision_model as cm 
import resources 
import time 


class Game(cocos.layer.ColorLayer): 
    is_event_handler = True 

    def __init__(self): 
     super(Game, self).__init__(102, 102, 225, 255) 

     self.collision_manager = cm.CollisionManagerBruteForce() 

     self.player = cocos.sprite.Sprite(resources.player) 
     self.player.position = 400, 25 
     self.player.velocity = 0, 0 
     self.player.speed = 150 
     self.add(self.player, z=2) 

     self.player.cshape = cm.AARectShape(
      self.player.position, 
      self.player.width//2, 
      self.player.height//2 
     ) 
     self.collision_manager.add(self.player) 

     self.boss = cocos.sprite.Sprite(resources.player) 
     self.boss.position = 400, 600 
     self.boss.scale = 0.4 
     self.add(self.boss, z=1) 

     self.boss.cshape = cm.AARectShape(
      self.boss.position, 
      self.boss.width//2, 
      self.boss.height//2 
     ) 
     self.collision_manager.add(self.boss) 

     self.batch = cocos.batch.BatchNode() 
     self.enemies = [cocos.sprite.Sprite(resources.player) 
         for i in range(6)] 
     positions = ((250, 125), (550, 125), (300, 325), (500, 325), 
        (150, 475), (650, 475)) 
     for num, enem in enumerate(self.enemies): 
      enem.position = positions[num] 
      enem.cshape = cm.AARectShape(
       enem.position, 
       enem.width//2, 
       enem.height//2 
      ) 
      self.collision_manager.add(enem) 
      self.batch.add(enem) 

     self.add(self.batch, z=1) 
     self.player.do(Move()) 

     move_basic = MoveBy((120, 0), 1) 
     self.enemies[0].do(Repeat(move_basic + Reverse(move_basic))) 
     self.enemies[1].do(Repeat(Reverse(move_basic) + move_basic)) 

     move_complex = (MoveBy((-75, 75), 1) + 
         Delay(0.5) + 
         MoveBy((-75, -75), 1) + 
         Delay(0.5) + 
         MoveBy((75, -75), 1) + 
         Delay(0.5) + 
         MoveBy((75, 75), 1) + 
         Delay(0.5)) 
     self.enemies[2].do(Repeat(move_complex)) 
     self.enemies[3].do(Repeat(Reverse(move_complex))) 

     move_jump = AccelDeccel(JumpBy((200, 0), 75, 3, 3)) 
     move_jump_rot = AccelDeccel(RotateBy(360, 3)) 
     self.enemies[4].do(Repeat(move_jump + Reverse(move_jump))) 
     self.enemies[4].do(Repeat(move_jump_rot + Reverse(move_jump_rot))) 
     self.enemies[5].do(Repeat(Reverse(move_jump) + move_jump)) 
     self.enemies[5].do(Repeat(Reverse(move_jump_rot) + move_jump_rot)) 

     self.schedule(self.update) 

    def simulate(self): 
     x = 100 
     while x > 0: 
      rand = random.randint(1,5) 
      if rand == 1: 
       self.movePlayer("left") 
       time.sleep(.05) 
       print("left") 
      elif rand == 2: 
       self.movePlayer("right") 
       time.sleep(.05) 
       print("right") 
      elif rand == 3: 
       self.movePlayer("up") 
       time.sleep(.05) 
       print("up") 
      elif rand == 4: 
       self.movePlayer("down") 
       time.sleep(.05) 
       print("down") 

      elif rand == 5: 
       self.movePlayer("space") 
       time.sleep(.05) 
       print("space") 
      x -= 1 

    def update(self, dt): 
     self.player.cshape.center = self.player.position 
     for enem in self.enemies: 
      enem.cshape.center = enem.position 

     collisions = self.collision_manager.objs_colliding(self.player) 
     if collisions: 
      if self.boss in collisions: 
       print("You won!") 
      cocos.director.director.pop() 

    def movePlayer(self, symbol): 

     if symbol == "left": 
       self.player.velocity = -self.player.speed, 0 
     elif symbol == "right": 
       self.player.velocity = self.player.speed, 0 
     elif symbol == "up": 
       self.player.velocity = 0, self.player.speed 
     elif symbol == "down": 
       self.player.velocity = 0, -self.player.speed 
     elif symbol == "space": 
       self.player.velocity = 0, 0 


if __name__ == '__main__': 
    cocos.director.director.init(
     width=800, 
     height=650, 
     caption="Catch your husband!" 
    ) 

    game_layer = Game() 
    game_scene = cocos.scene.Scene(game_layer) 

    game_layer.simulate() 

    cocos.director.director.run(game_scene) 

    print("after") 
+0

Что случилось с 'направлением'? Вы устанавливаете его в пустую строку, которая не влияет на метод 'movePlayer', вы не переназначаете его ни на что, но вы печатаете его каждый раз. – Reti43

+0

@ Reti43 thx для catch - я удалил его, но я все равно получаю одинаковые результаты. –

+0

Я не удивлен, так как это не должно влиять на программу. Я просто спросил, на случай, если вы планируете, чтобы он имел какой-то эффект. Можете ли вы также объяснить строку 'self.schedule (self.update)'? Это не имеет смысла для меня. – Reti43

ответ

1

Как @Blckknght отметил, рисунок слой Game и запуск его другие запланированные функции (в вашем случае Game.update) начинается только после вызова cocos.director.director.run (game_scene). Вот почему вы не можете видеть обновления скорости - они начинаются с начала отсчета времени.

Вы должны удалить звонок game_layer.simulate(), так как он не имеет желаемого эффекта.

Тогда вы могли бы сделать:

def simulate(self, dt): 
    if self.x > 0: # set this to 100 in constructor 
     rand = random.randint(1,5) 
     if rand == 1: 
      self.movePlayer("left") 
      print("left") 
     elif rand == 2: 
      self.movePlayer("right") 
      print("right") 
     elif rand == 3: 
      self.movePlayer("up") 
      print("up") 
     elif rand == 4: 
      self.movePlayer("down") 
      print("down") 

     elif rand == 5: 
      self.movePlayer("space") 
      print("space") 
     x -= 1 

Обратите внимание, что я удалил вызовы time.sleep. Не уверен, что это вызовет проблемы, но, скорее всего, лучше позвонить в специальную функцию schedule_interval (или) в cocos2d.

В конструкторе Game:

self.schedule_interval(self.simulate, 0.05) 
self.schedule_interval(self.update, 0.05) 

Для планирования Game.simulate необходимо изменить сигнатуру функции, чтобы иметь dt в качестве второго аргумента, как Game.update имеет.