2016-07-27 46 views
0

我一直在努力解決這個問題。下面是一個kivy應用程序早期階段的python/kivy代碼。問題在於玩家運動。 Kivy過度補償了dx和dy動作,並導致玩家的動作不斷震動。我不知道如何解決這個問題。有任何想法嗎?Kivy運動問題

注意: 許多代碼是不完整的,但播放器的運動大部分完成。運動問題發生在「Player」課程中。

編輯:這裏是我的嘗試下面的帖子下面

import kivy 
kivy.require('1.1.1') 

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.properties import ObjectProperty, ListProperty, NumericProperty 
import math 
from kivy.clock import Clock 
import time 
import random 

PLAYER_SPEED = 10 
ENEMY_SPAWN = 3 
UPDATE_SPEED = .01 
MIN_INITIAL_PLAYER_MINION_DISTANCE = 200 

class Player(Widget): 
    velocity_x = NumericProperty(0) 
    velocity_y = NumericProperty(0) 
    target = ListProperty([]) 
    speed = NumericProperty(PLAYER_SPEED) 
    def __init__(self, **kwargs): 
     Widget.__init__(self) 
     self.target = [399.0, 399.0] 
    def update_target(self, new_target): 
     self.target = new_target 
    def move(self): 
     dx = self.target[0] - self.center[0] 
     dy = self.target[1] - self.center[1] 
     x_1 = self.pos[0] - self.center[0] 
     y_1 = self.pos[1] - self.center[1] 
     total = math.sqrt(dx ** 2 + dy**2) 
     self.velocity_x = (dx/total) * self.speed 
     self.velocity_y = (dy/total) * self.speed 
     if math.sqrt(x_1** 2 + y_1**2) < self.speed: 
      self.pos = self.center 
     else: 
      new_x = self.pos[0] + self.velocity_x 
      new_y = self.pos[1] + self.velocity_y 
      self.pos = (new_x,new_y) 

class Enemy(Player): 
    velocity_y = NumericProperty(PLAYER_SPEED) 
    def __init__(self, **kwargs): 
     Widget.__init__(self) 
     self.center = kwargs.get('start_pos',[0,0]) 
    def move(self): 
     self.pos = (self.pos[0], self.pos[1] + self.velocity_y) 

def distance(widget1, widget2): 
    dist = math.sqrt((widget1.pos[0]-widget2.pos[0])**2 + \ 
        (widget1.pos[1]-widget2.pos[1])**2) 
    return dist 

class Game(Widget): 
    player1 = ObjectProperty(None) 
    enemies = ListProperty([]) 
    decoys = ListProperty([]) 
    def setup(self): 
     self.enemies = [] 
     self.decoys = [] 
     self.player1.center = self.center 
     self.setup_schedules() 
    #Don't forget about good code organization! 
    def setup_schedules(self): 
     Clock.schedule_interval(self.update, UPDATE_SPEED) 
     Clock.schedule_interval(self.spawn_enemy, ENEMY_SPAWN) 

    def update(self,dt): 
     self.player1.move() 

    def spawn_enemy(self, dt): 
     x = float(random.randint(0, self.width)) 
     y = float(random.randint(0, self.height)) 
     enemy = Enemy(start_pos = (x,y)) 
     while distance(enemy, self.player1)< MIN_INITIAL_PLAYER_MINION_DISTANCE: 
      x = float(random.randint(0, self.width)) 
      y = float(random.randint(0, self.height)) 
      enemy.pos = (x,y) 

     self.enemies.append(enemy) 
     self.add_widget(enemy) 

    def score(self): 
     zero_score = time.time() 
     player_score = zero_score + 1 


    #on_touch_move vs on_touch_down 
    def on_touch_move(self, touch): 
     self.player1.update_target([touch.x, touch.y]) 

#Entry Point into app  
class GameApp(App): 
    def build(self): 
     game = Game() 
     game.setup()   
     return game 

def main(): 
    GameApp().run() 
main() 
+0

試圖運行你的代碼,並得到一個錯誤@ 62行(self.player1.center = self.center):'AttributeError:'NoneType'object has no attribute'center'';當我評論它時,我有另一個@第70行(self.player1.move()):'AttributeError:'NoneType'對象沒有屬性'移動' – jligeza

回答

1

建議在你player類,並在move(),更新pos之前,你會檢查是否poscenter之間的距離小於speed。如果是,則簡單地將pos設置爲等於center。如果不是,那麼就像你已經做的那樣增加pos

+0

嗨,你能告訴我你的實現嗎?我給了它一個鏡頭,但我認爲我做錯了什麼。我會在上面發佈我的嘗試。 –

+1

你寫了'如果x_1和y_1 <速度:'。我假設你想測試'x_1'和'y_1'是否都在'speed'下,但這不是python的工作方式。此外,測試每個變量是否處於「速度」狀態不會起作用,因爲在您做任何事情之前您實際上需要計算斜邊。做'如果math.sqrt(x_1 ** 2 + y_1 ** 2)<速度:'會工作正常。 – ProgramGamer

+0

我按照你指定的方式改變了它,if語句總是進入else語句,所以震動仍然存在。你知道什麼是錯的嗎?我將在上面發佈已編輯的應用程序。 –