Помогите пожалуйста! (движение по наж клавиш)
|
|
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.Меню(будет другое, надеюсь ) 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 но пример этот какой то непонятный, как по мне есть еще какие то примеры ФМС в панде? или если не сложно напишите простейший пример со сменой окошек(используя ФМС)... Просто мне становится понятней что есть что, когда у мя есть толковый пример с помощью которого я могу экспериментировать и сопоставлять с докой)
|
|
| |