[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум Panda3D - по русски » Panda3D » Для начинающих » Помогите пожалуйста! (движение по наж клавиш) (Как заставить объект двигатся по нажатию клавиш?)
Помогите пожалуйста! (движение по наж клавиш)
3BiPДата: Понедельник, 21.02.2011, 23:31 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
Я нашел пример:
Code
#! /usr/bin/env python

# -*- coding: utf_8 -*-
from pandac.PandaModules import *

loadPrcFileData("editor-startup", "sync-video #f")

loadPrcFileData("editor-startup", "show-frame-rate-meter #t")

from direct.directbase import DirectStart

from random import randrange

# подобие окружения, чтобы видеть, что камера движется

for i in xrange(100):

      tmp = loader.loadModel('box')

      tmp.reparentTo(render)
      tmp.setPos(randrange(-50,50),randrange(-50,50),randrange(-50,50))

#     tmp.setPos(randrange(-50,50),randrange(-50,50),randrange(-50,50))

# отключение дефолтного управления

base.disableMouse()

# создание "корабля"

root = NodePath('avatar root')

root.reparentTo(render)

tmp = loader.loadModel('box')

tmp.setColor(1,0,0)

tmp.reparentTo(root)

base.camera.reparentTo(root)

base.camera.setPos(0,-15,10)

ba se.camera.lookAt(root)

# непосредственно процедура управления

def controlTask(task):

   if base.mouseWatcherNode.hasMouse():   

     mpos = base.mouseWatcherNode.getMouse()*globalClock.getDt()*50

     root.setHpr(root,-mpos[0],mpos[1],0)

   return task.cont

taskMgr.add(controlTask,'control task')

run()

В нем можно вращать кубик мышью, помогите/объясните/дайте часть кода пожалуйста как можно заставить куб лететь по нажатию клавиш..



 
ninthДата: Четверг, 24.02.2011, 15:38 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
http://codepaste.ru/5482/
изменённый код
w - вперёд
s - назад

Всё что требуется - зарегистрировать и обработать 4 события нажатия/отпускания нужных клавиш. После чего в основной процедуре управления рулить своим "кораблём" на основе полученных данных. По-хорошему надо было создать отдельный класс управления, унаследовав его от DirectObject, но в данном случае я привязываю (accept) события к base, который уже наследуется от него чтобы не писать лишний код.
Загляни в статьи обработка событий и клавиатура.

 
3BiPДата: Четверг, 24.02.2011, 22:38 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
Спс..загляну

Добавлено (24.02.2011, 22:38)
---------------------------------------------
так, с єтим чкть чуть понятно, а как сделать чтоб оно не вращалось по направлению к мыше, а поворочивалось в ее сторону(смотрело на мышь(мыш становилась постепенно в центр екрана)



 
ninthДата: Пятница, 25.02.2011, 10:40 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Не совсем тебя понял. Тебе что-ли нужно стандартное шутерное управление?
 
3BiPДата: Суббота, 26.02.2011, 22:07 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
Лално, это пока не важно,
У меня такой вопрос:
1.Вот в онлайн играх есть формы входа(логин, и пароль), как можно создать такие формы?
2. Как можно сделать сервер что б он хранил данные о игрокаи и мог передавать координаты игроков через себя другим игрокам
3. как можно сделать меню(у меня сейчас при нажатии ескейпа игра выходит, а хотелось чтоб появлялось окошко в котором можно было б нажать ВЫХОД)?
4.(если будет сервер) Как можно передавать на сервер направление и скорость игрока?
5. Как можно в место курсора зделать чтото вроде прицела.
6. Вот у меня с вашего кода скорость или 0.1 или 0(немножко подредактировал), а хотелось что б скорость увеличивалась при нажатии клавиши не больше 100 и уменьшалась при наж другой клавиши не меньше 0, и сделать возможным вывод скорости на экран, (я вообщемто разобрался как выводить данные на екран, но как не пытался не получилось вывести ни "0.1" ни "--" (0) используя тот пример)

Добавлено (25.02.2011, 19:56)
---------------------------------------------
Есть идея насчет пункта 3. Можно при нажатии ескейпа смотреть в переменную, если она = 0 то создавать рисунок на эране(меню) по пути с рисунками кнопок(выход, настройки и т.п.) и ставить переменную в 1, если же при нажатии эскейпа переменнай = 1, то етот рисунок(меню) убирается и переменная становится = 0

Добавлено (25.02.2011, 20:01)
---------------------------------------------
насчет 2. сервер может записывать присланные ему ники и пароли в отдельный файл(при регистрации) а при входе в гру может сверять данные с хранящимися в файле, но суть в том как передавать иму танные с формы логин/парось(вопрос №1)

Добавлено (25.02.2011, 20:06)
---------------------------------------------
7. Как сделать фон звездного неба?

Добавлено (25.02.2011, 21:19)
---------------------------------------------
Дополнение к 5. Как еще сделать чтоб был прицел и можно было стрельить и что б при выстреле в кубик ну хотябы исчезал, и или вспыхивал а потом исчезал....

Добавлено (25.02.2011, 21:54)
---------------------------------------------
читаю про 1е http://www.panda3d.org/manual/index.php/DirectGUI
но ниче пока непонятно(((

Добавлено (26.02.2011, 11:40)
---------------------------------------------
С первым разобрался, терь вопрос как менять меню, типо вот ввод данных и нажав на вход меню меняесться на саму игру

Добавлено (26.02.2011, 12:39)
---------------------------------------------
Попітался сделать класс:

Code
#! /usr/bin/env python

# -*- coding: utf-8 -*-

from pandac.PandaModules import *

loadPrcFileData("editor-startup", "sync-video #f")

loadPrcFileData("editor-startup", "show-frame-rate-meter #t")

from direct.directbase import DirectStart
from direct.showbase.DirectObject import DirectObject

from random import randrange

from direct.gui.OnscreenText import OnscreenText

import random, sys, os, math

# Function to put instructions on the screen.

def addInstructions(pos, msg):

     return OnscreenText(text=msg, style=1, fg=(1,1,1,1),

                         pos=(-1.3, pos), align=TextNode.ALeft, scale = .05)

# Function to put title on the screen.

def addTitle(text):

     return OnscreenText(text=text, style=1, fg=(1,1,1,1),

                         pos=(1.3,-0.95), align=TextNode.ARight, scale = .07)

class world(DirectObject):
   def __init__(self):

     # подобие окружения, чтобы видеть, что камера движется

     for i in xrange(100):

       tmp = loader.loadModel('box')

       tmp.reparentTo(render)

       tmp.setPos(randrange(-50,50),randrange(-50,50),randrange(-50,50))

     # отключение дефолтного управления

     base.disableMouse()

     # создание "корабля"

     root = NodePath('avatar root')

     root.reparentTo(render)

     tmp = loader.loadModel("objects/mine")

     #tmp.setColor(1,0,0)

     tmp.reparentTo(root)

     base.camera.reparentTo(root)

     base.camera.setPos(0,-50,0)

     base.camera.lookAt(root)

     speed = 0

     chvalue = 0

     def changeSpeed(v):

       global chvalue

       chvalue =  v

     inst1 = addInstructions(0.95, "[ESC]: Exit")

     inst2 = addInstructions(0.90, "[W]: Fly ")

     inst3 = addInstructions(0.85, "[S]: Stop")

     self.accept("escape", sys.exit)

     self.accept("w",changeSpeed,[0.1])

     self.accept("s",changeSpeed,[0])

     # непосредственно процедура управления

     def controlTask(task):

       global speed, chvalue

       if base.mouseWatcherNode.hasMouse():    

         mpos = base.mouseWatcherNode.getMouse()*globalClock.getDt()*50

         root.setHpr(root,-mpos[0],mpos[1],0)

       if -1<speed<100:

         speed += chvalue

       speed *= 0.99

       root.setPos(root,0,speed*globalClock.getDt(),0)

       return task.cont

     taskMgr.add(controlTask,'control task')

w=world()

run()

Из-за чего ошибка?:

Code
ppython spasesim.py
DirectStart: Starting the game.
Known pipe types:
   glxGraphicsPipe
(all display modules loaded.)
Traceback (most recent call last):
   File "spasesim.py", line 65, in controlTask
     if -1<speed<100:
NameError: global name 'speed' is not defined
:task(error): Exception occurred in PythonTask control task
Traceback (most recent call last):
   File "spasesim.py", line 76, in <module>
     run()  
   File "/usr/local/share/panda3d/direct/showbase/ShowBase.py", line 2630, in run
     self.taskMgr.run()
   File "/usr/local/share/panda3d/direct/task/Task.py", line 502, in run
     self.step()
   File "/usr/local/share/panda3d/direct/task/Task.py", line 460, in step
     self.mgr.poll()
   File "spasesim.py", line 65, in controlTask
     if -1<speed<100:
NameError: global name 'speed' is not defined
vag@linux-0ff9:~/Рабочий стол/pand/sps>  

Ведь speed уже обозначена глобальной в стр. 61

Можете обьяснить иза чего єто и как исправить?

Добавлено (26.02.2011, 22:07)
---------------------------------------------
исправил...





Сообщение отредактировал 3BiP - Пятница, 25.02.2011, 21:59
 
ninthДата: Суббота, 26.02.2011, 22:08 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Уф, сколько вопросов и все достаточно обширные. Если отвечать подробно на каждый, то трактат листов на -дцать получится, посему коротко, а дальше по мере уточнения.
------------------
По поводу смены состояний меню - игра - ивентарь - пауза и т.п., а так же переключение между менюшками: лучше всего использовать для этих целей FSM (машину конечных состояний). К сожалению, до перевода этой части я пока не добрался, так что придётся читать на английском в офф мануале. Если что-то будет непонятно, спрашивай, попробую помочь.
------------------
Сетевое взаимодействие можно реализовать как минимум двумя путями: средства самой панды (на сайте есть пример) или средствами питона с работой через сокеты (инфа есть в интернете). Промежуточные и временные данные (типа положения, скорости и т.п.) лучше хранить в памяти в массивах для того чтобы не тратить время на их извлечение с диска. Для длительного же хранения (логин, пароль, дамп состояния игрока при его выходе) обычно используют базы данных. У питона есть возможность работать с наиболее распространёнными БД, например, MySQL.
------------------
"Фон звёздного неба": Всё зависит от того что ты под этим подразумеваешь. Здесь я давал один из возможных вариантов http://panda3d.org.ru/forum/9-132-1 . Ещё можно скайбоксом, плоскостью, закреплёной на заднем фоне, комбинациями этих элементов, в общем много чего химичить можно.
------------------
Класс не совсем корректен в плане логики ) У тебя туда замешано всё и корабль и окружение и управление. Ну да ладно - это в данном случае не так важно. Ругается оно у тебя на speed потому что она объявляется локально внутри процедуры __init__ Если хочешь чтобы она была видна, то её нужно объявить вне класса и во всех процедурах где её используешь говорить что она глобальная. Но опять же с точки зрения ООП это не совсем корректно. Правильнее будет сделать класс корабля, у которого эта скорость будет в качестве свойства, так же как и моделька его представляющая и пр.
------------------
По скорости - тут проблема в том что она должна быть относительна масштаба всех твоих объектов - это первое. Второе - обрати внимание, для плавного уменьшения скорости я её умножаю на 0,99 в каждом кадре. В какой-то момент увеличение скорости не сможет пересилить уменьшение. Т.е. (100+1)*0,99 = 99,99 скорость уже не растёт. Тебе нужно менять этот алгоритм - или умножение отправить в отдельную задачу, которую вызывать по расписанию а не каждый кадр или уменьшать скорость не умножением, а вычитанием.
------------------
Попадание так же можно как минимум двумя путями делать - зависит от того имеют ли твои снаряды конечную скорость (ракеты, пули) или нет, как вариант, приближённую к бесконечности (лазеры).
Спецэффекты вообще отдельный разговор.
Удаляются модели с помощью removeNode() http://panda3d.org.ru/publ/1-1-0-8
 
3BiPДата: Воскресенье, 27.02.2011, 15:39 | Сообщение # 7
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
Разделил программу на 3 файла...

1.Главный

Code
#! /usr/bin/env python

# -*- coding: utf-8 -*-
from direct.directbase import DirectStart
from wmenu import menu
from wworld import world

m=menu()
w=world()

run()   

2.Меню(будет другое, надеюсь smile )
Code
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText   
from direct.gui.DirectGui import *
from pandac.PandaModules import *
import sys

class menu(DirectObject):
    def __init__(self):
      def itemSel(arg):
        if(arg == "Exit"):
          d=1   
         #callback function to set  text   
          def itemSel(arg):
     if(arg):
       sys.exit()
     else:
              d=0
          if d==1:
            dialog = YesNoDialog(dialogName="YesNoCancelDialog", text="Are you shure?", command=itemSel)
          else:
            gialog = []    
          base.camera.setPos(0,-50,0)
      menu = DirectOptionMenu(text="Menu",pos = (-1.33,3, 0.96), scale=0.05,items=["item1","item2","Add","Exit"],
      initialitem=0,highlightColor=(0.65,0.65,0.65,1),command=itemSel,textMayChange=0)
      menu.set(0)

3.Мир
Code
#! /usr/bin/env python

# -*- coding: utf-8 -*-
from direct.directbase import DirectStart
from pandac.PandaModules import *
from direct.showbase.DirectObject import DirectObject

from random import randrange

from direct.gui.OnscreenText import OnscreenText

class world(DirectObject):
    def __init__(self):
      # Function to put instructions on the screen.

      def addInstructions(pos, msg):

        return OnscreenText(text=msg, style=1, fg=(1,1,1,1),pos=(-1.3, pos), align=TextNode.ALeft, scale = .05)

      # Function to put title on the screen.

      def addTitle(text):

        return OnscreenText(text=text, style=1, fg=(1,1,1,1),pos=(1.3,-0.95), align=TextNode.ARight, scale = .07)

      # подобие окружения, чтобы видеть, что камера движется

      for i in xrange(100):

        tmp = loader.loadModel('box')

        tmp.reparentTo(render)

        tmp.setPos(randrange(-50,50),randrange(-50,50),randrange(-50,50))

      #  отключение дефолтного управления

      base.disableMouse()

      # создание "корабля"

      root = NodePath('avatar root')

      root.reparentTo(render)

      tmp = loader.loadModel("objects/mine")

      #tmp.setColor(1,0,0)

      tmp.reparentTo(root)

      base.camera.reparentTo(root)

      base.camera.setPos(0,-50,0)

      b ase.camera.lookAt(root)

      global speed, chvalue

      speed = 0

      chvalue = 0

      def changeSpeed(v):

        global chvalue

        chvalue =  v

      inst2 = addInstructions(0.70, "[W]: Fly ")

      inst3 = addInstructions(0.65, "[S]: Stop")

      self.accept("w",changeSpeed,[0.1])

      self.accept("s",changeSpeed,[0])

      # непосредственно процедура управления

      def controlTask(task):

        global speed, chvalue

        if base.mouseWatcherNode.hasMouse():     

          mpos = base.mouseWatcherNode.getMouse()*globalClock.getDt()*50

          root.setHpr(root,-mpos[0],mpos[1],0)

        if -1<speed<100:

          speed += chvalue

        speed *= 0.99

        root.setPos(root,0,speed*globalClock.getDt(),0)

        return task.cont

      taskMgr.add(controlTask,'control task')

После етого кусочка меню появился вопрос как запускать панду без стандартного окошка, в окошке Tkinter(tk).
Рылся на офф форуме но ниче особо вразумительного не нарыл(

Добавлено (27.02.2011, 11:17)
---------------------------------------------
*В tk можно сделать нормальное меню.

Добавлено (27.02.2011, 13:17)
---------------------------------------------
Со скоростью я сделал пока так:

Code
    def changeSpeed(v):
       global chvalue

       if v == 0:       
         chvalue =  v
       else:
         chvalue = chvalue + v
       inst4 =addInstructions(0.60, str(chvalue))

Но теперь фигня в топ чтобы переричсовывать ето, а иначе оно на 0 рисует 0.1 на 0.1 - 0.2 и вконце концов ничего невидно.

Добавлено (27.02.2011, 14:53)
---------------------------------------------
Так, со скоростью разобрался, норм пока, Терь вопрос как ворткуть панду в окно tk, а потом к серверу приступлю...

Добавлено (27.02.2011, 14:55)
---------------------------------------------
и где можно почитать, пусть даже по английски, про "FSM (машину конечных состояний)"

Добавлено (27.02.2011, 15:39)
---------------------------------------------
Так, по поводу фмс читаю, главный вопрос tk....help plizz...





Сообщение отредактировал 3BiP - Воскресенье, 27.02.2011, 11:28
 
ninthДата: Воскресенье, 27.02.2011, 18:53 | Сообщение # 8
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
tk как-то так http://codepaste.ru/5515/
хотя в дальнейшем могут возникать проблемы, связанные как раз с тем, что окно нестандартное, я так работать не пробовал, поэтому наверняка не скажу.
 
3BiPДата: Понедельник, 28.02.2011, 13:28 | Сообщение # 9
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
Quote (ninth)
tk как-то так http://codepaste.ru/5515/
хотя в дальнейшем могут возникать проблемы, связанные как раз с тем, что окно нестандартное, я так работать не пробовал, поэтому наверняка не скажу

Code
    import Pmw
ImportError: No module named Pmw
- ошибка( Что это за пмв?

Добавлено (28.02.2011, 13:28)
---------------------------------------------
так, pmw нашел, но не догоняю как его поставить(напоминаю у меня opensuse)



 
ninthДата: Понедельник, 28.02.2011, 17:06 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Надстройка над tk - пачка виджетов.
http://pmw.sourceforge.net/
У меня лежит в папке панды, ставилось вместе с ней.
Теоретически, они тебе не особо нужны, поэтому можешь поковыряться и обрезать их, оставив чистый tk. Но это теоретически.
 
3BiPДата: Понедельник, 28.02.2011, 17:09 | Сообщение # 11
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
попробую


 
ninthДата: Четверг, 03.03.2011, 03:17 | Сообщение # 12
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Я немного ошибся. Pmw в папке панды это в версии под винду. В убунте у меня Pmw стал сюда /usr/share/pyshared/Pmw и /usr/lib/python2.6/dist-packages/Pmw

А по поводу вырезания попробуй в pandad/direct/showbase/TkGlobal.py закомментировать все импорты/вызовы Pmw и вместо __builtins__["tkroot"] = Pmw.initialise() поставить __builtins__["tkroot"] = Tk()

 
3BiPДата: Понедельник, 07.03.2011, 01:08 | Сообщение # 13
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
Вырезал...
исправил код выхода на:
Code

if toolsMenu.add_command(label="Exit", command = tkroot.destroy):
   sys.exit()

Но теперь при нажатии Exit оно выходит. но сам процесс продолжается в ошибках:
Code

:display:x11display(error): GLXBadDrawable
:display:x11display(error): GLXBadDrawable
:display:x11display(error): GLXBadDrawable

И приходиться его руками тормозить....
Подскажите как его полностью закрывать, убивать, или избегать ошибки...

Добавлено (07.03.2011, 00:17)
---------------------------------------------
И еще в доке нигде нет ниче про accept, а ведь неизвестно как использовать колесико мыши в одну-другую сторону, или accept для клавы, а для мыши чттот другое?

Добавлено (07.03.2011, 00:25)
---------------------------------------------
таак, приближение отдаление камеры:

Code
    base.accept('wheel_up', lambda : base.cam.setY(base.cam.getY()+200 * globalClock.getDt()))  
     base.accept('wheel_down', lambda : base.cam.setY(base.cam.getY()-200 * globalClock.getDt()))    

Добавлено (07.03.2011, 01:08)
---------------------------------------------
Так...при нажатии ексит и остановке процесса руками, остается висеть дочерний процесс зомби, который отдельно надо грохать, можно ли как-то избежать создания этого процесса? или или убивать его вместе с главным?



 
ninthДата: Понедельник, 07.03.2011, 14:12 | Сообщение # 14
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
По выходу - есть подозрение, что проблема в задаче, tkLoop которая остаётся висеть в диспетчере taskMgr.
 
3BiPДата: Вторник, 08.03.2011, 23:43 | Сообщение # 15
Сержант
Группа: Пользователи
Сообщений: 37
Награды: 0
Репутация: 0
Статус: Offline
У мя нет идей как ее убивать...

Добавлено (08.03.2011, 23:43)
---------------------------------------------
про ФМС - http://www.panda3d.org/manual/index.php/FSM_Introduction
но пример этот какой то непонятный, как по мне
есть еще какие то примеры ФМС в панде?
или если не сложно напишите простейший пример со сменой окошек(используя ФМС)...
Просто мне становится понятней что есть что, когда у мя есть толковый пример с помощью которого я могу экспериментировать и сопоставлять с докой)



 
Форум Panda3D - по русски » Panda3D » Для начинающих » Помогите пожалуйста! (движение по наж клавиш) (Как заставить объект двигатся по нажатию клавиш?)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: