2016-07-27 2 views
0

저는 지금 당분간이 작업을 해왔습니다. 아래는 kivy 앱의 초기 단계를위한 python/kivy 코드입니다. 이 문제는 플레이어의 움직임에 있습니다. Kivy는 dx 및 dy 움직임을 과도하게 보정하며 플레이어의 움직임을 지속적으로 흔들립니다. 이 문제를 해결하는 방법을 모르겠습니다. 어떤 아이디어?키비 (Kivy) 동작 관련 문제

참고 : 이 코드의 대부분은 불완전하지만 플레이어 이동이 대부분 이루어집니다. 이동 문제는 "Player"수업에서 발생합니다.

편집 : 여기 당신의 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'객체에는 'center'' 속성이 없습니다. 내가 주석을 달았을 때 나는 다른 @ line 70 (self.player1.move())을 가지고있다.'AttributeError : 'NoneType'객체에 'move'속성이 없다. – jligeza

답변

1

아래 게시물의 조언을 다음 시도 것입니다, 당신은 pos를 업데이트하기 전에 poscenter 사이의 거리 인 경우 move() 내에서 다음 사항을 확인할 것 speed보다 작습니다. 그렇다면 poscenter과 동일하게 설정하면됩니다. 그렇지 않으면 pos을 이미 증가 시키십시오.

+0

안녕하세요. 나는 총을 쥐었지만 나는 틀린 일을했다고 생각한다. 나는 위의 시도를 게시 할 것입니다. –

+1

'x_1 및 y_1이면 ProgramGamer

+0

지정한 방식으로 변경했는데 if 문은 항상 else 문으로 넘어가므로 흔들림은 여전히 ​​존재합니다. 무엇이 잘못되었는지 압니까? 위의 편집 된 애플 리케이션을 게시 할 것입니다. –