Специально для Русских
Если вы русский, то вы меня поймёте.
Короче, попрошу всех русских написать мне свои идеи для этого проекта. И желательно
чтобы это были новые модели, динамика, и самое главное колизии. Все модели, и ваши скрипты
отошлите на почту m7db@mail.ru
Hi, guys! I created the simple droid game
with game engine “Panda3D”. I worked a sounds.
Simply, its no cool… But, game i created, i can move further.
Ok, let us give link to you(our).
DroidHGame.zip (1.0 MB)
It’s the source code
#!/usr/bin/env python
# Импортируем все необходимые инструменты
from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionNode
from panda3d.core import CollisionHandlerQueue, CollisionRay
from panda3d.core import Filename, AmbientLight, DirectionalLight
from panda3d.core import PandaNode, NodePath, Camera, TextNode
from panda3d.core import CollideMask
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectSlider import DirectSlider
from direct.actor.Actor import Actor
import random
import sys
import os
import math
# Создадим главный класс нашей игры
class DroidShooter(ShowBase):
def __init__(self):
ShowBase.__init__(self) # Загружаем все селфы из direct
self.win.setClearColor((0, 0, 0, 1)) # Закрашиваем поверхность чёрным. Дело в том, что по умолчанию в этом игровом движке поверхность закрашивается серым.
self.keyMap = {
"left": 0, "right": 0, "forward": 0, "cam-left": 0, "cam-right": 0} # Создадим словарь кнопок, по их нажатию
self.environ = loader.loadModel("models/world/falcon.egg") # Загрузим уже созданный в blender мир.
self.environ.reparentTo(render) # Загружаем модель мира в окно
self.restartSound = loader.loadMusic('sound/restart.ogg') # Загрузим звук перезагрузки
self.restartSound.setVolume(1) # Поставим громкость звука на 1.
self.restartSound.setLoopCount(0) # Скорость проигрывания - 0.
droidStartPos = (-1, 6, 1.5) # Загружаем стартовую позицию игрока в мире.
enemyStartPos = (-6, 1, 0.5) # Загружаем позицию помощника-дроида.
self.droid = Actor("models/seeker.egg") # Загружаем модель игрока (созданная в blender)
self.enemy = Actor("models/enemies/r2d2/r2d2.egg") # Загружаем модель помощника (созданная в blender)
self.droid.reparentTo(render) # Перемещаем модель игрока в наш мир.
self.enemy.reparentTo(render) # Перемещаем модель помощника в наш мир.
self.droid.setScale(1) # Делаем размер игрока на 1
self.enemy.setScale(1) # Делаем размер помощника на 1
self.droid.setPos(droidStartPos) # Ставим позицию игрока на ранее созданую нами позицию
self.enemy.setPos(enemyStartPos) # Ставим позицию помощника на ранее созданую нами позицию
self.floater = NodePath(PandaNode("floater"))
self.floater.reparentTo(self.droid)
self.floater.setZ(2.0)
self.accept("escape", sys.exit) # При нажатии клавиши Esc выходим.
self.accept("arrow_left", self.setKey, ["left", True]) # При кнопке влево - поворачиваем игрока влево
self.accept("arrow_right", self.setKey, ["right", True]) # При кнопке вправо - поворачиваем игрока вправо
self.accept("arrow_up", self.setKey, ["forward", True]) # При кнопке вперёд - идём вперёд
self.accept("a", self.setKey, ["cam-left", True]) # При кнопке a - разворачиваем камеру вокруг нашей модельки
self.accept("s", self.setKey, ["cam-right", True]) # При кнопке s - разворачиваем камеру вокруг нашей модельки
self.accept("arrow_left-up", self.setKey, ["left", False]) # При кнопке вверх+влево - поворачиваем игрока влево и идём вперёд
self.accept("arrow_right-up", self.setKey, ["right", False]) # При кнопке вверх+право - поворачиваем игрока вправо и идём вперёд
self.accept("arrow_up-up", self.setKey, ["forward", False]) # При кнопке вверх+вверъ - идём вперёд и идём вперёд
self.accept("a-up", self.setKey, ["cam-left", False]) # При кнопке a+вперёд - поворачиваем камеру влево и идём вперёд
self.accept("s-up", self.setKey, ["cam-right", False]) # При кнопке s+вперёд - поворачиваем камеру вправо и идём вперёд
taskMgr.add(self.move, "moveTask") # Добавляем задачу в наш движок
self.isMoving = False # Ставим значение isMoving на False(Вы можете менять это значение) чтобы игрок изначально стоял.
self.disableMouse() # Отключаем перемещение через мышку
self.camera.setPos(self.droid.getX(), self.droid.getY() + 1, 3) # Ставим позицию камеры чуть больше позиции игрока
self.sliderText = OnscreenText("Volume", pos=(-0.1, 0.87), scale=.07,
fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) # Создаём текст Zvuk. Дело в том, что Panda3D не умеет писать текст по русски.
self.slider = DirectSlider(pos=(-0.1, 0, .75), scale=0.8, value=.50,
command=self.setVolume) # Создаём слайдер звука
# Создаём механику коллизий. Пока этот инструмент не работает. В дальнеййшим я реализую его по другому и колизии заработают.
self.cTrav = CollisionTraverser()
self.droidGroundRay = CollisionRay()
self.droidGroundRay.setOrigin(0, 0, 9)
self.droidGroundRay.setDirection(0, 0, -1)
self.droidGroundCol = CollisionNode('DroidRay')
self.droidGroundCol.addSolid(self.droidGroundRay)
self.droidGroundCol.setFromCollideMask(CollideMask.bit(0))
self.droidGroundCol.setIntoCollideMask(CollideMask.allOff())
self.droidGroundColNp = self.droid.attachNewNode(self.droidGroundCol)
self.droidGroundHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.droidGroundColNp, self.droidGroundHandler)
self.camGroundRay = CollisionRay()
self.camGroundRay.setOrigin(0, 0, 9)
self.camGroundRay.setDirection(0, 0, -1)
self.camGroundCol = CollisionNode('camRay')
self.camGroundCol.addSolid(self.camGroundRay)
self.camGroundCol.setFromCollideMask(CollideMask.bit(0))
self.camGroundCol.setIntoCollideMask(CollideMask.allOff())
self.camGroundColNp = self.camera.attachNewNode(self.camGroundCol)
self.camGroundHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)
self.cTrav.showCollisions(render)
ambientLight = AmbientLight("ambientLight")
ambientLight.setColor((.3, .3, .3, 1))
directionalLight = DirectionalLight("directionalLight")
directionalLight.setDirection((-5, -5, -5))
directionalLight.setColor((1, 1, 1, 1))
directionalLight.setSpecularColor((1, 1, 1, 1))
render.setLight(render.attachNewNode(ambientLight))
render.setLight(render.attachNewNode(directionalLight))
def setVolume(self):
'''Сделаем функцию измены звука'''
newVol = self.slider.guiItem.getValue()
self.restartSound.setVolume(newVol)
def setKey(self, key, value):
self.keyMap[key] = value # Делаем мехнзм нажатия клавиш.
def move(self, task):
''' Делаем фуцнкцию движения игрока '''
dt = globalClock.getDt() - 0.005
if self.keyMap["cam-left"]:
self.camera.setX(self.camera, -20 * dt)
if self.keyMap["cam-right"]:
self.camera.setX(self.camera, +20 * dt)
startpos = self.droid.getPos()
if self.keyMap["left"]:
self.droid.setH(self.droid.getH() + 300 * dt)
self.restartSound.play()
if self.keyMap["right"]:
self.restartSound.play()
self.droid.setH(self.droid.getH() - 300 * dt)
if self.keyMap["forward"]:
self.droid.setY(self.droid, -25 * dt)
if self.keyMap["forward"] or self.keyMap["left"] or self.keyMap["right"]:
if self.isMoving is False:
self.droid.loop("run")
self.isMoving = True
else:
if self.isMoving:
self.droid.stop()
self.droid.pose("walk", 5)
self.isMoving = False
camvec = self.droid.getPos() - self.camera.getPos()
camvec.setZ(0)
camdist = camvec.length()
camvec.normalize()
if camdist > 10.0:
self.camera.setPos(self.camera.getPos() + camvec * (camdist - 10))
camdist = 10.0
if camdist < 5.0:
self.camera.setPos(self.camera.getPos() - camvec * (5 - camdist))
camdist = 5.0
entries = list(self.camGroundHandler.getEntries())
entries.sort(key=lambda x: x.getSurfacePoint(render).getZ())
if len(entries) > 0 and entries[0].getIntoNode().getName() == "terrain":
self.camera.setZ(entries[0].getSurfacePoint(render).getZ() + 1.0)
if self.camera.getZ() < self.droid.getZ() + 2.0:
self.camera.setZ(self.droid.getZ() + 2.0)
entries = list(self.camGroundHandler.getEntries())
entries.sort(key=lambda x: x.getSurfacePoint(render).getZ())
if len(entries) > 0 and entries[0].getIntoNode().getName() == "terrain":
self.camera.setZ(entries[0].getSurfacePoint(render).getZ() + 1.0)
if self.camera.getZ() < self.droid.getZ() + 2.0:
self.camera.setZ(self.droid.getZ() + 2.0)
self.camera.lookAt(self.floater)
return task.cont
demo = DroidShooter() # Cоздаём объект класса нашей игры
demo.run() # Запускаем
4
Look to models new robot
30 min later…
Robot r2d2 in the shooter!
Screenshot the new person in game
23:52… Full screen update!
Screenshot
New code :
#!/usr/bin/env python
# Импортируем все необходимые инструменты
from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionNode
from panda3d.core import CollisionHandlerQueue, CollisionRay
from panda3d.core import Filename, AmbientLight, DirectionalLight
from panda3d.core import PandaNode, NodePath, Camera, TextNode
from panda3d.core import CollideMask
from panda3d.core import loadPrcFileData
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectSlider import DirectSlider
from direct.actor.Actor import Actor
import random
import sys
import os
import math
loadPrcFileData('', 'window-title Droid Game 1.0.2') # Сделаем не стандартный заголовок
loadPrcFileData('', 'win-size 1920 1200') # Ставим размер окна на полный экран
# Создадим главный класс нашей игры
class DroidShooter(ShowBase):
def __init__(self):
ShowBase.__init__(self) # Загружаем все селфы из direct
self.win.setClearColor((0, 0, 0, 1)) # Закрашиваем поверхность чёрным. Дело в том, что по умолчанию в этом игровом движке поверхность закрашивается серым.
self.keyMap = {
"left": 0, "right": 0, "forward": 0, "cam-left": 0, "cam-right": 0} # Создадим словарь кнопок, по их нажатию
self.environ = loader.loadModel("models/world/falcon.egg") # Загрузим уже созданный в blender мир.
self.environ.reparentTo(render) # Загружаем модель мира в окно
self.restartSound = loader.loadMusic('sound/restart.ogg') # Загрузим звук перезагрузки
self.restartSound.setVolume(1) # Поставим громкость звука на 1.
self.restartSound.setLoopCount(0) # Скорость проигрывания - 0.
droidStartPos = (-1, 6, 1.5) # Загружаем стартовую позицию игрока в мире.
enemyStartPos = (-6, 1, 0.5) # Загружаем позицию помощника-дроида.
self.droid = Actor("models/seeker.egg") # Загружаем модель игрока (созданная в blender)
self.enemy = Actor("models/enemies/r2d2/r2d2.egg") # Загружаем модель помощника (созданная в blender)
self.droid.reparentTo(render) # Перемещаем модель игрока в наш мир.
self.enemy.reparentTo(render) # Перемещаем модель помощника в наш мир.
self.droid.setScale(1) # Делаем размер игрока на 1
self.enemy.setScale(1) # Делаем размер помощника на 1
self.droid.setPos(droidStartPos) # Ставим позицию игрока на ранее созданую нами позицию
self.enemy.setPos(enemyStartPos) # Ставим позицию помощника на ранее созданую нами позицию
self.floater = NodePath(PandaNode("floater"))
self.floater.reparentTo(self.droid)
self.floater.setZ(2.0)
self.accept("escape", sys.exit) # При нажатии клавиши Esc выходим.
self.accept("arrow_left", self.setKey, ["left", True]) # При кнопке влево - поворачиваем игрока влево
self.accept("arrow_right", self.setKey, ["right", True]) # При кнопке вправо - поворачиваем игрока вправо
self.accept("arrow_up", self.setKey, ["forward", True]) # При кнопке вперёд - идём вперёд
self.accept("a", self.setKey, ["cam-left", True]) # При кнопке a - разворачиваем камеру вокруг нашей модельки
self.accept("s", self.setKey, ["cam-right", True]) # При кнопке s - разворачиваем камеру вокруг нашей модельки
self.accept("arrow_left-up", self.setKey, ["left", False]) # При кнопке вверх+влево - поворачиваем игрока влево и идём вперёд
self.accept("arrow_right-up", self.setKey, ["right", False]) # При кнопке вверх+право - поворачиваем игрока вправо и идём вперёд
self.accept("arrow_up-up", self.setKey, ["forward", False]) # При кнопке вверх+вверъ - идём вперёд и идём вперёд
self.accept("a-up", self.setKey, ["cam-left", False]) # При кнопке a+вперёд - поворачиваем камеру влево и идём вперёд
self.accept("s-up", self.setKey, ["cam-right", False]) # При кнопке s+вперёд - поворачиваем камеру вправо и идём вперёд
taskMgr.add(self.move, "moveTask") # Добавляем задачу в наш движок
self.isMoving = False # Ставим значение isMoving на False(Вы можете менять это значение) чтобы игрок изначально стоял.
self.disableMouse() # Отключаем перемещение через мышку
self.camera.setPos(self.droid.getX(), self.droid.getY() + 1, 3) # Ставим позицию камеры чуть больше позиции игрока
self.sliderText = OnscreenText("Volume", pos=(-0.1, 0.87), scale=.07,
fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1)) # Создаём текст Zvuk. Дело в том, что Panda3D не умеет писать текст по русски.
self.slider = DirectSlider(pos=(-0.1, 0, .75), scale=0.8, value=.50,
command=self.setVolume) # Создаём слайдер звука
# Создаём механику коллизий. Пока этот инструмент не работает. В дальнеййшим я реализую его по другому и колизии заработают.
self.cTrav = CollisionTraverser()
self.droidGroundRay = CollisionRay()
self.droidGroundRay.setOrigin(0, 0, 9)
self.droidGroundRay.setDirection(0, 0, -1)
self.droidGroundCol = CollisionNode('DroidRay')
self.droidGroundCol.addSolid(self.droidGroundRay)
self.droidGroundCol.setFromCollideMask(CollideMask.bit(0))
self.droidGroundCol.setIntoCollideMask(CollideMask.allOff())
self.droidGroundColNp = self.droid.attachNewNode(self.droidGroundCol)
self.droidGroundHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.droidGroundColNp, self.droidGroundHandler)
self.camGroundRay = CollisionRay()
self.camGroundRay.setOrigin(0, 0, 9)
self.camGroundRay.setDirection(0, 0, -1)
self.camGroundCol = CollisionNode('camRay')
self.camGroundCol.addSolid(self.camGroundRay)
self.camGroundCol.setFromCollideMask(CollideMask.bit(0))
self.camGroundCol.setIntoCollideMask(CollideMask.allOff())
self.camGroundColNp = self.camera.attachNewNode(self.camGroundCol)
self.camGroundHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)
self.cTrav.showCollisions(render)
ambientLight = AmbientLight("ambientLight")
ambientLight.setColor((.3, .3, .3, 1))
directionalLight = DirectionalLight("directionalLight")
directionalLight.setDirection((-5, -5, -5))
directionalLight.setColor((1, 1, 1, 1))
directionalLight.setSpecularColor((1, 1, 1, 1))
render.setLight(render.attachNewNode(ambientLight))
render.setLight(render.attachNewNode(directionalLight))
def setVolume(self):
'''Сделаем функцию измены звука'''
newVol = self.slider.guiItem.getValue()
self.restartSound.setVolume(newVol)
def setKey(self, key, value):
self.keyMap[key] = value # Делаем мехнзм нажатия клавиш.
def move(self, task):
''' Делаем фуцнкцию движения игрока '''
dt = globalClock.getDt() - 0.005 # Cкорость движения
# Поворот камеры влево и вправо
if self.keyMap["cam-left"]:
self.camera.setX(self.camera, -20 * dt) # Меняем положеника камеры по икс. Таким образом получается илюзия поворота угла луча. Но на самом деле камера просто перемещается.
if self.keyMap["cam-right"]:
self.camera.setX(self.camera, +20 * dt) # Тоже самое, что и наверху.
startpos = self.droid.getPos() # Сделаем удобную переменную позиции игрока
if self.keyMap["left"]:
self.droid.setH(self.droid.getH() + 300 * dt)
self.restartSound.play() # Играем звук перезагрузки дроида.
if self.keyMap["right"]:
self.restartSound.play() # Играем звук перезагрузки дроида.
self.droid.setH(self.droid.getH() - 300 * dt)
if self.keyMap["forward"]:
self.droid.setY(self.droid, -25 * dt)
if self.keyMap["forward"] or self.keyMap["left"] or self.keyMap["right"]:
if self.isMoving is False:
self.droid.loop("run")
self.isMoving = True
else:
if self.isMoving:
self.droid.stop()
self.droid.pose("walk", 5)
self.isMoving = False
camvec = self.droid.getPos() - self.camera.getPos()
camvec.setZ(0)
camdist = camvec.length()
camvec.normalize()
if camdist > 10.0:
self.camera.setPos(self.camera.getPos() + camvec * (camdist - 10))
camdist = 10.0
if camdist < 5.0:
self.camera.setPos(self.camera.getPos() - camvec * (5 - camdist))
camdist = 5.0
entries = list(self.camGroundHandler.getEntries())
entries.sort(key=lambda x: x.getSurfacePoint(render).getZ())
if len(entries) > 0 and entries[0].getIntoNode().getName() == "terrain":
self.camera.setZ(entries[0].getSurfacePoint(render).getZ() + 1.0)
if self.camera.getZ() < self.droid.getZ() + 2.0:
self.camera.setZ(self.droid.getZ() + 2.0)
entries = list(self.camGroundHandler.getEntries())
entries.sort(key=lambda x: x.getSurfacePoint(render).getZ())
if len(entries) > 0 and entries[0].getIntoNode().getName() == "terrain":
self.camera.setZ(entries[0].getSurfacePoint(render).getZ() + 1.0)
if self.camera.getZ() < self.droid.getZ() + 2.0:
self.camera.setZ(self.droid.getZ() + 2.0)
self.camera.lookAt(self.floater)
return task.cont
demo = DroidShooter() # Cоздаём объект класса нашей игры
demo.run() # Запускаем
Screenshot :
23 January 2021, 10:22
Weapon Update.
Screenshot new weapon :
New ZIP-archive for weapon : DroidHGame.zip (1.0 MB)
Sorry, i deleted full screen mod FPS in weak comuters = < 30
Hey, please comment this project. I very listen your ideas and wish.