2016-07-27 14 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''がありません。私はそれをコメントするとき、私は別の行70(self.player1.move())を持っています: 'AttributeError: 'NoneType'オブジェクトに属性 'move'がありません – jligeza

答えて

1

下のポストのアドバイス以下しようとしたもので、move()内、あなたがposを更新する前にposcenterとの距離がある場合は、あなたがチェックしますspeedより小さい。そうであれば、poscenterと等しく設定するだけです。そうでない場合は、すでに行ったとおりにposを増やしてください。

+0

こんにちは、私はそれにショットを与えたが、私は何か間違ったことをしたと思う。私は上記の私の試みを投稿します。 –

+1

あなたは 'x_1とy_1なら ProgramGamer

+0

あなたが指定した方法でそれを変更しました。if文が常にelse文に移動するので、振りがまだ残っています。何が間違っているか知っていますか?上記の編集済みのアプリを投稿します。 –

関連する問題