Hello all 
About 5.0.0 :
Add the shader of the fire.
Screenshot this :
Directory 5.0.0 :
/models :
./models/world
Now, download panda3d art from https://www.panda3d.org/download/noversion/art-gallery.zip
Go to the cat-environment folder. In it you will see a millenium falcon folder. Take all the files from it and put it in the directory ./models/world)
./models/block : block.zip (269.6 KB)
./models/enemies : enemies.zip (381.4 KB)
./models/fighter : fighter.zip (36.9 KB)
./models/player : player.zip (644.6 KB)
./models/sky : sky.zip (12.5 KB)
./models/weapon : weapon.zip (234.3 KB)
./models/whishlyflash : whishlyflash.zip
./fonts : fonts.zip (192.5 KB)
./sounds : sounds.zip (1.8 MB)
./special_effects : special_effects.zip (19.3 KB)
./tex : tex.zip (95.1 KB)
./shaders : shaders.zip (22.2 KB)
droid.py :
#!/usr/bin/env python
# -*- coding: utf_8 -*-
# Π‘ΠΎΠ·Π΄Π°Π½ΠΎ : 22 ΡΠΈΡΠ»ΠΎ, ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄
# ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
from direct.showbase.ShowBase import ShowBase
from direct.particles.ParticleEffect import ParticleEffect
from direct.gui.OnscreenImage import OnscreenImage
from direct.interval.IntervalGlobal import *
from panda3d.core import *
from marconit_engine import *
import random
import sys
import time
import os
import math
VERSION = '5.0.0'
settings = ['window-title Droid Game release ' + VERSION,
'fullscreen 0',
'win-size 1440 900']
loadPrcFileData('', settings[0]) # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (Π²ΠΎΠ·ΠΌΡΠΌ Π΅Π³ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ settings)
loadPrcFileData('', settings[1]) # Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
loadPrcFileData('', settings[2]) # Π Π°Π·ΠΌΠ΅Ρ ΠΎΠΊΠ½Π°
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³Π»Π°Π²Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
class DroidShooter(ShowBase):
def __init__(self):
ShowBase.__init__(self) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅Π»ΡΡ ΠΈΠ· direct
self.speed = 1800 # ΡΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ
self.GB = False # ΠΠ ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
self.EN = False # ΠΠ΅ Π±ΡΠ΄Π΅ΠΌ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.pro_machine = False # ΠΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.menu() # Π·Π²ΠΏΡΡΠΊ ΠΌΠ΅Π½Ρ
def menu(self):
base.enableParticles() # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.win.setClearColor((0, 0.2, 0.2, 1)) # ΠΠ°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ ΡΡΡΠ½ΡΠΌ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΠΈΠ³ΡΠΎΠ²ΠΎΠΌ Π΄Π²ΠΈΠΆΠΊΠ΅ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ Π·Π°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΡΠΌ.
self.font = loader.loadFont('./fonts/doom_font.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ ΠΈΠ· ΠΈΠ³ΡΡ doom
self.inst_font = loader.loadFont('./fonts/arial.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ arial
self.crackSound = GameApi.sound(self, './sounds/crack.wav', 1) # Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π° ΠΊΠΎΡΠ°Π±Π»Ρ
self.shotSound = GameApi.sound(self, './sounds/shot.wav', 1) # Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.startSound = GameApi.sound(self, './sounds/started.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.errorSound = GameApi.sound(self, './sounds/error.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.click_sound = GameApi.sound(self, './sounds/GUI_click.wav', 1) # Π·Π²ΡΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ
self.startSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
# ΠΠ΅Π½Ρ-ΡΡΡΠ΅ΠΊΡΡ
MenuApi.menu_effect(self)
self.button_start = MenuApi.button(self, pos=(0.7, 0, 0.4), text="CTAPT",
scale=.2, pad=(.2, .2),
command=self.load_game) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
self.gb_start = MenuApi.button(self, pos=(0.7, 0, 0.1), text="GB",
scale=.2, pad=(.2, .2),
command=self.gb_mode) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ Π² ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅
self.en = MenuApi.button(self, pos=(0.7, 0, -0.2), text='EN',
scale=.2, pad=(.2, .2),
command=self.en_lang)
self.pro_button = MenuApi.button(self, pos=(0.7, 0, -0.5), text='PRO',
scale=.2, pad=(.2, .2),
command=self.pro_system)
self.slider_sun = MenuApi.slider(self, pos=(0.1, 0, .75), scale=0.8, value=0.5,
command=self.set_sun_interval)
self.title = MenuApi.addTitle(self, "Droid game ΡΠ΅Π»ΠΈΠ· " + VERSION, self.font)
# ΠΠ°ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.inst1 = MenuApi.addInstruction(self, 0.95, u"[ESC]: ΠΡΡ
ΠΎΠ΄", self.inst_font)
self.inst2 = MenuApi.addInstruction(self, 0.90, u"[Left Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst3 = MenuApi.addInstruction(self, 0.85, u"[Right Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst4 = MenuApi.addInstruction(self, 0.80, u"[Up Arrow]: ΠΠΏΠ΅ΡΠ΅Π΄", self.inst_font)
self.inst5 = MenuApi.addInstruction(self, 0.75, u"[a]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst6 = MenuApi.addInstruction(self, 0.70, u"[d]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst7 = MenuApi.addInstruction(self, 0.65, u"[Left Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst8 = MenuApi.addInstruction(self, 0.60, u"[Right Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst9 = MenuApi.addInstruction(self, 0.55, u"[a + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst10 = MenuApi.addInstruction(self, 0.50, u"[d + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst11 = MenuApi.addInstruction(self, 0.45, u"[space]: ΡΡΡΠ΅Π»ΡΠ±Π°", self.inst_font)
self.inst12 = MenuApi.addInstruction(self, 0.40, u"[s]: Π΄ΠΎΡΡΠ°ΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ", self.inst_font)
self.inst13 = MenuApi.addInstruction(self, 0.35, u"[w]: ΡΠ±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅", self.inst_font)
self.inst14 = MenuApi.addInstruction(self, 0.30, u"[f]: ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·Π³ΠΎΠ½(ΠΠΠΠ‘ΠΠ!)", self.inst_font)
self.inst15 = MenuApi.addInstruction(self, 0.25, u"[0]: ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°", self.inst_font)
self.accept("escape", sys.exit) # ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ Esc Π²ΡΡ
ΠΎΠ΄ΠΈΠΌ.
def set_sun_interval(self):
self.sun_interval = self.slider_sun.guiItem.getValue() * 100 # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ»Π°ΠΉΠ΄Π΅ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΎΠ΅ Π½Π° 500, Π΄Π° ΡΡΠ°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½ΠΎ ΠΌΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΏΠ»Π΅Π²Π°ΡΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Π½Ρ, ΠΈΠ±ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ½ΡΡΠΈΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΡΡ :)
def gb_mode(self):
'''Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ½ΠΎΠ±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.GB = True
def en_lang(self):
'''ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ·ΡΠΊΠ° Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.EN = True
def pro_system(self):
'''ΠΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.pro_machine = True # Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
def load_game(self):
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.button_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΠ°ΡΡΠ°
self.gb_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΡΠ½ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°.
self.title.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈΠ³ΡΡ
self.en.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π°Π½Π³ΠΎΡΠ·ΡΡΠ½ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ
self.pro_button.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠ²Π»Π΅Π½ΠΈΡ
# ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
self.inst1.destroy()
self.inst2.destroy()
self.inst3.destroy()
self.inst4.destroy()
self.inst5.destroy()
self.inst6.destroy()
self.inst7.destroy()
self.inst8.destroy()
self.inst9.destroy()
self.inst10.destroy()
self.inst11.destroy()
self.inst12.destroy()
self.inst13.destroy()
self.inst14.destroy()
self.inst15.destroy()
self.slider_sun.destroy() # ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΡΠ»Π°ΠΉΠ΄Π΅Ρ ΡΠΎΠ»Π½ΡΠ°
self.keyMap = {
"left": 0, "right": 0, "forward": 0, "cam-left": 0, "cam-right": 0} # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΠΎ ΠΈΡ
Π½Π°ΠΆΠ°ΡΠΈΡ
# Π ΠΈΡΡΠ΅ΠΌ Π·Π²ΡΠ·Π΄Ρ
self.sky = loader.loadModel("./models/sky/solar_sky_sphere") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΊΠΎΡΠΌΠΎΡΠ°(ΡΡΠΎ ΡΡΠ΅ΡΠ°)
self.sky_tex = loader.loadTexture("./tex/stars_1k_tex.jpg") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ
self.sky.setTexture(self.sky_tex, 1) # Π·Π°ΡΠ΅Π½Π΄Π΅ΡΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ Π½Π° Π½Π΅Π±ΠΎ
self.sky.reparentTo(render) # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π½Π΅Π±ΠΎ
self.sky.setScale(40000) # ΡΠ°ΡΡΠΈΡΠΈΠΌ Π½Π΅Π±ΠΎ Π΄ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ panda3d
self.environ = loader.loadModel("models/world/falcon.egg") # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π² blender ΠΌΠΈΡ.
self.environ.reparentTo(render) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΈΡΠ° Π² ΠΎΠΊΠ½ΠΎ
droidStartPos = (-1, 0, 1.5 ) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΡΡΠ°ΡΡΠΎΠ²ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° Π² ΠΌΠΈΡΠ΅.
enemyStartPos = (-6, 1, 0.5) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ°-Π΄ΡΠΎΠΈΠ΄Π°.
self.droid = GameApi.object(self, "models/player/seeker.egg", 1, droidStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ³ΡΠΎΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.enemy = GameApi.object(self, "models/enemies/r2d2/r2d2.egg", 1, enemyStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 1 # ΠΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
self.weapon = GameApi.object(self, 'models/weapon/lightsaber.egg', .5, self.weapon_pos) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΎΡΡΠΆΠΈΠ΅
self.bullet = GameApi.object(self, 'models/weapon/bullet/bullet.egg.pz', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΠΏΡΠ»Ρ
self.flash = GameApi.object(self, 'models/whishlyflash/handlamp.egg', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.bullet.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΠΏΡΠ»Ρ Π² ΠΌΠΈΡ Π½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΎΠ½Π° ΡΠ°ΠΌΠ° Π½Π΅ ΡΠΊΠΎΡΠΎ
self.flash.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ Π² Π½Π°Ρ ΠΌΠΈΡ
self.bullet.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠ»ΠΈ
self.flash.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
# Π²ΡΠ°ΠΆΠ΅ΡΠΊΠΈΠΉ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.fighter = GameApi.object(self, 'models/fighter/fighter.egg', 1, (0, 90 , 0)) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»ΡΠΊΡ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.cube = GameApi.object(self, 'models/block/crate.egg', .7, (0, 0, 0)) # Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ Π±Π»ΠΎΠΊ
self.cube.hprInterval(1.5, (0, 360, 360)).loop()
self.Intervalcube = self.cube.posInterval(13,
Point3(0, -500, 0),
startPos=Point3(0, 10, 0))
self.Intervalcube.loop()
self.spotlight = camera.attachNewNode(Spotlight("spotlight")) # ΠΠΎΠ½ΡΠΈΠ³ΠΈ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
self.spotlight.node().setColor((.3, .3, .3, 1))
self.spotlight.node().setSpecularColor((0, 0, 0, 1))
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("d", 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("d-up", self.setKey, ["cam-right", False]) # ΠΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ s+Π²ΠΏΠ΅ΡΡΠ΄ - ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π²ΠΏΡΠ°Π²ΠΎ ΠΈ ΠΈΠ΄ΡΠΌ Π²ΠΏΠ΅ΡΡΠ΄
self.accept("space", self.shot) # ΠΏΡΠΈ ΠΏΡΠΎΠ±Π΅Π»Π΅ ΡΡΡΠ΅Π»ΡΠ΅ΠΌ
self.accept("s", self.toggleLights, [[self.spotlight]]) # ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.accept("w", self.weapon_hide) # ΠΏΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ w - ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅.
base.enableParticles() # ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΡΠΌΠ°
self.p = ParticleEffect() # ΠΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.accept('f', self.particle_start) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f(ΠΎΡ force) - Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ°ΠΉΠ» Π΄ΡΠΌΠ° ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠΈΠ³ ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΡΡΠ°Π»Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄ΡΠΌΠ°
self.accept('0', self.fountain) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ f+o(fountain) Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ
self.accept('f3', self.toggleWireframe) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f3 - Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ»ΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
taskMgr.add(self.move, "moveTask") # ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°Π΄Π°ΡΡ Π² Π½Π°Ρ Π΄Π²ΠΈΠΆΠΎΠΊ
self.isMoving = False # Π‘ΡΠ°Π²ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ isMoving Π½Π° False(ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠ΅Π½ΡΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅) ΡΡΠΎΠ±Ρ ΠΈΠ³ΡΠΎΠΊ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎΡΠ».
# ΠΠ΅Π»Π°Π΅ΠΌ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ²Π΅Ρ Π±ΡΠ» ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π²ΡΠΊΠ»ΡΡΠ΅Π½.
self.disableMouse() # ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΌΡΡΠΊΡ
self.camera.setPos(self.droid.getX(), self.droid.getY() + 1, 3) # Π‘ΡΠ°Π²ΠΈΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
self.state = 10 # Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠΎΡΠ°Π±Π»Ρ
if not self.EN : # Π΅ΡΠ»ΠΈ ΡΠ·ΡΠΊ Π½Π΅ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else : # Π΅ΡΠ»ΠΈ ΡΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.state_info = MenuApi.text(self, text='machine :' + str(self.state), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.hide_weapon = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΎΡΡΠΆΠΈΠ΅ Π½Π΅ ΡΠ±ΡΠ°Π½ΠΎ
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
self.motor_pos1 = 25.238849639892578, 8.962211608886719, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor_pos2 = -20.676218032836914, 10.55816650390625, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor1 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos1, self.environ) # ΠΌΠΎΡΠΎΡ 1
self.motor2 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos2, self.environ) # ΠΌΠΎΡΠΎΡ 2
self.state_info2 = MenuApi.text(self, text='', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.force = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Π½Π΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.black_light() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ²Π΅Ρ
self.collisions() # Π²ΡΡΠ±Π°Π΅ΠΌ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ
# ΡΠΎΠ»Π½ΡΠ΅(Π½ΠΎΠ²Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ)
sun = DirectionalLight("sun")
sun.set_color_temperature(6000)
sun.color = sun.color * 4
sun_path = render.attach_new_node(sun)
sun_path.set_pos(10, -10, -10)
sun_path.look_at(0, 0, 0)
sun_path.hprInterval(self.sun_interval, (sun_path.get_h(), sun_path.get_p() - 360, sun_path.get_r()), bakeInStart=True).loop()
render.set_light(sun_path)
#GameApi.fire(self)
#GameApi.shadows_shader(self)
#PaintShade(render)
# ΠΡΠ»ΠΈ ΠΈΠ³ΡΠΎΠΊ Π·Π°Ρ
ΠΎΡΠ΅Π» ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Π² ΡΡΡΠ½ΠΎΠ±Π΅Π»ΡΡ ΠΈΠ³ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΡΠΎ
if self.GB :
GameApi.shaders(self, "./shaders/lighting.vert", "./shaders/lighting.frag") # ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ΅ΠΉΠ΄Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ!
#render.set_shader(Shader.load(Shader.SL_GLSL, "./shaders/terrain.vert.glsl", "./shaders/terrain.frag.glsl"))
def collisions(self):
pass
def light_shader(self):
'''ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΉΠ΄Π΅ΡΠ° Π³ΠΎΡΠ΅Π½ΠΈΡ'''
return Shader.make(Shader.SL_GLSL, vertex="""
#version 120
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
attribute vec2 p3d_MultiTexCoord0;
attribute vec4 p3d_Vertex;
attribute vec3 p3d_Normal;
uniform mat4 p3d_ModelViewProjectionMatrix;
void main( void )
{
gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex;
gl_TexCoord[0].xy = p3d_MultiTexCoord0;
v_FragmentPosition = p3d_Vertex.xyz;
v_FragmentNormal = p3d_Normal;
}
""",
fragment="""
#version 120
uniform sampler2D p3d_Texture0;
uniform vec3 pos_light;
uniform mat4 p3d_ViewMatrixInverse;
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
const vec4 k_LightColor = vec4(1.0, 0.6, 0.3, 1.0);
const float k_Shininess = 64.0;
const float k_ConstAttenuation = 0.5;
const float k_LinearAttenuation = 0.05;
const float k_QuadricAttenuation = 0.001;
void main( void )
{
vec3 L = pos_light - v_FragmentPosition;
// ** Used in the calculation of light extinction
float distance = length( L );
L = normalize( L );
vec3 N = normalize( v_FragmentNormal );
// ** The H vector is used to calculate the gloss (specularity) of a fragment
vec3 E = normalize( p3d_ViewMatrixInverse[3].xyz - v_FragmentPosition );
vec3 H = normalize( L + E ); // ** Half-vector
// ** The calculation coefficient. attenuations
float attenuation = 1.0 / ( k_ConstAttenuation + k_LinearAttenuation * distance + k_QuadricAttenuation * distance * distance );
float diffuse = clamp( dot( L, N ), 0.0, 1.0 );
float specular = pow( clamp( dot( N, H ), 0.0, 1.0 ), k_Shininess );
if( diffuse <= 0.0 ){
specular = 0.0;
}
vec4 diffuseColor = diffuse * k_LightColor * attenuation;
vec4 specularColor = specular * k_LightColor * attenuation;
vec4 ambientColor = vec4(0.01, 0.01, 0.01, 0.01);
vec4 emissionColor = vec4(0.0, 0.0, 0.0, 0.0);
gl_FragColor = ( diffuseColor + specularColor + ambientColor + emissionColor) * texture2D(p3d_Texture0, gl_TexCoord[0].xy );
}
""")
def particle_start(self):
if not self.pro_machine :
self.force = True # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΡΠΆΠ΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.state -= 1 # ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΡΠΊΠΎΠ²
self.state_info.hide() # ΡΠ΄Π°Π»ΠΈΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΎΡΠΊΠΈ
if self.state != 10 and self.state > 10:
self.state_info.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΠΆΠΈΠ·Π½ΡΡ
ΠΊΠΎΡΠ°Π±Π»Ρ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ Π½Π΅ΠΈΡΠΏΡΠ°Π²Π΅Π½', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='motor error', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else:
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam_critic/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='critic state', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
if self.state < 10:
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
GameApi.make_shader(self, self.environ, self.steam_pos) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ Π³ΠΎΡΠ΅Π½ΠΈΡ
GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΏΠ°Π΄Π°Π΅ΠΌ!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='fall!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
if not self.EN :
self.pro_info = MenuApi.text(self, text='ΠΠ ΠΠ€Π!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
else :
self.pro_info = MenuApi.text(self, text='PRO!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
self.pro_machine_engine()
def pro_machine_engine(self):
'''ΠΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΊΠΎΡΠ°Π±Π»Ρ'''
# Π’ΡΡ Π½ΡΠΆΠ΅Π½ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊ. ΠΡΠ»ΠΈ Π΅Π³ΠΎ Ρ Π²Π°Ρ Π½Π΅Ρ, ΡΠ²Ρ Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ΅ΠΆΠΈΠΌ.
self.mgr = InputDeviceManager.get_global_ptr()
for device in self.mgr.get_devices():
self.gamepad = device
MenuApi.text(self, text=str(self.gamepad), pos=(-1.6, -0.9), scale=0.05, font=self.font) # Π½Π°ΠΉΠ΄Π΅Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
# Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠΎΠΌ
taskMgr.add(self.moveTaskDjoystic, "moveTaskDjoystic")
## self.accept("gamepad-back", exit)
## self.accept("gamepad-start", exit)
## self.accept("gamepad-face_x", self.reset)
## self.accept("gamepad-face_b", self.action, extraArgs=["face_b"])
def reset(self):
self.camera.setPosHpr(0, -200, 10, 0, 0, 0)
self.environ.setPosHpr(0, -200, 9, 0, 0, 0)
def moveTaskDjoystic(self, task):
dt = globalClock.getDt()
strafe_speed = 85
vert_speed = 50
turn_speed = 100
lstick = self.gamepad.findButton("lstick")
if lstick.pressed:
strafe_speed *= 2.0
strafe = Vec3(0)
left_x = self.gamepad.findAxis(InputDevice.Axis.left_x)
left_y = self.gamepad.findAxis(InputDevice.Axis.left_y)
strafe.x = left_x.value
strafe.y = left_y.value
if strafe.lengthSquared() >= 0.01:
self.camera.setPos(self.camera, strafe * strafe_speed * dt)
trigger_l = self.gamepad.findAxis(InputDevice.Axis.left_trigger)
trigger_r = self.gamepad.findAxis(InputDevice.Axis.right_trigger)
lift = trigger_r.value - trigger_l.value
self.camera.setZ(self.camera.getZ() + (lift * vert_speed * dt))
right_x = self.gamepad.findAxis(InputDevice.Axis.right_x)
right_y = self.gamepad.findAxis(InputDevice.Axis.right_y)
if abs(right_x.value) >= 0.1 or abs(right_y.value) >= 0.1:
self.camera.setH(self.camera, turn_speed * dt * -right_x.value)
self.camera.setP(self.camera, turn_speed * dt * right_y.value)
self.camera.setR(0)
return task.cont
def fountain(self):
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ΅ΠΊΡΡ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
if self.force:
if self.state != 100:
self.state += 1
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
else :
if self.state != 100:
self.state += 1
self.state_info.hide()
MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
#self.state_info = OnscreenText(text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
def black_light(self):
# ΠΡΠΊΠ»ΡΡΠ΅Π½ΡΠΉ ΡΠ²Π΅Ρ
ambientLight = AmbientLight("ambientLight")
ambientLight.setColor((0, 0, 0, 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 weapon_hide(self):
# Π£Π±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅
self.hide_weapon = True
self.weapon.hide()
def toggleLights(self, lights):
# Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
if self.hide_weapon:
for light in lights:
if render.hasLight(light):
render.clearLight(light)
else:
render.setLight(light)
self.flash.setPos(self.weapon_pos)
else:
return
def shot(self):
dt = globalClock.getDt() + 0.5 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
if not self.hide_weapon : # Π΅ΡΠ»ΠΈ ΠΎΡΡΠΆΠΈΠ΅ ΡΠ±ΡΠ°Π½ΠΎ ΡΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ΅Π»ΡΡΡ
self.shotSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.bullet.setPos(self.weapon_pos) # ΠΡΠ»Ρ Π±ΡΠ΄Π΅Ρ ΡΠΏΠ°Π²Π½ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΏΡΡΠΊΠΈ
self.bullet.setY(self.bullet, -11 * dt) # Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΏΡΠ»Ρ Π½Π° ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ Π²ΠΏΠ΅ΡΡΠ΄
def check_loss(self):
if self.state == 0: # Π΅ΡΠ»ΠΈ ΠΆΠΈΠ·Π½Π΅ΠΉ Ρ ΠΊΠΎΡΠ°Π±Π»Ρ Π½Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ
self.black_light() # Π²ΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ½ΡΠΉ ΡΠ²Π΅Ρ
self.weapon_hide() # ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅
if not self.EN :
self.info = MenuApi.text(self, text='ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
else :
self.info = MenuApi.text(self, text='LOSS', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
self.crackSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π°
def setKey(self, key, value):
self.keyMap[key] = value # ΠΠ΅Π»Π°Π΅ΠΌ ΠΌΠ΅Ρ
aΠ½uΠ·ΠΌ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ.
def move(self, task):
''' ΠΠ΅Π»Π°Π΅ΠΌ ΡΡΡΠ½ΠΊΡΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° '''
dt = globalClock.getDt() - .005 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
# ΠΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡΠ°Π²ΠΎ
if self.keyMap["cam-left"]:
self.camera.setX(self.camera, -10 * dt) # ΠΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΊΠ° ΠΊΠ°ΠΌΠ΅ΡΡ ΠΏΠΎ ΠΈΠΊΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΠ»ΡΠ·ΠΈΡ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΡΠ³Π»Π° Π»ΡΡΠ°. ΠΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΊΠ°ΠΌΠ΅ΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ.
if self.keyMap["cam-right"]:
self.camera.setX(self.camera, + 10 * dt) # Π’ΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Π½Π°Π²Π΅ΡΡ
Ρ.
startpos = self.droid.getPos() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ΄ΠΎΠ±Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
if self.keyMap["left"]:
self.droid.setH(self.droid.getH() + 145 * dt)
self.enemy.setY(self.enemy, 1 * dt)
if self.keyMap["right"]:
self.droid.setH(self.droid.getH() - 145 * dt)
self.enemy.setY(self.enemy, -1 * dt)
if self.keyMap["forward"]:
self.droid.setY(self.droid, -25 * dt)
self.enemy.setX(self.enemy, 1 * dt)
# Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ±ΡΠ°Π½ΠΎ ΠΎΡΡΠΆΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ
if not self.hide_weapon:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.weapon.setPos(self.weapon_pos) # ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
else:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.flash.setPos(self.weapon_pos)
camvec = self.droid.getPos() - self.camera.getPos() # Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
camvec.setZ(0) # 0 Π²ΡΡΠΎΡΠ° Π²Π΅ΠΊΡΠΎΡΠ°
camdist = camvec.length() # Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΎΡ Π΄ΡΠΎΠΈΠ΄Π°
camvec.normalize() # Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
if camdist > 10.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ 10, ΡΠΎ ΡΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π·Π° Π΄ΡΠΎΠΎΠΈΠ΄ΠΎΠΌ
self.camera.setPos(self.camera.getPos() + camvec * (camdist - 10))
camdist = 10.0 # ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΎΠ²Π° 10
if camdist < 5.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π³ΡΡΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ 5, ΡΠΎ...
self.camera.setPos(self.camera.getPos() - camvec * (5 - camdist)) # ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ
camdist = 5.0 # Π²ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ
self.camera.lookAt(self.floater) # Π²ΠΎΡ ΠΈ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΠ»ΡΡ Π½Π°Ρ floater
return task.cont # Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΡ
## def addInstructions(self, pos, msg):
## return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=self.inst_font, pos=(-1.3, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1)) # Π€ΡΠ½ΠΊΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ
##
## def addTitle(self, text):
## return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=0.2,
## parent=base.a2dBottomRight, align=TextNode.ARight,
## pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=self.font) # Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Ρ ΡΡΠΈΡΡΠΎΠΌ ΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ
##
droid = DroidShooter() # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
droid.run() # 3Π°ΠΏΡΡΡΠΈΠΌ ΠΈΠ³ΡΡ
# ΡΠ°Π·ΡΠΎΠ±ΠΎΡΡΠΈΠΊΠΈ :
# ΠΠ»Π°Π²Π½ΡΠΉ Π°Π²ΡΠΎΡ : ma3rx
# ΠΠΎΠΌΠΎΡΠ½ΠΈΠΊ : panda3dmastercoder( ΠΏΡΠΈΡΠΎΠ΅Π΄Π΅Π½ΠΈΠ»ΡΡ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΡ 31 ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄Π°, 12:??)
# Π Π΅ΠΊΠ»Π°ΠΌΡΠΈΠΊ : rdb (Π½Π°ΠΏΠΈΡΠ°Π» ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΡΠΌΠ΅ 6 ΡΠ΅Π²ΡΠ°Π»Ρ 2021 Π³ΠΎΠ΄Π°, 20:11)
marconit_engine.py :
# Π‘Π°ΠΌΠΎΠΏΠΈΡΠ½ΠΎΠ΅ API ΠΊ direct ΠΈ panda3d
from direct.showbase.ShowBase import ShowBase
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectButton import DirectButton
from direct.gui.DirectSlider import DirectSlider
from direct.actor.Actor import Actor
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
from panda3d.core import *
from array import array
import random
class MenuApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def slider(self, pos, scale, value, command):
return DirectSlider(pos=pos, scale=scale, value=value,
command=command)
def button(self, pos, text, scale, pad, command):
return DirectButton(pos=pos, text=text,
scale=scale, pad=pad,
command=command)
def addInstruction(self, pos, msg, font):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=font, pos=(-1.6, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1))
def addTitle(self, msg, font):
return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=0.2,
parent=base.a2dBottomRight, align=TextNode.ARight,
pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=font)
def text(self, pos, text, font, scale):
return OnscreenText(text=text, pos=pos, scale=scale, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=font)
def menu_effect(self):
NUM_EMBERS = 512 # ΠΠΎΠ»Π²ΠΎ ΡΠ°ΡΡΠΈΡ
floats = []
# ΠΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΈ Π·Π°Π΄Π°ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡ
for i in range(NUM_EMBERS):
speed = (0.2 + random.random()) * 0.7
size = 0.5 + random.random() * 0.5
size = max(size ** 4, 0.1)
floats += [random.random(), random.random(), random.random(), speed, 0, 0, 0, size]
initial_data = array('f', floats) # Π°ΡΡΠ°Π΅ΠΌ Π½Π°ΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
buffer = ShaderBuffer('embers', initial_data.tobytes(), GeomEnums.UH_static) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ
format = GeomVertexFormat.get_empty()
vdata = GeomVertexData('embers', format, GeomEnums.UH_static)
tris = GeomTriangles(GeomEnums.UH_static)
tris.add_next_vertices(NUM_EMBERS * 3)
geom = Geom(vdata)
geom.add_primitive(tris)
geom.set_bounds(BoundingBox((0, 0, 0), (1, 1, 1)))
node = GeomNode("node")
node.add_geom(geom)
embertex = loader.load_texture("./shaders/menu/ember.png")
embertex.wrap_u = SamplerState.WM_clamp
embertex.wrap_v = SamplerState.WM_clamp
shader = Shader.load(Shader.SL_GLSL, "./shaders/menu/embers.vert", "./shaders/menu/embers.frag")
path = base.render.attach_new_node(node)
path.set_shader(shader)
path.set_shader_input("EmberBuffer", buffer)
path.set_texture(embertex)
path.set_two_sided(True)
path.set_attrib(ColorBlendAttrib.make(ColorBlendAttrib.M_add, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_one))
path.set_depth_write(False)
path.node().set_bounds_type(BoundingVolume.BT_box)
node = ComputeNode("simulate")
node.add_dispatch(NUM_EMBERS // 16, 1, 1)
path = base.render.attach_new_node(node)
path.set_shader(Shader.load_compute(Shader.SL_GLSL, "./shaders/menu/simulate.comp"))
path.set_shader_input("windmap", loader.load_texture("./shaders/menu/wind.png"))
path.set_shader_input("EmberBuffer", buffer)
base.cam.set_x(0.5)
base.cam.set_y(-2)
base.cam.set_z(0.5)
class GameApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def light(self):
sun = DirectionalLight("sun")
sun.set_color_temperature(6000)
sun.color = sun.color * 4
sun_path = render.attach_new_node(sun)
sun_path.set_pos(10, -10, -10)
sun_path.look_at(0, 0, 0)
sun_path.hprInterval(self.sun_interval, (sun_path.get_h(), sun_path.get_p() - 360, sun_path.get_r()), bakeInStart=True).loop()
render.set_light(sun_path)
def object(self, path, scale, pos):
self.object = Actor(path)
self.object.reparentTo(render)
self.object.setScale(scale)
self.object.setPos(pos)
return self.object
def sound(self, path, volume):
self.sound = loader.loadMusic(path)
self.sound.setVolume(volume)
return self.sound
def shaders(self, vert, frag):
render.set_shader(Shader.load(Shader.SL_GLSL, vert, frag))
def loadParticleConfig(self, filename, pos, object):
self.p.cleanup()
self.p = ParticleEffect()
self.p.loadConfig(Filename(filename))
self.p.start(object)
self.p.setPos(pos)
def make_shader(self, object, pos):
'''ΠΡΠΎ ΡΠ΅ΠΉΠ΄Π΅Ρ'''
object.set_shader(self.light_shader())
object.set_shader_input('pos_light', pos)
Thank all for this shader. Its really cool

Directory 5.0.1 :
/models :
./models/world
Now, download panda3d art from https://www.panda3d.org/download/noversion/art-gallery.zip
Go to the cat-environment folder. In it you will see a millenium falcon folder. Take all the files from it and put it in the directory ./models/world)
./models/block : block.zip (269.6 KB)
./models/enemies : enemies.zip (381.4 KB)
./models/fighter : fighter.zip (36.9 KB)
./models/player : player.zip (644.6 KB)
./models/sky : sky.zip (12.5 KB)
./models/weapon : weapon.zip (234.3 KB)
./models/whishlyflash : whishlyflash.zip
./fonts : fonts.zip (192.5 KB)
./sounds : sounds.zip (1.8 MB)
./special_effects : special_effects.zip (19.3 KB)
./tex : tex.zip (95.1 KB)
./shaders : shaders.zip (22.2 KB)
droid.py :
#!/usr/bin/env python
# -*- coding: utf_8 -*-
# Π‘ΠΎΠ·Π΄Π°Π½ΠΎ : 22 ΡΠΈΡΠ»ΠΎ, ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄
# ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
from direct.showbase.ShowBase import ShowBase
from direct.particles.ParticleEffect import ParticleEffect
from direct.gui.OnscreenImage import OnscreenImage
from direct.interval.IntervalGlobal import *
from panda3d.core import *
from marconit_engine import *
import random
import sys
import time
import os
import math
VERSION = '5.0.1'
settings = ['window-title Droid Game release ' + VERSION,
'fullscreen 0',
'win-size 1440 900']
loadPrcFileData('', settings[0]) # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (Π²ΠΎΠ·ΠΌΡΠΌ Π΅Π³ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ settings)
loadPrcFileData('', settings[1]) # Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
loadPrcFileData('', settings[2]) # Π Π°Π·ΠΌΠ΅Ρ ΠΎΠΊΠ½Π°
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³Π»Π°Π²Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
class DroidShooter(ShowBase):
def __init__(self):
ShowBase.__init__(self) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅Π»ΡΡ ΠΈΠ· direct
self.speed = 1800 # ΡΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ
self.GB = False # ΠΠ ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
self.EN = False # ΠΠ΅ Π±ΡΠ΄Π΅ΠΌ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.pro_machine = False # ΠΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.sun_interval = 100 # ΠΠ½ΡΠ΅ΡΠ²Π°Π» ΡΠΎΠ»Π½ΡΠ°
self.menu() # Π·Π²ΠΏΡΡΠΊ ΠΌΠ΅Π½Ρ
def menu(self):
base.enableParticles() # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.disableMouse() # ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΌΡΡΠΊΡ
self.win.setClearColor((0, 0.2, 0.2, 1)) # ΠΠ°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ ΡΡΡΠ½ΡΠΌ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΠΈΠ³ΡΠΎΠ²ΠΎΠΌ Π΄Π²ΠΈΠΆΠΊΠ΅ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ Π·Π°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΡΠΌ.
self.font = loader.loadFont('./fonts/doom_font.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ ΠΈΠ· ΠΈΠ³ΡΡ doom
self.inst_font = loader.loadFont('./fonts/arial.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ arial
self.crackSound = GameApi.sound(self, './sounds/crack.wav', 1) # Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π° ΠΊΠΎΡΠ°Π±Π»Ρ
self.shotSound = GameApi.sound(self, './sounds/shot.wav', 1) # Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.startSound = GameApi.sound(self, './sounds/started.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.errorSound = GameApi.sound(self, './sounds/error.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.click_sound = GameApi.sound(self, './sounds/GUI_click.wav', 1) # Π·Π²ΡΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ
self.startSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
# ΠΠ΅Π½Ρ-ΡΡΡΠ΅ΠΊΡΡ
MenuApi.menu_effect(self)
self.button_start = MenuApi.button(self, pos=(0.7, 0, 0.4), text="CTAPT",
scale=.2, pad=(.2, .2),
command=self.load_game) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
self.gb_start = MenuApi.button(self, pos=(0.7, 0, 0.1), text="GB",
scale=.2, pad=(.2, .2),
command=self.gb_mode) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ Π² ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅
self.en = MenuApi.button(self, pos=(0.7, 0, -0.2), text='EN',
scale=.2, pad=(.2, .2),
command=self.en_lang)
self.pro_button = MenuApi.button(self, pos=(0.7, 0, -0.5), text='PRO',
scale=.2, pad=(.2, .2),
command=self.pro_system)
self.slider_life = MenuApi.slider(self, pos=(0.1, 0, .75), scale=0.8, value=0.5,
command=self.set_lifes)
self.title = MenuApi.addTitle(self, "Droid game ΡΠ΅Π»ΠΈΠ· " + VERSION, self.font)
# ΠΠ°ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.inst1 = MenuApi.addInstruction(self, 0.95, u"[ESC]: ΠΡΡ
ΠΎΠ΄", self.inst_font)
self.inst2 = MenuApi.addInstruction(self, 0.90, u"[Left Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst3 = MenuApi.addInstruction(self, 0.85, u"[Right Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst4 = MenuApi.addInstruction(self, 0.80, u"[Up Arrow]: ΠΠΏΠ΅ΡΠ΅Π΄", self.inst_font)
self.inst5 = MenuApi.addInstruction(self, 0.75, u"[a]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst6 = MenuApi.addInstruction(self, 0.70, u"[d]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst7 = MenuApi.addInstruction(self, 0.65, u"[Left Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst8 = MenuApi.addInstruction(self, 0.60, u"[Right Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst9 = MenuApi.addInstruction(self, 0.55, u"[a + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst10 = MenuApi.addInstruction(self, 0.50, u"[d + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst11 = MenuApi.addInstruction(self, 0.45, u"[space]: ΡΡΡΠ΅Π»ΡΠ±Π°", self.inst_font)
self.inst12 = MenuApi.addInstruction(self, 0.40, u"[s]: Π΄ΠΎΡΡΠ°ΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ", self.inst_font)
self.inst13 = MenuApi.addInstruction(self, 0.35, u"[w]: ΡΠ±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅", self.inst_font)
self.inst14 = MenuApi.addInstruction(self, 0.30, u"[f]: ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·Π³ΠΎΠ½(ΠΠΠΠ‘ΠΠ!)", self.inst_font)
self.inst15 = MenuApi.addInstruction(self, 0.25, u"[0]: ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°", self.inst_font)
self.accept("escape", sys.exit) # ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ Esc Π²ΡΡ
ΠΎΠ΄ΠΈΠΌ.
def set_lifes(self):
self.state = self.slider_life.guiItem.getValue() * 100 # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ»Π°ΠΉΠ΄Π΅ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΎΠ΅ Π½Π° 100, Π΄Π° ΡΡΠ°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½ΠΎ ΠΌΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΏΠ»Π΅Π²Π°ΡΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Π½Ρ, ΠΈΠ±ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ½ΡΡΠΈΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΡΡ :)
def gb_mode(self):
'''Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ½ΠΎΠ±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.GB = True
def en_lang(self):
'''ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ·ΡΠΊΠ° Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.EN = True
def pro_system(self):
'''ΠΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.pro_machine = True # Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
def load_game(self):
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.button_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΠ°ΡΡΠ°
self.gb_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΡΠ½ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°.
self.title.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈΠ³ΡΡ
self.en.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π°Π½Π³ΠΎΡΠ·ΡΡΠ½ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ
self.pro_button.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠ²Π»Π΅Π½ΠΈΡ
# ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
self.inst1.destroy()
self.inst2.destroy()
self.inst3.destroy()
self.inst4.destroy()
self.inst5.destroy()
self.inst6.destroy()
self.inst7.destroy()
self.inst8.destroy()
self.inst9.destroy()
self.inst10.destroy()
self.inst11.destroy()
self.inst12.destroy()
self.inst13.destroy()
self.inst14.destroy()
self.inst15.destroy()
self.slider_life.destroy() # ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΡΠ»Π°ΠΉΠ΄Π΅Ρ ΠΆΠΈΠ·Π½Π΅ΠΉ ΠΊΠΎΡΠ°Π±Π»Ρ
self.keyMap = {
"left": 0, "right": 0, "forward": 0, "cam-left": 0, "cam-right": 0} # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΠΎ ΠΈΡ
Π½Π°ΠΆΠ°ΡΠΈΡ
# Π ΠΈΡΡΠ΅ΠΌ Π·Π²ΡΠ·Π΄Ρ
self.sky = loader.loadModel("./models/sky/solar_sky_sphere") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΊΠΎΡΠΌΠΎΡΠ°(ΡΡΠΎ ΡΡΠ΅ΡΠ°)
self.sky_tex = loader.loadTexture("./tex/stars_1k_tex.jpg") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ
self.sky.setTexture(self.sky_tex, 1) # Π·Π°ΡΠ΅Π½Π΄Π΅ΡΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ Π½Π° Π½Π΅Π±ΠΎ
self.sky.reparentTo(render) # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π½Π΅Π±ΠΎ
self.sky.setScale(40000) # ΡΠ°ΡΡΠΈΡΠΈΠΌ Π½Π΅Π±ΠΎ Π΄ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ panda3d
self.environ = loader.loadModel("models/world/falcon.egg") # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π² blender ΠΌΠΈΡ.
self.environ.reparentTo(render) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΈΡΠ° Π² ΠΎΠΊΠ½ΠΎ
droidStartPos = (-1, 0, 1.5 ) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΡΡΠ°ΡΡΠΎΠ²ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° Π² ΠΌΠΈΡΠ΅.
enemyStartPos = (-6, 1, 0.5) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ°-Π΄ΡΠΎΠΈΠ΄Π°.
self.droid = GameApi.object(self, "models/player/seeker.egg", 1, droidStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ³ΡΠΎΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.enemy = GameApi.object(self, "models/enemies/r2d2/r2d2.egg", 1, enemyStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 1 # ΠΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
self.weapon = GameApi.object(self, 'models/weapon/lightsaber.egg', .5, self.weapon_pos) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΎΡΡΠΆΠΈΠ΅
self.bullet = GameApi.object(self, 'models/weapon/bullet/bullet.egg.pz', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΠΏΡΠ»Ρ
self.flash = GameApi.object(self, 'models/whishlyflash/handlamp.egg', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.bullet.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΠΏΡΠ»Ρ Π² ΠΌΠΈΡ Π½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΎΠ½Π° ΡΠ°ΠΌΠ° Π½Π΅ ΡΠΊΠΎΡΠΎ
self.flash.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ Π² Π½Π°Ρ ΠΌΠΈΡ
self.bullet.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠ»ΠΈ
self.flash.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
# Π²ΡΠ°ΠΆΠ΅ΡΠΊΠΈΠΉ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.fighter = GameApi.object(self, 'models/fighter/fighter.egg', 1, (0, 90 , 0)) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»ΡΠΊΡ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.cube = GameApi.object(self, 'models/block/crate.egg', .7, (0, 0, 0)) # Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ Π±Π»ΠΎΠΊ
self.cube.hprInterval(1.5, (0, 360, 360)).loop()
self.Intervalcube = self.cube.posInterval(13,
Point3(0, -500, 0),
startPos=Point3(0, 10, 0))
self.Intervalcube.loop()
self.spotlight = camera.attachNewNode(Spotlight("spotlight")) # ΠΠΎΠ½ΡΠΈΠ³ΠΈ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
self.spotlight.node().setColor((.3, .3, .3, 1))
self.spotlight.node().setSpecularColor((0, 0, 0, 1))
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("d", 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("d-up", self.setKey, ["cam-right", False]) # ΠΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ s+Π²ΠΏΠ΅ΡΡΠ΄ - ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π²ΠΏΡΠ°Π²ΠΎ ΠΈ ΠΈΠ΄ΡΠΌ Π²ΠΏΠ΅ΡΡΠ΄
self.accept("space", self.shot) # ΠΏΡΠΈ ΠΏΡΠΎΠ±Π΅Π»Π΅ ΡΡΡΠ΅Π»ΡΠ΅ΠΌ
self.accept("s", self.toggleLights, [[self.spotlight]]) # ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.accept("w", self.weapon_hide) # ΠΏΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ w - ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅.
base.enableParticles() # ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΡΠΌΠ°
self.p = ParticleEffect() # ΠΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.accept('f', self.particle_start) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f(ΠΎΡ force) - Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ°ΠΉΠ» Π΄ΡΠΌΠ° ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠΈΠ³ ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΡΡΠ°Π»Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄ΡΠΌΠ°
self.accept('0', self.fountain) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ f+o(fountain) Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ
self.accept('f3', self.toggleWireframe) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f3 - Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ»ΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
taskMgr.add(self.move, "moveTask") # ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°Π΄Π°ΡΡ Π² Π½Π°Ρ Π΄Π²ΠΈΠΆΠΎΠΊ
self.isMoving = False # Π‘ΡΠ°Π²ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ isMoving Π½Π° False(ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠ΅Π½ΡΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅) ΡΡΠΎΠ±Ρ ΠΈΠ³ΡΠΎΠΊ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎΡΠ».
# ΠΠ΅Π»Π°Π΅ΠΌ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ²Π΅Ρ Π±ΡΠ» ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π²ΡΠΊΠ»ΡΡΠ΅Π½.
self.camera.setPos(self.droid.getX(), self.droid.getY() + 1, 3) # Π‘ΡΠ°Π²ΠΈΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
if not self.EN : # Π΅ΡΠ»ΠΈ ΡΠ·ΡΠΊ Π½Π΅ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else : # Π΅ΡΠ»ΠΈ ΡΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.state_info = MenuApi.text(self, text='machine :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.hide_weapon = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΎΡΡΠΆΠΈΠ΅ Π½Π΅ ΡΠ±ΡΠ°Π½ΠΎ
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
self.motor_pos1 = 25.238849639892578, 8.962211608886719, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor_pos2 = -20.676218032836914, 10.55816650390625, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor1 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos1, self.environ) # ΠΌΠΎΡΠΎΡ 1
self.motor2 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos2, self.environ) # ΠΌΠΎΡΠΎΡ 2
self.state_info2 = MenuApi.text(self, text='', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.force = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Π½Π΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.black_light() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ²Π΅Ρ
self.collisions() # Π²ΡΡΠ±Π°Π΅ΠΌ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ
# ΡΠΎΠ»Π½ΡΠ΅(Π½ΠΎΠ²Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ)
GameApi.light(self)
#GameApi.fire(self)
#GameApi.shadows_shader(self)
#PaintShade(render)
# ΠΡΠ»ΠΈ ΠΈΠ³ΡΠΎΠΊ Π·Π°Ρ
ΠΎΡΠ΅Π» ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Π² ΡΡΡΠ½ΠΎΠ±Π΅Π»ΡΡ ΠΈΠ³ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΡΠΎ
if self.GB :
GameApi.shaders(self, "./shaders/lighting.vert", "./shaders/lighting.frag") # ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ΅ΠΉΠ΄Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ!
#render.set_shader(Shader.load(Shader.SL_GLSL, "./shaders/terrain.vert.glsl", "./shaders/terrain.frag.glsl"))
def collisions(self):
pass
def light_shader(self):
'''ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΉΠ΄Π΅ΡΠ° Π³ΠΎΡΠ΅Π½ΠΈΡ'''
return Shader.make(Shader.SL_GLSL, vertex="""
#version 120
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
attribute vec2 p3d_MultiTexCoord0;
attribute vec4 p3d_Vertex;
attribute vec3 p3d_Normal;
uniform mat4 p3d_ModelViewProjectionMatrix;
void main( void )
{
gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex;
gl_TexCoord[0].xy = p3d_MultiTexCoord0;
v_FragmentPosition = p3d_Vertex.xyz;
v_FragmentNormal = p3d_Normal;
}
""",
fragment="""
#version 120
uniform sampler2D p3d_Texture0;
uniform vec3 pos_light;
uniform mat4 p3d_ViewMatrixInverse;
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
const vec4 k_LightColor = vec4(1.0, 0.6, 0.3, 1.0);
const float k_Shininess = 64.0;
const float k_ConstAttenuation = 0.5;
const float k_LinearAttenuation = 0.05;
const float k_QuadricAttenuation = 0.001;
void main( void )
{
vec3 L = pos_light - v_FragmentPosition;
// ** Used in the calculation of light extinction
float distance = length( L );
L = normalize( L );
vec3 N = normalize( v_FragmentNormal );
// ** The H vector is used to calculate the gloss (specularity) of a fragment
vec3 E = normalize( p3d_ViewMatrixInverse[3].xyz - v_FragmentPosition );
vec3 H = normalize( L + E ); // ** Half-vector
// ** The calculation coefficient. attenuations
float attenuation = 1.0 / ( k_ConstAttenuation + k_LinearAttenuation * distance + k_QuadricAttenuation * distance * distance );
float diffuse = clamp( dot( L, N ), 0.0, 1.0 );
float specular = pow( clamp( dot( N, H ), 0.0, 1.0 ), k_Shininess );
if( diffuse <= 0.0 ){
specular = 0.0;
}
vec4 diffuseColor = diffuse * k_LightColor * attenuation;
vec4 specularColor = specular * k_LightColor * attenuation;
vec4 ambientColor = vec4(0.01, 0.01, 0.01, 0.01);
vec4 emissionColor = vec4(0.0, 0.0, 0.0, 0.0);
gl_FragColor = ( diffuseColor + specularColor + ambientColor + emissionColor) * texture2D(p3d_Texture0, gl_TexCoord[0].xy );
}
""")
def particle_start(self):
if not self.pro_machine :
self.force = True # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΡΠΆΠ΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.state -= 1 # ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΡΠΊΠΎΠ²
self.state_info.hide() # ΡΠ΄Π°Π»ΠΈΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΎΡΠΊΠΈ
if self.state != 10 and self.state > 10:
self.state_info.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΠΆΠΈΠ·Π½ΡΡ
ΠΊΠΎΡΠ°Π±Π»Ρ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ Π½Π΅ΠΈΡΠΏΡΠ°Π²Π΅Π½', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='motor error', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else:
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam_critic/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='critic state', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
if self.state < 10:
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
GameApi.make_shader(self, self.environ, self.steam_pos) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ Π³ΠΎΡΠ΅Π½ΠΈΡ
GameApi.make_shader(self, self.droid, (self.droid.getX(), self.droid.getY(), self.droid.getZ()))
GameApi.make_shader(self, self.enemy, (self.enemy.getX(), self.enemy.getY(), self.enemy.getZ()))
GameApi.make_shader(self, self.weapon, (self.weapon.getX(), self.weapon.getY(), self.weapon.getZ()))
GameApi.make_shader(self, self.bullet, (self.bullet.getX(), self.bullet.getY(), self.bullet.getZ()))
GameApi.make_shader(self, self.flash, (self.flash.getX(), self.flash.getY(), self.flash.getZ()))
GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΏΠ°Π΄Π°Π΅ΠΌ!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='fall!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
if not self.EN :
self.pro_info = MenuApi.text(self, text='ΠΠ ΠΠ€Π!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
else :
self.pro_info = MenuApi.text(self, text='PRO!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
self.pro_machine_engine()
def pro_machine_engine(self):
'''ΠΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΊΠΎΡΠ°Π±Π»Ρ'''
# Π’ΡΡ Π½ΡΠΆΠ΅Π½ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊ. ΠΡΠ»ΠΈ Π΅Π³ΠΎ Ρ Π²Π°Ρ Π½Π΅Ρ, ΡΠ²Ρ Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ΅ΠΆΠΈΠΌ.
self.mgr = InputDeviceManager.get_global_ptr()
for device in self.mgr.get_devices():
self.gamepad = device
MenuApi.text(self, text=str(self.gamepad), pos=(-1.6, -0.9), scale=0.05, font=self.font) # Π½Π°ΠΉΠ΄Π΅Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
# Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠΎΠΌ
taskMgr.add(self.moveTaskDjoystic, "moveTaskDjoystic")
## self.accept("gamepad-back", exit)
## self.accept("gamepad-start", exit)
## self.accept("gamepad-face_x", self.reset)
## self.accept("gamepad-face_b", self.action, extraArgs=["face_b"])
def reset(self):
self.camera.setPosHpr(0, -200, 10, 0, 0, 0)
self.environ.setPosHpr(0, -200, 9, 0, 0, 0)
def moveTaskDjoystic(self, task):
dt = globalClock.getDt()
strafe_speed = 85
vert_speed = 50
turn_speed = 100
lstick = self.gamepad.findButton("lstick")
if lstick.pressed:
strafe_speed *= 2.0
strafe = Vec3(0)
left_x = self.gamepad.findAxis(InputDevice.Axis.left_x)
left_y = self.gamepad.findAxis(InputDevice.Axis.left_y)
strafe.x = left_x.value
strafe.y = left_y.value
if strafe.lengthSquared() >= 0.01:
self.camera.setPos(self.camera, strafe * strafe_speed * dt)
trigger_l = self.gamepad.findAxis(InputDevice.Axis.left_trigger)
trigger_r = self.gamepad.findAxis(InputDevice.Axis.right_trigger)
lift = trigger_r.value - trigger_l.value
self.camera.setZ(self.camera.getZ() + (lift * vert_speed * dt))
right_x = self.gamepad.findAxis(InputDevice.Axis.right_x)
right_y = self.gamepad.findAxis(InputDevice.Axis.right_y)
if abs(right_x.value) >= 0.1 or abs(right_y.value) >= 0.1:
self.camera.setH(self.camera, turn_speed * dt * -right_x.value)
self.camera.setP(self.camera, turn_speed * dt * right_y.value)
self.camera.setR(0)
return task.cont
def fountain(self):
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ΅ΠΊΡΡ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
if self.force:
if self.state != 100:
self.state += 1
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
else :
if self.state != 100:
self.state += 1
self.state_info.hide()
MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
#self.state_info = OnscreenText(text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
def black_light(self):
# ΠΡΠΊΠ»ΡΡΠ΅Π½ΡΠΉ ΡΠ²Π΅Ρ
ambientLight = AmbientLight("ambientLight")
ambientLight.setColor((0, 0, 0, 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 weapon_hide(self):
# Π£Π±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅
self.hide_weapon = True
self.weapon.hide()
def toggleLights(self, lights):
# Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
if self.hide_weapon:
for light in lights:
if render.hasLight(light):
render.clearLight(light)
else:
render.setLight(light)
self.flash.setPos(self.weapon_pos)
else:
return
def shot(self):
dt = globalClock.getDt() + 0.5 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
if not self.hide_weapon : # Π΅ΡΠ»ΠΈ ΠΎΡΡΠΆΠΈΠ΅ ΡΠ±ΡΠ°Π½ΠΎ ΡΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ΅Π»ΡΡΡ
self.shotSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.bullet.setPos(self.weapon_pos) # ΠΡΠ»Ρ Π±ΡΠ΄Π΅Ρ ΡΠΏΠ°Π²Π½ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΏΡΡΠΊΠΈ
self.bullet.setY(self.bullet, -11 * dt) # Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΏΡΠ»Ρ Π½Π° ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ Π²ΠΏΠ΅ΡΡΠ΄
def check_loss(self):
if self.state == 0: # Π΅ΡΠ»ΠΈ ΠΆΠΈΠ·Π½Π΅ΠΉ Ρ ΠΊΠΎΡΠ°Π±Π»Ρ Π½Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ
self.black_light() # Π²ΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ½ΡΠΉ ΡΠ²Π΅Ρ
self.weapon_hide() # ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅
if not self.EN :
self.info = MenuApi.text(self, text='ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
else :
self.info = MenuApi.text(self, text='LOSS', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
self.crackSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π°
def setKey(self, key, value):
self.keyMap[key] = value # ΠΠ΅Π»Π°Π΅ΠΌ ΠΌΠ΅Ρ
aΠ½uΠ·ΠΌ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ.
def move(self, task):
''' ΠΠ΅Π»Π°Π΅ΠΌ ΡΡΡΠ½ΠΊΡΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° '''
dt = globalClock.getDt() - .005 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
# ΠΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡΠ°Π²ΠΎ
if self.keyMap["cam-left"]:
self.camera.setX(self.camera, -10 * dt) # ΠΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΊΠ° ΠΊΠ°ΠΌΠ΅ΡΡ ΠΏΠΎ ΠΈΠΊΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΠ»ΡΠ·ΠΈΡ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΡΠ³Π»Π° Π»ΡΡΠ°. ΠΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΊΠ°ΠΌΠ΅ΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ.
if self.keyMap["cam-right"]:
self.camera.setX(self.camera, + 10 * dt) # Π’ΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Π½Π°Π²Π΅ΡΡ
Ρ.
startpos = self.droid.getPos() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ΄ΠΎΠ±Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
if self.keyMap["left"]:
self.droid.setH(self.droid.getH() + 145 * dt)
self.enemy.setY(self.enemy, 1 * dt)
if self.keyMap["right"]:
self.droid.setH(self.droid.getH() - 145 * dt)
self.enemy.setY(self.enemy, -1 * dt)
if self.keyMap["forward"]:
self.droid.setY(self.droid, -25 * dt)
self.enemy.setX(self.enemy, 1 * dt)
# Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ±ΡΠ°Π½ΠΎ ΠΎΡΡΠΆΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ
if not self.hide_weapon:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.weapon.setPos(self.weapon_pos) # ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
else:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.flash.setPos(self.weapon_pos)
camvec = self.droid.getPos() - self.camera.getPos() # Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
camvec.setZ(0) # 0 Π²ΡΡΠΎΡΠ° Π²Π΅ΠΊΡΠΎΡΠ°
camdist = camvec.length() # Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΎΡ Π΄ΡΠΎΠΈΠ΄Π°
camvec.normalize() # Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
if camdist > 10.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ 10, ΡΠΎ ΡΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π·Π° Π΄ΡΠΎΠΎΠΈΠ΄ΠΎΠΌ
self.camera.setPos(self.camera.getPos() + camvec * (camdist - 10))
camdist = 10.0 # ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΎΠ²Π° 10
if camdist < 5.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π³ΡΡΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ 5, ΡΠΎ...
self.camera.setPos(self.camera.getPos() - camvec * (5 - camdist)) # ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ
camdist = 5.0 # Π²ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ
self.camera.lookAt(self.floater) # Π²ΠΎΡ ΠΈ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΠ»ΡΡ Π½Π°Ρ floater
return task.cont # Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΡ
## def addInstructions(self, pos, msg):
## return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=self.inst_font, pos=(-1.3, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1)) # Π€ΡΠ½ΠΊΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ
##
## def addTitle(self, text):
## return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=0.2,
## parent=base.a2dBottomRight, align=TextNode.ARight,
## pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=self.font) # Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Ρ ΡΡΠΈΡΡΠΎΠΌ ΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ
##
droid = DroidShooter() # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
droid.run() # 3Π°ΠΏΡΡΡΠΈΠΌ ΠΈΠ³ΡΡ
# ΡΠ°Π·ΡΠΎΠ±ΠΎΡΡΠΈΠΊΠΈ :
# ΠΠ»Π°Π²Π½ΡΠΉ Π°Π²ΡΠΎΡ : ma3rx
# ΠΠΎΠΌΠΎΡΠ½ΠΈΠΊ : panda3dmastercoder( ΠΏΡΠΈΡΠΎΠ΅Π΄Π΅Π½ΠΈΠ»ΡΡ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΡ 31 ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄Π°, 12:??)
# Π Π΅ΠΊΠ»Π°ΠΌΡΠΈΠΊ : rdb (Π½Π°ΠΏΠΈΡΠ°Π» ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΡΠΌΠ΅ 6 ΡΠ΅Π²ΡΠ°Π»Ρ 2021 Π³ΠΎΠ΄Π°, 20:11)
marconit_engine.py :
# Π‘Π°ΠΌΠΎΠΏΠΈΡΠ½ΠΎΠ΅ API ΠΊ direct ΠΈ panda3d
from direct.showbase.ShowBase import ShowBase
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectButton import DirectButton
from direct.gui.DirectSlider import DirectSlider
from direct.actor.Actor import Actor
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
from panda3d.core import *
from array import array
import random
class MenuApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def slider(self, pos, scale, value, command):
return DirectSlider(pos=pos, scale=scale, value=value,
command=command)
def button(self, pos, text, scale, pad, command):
return DirectButton(pos=pos, text=text,
scale=scale, pad=pad,
command=command)
def addInstruction(self, pos, msg, font):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=font, pos=(-1.6, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1))
def addTitle(self, msg, font):
return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=0.2,
parent=base.a2dBottomRight, align=TextNode.ARight,
pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=font)
def text(self, pos, text, font, scale):
return OnscreenText(text=text, pos=pos, scale=scale, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=font)
def menu_effect(self):
NUM_EMBERS = 512 # ΠΠΎΠ»Π²ΠΎ ΡΠ°ΡΡΠΈΡ
floats = []
# ΠΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΈ Π·Π°Π΄Π°ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡ
for i in range(NUM_EMBERS):
speed = (0.2 + random.random()) * 0.7
size = 0.5 + random.random() * 0.5
size = max(size ** 4, 0.1)
floats += [random.random(), random.random(), random.random(), speed, 0, 0, 0, size]
initial_data = array('f', floats) # Π°ΡΡΠ°Π΅ΠΌ Π½Π°ΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
buffer = ShaderBuffer('embers', initial_data.tobytes(), GeomEnums.UH_static) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ
format = GeomVertexFormat.get_empty()
vdata = GeomVertexData('embers', format, GeomEnums.UH_static)
tris = GeomTriangles(GeomEnums.UH_static)
tris.add_next_vertices(NUM_EMBERS * 3)
geom = Geom(vdata)
geom.add_primitive(tris)
geom.set_bounds(BoundingBox((0, 0, 0), (1, 1, 1)))
node = GeomNode("node")
node.add_geom(geom)
embertex = loader.load_texture("./shaders/menu/ember.png")
embertex.wrap_u = SamplerState.WM_clamp
embertex.wrap_v = SamplerState.WM_clamp
shader = Shader.load(Shader.SL_GLSL, "./shaders/menu/embers.vert", "./shaders/menu/embers.frag")
path = base.render.attach_new_node(node)
path.set_shader(shader)
path.set_shader_input("EmberBuffer", buffer)
path.set_texture(embertex)
path.set_two_sided(True)
path.set_attrib(ColorBlendAttrib.make(ColorBlendAttrib.M_add, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_one))
path.set_depth_write(False)
path.node().set_bounds_type(BoundingVolume.BT_box)
node = ComputeNode("simulate")
node.add_dispatch(NUM_EMBERS // 16, 1, 1)
path = base.render.attach_new_node(node)
path.set_shader(Shader.load_compute(Shader.SL_GLSL, "./shaders/menu/simulate.comp"))
path.set_shader_input("windmap", loader.load_texture("./shaders/menu/wind.png"))
path.set_shader_input("EmberBuffer", buffer)
base.cam.set_x(0.5)
base.cam.set_y(-2)
base.cam.set_z(0.5)
class GameApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def light(self):
sun = DirectionalLight("sun")
sun.set_color_temperature(6000)
sun.color = sun.color * 4
sun_path = render.attach_new_node(sun)
sun_path.set_pos(10, -10, -10)
sun_path.look_at(0, 0, 0)
sun_path.hprInterval(self.sun_interval, (sun_path.get_h(), sun_path.get_p() - 360, sun_path.get_r()), bakeInStart=True).loop()
render.set_light(sun_path)
def object(self, path, scale, pos):
self.object = Actor(path)
self.object.reparentTo(render)
self.object.setScale(scale)
self.object.setPos(pos)
return self.object
def sound(self, path, volume):
self.sound = loader.loadMusic(path)
self.sound.setVolume(volume)
return self.sound
def shaders(self, vert, frag):
render.set_shader(Shader.load(Shader.SL_GLSL, vert, frag))
def loadParticleConfig(self, filename, pos, object):
self.p.cleanup()
self.p = ParticleEffect()
self.p.loadConfig(Filename(filename))
self.p.start(object)
self.p.setPos(pos)
def make_shader(self, object, pos):
'''ΠΡΠΎ ΡΠ΅ΠΉΠ΄Π΅Ρ'''
object.set_shader(self.light_shader())
object.set_shader_input('pos_light', pos)
5.0.2 update! MORE REALISTIC!
Directory 5.0.2 :
/models :
./models/world
Now, download panda3d art from https://www.panda3d.org/download/noversion/art-gallery.zip
Go to the cat-environment folder. In it you will see a millenium falcon folder. Take all the files from it and put it in the directory ./models/world)
./models/block : block.zip (269.6 KB)
./models/enemies : enemies.zip (381.4 KB)
./models/fighter : fighter.zip (36.9 KB)
./models/player : player.zip (644.6 KB)
./models/sky : sky.zip (12.5 KB)
./models/weapon : weapon.zip (234.3 KB)
./models/whishlyflash : whishlyflash.zip
./fonts : fonts.zip (192.5 KB)
./sounds : sounds.zip (1.8 MB)
./special_effects : special_effects.zip (19.3 KB)
./tex : tex.zip (95.1 KB)
./shaders : shaders.zip (22.2 KB)
droid.py :
#!/usr/bin/env python
# -*- coding: utf_8 -*-
# Π‘ΠΎΠ·Π΄Π°Π½ΠΎ : 22 ΡΠΈΡΠ»ΠΎ, ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄
# ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
from direct.showbase.ShowBase import ShowBase
from direct.particles.ParticleEffect import ParticleEffect
from direct.gui.OnscreenImage import OnscreenImage
from direct.interval.IntervalGlobal import *
from panda3d.core import *
from marconit_engine import *
import random
import sys
import time
import os
import math
VERSION = '5.0.2'
settings = ['window-title Droid Game release ' + VERSION,
'fullscreen 0',
'win-size 1440 900']
loadPrcFileData('', settings[0]) # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (Π²ΠΎΠ·ΠΌΡΠΌ Π΅Π³ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ settings)
loadPrcFileData('', settings[1]) # Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
loadPrcFileData('', settings[2]) # Π Π°Π·ΠΌΠ΅Ρ ΠΎΠΊΠ½Π°
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³Π»Π°Π²Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
class DroidShooter(ShowBase):
def __init__(self):
ShowBase.__init__(self) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅Π»ΡΡ ΠΈΠ· direct
self.speed = 1800 # ΡΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ
self.GB = False # ΠΠ ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
self.EN = False # ΠΠ΅ Π±ΡΠ΄Π΅ΠΌ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.pro_machine = False # ΠΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.sun_interval = 100 # ΠΠ½ΡΠ΅ΡΠ²Π°Π» ΡΠΎΠ»Π½ΡΠ°
self.menu() # Π·Π²ΠΏΡΡΠΊ ΠΌΠ΅Π½Ρ
def menu(self):
base.enableParticles() # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.disableMouse() # ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΌΡΡΠΊΡ
self.win.setClearColor((0, 0.2, 0.2, 1)) # ΠΠ°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ ΡΡΡΠ½ΡΠΌ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΠΈΠ³ΡΠΎΠ²ΠΎΠΌ Π΄Π²ΠΈΠΆΠΊΠ΅ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ Π·Π°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΡΠΌ.
self.font = loader.loadFont('./fonts/doom_font.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ ΠΈΠ· ΠΈΠ³ΡΡ doom
self.inst_font = loader.loadFont('./fonts/arial.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ arial
self.crackSound = GameApi.sound(self, './sounds/crack.wav', 1) # Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π° ΠΊΠΎΡΠ°Π±Π»Ρ
self.shotSound = GameApi.sound(self, './sounds/shot.wav', 1) # Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.startSound = GameApi.sound(self, './sounds/started.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.errorSound = GameApi.sound(self, './sounds/error.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.click_sound = GameApi.sound(self, './sounds/GUI_click.wav', 1) # Π·Π²ΡΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ
self.startSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
# ΠΠ΅Π½Ρ-ΡΡΡΠ΅ΠΊΡΡ
MenuApi.menu_effect(self)
self.button_start = MenuApi.button(self, pos=(0.7, 0, 0.4), text="CTAPT",
scale=.2, pad=(.2, .2),
command=self.load_game) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
self.gb_start = MenuApi.button(self, pos=(0.7, 0, 0.1), text="GB",
scale=.2, pad=(.2, .2),
command=self.gb_mode) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ Π² ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅
self.en = MenuApi.button(self, pos=(0.7, 0, -0.2), text='EN',
scale=.2, pad=(.2, .2),
command=self.en_lang)
self.pro_button = MenuApi.button(self, pos=(0.7, 0, -0.5), text='PRO',
scale=.2, pad=(.2, .2),
command=self.pro_system)
self.slider_life = MenuApi.slider(self, pos=(0.1, 0, .75), scale=0.8, value=0.5,
command=self.set_lifes)
self.title = MenuApi.addTitle(self, "Droid game ΡΠ΅Π»ΠΈΠ· " + VERSION, self.font)
# ΠΠ°ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.inst1 = MenuApi.addInstruction(self, 0.95, u"[ESC]: ΠΡΡ
ΠΎΠ΄", self.inst_font)
self.inst2 = MenuApi.addInstruction(self, 0.90, u"[Left Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst3 = MenuApi.addInstruction(self, 0.85, u"[Right Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst4 = MenuApi.addInstruction(self, 0.80, u"[Up Arrow]: ΠΠΏΠ΅ΡΠ΅Π΄", self.inst_font)
self.inst5 = MenuApi.addInstruction(self, 0.75, u"[a]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst6 = MenuApi.addInstruction(self, 0.70, u"[d]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst7 = MenuApi.addInstruction(self, 0.65, u"[Left Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst8 = MenuApi.addInstruction(self, 0.60, u"[Right Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst9 = MenuApi.addInstruction(self, 0.55, u"[a + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst10 = MenuApi.addInstruction(self, 0.50, u"[d + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst11 = MenuApi.addInstruction(self, 0.45, u"[space]: ΡΡΡΠ΅Π»ΡΠ±Π°", self.inst_font)
self.inst12 = MenuApi.addInstruction(self, 0.40, u"[s]: Π΄ΠΎΡΡΠ°ΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ", self.inst_font)
self.inst13 = MenuApi.addInstruction(self, 0.35, u"[w]: ΡΠ±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅", self.inst_font)
self.inst14 = MenuApi.addInstruction(self, 0.30, u"[f]: ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·Π³ΠΎΠ½(ΠΠΠΠ‘ΠΠ!)", self.inst_font)
self.inst15 = MenuApi.addInstruction(self, 0.25, u"[0]: ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°", self.inst_font)
self.accept("escape", sys.exit) # ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ Esc Π²ΡΡ
ΠΎΠ΄ΠΈΠΌ.
def set_lifes(self):
self.state = self.slider_life.guiItem.getValue() * 100 # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ»Π°ΠΉΠ΄Π΅ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΎΠ΅ Π½Π° 100, Π΄Π° ΡΡΠ°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½ΠΎ ΠΌΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΏΠ»Π΅Π²Π°ΡΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Π½Ρ, ΠΈΠ±ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ½ΡΡΠΈΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΡΡ :)
def gb_mode(self):
'''Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ½ΠΎΠ±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.GB = True
def en_lang(self):
'''ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ·ΡΠΊΠ° Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.EN = True
def pro_system(self):
'''ΠΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.pro_machine = True # Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
def load_game(self):
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.button_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΠ°ΡΡΠ°
self.gb_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΡΠ½ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°.
self.title.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈΠ³ΡΡ
self.en.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π°Π½Π³ΠΎΡΠ·ΡΡΠ½ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ
self.pro_button.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠ²Π»Π΅Π½ΠΈΡ
# ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
self.inst1.destroy()
self.inst2.destroy()
self.inst3.destroy()
self.inst4.destroy()
self.inst5.destroy()
self.inst6.destroy()
self.inst7.destroy()
self.inst8.destroy()
self.inst9.destroy()
self.inst10.destroy()
self.inst11.destroy()
self.inst12.destroy()
self.inst13.destroy()
self.inst14.destroy()
self.inst15.destroy()
self.slider_life.destroy() # ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΡΠ»Π°ΠΉΠ΄Π΅Ρ ΠΆΠΈΠ·Π½Π΅ΠΉ ΠΊΠΎΡΠ°Π±Π»Ρ
self.keyMap = {
"left": 0, "right": 0, "forward": 0, "cam-left": 0, "cam-right": 0} # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΠΎ ΠΈΡ
Π½Π°ΠΆΠ°ΡΠΈΡ
# Π ΠΈΡΡΠ΅ΠΌ Π·Π²ΡΠ·Π΄Ρ
self.sky = loader.loadModel("./models/sky/solar_sky_sphere") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΊΠΎΡΠΌΠΎΡΠ°(ΡΡΠΎ ΡΡΠ΅ΡΠ°)
self.sky_tex = loader.loadTexture("./tex/stars_1k_tex.jpg") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ
self.sky.setTexture(self.sky_tex, 1) # Π·Π°ΡΠ΅Π½Π΄Π΅ΡΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ Π½Π° Π½Π΅Π±ΠΎ
self.sky.reparentTo(render) # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π½Π΅Π±ΠΎ
self.sky.setScale(40000) # ΡΠ°ΡΡΠΈΡΠΈΠΌ Π½Π΅Π±ΠΎ Π΄ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ panda3d
self.environ = loader.loadModel("models/world/falcon.egg") # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π² blender ΠΌΠΈΡ.
self.environ.reparentTo(render) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΈΡΠ° Π² ΠΎΠΊΠ½ΠΎ
droidStartPos = (-1, 0, 1.5 ) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΡΡΠ°ΡΡΠΎΠ²ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° Π² ΠΌΠΈΡΠ΅.
enemyStartPos = (-6, 1, 0.5) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ°-Π΄ΡΠΎΠΈΠ΄Π°.
self.droid = GameApi.object(self, "models/player/seeker.egg", 1, droidStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ³ΡΠΎΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.enemy = GameApi.object(self, "models/enemies/r2d2/r2d2.egg", 1, enemyStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 1 # ΠΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
self.weapon = GameApi.object(self, 'models/weapon/lightsaber.egg', .5, self.weapon_pos) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΎΡΡΠΆΠΈΠ΅
self.bullet = GameApi.object(self, 'models/weapon/bullet/bullet.egg.pz', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΠΏΡΠ»Ρ
self.flash = GameApi.object(self, 'models/whishlyflash/handlamp.egg', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.bullet.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΠΏΡΠ»Ρ Π² ΠΌΠΈΡ Π½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΎΠ½Π° ΡΠ°ΠΌΠ° Π½Π΅ ΡΠΊΠΎΡΠΎ
self.flash.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ Π² Π½Π°Ρ ΠΌΠΈΡ
self.bullet.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠ»ΠΈ
self.flash.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
# Π²ΡΠ°ΠΆΠ΅ΡΠΊΠΈΠΉ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.fighter = GameApi.object(self, 'models/fighter/fighter.egg', 1, (0, 90 , 0)) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»ΡΠΊΡ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.cube = GameApi.object(self, 'models/block/crate.egg', .7, (0, 0, 0)) # Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ Π±Π»ΠΎΠΊ
self.cube.hprInterval(1.5, (0, 360, 360)).loop()
self.Intervalcube = self.cube.posInterval(13,
Point3(0, -500, 0),
startPos=Point3(0, 10, 0))
self.Intervalcube.loop()
self.spotlight = camera.attachNewNode(Spotlight("spotlight")) # ΠΠΎΠ½ΡΠΈΠ³ΠΈ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
self.spotlight.node().setColor((.3, .3, .3, 1))
self.spotlight.node().setSpecularColor((0, 0, 0, 1))
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("d", 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("d-up", self.setKey, ["cam-right", False]) # ΠΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ s+Π²ΠΏΠ΅ΡΡΠ΄ - ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π²ΠΏΡΠ°Π²ΠΎ ΠΈ ΠΈΠ΄ΡΠΌ Π²ΠΏΠ΅ΡΡΠ΄
self.accept("space", self.shot) # ΠΏΡΠΈ ΠΏΡΠΎΠ±Π΅Π»Π΅ ΡΡΡΠ΅Π»ΡΠ΅ΠΌ
self.accept("s", self.toggleLights, [[self.spotlight]]) # ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.accept("w", self.weapon_hide) # ΠΏΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ w - ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅.
base.enableParticles() # ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΡΠΌΠ°
self.p = ParticleEffect() # ΠΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.accept('f', self.particle_start) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f(ΠΎΡ force) - Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ°ΠΉΠ» Π΄ΡΠΌΠ° ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠΈΠ³ ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΡΡΠ°Π»Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄ΡΠΌΠ°
self.accept('0', self.fountain) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ f+o(fountain) Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ
self.accept('f3', self.toggleWireframe) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f3 - Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ»ΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
taskMgr.add(self.move, "moveTask") # ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°Π΄Π°ΡΡ Π² Π½Π°Ρ Π΄Π²ΠΈΠΆΠΎΠΊ
self.isMoving = False # Π‘ΡΠ°Π²ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ isMoving Π½Π° False(ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠ΅Π½ΡΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅) ΡΡΠΎΠ±Ρ ΠΈΠ³ΡΠΎΠΊ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎΡΠ».
# ΠΠ΅Π»Π°Π΅ΠΌ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ²Π΅Ρ Π±ΡΠ» ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π²ΡΠΊΠ»ΡΡΠ΅Π½.
self.camera.setPos(self.droid.getX(), self.droid.getY() + 1, 3) # Π‘ΡΠ°Π²ΠΈΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
if not self.EN : # Π΅ΡΠ»ΠΈ ΡΠ·ΡΠΊ Π½Π΅ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else : # Π΅ΡΠ»ΠΈ ΡΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.state_info = MenuApi.text(self, text='machine :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.hide_weapon = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΎΡΡΠΆΠΈΠ΅ Π½Π΅ ΡΠ±ΡΠ°Π½ΠΎ
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
self.motor_pos1 = 25.238849639892578, 8.962211608886719, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor_pos2 = -20.676218032836914, 10.55816650390625, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor1 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos1, self.environ) # ΠΌΠΎΡΠΎΡ 1
self.motor2 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos2, self.environ) # ΠΌΠΎΡΠΎΡ 2
self.state_info2 = MenuApi.text(self, text='', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.force = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Π½Π΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.black_light() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ²Π΅Ρ
self.collisions() # Π²ΡΡΠ±Π°Π΅ΠΌ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ
# ΡΠΎΠ»Π½ΡΠ΅(Π½ΠΎΠ²Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ)
GameApi.light(self)
#GameApi.fire(self)
#GameApi.shadows_shader(self)
#PaintShade(render)
self.objects = [self.environ, self.droid,
self.enemy, self.weapon,
self.bullet, self.flash,
self.cube, self.fighter]
# ΠΡΠ»ΠΈ ΠΈΠ³ΡΠΎΠΊ Π·Π°Ρ
ΠΎΡΠ΅Π» ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Π² ΡΡΡΠ½ΠΎΠ±Π΅Π»ΡΡ ΠΈΠ³ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΡΠΎ
if self.GB :
GameApi.shaders(self, "./shaders/lighting.vert", "./shaders/lighting.frag") # ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ΅ΠΉΠ΄Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ!
#render.set_shader(Shader.load(Shader.SL_GLSL, "./shaders/terrain.vert.glsl", "./shaders/terrain.frag.glsl"))
def collisions(self):
pass
def light_shader(self):
'''ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΉΠ΄Π΅ΡΠ° Π³ΠΎΡΠ΅Π½ΠΈΡ'''
return Shader.make(Shader.SL_GLSL, vertex="""
#version 120
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
attribute vec2 p3d_MultiTexCoord0;
attribute vec4 p3d_Vertex;
attribute vec3 p3d_Normal;
uniform mat4 p3d_ModelViewProjectionMatrix;
void main( void )
{
gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex;
gl_TexCoord[0].xy = p3d_MultiTexCoord0;
v_FragmentPosition = p3d_Vertex.xyz;
v_FragmentNormal = p3d_Normal;
}
""",
fragment="""
#version 120
uniform sampler2D p3d_Texture0;
uniform vec3 pos_light;
uniform mat4 p3d_ViewMatrixInverse;
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
const vec4 k_LightColor = vec4(1.0, 0.6, 0.3, 1.0);
const float k_Shininess = 64.0;
const float k_ConstAttenuation = 0.5;
const float k_LinearAttenuation = 0.05;
const float k_QuadricAttenuation = 0.001;
void main( void )
{
vec3 L = pos_light - v_FragmentPosition;
// ** Used in the calculation of light extinction
float distance = length( L );
L = normalize( L );
vec3 N = normalize( v_FragmentNormal );
// ** The H vector is used to calculate the gloss (specularity) of a fragment
vec3 E = normalize( p3d_ViewMatrixInverse[3].xyz - v_FragmentPosition );
vec3 H = normalize( L + E ); // ** Half-vector
// ** The calculation coefficient. attenuations
float attenuation = 1.0 / ( k_ConstAttenuation + k_LinearAttenuation * distance + k_QuadricAttenuation * distance * distance );
float diffuse = clamp( dot( L, N ), 0.0, 1.0 );
float specular = pow( clamp( dot( N, H ), 0.0, 1.0 ), k_Shininess );
if( diffuse <= 0.0 ){
specular = 0.0;
}
vec4 diffuseColor = diffuse * k_LightColor * attenuation;
vec4 specularColor = specular * k_LightColor * attenuation;
vec4 ambientColor = vec4(0.01, 0.01, 0.01, 0.01);
vec4 emissionColor = vec4(0.0, 0.0, 0.0, 0.0);
gl_FragColor = ( diffuseColor + specularColor + ambientColor + emissionColor) * texture2D(p3d_Texture0, gl_TexCoord[0].xy );
}
""")
def particle_start(self):
if not self.pro_machine :
self.force = True # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΡΠΆΠ΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.state -= 1 # ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΡΠΊΠΎΠ²
self.state_info.hide() # ΡΠ΄Π°Π»ΠΈΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΎΡΠΊΠΈ
if self.state != 10 and self.state > 10:
self.state_info.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΠΆΠΈΠ·Π½ΡΡ
ΠΊΠΎΡΠ°Π±Π»Ρ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ Π½Π΅ΠΈΡΠΏΡΠ°Π²Π΅Π½', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='motor error', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else:
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam_critic/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='critic state', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
if self.state < 10:
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
for i in range(len(self.objects)):
self.object = self.objects[i]
GameApi.make_shader(self, self.object, (self.object.getX(), self.object.getY(), self.object.getZ())) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ Π³ΠΎΡΠ΅Π½ΠΈΡ
GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΏΠ°Π΄Π°Π΅ΠΌ!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='fall!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
if not self.EN :
self.pro_info = MenuApi.text(self, text='ΠΠ ΠΠ€Π!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
else :
self.pro_info = MenuApi.text(self, text='PRO!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
self.pro_machine_engine()
def pro_machine_engine(self):
'''ΠΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΊΠΎΡΠ°Π±Π»Ρ'''
# Π’ΡΡ Π½ΡΠΆΠ΅Π½ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊ. ΠΡΠ»ΠΈ Π΅Π³ΠΎ Ρ Π²Π°Ρ Π½Π΅Ρ, ΡΠ²Ρ Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ΅ΠΆΠΈΠΌ.
self.mgr = InputDeviceManager.get_global_ptr()
for device in self.mgr.get_devices():
self.gamepad = device
MenuApi.text(self, text=str(self.gamepad), pos=(-1.6, -0.9), scale=0.05, font=self.font) # Π½Π°ΠΉΠ΄Π΅Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
# Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠΎΠΌ
taskMgr.add(self.moveTaskDjoystic, "moveTaskDjoystic")
## self.accept("gamepad-back", exit)
## self.accept("gamepad-start", exit)
## self.accept("gamepad-face_x", self.reset)
## self.accept("gamepad-face_b", self.action, extraArgs=["face_b"])
def reset(self):
self.camera.setPosHpr(0, -200, 10, 0, 0, 0)
self.environ.setPosHpr(0, -200, 9, 0, 0, 0)
def moveTaskDjoystic(self, task):
dt = globalClock.getDt()
strafe_speed = 85
vert_speed = 50
turn_speed = 100
lstick = self.gamepad.findButton("lstick")
if lstick.pressed:
strafe_speed *= 2.0
strafe = Vec3(0)
left_x = self.gamepad.findAxis(InputDevice.Axis.left_x)
left_y = self.gamepad.findAxis(InputDevice.Axis.left_y)
strafe.x = left_x.value
strafe.y = left_y.value
if strafe.lengthSquared() >= 0.01:
self.camera.setPos(self.camera, strafe * strafe_speed * dt)
trigger_l = self.gamepad.findAxis(InputDevice.Axis.left_trigger)
trigger_r = self.gamepad.findAxis(InputDevice.Axis.right_trigger)
lift = trigger_r.value - trigger_l.value
self.camera.setZ(self.camera.getZ() + (lift * vert_speed * dt))
right_x = self.gamepad.findAxis(InputDevice.Axis.right_x)
right_y = self.gamepad.findAxis(InputDevice.Axis.right_y)
if abs(right_x.value) >= 0.1 or abs(right_y.value) >= 0.1:
self.camera.setH(self.camera, turn_speed * dt * -right_x.value)
self.camera.setP(self.camera, turn_speed * dt * right_y.value)
self.camera.setR(0)
return task.cont
def fountain(self):
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ΅ΠΊΡΡ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
if self.force:
if self.state != 100:
self.state += 1
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
else :
if self.state != 100:
self.state += 1
self.state_info.hide()
MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
#self.state_info = OnscreenText(text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
def black_light(self):
# ΠΡΠΊΠ»ΡΡΠ΅Π½ΡΠΉ ΡΠ²Π΅Ρ
ambientLight = AmbientLight("ambientLight")
ambientLight.setColor((0, 0, 0, 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 weapon_hide(self):
# Π£Π±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅
self.hide_weapon = True
self.weapon.hide()
def toggleLights(self, lights):
# Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
if self.hide_weapon:
for light in lights:
if render.hasLight(light):
render.clearLight(light)
else:
render.setLight(light)
self.flash.setPos(self.weapon_pos)
else:
return
def shot(self):
dt = globalClock.getDt() + 0.5 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
if not self.hide_weapon : # Π΅ΡΠ»ΠΈ ΠΎΡΡΠΆΠΈΠ΅ ΡΠ±ΡΠ°Π½ΠΎ ΡΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ΅Π»ΡΡΡ
self.shotSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.bullet.setPos(self.weapon_pos) # ΠΡΠ»Ρ Π±ΡΠ΄Π΅Ρ ΡΠΏΠ°Π²Π½ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΏΡΡΠΊΠΈ
self.bullet.setY(self.bullet, -11 * dt) # Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΏΡΠ»Ρ Π½Π° ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ Π²ΠΏΠ΅ΡΡΠ΄
def check_loss(self):
if self.state == 0: # Π΅ΡΠ»ΠΈ ΠΆΠΈΠ·Π½Π΅ΠΉ Ρ ΠΊΠΎΡΠ°Π±Π»Ρ Π½Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ
self.black_light() # Π²ΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ½ΡΠΉ ΡΠ²Π΅Ρ
self.weapon_hide() # ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅
if not self.EN :
self.info = MenuApi.text(self, text='ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
else :
self.info = MenuApi.text(self, text='LOSS', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
self.crackSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π°
def setKey(self, key, value):
self.keyMap[key] = value # ΠΠ΅Π»Π°Π΅ΠΌ ΠΌΠ΅Ρ
aΠ½uΠ·ΠΌ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ.
def move(self, task):
''' ΠΠ΅Π»Π°Π΅ΠΌ ΡΡΡΠ½ΠΊΡΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° '''
dt = globalClock.getDt() - .005 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
# ΠΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡΠ°Π²ΠΎ
if self.keyMap["cam-left"]:
self.camera.setX(self.camera, -10 * dt) # ΠΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΊΠ° ΠΊΠ°ΠΌΠ΅ΡΡ ΠΏΠΎ ΠΈΠΊΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΠ»ΡΠ·ΠΈΡ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΡΠ³Π»Π° Π»ΡΡΠ°. ΠΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΊΠ°ΠΌΠ΅ΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ.
if self.keyMap["cam-right"]:
self.camera.setX(self.camera, + 10 * dt) # Π’ΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Π½Π°Π²Π΅ΡΡ
Ρ.
startpos = self.droid.getPos() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ΄ΠΎΠ±Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
if self.keyMap["left"]:
self.droid.setH(self.droid.getH() + 145 * dt)
self.enemy.setY(self.enemy, 1 * dt)
if self.keyMap["right"]:
self.droid.setH(self.droid.getH() - 145 * dt)
self.enemy.setY(self.enemy, -1 * dt)
if self.keyMap["forward"]:
self.droid.setY(self.droid, -25 * dt)
self.enemy.setX(self.enemy, 1 * dt)
# Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ±ΡΠ°Π½ΠΎ ΠΎΡΡΠΆΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ
if not self.hide_weapon:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.weapon.setPos(self.weapon_pos) # ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
else:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.flash.setPos(self.weapon_pos)
camvec = self.droid.getPos() - self.camera.getPos() # Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
camvec.setZ(0) # 0 Π²ΡΡΠΎΡΠ° Π²Π΅ΠΊΡΠΎΡΠ°
camdist = camvec.length() # Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΎΡ Π΄ΡΠΎΠΈΠ΄Π°
camvec.normalize() # Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
if camdist > 10.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ 10, ΡΠΎ ΡΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π·Π° Π΄ΡΠΎΠΎΠΈΠ΄ΠΎΠΌ
self.camera.setPos(self.camera.getPos() + camvec * (camdist - 10))
camdist = 10.0 # ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΎΠ²Π° 10
if camdist < 5.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π³ΡΡΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ 5, ΡΠΎ...
self.camera.setPos(self.camera.getPos() - camvec * (5 - camdist)) # ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ
camdist = 5.0 # Π²ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ
self.camera.lookAt(self.floater) # Π²ΠΎΡ ΠΈ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΠ»ΡΡ Π½Π°Ρ floater
return task.cont # Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΡ
## def addInstructions(self, pos, msg):
## return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=self.inst_font, pos=(-1.3, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1)) # Π€ΡΠ½ΠΊΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ
##
## def addTitle(self, text):
## return OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), scale=0.2,
## parent=base.a2dBottomRight, align=TextNode.ARight,
## pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=self.font) # Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Ρ ΡΡΠΈΡΡΠΎΠΌ ΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ
##
droid = DroidShooter() # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
droid.run() # 3Π°ΠΏΡΡΡΠΈΠΌ ΠΈΠ³ΡΡ
# ΡΠ°Π·ΡΠΎΠ±ΠΎΡΡΠΈΠΊΠΈ :
# ΠΠ»Π°Π²Π½ΡΠΉ Π°Π²ΡΠΎΡ : ma3rx
# ΠΠΎΠΌΠΎΡΠ½ΠΈΠΊ : panda3dmastercoder( ΠΏΡΠΈΡΠΎΠ΅Π΄Π΅Π½ΠΈΠ»ΡΡ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΡ 31 ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄Π°, 12:??)
# Π Π΅ΠΊΠ»Π°ΠΌΡΠΈΠΊ : rdb (Π½Π°ΠΏΠΈΡΠ°Π» ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΡΠΌΠ΅ 6 ΡΠ΅Π²ΡΠ°Π»Ρ 2021 Π³ΠΎΠ΄Π°, 20:11)
marconit_engine.py :
# Π‘Π°ΠΌΠΎΠΏΠΈΡΠ½ΠΎΠ΅ API ΠΊ direct ΠΈ panda3d
from direct.showbase.ShowBase import ShowBase
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectButton import DirectButton
from direct.gui.DirectSlider import DirectSlider
from direct.actor.Actor import Actor
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
from panda3d.core import *
from array import array
import random
class MenuApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def slider(self, pos, scale, value, command):
return DirectSlider(pos=pos, scale=scale, value=value,
command=command)
def button(self, pos, text, scale, pad, command):
return DirectButton(pos=pos, text=text,
scale=scale, pad=pad,
command=command)
def addInstruction(self, pos, msg, font):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=font, pos=(-1.6, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1))
def addTitle(self, msg, font):
return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=0.2,
parent=base.a2dBottomRight, align=TextNode.ARight,
pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=font)
def text(self, pos, text, font, scale):
return OnscreenText(text=text, pos=pos, scale=scale, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=font)
def menu_effect(self):
NUM_EMBERS = 512 # ΠΠΎΠ»Π²ΠΎ ΡΠ°ΡΡΠΈΡ
floats = []
# ΠΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΈ Π·Π°Π΄Π°ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡ
for i in range(NUM_EMBERS):
speed = (0.2 + random.random()) * 0.7
size = 0.5 + random.random() * 0.5
size = max(size ** 4, 0.1)
floats += [random.random(), random.random(), random.random(), speed, 0, 0, 0, size]
initial_data = array('f', floats) # Π°ΡΡΠ°Π΅ΠΌ Π½Π°ΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
buffer = ShaderBuffer('embers', initial_data.tobytes(), GeomEnums.UH_static) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ
format = GeomVertexFormat.get_empty()
vdata = GeomVertexData('embers', format, GeomEnums.UH_static)
tris = GeomTriangles(GeomEnums.UH_static)
tris.add_next_vertices(NUM_EMBERS * 3)
geom = Geom(vdata)
geom.add_primitive(tris)
geom.set_bounds(BoundingBox((0, 0, 0), (1, 1, 1)))
node = GeomNode("node")
node.add_geom(geom)
embertex = loader.load_texture("./shaders/menu/ember.png")
embertex.wrap_u = SamplerState.WM_clamp
embertex.wrap_v = SamplerState.WM_clamp
shader = Shader.load(Shader.SL_GLSL, "./shaders/menu/embers.vert", "./shaders/menu/embers.frag")
path = base.render.attach_new_node(node)
path.set_shader(shader)
path.set_shader_input("EmberBuffer", buffer)
path.set_texture(embertex)
path.set_two_sided(True)
path.set_attrib(ColorBlendAttrib.make(ColorBlendAttrib.M_add, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_one))
path.set_depth_write(False)
path.node().set_bounds_type(BoundingVolume.BT_box)
node = ComputeNode("simulate")
node.add_dispatch(NUM_EMBERS // 16, 1, 1)
path = base.render.attach_new_node(node)
path.set_shader(Shader.load_compute(Shader.SL_GLSL, "./shaders/menu/simulate.comp"))
path.set_shader_input("windmap", loader.load_texture("./shaders/menu/wind.png"))
path.set_shader_input("EmberBuffer", buffer)
base.cam.set_x(0.5)
base.cam.set_y(-2)
base.cam.set_z(0.5)
class GameApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def light(self):
sun = DirectionalLight("sun")
sun.set_color_temperature(6000)
sun.color = sun.color * 4
sun_path = render.attach_new_node(sun)
sun_path.set_pos(10, -10, -10)
sun_path.look_at(0, 0, 0)
sun_path.hprInterval(self.sun_interval, (sun_path.get_h(), sun_path.get_p() - 360, sun_path.get_r()), bakeInStart=True).loop()
render.set_light(sun_path)
def object(self, path, scale, pos):
self.object = Actor(path)
self.object.reparentTo(render)
self.object.setScale(scale)
self.object.setPos(pos)
return self.object
def sound(self, path, volume):
self.sound = loader.loadMusic(path)
self.sound.setVolume(volume)
return self.sound
def shaders(self, vert, frag):
render.set_shader(Shader.load(Shader.SL_GLSL, vert, frag))
def loadParticleConfig(self, filename, pos, object):
self.p.cleanup()
self.p = ParticleEffect()
self.p.loadConfig(Filename(filename))
self.p.start(object)
self.p.setPos(pos)
def make_shader(self, object, pos):
'''ΠΡΠΎ ΡΠ΅ΠΉΠ΄Π΅Ρ'''
object.set_shader(self.light_shader())
object.set_shader_input('pos_light', pos)
Directory 5.0.3 :
/models :
./models/world
Now, download panda3d art from https://www.panda3d.org/download/noversion/art-gallery.zip
Go to the cat-environment folder. In it you will see a millenium falcon folder. Take all the files from it and put it in the directory ./models/world)
./models/block : block.zip (269.6 KB)
./models/enemies : enemies.zip (381.4 KB)
./models/fighter : fighter.zip (36.9 KB)
./models/player : player.zip (644.6 KB)
./models/sky : sky.zip (12.5 KB)
./models/weapon : weapon.zip (234.3 KB)
./models/whishlyflash : whishlyflash.zip
./fonts : fonts.zip (192.5 KB)
./sounds : sounds.zip (1.8 MB)
./special_effects : special_effects.zip (19.3 KB)
./tex : tex.zip (95.1 KB)
./shaders : shaders.zip (22.2 KB)
droid.py
#!/usr/bin/env python
# -*- coding: utf_8 -*-
# Π‘ΠΎΠ·Π΄Π°Π½ΠΎ : 22 ΡΠΈΡΠ»ΠΎ, ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄
# ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
from direct.showbase.ShowBase import ShowBase
from direct.particles.ParticleEffect import ParticleEffect
from direct.gui.OnscreenImage import OnscreenImage
from direct.gui.OnscreenText import OnscreenText
from direct.interval.IntervalGlobal import *
from panda3d.core import *
from marconit_engine import *
import random
import sys
import time
import os
import math
VERSION = '5.0.3'
settings = ['window-title Droid Game release ' + VERSION,
'fullscreen 0',
'win-size 1440 900']
loadPrcFileData('', settings[0]) # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (Π²ΠΎΠ·ΠΌΡΠΌ Π΅Π³ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ settings)
loadPrcFileData('', settings[1]) # Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
loadPrcFileData('', settings[2]) # Π Π°Π·ΠΌΠ΅Ρ ΠΎΠΊΠ½Π°
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³Π»Π°Π²Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
class DroidShooter(ShowBase):
def __init__(self):
ShowBase.__init__(self) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅Π»ΡΡ ΠΈΠ· direct
self.speed = 1800 # ΡΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ
self.GB = False # ΠΠ ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
self.EN = False # ΠΠ΅ Π±ΡΠ΄Π΅ΠΌ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.pro_machine = False # ΠΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.sun_interval = 100 # ΠΠ½ΡΠ΅ΡΠ²Π°Π» ΡΠΎΠ»Π½ΡΠ°
self.menu() # Π·Π²ΠΏΡΡΠΊ ΠΌΠ΅Π½Ρ
def menu(self):
base.enableParticles() # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.disableMouse() # ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΌΡΡΠΊΡ
self.win.setClearColor((0, 0.2, 0.2, 1)) # ΠΠ°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ ΡΡΡΠ½ΡΠΌ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΠΈΠ³ΡΠΎΠ²ΠΎΠΌ Π΄Π²ΠΈΠΆΠΊΠ΅ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΡ Π·Π°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΡΠΌ.
self.font = loader.loadFont('./fonts/doom_font.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ ΠΈΠ· ΠΈΠ³ΡΡ doom
self.inst_font = loader.loadFont('./fonts/arial.ttf') # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΡΠΈΡΡ arial
self.crackSound = GameApi.sound(self, './sounds/crack.wav', 1) # Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π° ΠΊΠΎΡΠ°Π±Π»Ρ
self.shotSound = GameApi.sound(self, './sounds/shot.wav', 1) # Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.startSound = GameApi.sound(self, './sounds/started.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.errorSound = GameApi.sound(self, './sounds/error.wav', 1) # Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ°
self.click_sound = GameApi.sound(self, './sounds/GUI_click.wav', 1) # Π·Π²ΡΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ
self.startSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
# ΠΠ΅Π½Ρ-ΡΡΡΠ΅ΠΊΡΡ
MenuApi.menu_effect(self)
self.button_start = MenuApi.button(self, pos=(0.7, 0, 0.4), text="CTAPT",
scale=.2, pad=(.2, .2),
command=self.load_game) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ
self.gb_start = MenuApi.button(self, pos=(0.7, 0, 0.1), text="GB",
scale=.2, pad=(.2, .2),
command=self.gb_mode) # ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΡ Π² ΡΡΡΠ½ΠΎ-Π±Π΅Π»ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅
self.en = MenuApi.button(self, pos=(0.7, 0, -0.2), text='EN',
scale=.2, pad=(.2, .2),
command=self.en_lang)
self.pro_button = MenuApi.button(self, pos=(0.7, 0, -0.5), text='PRO',
scale=.2, pad=(.2, .2),
command=self.pro_system)
self.slider_life = MenuApi.slider(self, pos=(0.1, 0, .75), scale=0.8, value=0.5,
command=self.set_lifes)
self.title = MenuApi.addTitle(self, "Droid game ΡΠ΅Π»ΠΈΠ· " + VERSION, self.font)
# ΠΠ°ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
self.inst1 = MenuApi.addInstruction(self, 0.95, u"[ESC]: ΠΡΡ
ΠΎΠ΄", self.inst_font)
self.inst2 = MenuApi.addInstruction(self, 0.90, u"[Left Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst3 = MenuApi.addInstruction(self, 0.85, u"[Right Arrow]: ΠΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst4 = MenuApi.addInstruction(self, 0.80, u"[Up Arrow]: ΠΠΏΠ΅ΡΠ΅Π΄", self.inst_font)
self.inst5 = MenuApi.addInstruction(self, 0.75, u"[a]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ", self.inst_font)
self.inst6 = MenuApi.addInstruction(self, 0.70, u"[d]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ", self.inst_font)
self.inst7 = MenuApi.addInstruction(self, 0.65, u"[Left Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst8 = MenuApi.addInstruction(self, 0.60, u"[Right Arrow + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ Π΄ΡΠΎΠΈΠ΄Π° Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst9 = MenuApi.addInstruction(self, 0.55, u"[a + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΠΏΡΠ°Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst10 = MenuApi.addInstruction(self, 0.50, u"[d + Up arrow]: ΠΏΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΠ΅ΡΡΠ΄", self.inst_font)
self.inst11 = MenuApi.addInstruction(self, 0.45, u"[space]: ΡΡΡΠ΅Π»ΡΠ±Π°", self.inst_font)
self.inst12 = MenuApi.addInstruction(self, 0.40, u"[s]: Π΄ΠΎΡΡΠ°ΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ", self.inst_font)
self.inst13 = MenuApi.addInstruction(self, 0.35, u"[w]: ΡΠ±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅", self.inst_font)
self.inst14 = MenuApi.addInstruction(self, 0.30, u"[f]: ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°Π·Π³ΠΎΠ½(ΠΠΠΠ‘ΠΠ!)", self.inst_font)
self.inst15 = MenuApi.addInstruction(self, 0.25, u"[0]: ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°", self.inst_font)
self.inst16 = MenuApi.addInstruction(self, 0.20, u"[p]: ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΏΡΠΈΡΠ΅Π»", self.inst_font)
self.accept("escape", sys.exit) # ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ Esc Π²ΡΡ
ΠΎΠ΄ΠΈΠΌ.
def set_lifes(self):
self.state = self.slider_life.guiItem.getValue() * 100 # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ»Π°ΠΉΠ΄Π΅ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΎΠ΅ Π½Π° 100, Π΄Π° ΡΡΠ°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½ΠΎ ΠΌΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΏΠ»Π΅Π²Π°ΡΡ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Π½Ρ, ΠΈΠ±ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ½ΡΡΠΈΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΡΡ :)
def gb_mode(self):
'''Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ½ΠΎΠ±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.GB = True
def en_lang(self):
'''ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ·ΡΠΊΠ° Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.EN = True
def pro_system(self):
'''ΠΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅'''
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.pro_machine = True # Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
def load_game(self):
self.click_sound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΊΠ»ΠΈΠΊΠ°
self.button_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΠ°ΡΡΠ°
self.gb_start.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΡΠ½ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°.
self.title.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈΠ³ΡΡ
self.en.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ Π°Π½Π³ΠΎΡΠ·ΡΡΠ½ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ
self.pro_button.destroy() # ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΏΡΠΎΡΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠ²Π»Π΅Π½ΠΈΡ
# ΡΠ΄Π°Π»ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
self.inst1.destroy()
self.inst2.destroy()
self.inst3.destroy()
self.inst4.destroy()
self.inst5.destroy()
self.inst6.destroy()
self.inst7.destroy()
self.inst8.destroy()
self.inst9.destroy()
self.inst10.destroy()
self.inst11.destroy()
self.inst12.destroy()
self.inst13.destroy()
self.inst14.destroy()
self.inst15.destroy()
self.inst16.destroy()
self.slider_life.destroy() # ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΡΠ»Π°ΠΉΠ΄Π΅Ρ ΠΆΠΈΠ·Π½Π΅ΠΉ ΠΊΠΎΡΠ°Π±Π»Ρ
self.keyMap = {
"left": 0, "right": 0, "forward": 0, "cam-left": 0, "cam-right": 0} # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΠΎ ΠΈΡ
Π½Π°ΠΆΠ°ΡΠΈΡ
# Π ΠΈΡΡΠ΅ΠΌ Π·Π²ΡΠ·Π΄Ρ
self.sky = loader.loadModel("./models/sky/solar_sky_sphere") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΊΠΎΡΠΌΠΎΡΠ°(ΡΡΠΎ ΡΡΠ΅ΡΠ°)
self.sky_tex = loader.loadTexture("./tex/stars_1k_tex.jpg") # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ
self.sky.setTexture(self.sky_tex, 1) # Π·Π°ΡΠ΅Π½Π΄Π΅ΡΠΈΠΌ ΡΠ΅ΠΊΡΡΡΡΡ Π½Π° Π½Π΅Π±ΠΎ
self.sky.reparentTo(render) # ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π½Π΅Π±ΠΎ
self.sky.setScale(40000) # ΡΠ°ΡΡΠΈΡΠΈΠΌ Π½Π΅Π±ΠΎ Π΄ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ panda3d
self.environ = loader.loadModel("models/world/falcon.egg") # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π² blender ΠΌΠΈΡ.
self.environ.reparentTo(render) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΈΡΠ° Π² ΠΎΠΊΠ½ΠΎ
droidStartPos = (-1, 0, 1.5 ) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΡΡΠ°ΡΡΠΎΠ²ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° Π² ΠΌΠΈΡΠ΅.
enemyStartPos = (-6, 1, 0.5) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ°-Π΄ΡΠΎΠΈΠ΄Π°.
self.droid = GameApi.object(self, "models/player/seeker.egg", 1, droidStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ³ΡΠΎΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.enemy = GameApi.object(self, "models/enemies/r2d2/r2d2.egg", 1, enemyStartPos) # ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ° (ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π² blender)
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 1 # ΠΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
self.weapon = GameApi.object(self, 'models/weapon/lightsaber.egg', .5, self.weapon_pos) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΎΡΡΠΆΠΈΠ΅
self.bullet = GameApi.object(self, 'models/weapon/bullet/bullet.egg.pz', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΠΏΡΠ»Ρ
self.flash = GameApi.object(self, 'models/whishlyflash/handlamp.egg', .5, (0, 0, 0)) # ΠΠ°Π³ΡΡΠ·ΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.bullet.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΠΏΡΠ»Ρ Π² ΠΌΠΈΡ Π½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΎΠ½Π° ΡΠ°ΠΌΠ° Π½Π΅ ΡΠΊΠΎΡΠΎ
self.flash.reparentTo(render) # ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΡΠΎΠ½Π°ΡΠΈΠΊ Π² Π½Π°Ρ ΠΌΠΈΡ
self.bullet.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠ»ΠΈ
self.flash.setScale(.5) # Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
# Π²ΡΠ°ΠΆΠ΅ΡΠΊΠΈΠΉ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.fighter = GameApi.object(self, 'models/fighter/fighter.egg', 1, (0, 90 , 0)) # Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΌΠΎΠ΄Π΅Π»ΡΠΊΡ ΠΈΡΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
self.cube = GameApi.object(self, 'models/block/crate.egg', .7, (0, 0, 0)) # Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌ Π±Π»ΠΎΠΊ
self.cube.hprInterval(1.5, (0, 360, 360)).loop()
self.Intervalcube = self.cube.posInterval(13,
Point3(0, -500, 0),
startPos=Point3(0, 10, 0))
self.Intervalcube.loop()
self.spotlight = camera.attachNewNode(Spotlight("spotlight")) # ΠΠΎΠ½ΡΠΈΠ³ΠΈ ΡΠΎΠ½Π°ΡΠΈΠΊΠ°
self.spotlight.node().setColor((.3, .3, .3, 1))
self.spotlight.node().setSpecularColor((0, 0, 0, 1))
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("d", 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("d-up", self.setKey, ["cam-right", False]) # ΠΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ s+Π²ΠΏΠ΅ΡΡΠ΄ - ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π²ΠΏΡΠ°Π²ΠΎ ΠΈ ΠΈΠ΄ΡΠΌ Π²ΠΏΠ΅ΡΡΠ΄
self.accept("space", self.shot) # ΠΏΡΠΈ ΠΏΡΠΎΠ±Π΅Π»Π΅ ΡΡΡΠ΅Π»ΡΠ΅ΠΌ
self.accept("s", self.toggleLights, [[self.spotlight]]) # ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠΎΠ½Π°ΡΠΈΠΊ
self.accept("w", self.weapon_hide) # ΠΏΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ w - ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅.
self.accept("p", self.cursor)
base.enableParticles() # ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΡΠΌΠ°
self.p = ParticleEffect() # ΠΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ΅ΠΊΡ Π΄ΡΠΌΠ°
self.accept('f', self.particle_start) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f(ΠΎΡ force) - Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΡΠ°ΠΉΠ» Π΄ΡΠΌΠ° ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠΈΠ³ ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΡΡΠ°Π»Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄ΡΠΌΠ°
self.accept('0', self.fountain) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ f+o(fountain) Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΏΠΎΠΆΠ°ΡΠΎΡΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ
self.accept('f3', self.toggleWireframe) # ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ f3 - Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ»ΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
taskMgr.add(self.move, "moveTask") # ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°Π΄Π°ΡΡ Π² Π½Π°Ρ Π΄Π²ΠΈΠΆΠΎΠΊ
self.isMoving = False # Π‘ΡΠ°Π²ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ isMoving Π½Π° False(ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠ΅Π½ΡΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅) ΡΡΠΎΠ±Ρ ΠΈΠ³ΡΠΎΠΊ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎΡΠ».
# ΠΠ΅Π»Π°Π΅ΠΌ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ²Π΅Ρ Π±ΡΠ» ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π²ΡΠΊΠ»ΡΡΠ΅Π½.
self.camera.setPos(self.droid.getX(), self.droid.getY() + 1, 3) # Π‘ΡΠ°Π²ΠΈΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
if not self.EN : # Π΅ΡΠ»ΠΈ ΡΠ·ΡΠΊ Π½Π΅ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else : # Π΅ΡΠ»ΠΈ ΡΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
self.state_info = MenuApi.text(self, text='machine :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.hide_weapon = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΎΡΡΠΆΠΈΠ΅ Π½Π΅ ΡΠ±ΡΠ°Π½ΠΎ
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
self.motor_pos1 = 25.238849639892578, 8.962211608886719, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor_pos2 = -20.676218032836914, 10.55816650390625, 1.5 # ΠΏΠΎΠ·ΠΈΡΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΡΠΎΡΠ°
self.motor1 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos1, self.environ) # ΠΌΠΎΡΠΎΡ 1
self.motor2 = GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.motor_pos2, self.environ) # ΠΌΠΎΡΠΎΡ 2
self.state_info2 = MenuApi.text(self, text='', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.force = False # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Π½Π΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.black_light() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ²Π΅Ρ
self.collisions() # Π²ΡΡΠ±Π°Π΅ΠΌ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ
# ΡΠΎΠ»Π½ΡΠ΅(Π½ΠΎΠ²Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ)
GameApi.light(self)
#GameApi.fire(self)
#GameApi.shadows_shader(self)
#PaintShade(render)
self.objects = [self.environ, self.droid,
self.enemy, self.weapon,
self.bullet, self.flash,
self.cube, self.fighter]
# ΠΡΠ»ΠΈ ΠΈΠ³ΡΠΎΠΊ Π·Π°Ρ
ΠΎΡΠ΅Π» ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Π² ΡΡΡΠ½ΠΎΠ±Π΅Π»ΡΡ ΠΈΠ³ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΡΠΎ
if self.GB :
GameApi.shaders(self, "./shaders/lighting.vert", "./shaders/lighting.frag") # ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ΅ΠΉΠ΄Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ!
#render.set_shader(Shader.load(Shader.SL_GLSL, "./shaders/terrain.vert.glsl", "./shaders/terrain.frag.glsl"))
def collisions(self):
pass
def light_shader(self):
'''ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΉΠ΄Π΅ΡΠ° Π³ΠΎΡΠ΅Π½ΠΈΡ'''
return Shader.make(Shader.SL_GLSL, vertex="""
#version 120
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
attribute vec2 p3d_MultiTexCoord0;
attribute vec4 p3d_Vertex;
attribute vec3 p3d_Normal;
uniform mat4 p3d_ModelViewProjectionMatrix;
void main( void )
{
gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex;
gl_TexCoord[0].xy = p3d_MultiTexCoord0;
v_FragmentPosition = p3d_Vertex.xyz;
v_FragmentNormal = p3d_Normal;
}
""",
fragment="""
#version 120
uniform sampler2D p3d_Texture0;
uniform vec3 pos_light;
uniform mat4 p3d_ViewMatrixInverse;
varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;
const vec4 k_LightColor = vec4(1.0, 0.6, 0.3, 1.0);
const float k_Shininess = 64.0;
const float k_ConstAttenuation = 0.5;
const float k_LinearAttenuation = 0.05;
const float k_QuadricAttenuation = 0.001;
void main( void )
{
vec3 L = pos_light - v_FragmentPosition;
// ** Used in the calculation of light extinction
float distance = length( L );
L = normalize( L );
vec3 N = normalize( v_FragmentNormal );
// ** The H vector is used to calculate the gloss (specularity) of a fragment
vec3 E = normalize( p3d_ViewMatrixInverse[3].xyz - v_FragmentPosition );
vec3 H = normalize( L + E ); // ** Half-vector
// ** The calculation coefficient. attenuations
float attenuation = 1.0 / ( k_ConstAttenuation + k_LinearAttenuation * distance + k_QuadricAttenuation * distance * distance );
float diffuse = clamp( dot( L, N ), 0.0, 1.0 );
float specular = pow( clamp( dot( N, H ), 0.0, 1.0 ), k_Shininess );
if( diffuse <= 0.0 ){
specular = 0.0;
}
vec4 diffuseColor = diffuse * k_LightColor * attenuation;
vec4 specularColor = specular * k_LightColor * attenuation;
vec4 ambientColor = vec4(0.01, 0.01, 0.01, 0.01);
vec4 emissionColor = vec4(0.0, 0.0, 0.0, 0.0);
gl_FragColor = ( diffuseColor + specularColor + ambientColor + emissionColor) * texture2D(p3d_Texture0, gl_TexCoord[0].xy );
}
""")
def particle_start(self):
if not self.pro_machine :
self.force = True # ΠΠΎΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΡΠΆΠ΅ ΡΠ°Π·Π³ΠΎΠ½ΡΠ»ΠΈΡΡ
self.state -= 1 # ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΡΠΊΠΎΠ²
self.state_info.hide() # ΡΠ΄Π°Π»ΠΈΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΎΡΠΊΠΈ
if self.state != 10 and self.state > 10:
self.state_info.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΠΆΠΈΠ·Π½ΡΡ
ΠΊΠΎΡΠ°Π±Π»Ρ
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ Π½Π΅ΠΈΡΠΏΡΠ°Π²Π΅Π½', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='motor error', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else:
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/steam_critic/steam.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='critic state', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
if self.state < 10:
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.check_loss() # ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
self.steam_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 5)
for i in range(len(self.objects)):
self.object = self.objects[i]
GameApi.make_shader(self, self.object, (self.object.getX(), self.object.getY(), self.object.getZ())) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ Π³ΠΎΡΠ΅Π½ΠΈΡ
GameApi.loadParticleConfig(self, 'special_effects/steam_critic+/fireish.ptf', self.steam_pos, self.environ)
self.errorSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π΅Π΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
if not self.EN :
self.state_info2 = MenuApi.text(self, text='ΠΏΠ°Π΄Π°Π΅ΠΌ!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
self.state_info2 = MenuApi.text(self, text='fall!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
else :
if not self.EN :
self.pro_info = MenuApi.text(self, text='ΠΠ ΠΠ€Π!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
else :
self.pro_info = MenuApi.text(self, text='PRO!', pos=(-0.8, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΈ :)
self.pro_machine_engine()
def pro_machine_engine(self):
'''ΠΡΠΎΡΠ΅ΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠΊΠ° ΠΊΠΎΡΠ°Π±Π»Ρ'''
# Π’ΡΡ Π½ΡΠΆΠ΅Π½ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊ. ΠΡΠ»ΠΈ Π΅Π³ΠΎ Ρ Π²Π°Ρ Π½Π΅Ρ, ΡΠ²Ρ Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ΅ΠΆΠΈΠΌ.
self.mgr = InputDeviceManager.get_global_ptr()
for device in self.mgr.get_devices():
self.gamepad = device
MenuApi.text(self, text=str(self.gamepad), pos=(-1.6, -0.9), scale=0.05, font=self.font) # Π½Π°ΠΉΠ΄Π΅Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
# Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠΎΠΌ
taskMgr.add(self.moveTaskDjoystic, "moveTaskDjoystic")
## self.accept("gamepad-back", exit)
## self.accept("gamepad-start", exit)
## self.accept("gamepad-face_x", self.reset)
## self.accept("gamepad-face_b", self.action, extraArgs=["face_b"])
def reset(self):
self.camera.setPosHpr(0, -200, 10, 0, 0, 0)
self.environ.setPosHpr(0, -200, 9, 0, 0, 0)
def moveTaskDjoystic(self, task):
dt = globalClock.getDt()
strafe_speed = 85
vert_speed = 50
turn_speed = 100
lstick = self.gamepad.findButton("lstick")
if lstick.pressed:
strafe_speed *= 2.0
strafe = Vec3(0)
left_x = self.gamepad.findAxis(InputDevice.Axis.left_x)
left_y = self.gamepad.findAxis(InputDevice.Axis.left_y)
strafe.x = left_x.value
strafe.y = left_y.value
if strafe.lengthSquared() >= 0.01:
self.camera.setPos(self.camera, strafe * strafe_speed * dt)
trigger_l = self.gamepad.findAxis(InputDevice.Axis.left_trigger)
trigger_r = self.gamepad.findAxis(InputDevice.Axis.right_trigger)
lift = trigger_r.value - trigger_l.value
self.camera.setZ(self.camera.getZ() + (lift * vert_speed * dt))
right_x = self.gamepad.findAxis(InputDevice.Axis.right_x)
right_y = self.gamepad.findAxis(InputDevice.Axis.right_y)
if abs(right_x.value) >= 0.1 or abs(right_y.value) >= 0.1:
self.camera.setH(self.camera, turn_speed * dt * -right_x.value)
self.camera.setP(self.camera, turn_speed * dt * right_y.value)
self.camera.setR(0)
return task.cont
def fountain(self):
self.state_info2.hide() # ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ΅ΠΊΡΡ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
if self.force:
if self.state != 100:
self.state += 1
self.state_info.hide()
self.state_info = MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
else :
if self.state != 100:
self.state += 1
self.state_info.hide()
MenuApi.text(self, text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(float(self.state)), pos=(0.5, 0.8), scale=0.1, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
#self.state_info = OnscreenText(text='ΠΊΠΎΡΠ°Π±Π»Ρ :' + str(self.state), pos=(0.5, 0.8), scale=0.1, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=self.font) # ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΡΠ°Π±Π»Ρ
self.fountain_pos = random.randrange(0, 5), random.randrange(0, 5), random.randrange(0, 1)
GameApi.loadParticleConfig(self, 'special_effects/fountain/fountain.ptf', self.fountain_pos, self.environ)
def black_light(self):
# ΠΡΠΊΠ»ΡΡΠ΅Π½ΡΠΉ ΡΠ²Π΅Ρ
ambientLight = AmbientLight("ambientLight")
ambientLight.setColor((0, 0, 0, 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 weapon_hide(self):
# Π£Π±ΡΠ°ΡΡ ΠΎΡΡΠΆΠΈΠ΅
self.hide_weapon = True
self.weapon.hide()
def toggleLights(self, lights):
# Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
if self.hide_weapon:
for light in lights:
if render.hasLight(light):
render.clearLight(light)
else:
render.setLight(light)
self.flash.setPos(self.weapon_pos)
else:
return
def shot(self):
dt = globalClock.getDt() + 0.5 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
if not self.hide_weapon : # Π΅ΡΠ»ΠΈ ΠΎΡΡΠΆΠΈΠ΅ ΡΠ±ΡΠ°Π½ΠΎ ΡΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ΅Π»ΡΡΡ
self.shotSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²ΡΡΡΡΠ΅Π»Π°
self.bullet.setPos(self.weapon_pos) # ΠΡΠ»Ρ Π±ΡΠ΄Π΅Ρ ΡΠΏΠ°Π²Π½ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΏΡΡΠΊΠΈ
self.bullet.setY(self.bullet, -500 * dt) # Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΏΡΠ»Ρ Π½Π° ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ Π²ΠΏΠ΅ΡΡΠ΄
def check_loss(self):
if self.state == 0: # Π΅ΡΠ»ΠΈ ΠΆΠΈΠ·Π½Π΅ΠΉ Ρ ΠΊΠΎΡΠ°Π±Π»Ρ Π½Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ
self.black_light() # Π²ΠΊΠ»ΡΡΠΈΠΌ ΡΡΡΠ½ΡΠΉ ΡΠ²Π΅Ρ
self.weapon_hide() # ΡΠ±Π΅ΡΡΠΌ ΠΎΡΡΠΆΠΈΠ΅
if not self.EN :
self.info = MenuApi.text(self, text='ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
else :
self.info = MenuApi.text(self, text='LOSS', font=self.font,
pos=(-1.3, -0.5), scale=0.3) # Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠΈ
self.crackSound.play() # ΠΈΠ³ΡΠ°Π΅ΠΌ Π·Π²ΡΠΊ Π²Π·ΡΡΠ²Π°
def setKey(self, key, value):
self.keyMap[key] = value # ΠΠ΅Π»Π°Π΅ΠΌ ΠΌΠ΅Ρ
aΠ½uΠ·ΠΌ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ.
def cursor(self):
OnscreenText(text="||", style=1, fg=(1,1,1,1),pos=(0.0,0.03) , align=TextNode.ARight, scale = .07)
OnscreenText(text="||", style=1, fg=(1,1,1,1),pos=(0.0,-0.05), align=TextNode.ARight, scale = .07)
OnscreenText(text="==", style=1, fg=(1,1,1,1),pos=(-0.03,0.0), align=TextNode.ARight, scale = .07)
OnscreenText(text="==", style=1, fg=(1,1,1,1),pos=(0.055,0.0), align=TextNode.ARight, scale = .07)
def move(self, task):
''' ΠΠ΅Π»Π°Π΅ΠΌ ΡΡΡΠ½ΠΊΡΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° '''
dt = globalClock.getDt() - .005 # CΠΊΠΎΡΠΎΡΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ
# ΠΠΎΠ²ΠΎΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡΠ°Π²ΠΎ
if self.keyMap["cam-left"]:
self.camera.setX(self.camera, -10 * dt) # ΠΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΊΠ° ΠΊΠ°ΠΌΠ΅ΡΡ ΠΏΠΎ ΠΈΠΊΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΠ»ΡΠ·ΠΈΡ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΡΠ³Π»Π° Π»ΡΡΠ°. ΠΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΊΠ°ΠΌΠ΅ΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ.
if self.keyMap["cam-right"]:
self.camera.setX(self.camera, + 10 * dt) # Π’ΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Π½Π°Π²Π΅ΡΡ
Ρ.
startpos = self.droid.getPos() # Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ΄ΠΎΠ±Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ³ΡΠΎΠΊΠ°
if self.keyMap["left"]:
self.droid.setH(self.droid.getH() + 145 * dt)
self.enemy.setY(self.enemy, 1 * dt)
if self.keyMap["right"]:
self.droid.setH(self.droid.getH() - 145 * dt)
self.enemy.setY(self.enemy, -1 * dt)
if self.keyMap["forward"]:
self.droid.setY(self.droid, -25 * dt)
self.enemy.setX(self.enemy, 1 * dt)
# Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ±ΡΠ°Π½ΠΎ ΠΎΡΡΠΆΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ
if not self.hide_weapon:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.weapon.setPos(self.weapon_pos) # ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΡΠΊΠΈ
else:
self.weapon_pos = self.droid.getX(), self.droid.getY() + 0.7, 3
self.flash.setPos(self.weapon_pos)
camvec = self.droid.getPos() - self.camera.getPos() # Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
camvec.setZ(0) # 0 Π²ΡΡΠΎΡΠ° Π²Π΅ΠΊΡΠΎΡΠ°
camdist = camvec.length() # Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΎΡ Π΄ΡΠΎΠΈΠ΄Π°
camvec.normalize() # Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΌΠ΅ΡΡ
if camdist > 10.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ 10, ΡΠΎ ΡΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ Π·Π° Π΄ΡΠΎΠΎΠΈΠ΄ΠΎΠΌ
self.camera.setPos(self.camera.getPos() + camvec * (camdist - 10))
camdist = 10.0 # ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΎΠ²Π° 10
if camdist < 5.0: # Π΅ΡΠ»ΠΈ Π΄ΠΈΡΡΠ°Π³ΡΡΡ ΠΊΠ°ΠΌΠ΅ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ 5, ΡΠΎ...
self.camera.setPos(self.camera.getPos() - camvec * (5 - camdist)) # ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΊΠ°ΠΌΠ΅ΡΡ
camdist = 5.0 # Π²ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ
self.camera.lookAt(self.floater) # Π²ΠΎΡ ΠΈ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΠ»ΡΡ Π½Π°Ρ floater
return task.cont # Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΡ
droid = DroidShooter() # Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Π½Π°ΡΠ΅ΠΉ ΠΈΠ³ΡΡ
droid.run() # 3Π°ΠΏΡΡΡΠΈΠΌ ΠΈΠ³ΡΡ
# ΡΠ°Π·ΡΠΎΠ±ΠΎΡΡΠΈΠΊΠΈ :
# ΠΠ»Π°Π²Π½ΡΠΉ Π°Π²ΡΠΎΡ : ma3rx
# ΠΠΎΠΌΠΎΡΠ½ΠΈΠΊ : panda3dmastercoder( ΠΏΡΠΈΡΠΎΠ΅Π΄Π΅Π½ΠΈΠ»ΡΡ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΡ 31 ΡΠ½Π²Π°ΡΡ, 2021 Π³ΠΎΠ΄Π°, 12:??)
# Π Π΅ΠΊΠ»Π°ΠΌΡΠΈΠΊ : rdb (Π½Π°ΠΏΠΈΡΠ°Π» ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΡΠΌΠ΅ 6 ΡΠ΅Π²ΡΠ°Π»Ρ 2021 Π³ΠΎΠ΄Π°, 20:11)
marconit_engine.py :
# Π‘Π°ΠΌΠΎΠΏΠΈΡΠ½ΠΎΠ΅ API ΠΊ direct ΠΈ panda3d
from direct.showbase.ShowBase import ShowBase
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectButton import DirectButton
from direct.gui.DirectSlider import DirectSlider
from direct.actor.Actor import Actor
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
from panda3d.core import *
from array import array
import random
class MenuApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def slider(self, pos, scale, value, command):
return DirectSlider(pos=pos, scale=scale, value=value,
command=command)
def button(self, pos, text, scale, pad, command):
return DirectButton(pos=pos, text=text,
scale=scale, pad=pad,
command=command)
def addInstruction(self, pos, msg, font):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=font, pos=(-1.6, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1))
def addTitle(self, msg, font):
return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=0.2,
parent=base.a2dBottomRight, align=TextNode.ARight,
pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=font)
def text(self, pos, text, font, scale):
return OnscreenText(text=text, pos=pos, scale=scale, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=font)
def menu_effect(self):
NUM_EMBERS = 512 # ΠΠΎΠ»Π²ΠΎ ΡΠ°ΡΡΠΈΡ
floats = []
# ΠΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΈ Π·Π°Π΄Π°ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡ
for i in range(NUM_EMBERS):
speed = (0.2 + random.random()) * 0.7
size = 0.5 + random.random() * 0.5
size = max(size ** 4, 0.1)
floats += [random.random(), random.random(), random.random(), speed, 0, 0, 0, size]
initial_data = array('f', floats) # Π°ΡΡΠ°Π΅ΠΌ Π½Π°ΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
buffer = ShaderBuffer('embers', initial_data.tobytes(), GeomEnums.UH_static) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ
format = GeomVertexFormat.get_empty()
vdata = GeomVertexData('embers', format, GeomEnums.UH_static)
tris = GeomTriangles(GeomEnums.UH_static)
tris.add_next_vertices(NUM_EMBERS * 3)
geom = Geom(vdata)
geom.add_primitive(tris)
geom.set_bounds(BoundingBox((0, 0, 0), (1, 1, 1)))
node = GeomNode("node")
node.add_geom(geom)
embertex = loader.load_texture("./shaders/menu/ember.png")
embertex.wrap_u = SamplerState.WM_clamp
embertex.wrap_v = SamplerState.WM_clamp
shader = Shader.load(Shader.SL_GLSL, "./shaders/menu/embers.vert", "./shaders/menu/embers.frag")
path = base.render.attach_new_node(node)
path.set_shader(shader)
path.set_shader_input("EmberBuffer", buffer)
path.set_texture(embertex)
path.set_two_sided(True)
path.set_attrib(ColorBlendAttrib.make(ColorBlendAttrib.M_add, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_one))
path.set_depth_write(False)
path.node().set_bounds_type(BoundingVolume.BT_box)
node = ComputeNode("simulate")
node.add_dispatch(NUM_EMBERS // 16, 1, 1)
path = base.render.attach_new_node(node)
path.set_shader(Shader.load_compute(Shader.SL_GLSL, "./shaders/menu/simulate.comp"))
path.set_shader_input("windmap", loader.load_texture("./shaders/menu/wind.png"))
path.set_shader_input("EmberBuffer", buffer)
base.cam.set_x(0.5)
base.cam.set_y(-2)
base.cam.set_z(0.5)
class GameApi(ShowBase):
def __init__(self):
ShowBase.__init__(self)
def light(self):
sun = DirectionalLight("sun")
sun.set_color_temperature(6000)
sun.color = sun.color * 4
sun_path = render.attach_new_node(sun)
sun_path.set_pos(10, -10, -10)
sun_path.look_at(0, 0, 0)
sun_path.hprInterval(self.sun_interval, (sun_path.get_h(), sun_path.get_p() - 360, sun_path.get_r()), bakeInStart=True).loop()
render.set_light(sun_path)
def object(self, path, scale, pos):
self.object = Actor(path)
self.object.reparentTo(render)
self.object.setScale(scale)
self.object.setPos(pos)
return self.object
def sound(self, path, volume):
self.sound = loader.loadMusic(path)
self.sound.setVolume(volume)
return self.sound
def shaders(self, vert, frag):
render.set_shader(Shader.load(Shader.SL_GLSL, vert, frag))
def loadParticleConfig(self, filename, pos, object):
self.p.cleanup()
self.p = ParticleEffect()
self.p.loadConfig(Filename(filename))
self.p.start(object)
self.p.setPos(pos)
def make_shader(self, object, pos):
'''ΠΡΠΎ ΡΠ΅ΠΉΠ΄Π΅Ρ'''
object.set_shader(self.light_shader())
object.set_shader_input('pos_light', pos)
New marconit_engine.py code:
# Π‘Π°ΠΌΠΎΠΏΠΈΡΠ½ΠΎΠ΅ API ΠΊ direct ΠΈ panda3d
from direct.showbase.ShowBase import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectButton import DirectButton
from direct.gui.DirectSlider import DirectSlider
from direct.actor.Actor import Actor
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
from panda3d.core import *
from array import array
import random
class MenuApi(DirectObject):
def __init__(self):
ShowBase.__init__(self)
def slider(self, pos, scale, value, command):
return DirectSlider(pos=pos, scale=scale, value=value,
command=command)
def button(self, pos, text, scale, pad, command):
return DirectButton(pos=pos, text=text,
scale=scale, pad=pad,
command=command)
def addInstruction(self, pos, msg, font):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font=font, pos=(-1.6, pos), align=TextNode.ALeft, scale = .04, shadow=(0,0,0,1))
def addTitle(self, msg, font):
return OnscreenText(text=msg, style=1, fg=(1, 1, 1, 1), scale=0.2,
parent=base.a2dBottomRight, align=TextNode.ARight,
pos=(-0.1, 0.09), shadow=(0, 0, 0, 1), font=font)
def text(self, pos, text, font, scale):
return OnscreenText(text=text, pos=pos, scale=scale, fg=(1, 1, 1, 1), align=TextNode.ALeft, font=font)
def menu_effect(self):
NUM_EMBERS = 512 # ΠΠΎΠ»Π²ΠΎ ΡΠ°ΡΡΠΈΡ
floats = []
# ΠΡΠΎΡ
ΠΎΠ΄ΠΈΠΌΡΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΈ Π·Π°Π΄Π°ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡ
for i in range(NUM_EMBERS):
speed = (0.2 + random.random()) * 0.7
size = 0.5 + random.random() * 0.5
size = max(size ** 4, 0.1)
floats += [random.random(), random.random(), random.random(), speed, 0, 0, 0, size]
initial_data = array('f', floats) # Π°ΡΡΠ°Π΅ΠΌ Π½Π°ΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
buffer = ShaderBuffer('embers', initial_data.tobytes(), GeomEnums.UH_static) # Π²ΡΡΠ±Π°Π΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅Ρ
format = GeomVertexFormat.get_empty()
vdata = GeomVertexData('embers', format, GeomEnums.UH_static)
tris = GeomTriangles(GeomEnums.UH_static)
tris.add_next_vertices(NUM_EMBERS * 3)
geom = Geom(vdata)
geom.add_primitive(tris)
geom.set_bounds(BoundingBox((0, 0, 0), (1, 1, 1)))
node = GeomNode("node")
node.add_geom(geom)
embertex = loader.load_texture("./shaders/menu/ember.png")
embertex.wrap_u = SamplerState.WM_clamp
embertex.wrap_v = SamplerState.WM_clamp
shader = Shader.load(Shader.SL_GLSL, "./shaders/menu/embers.vert", "./shaders/menu/embers.frag")
path = base.render.attach_new_node(node)
path.set_shader(shader)
path.set_shader_input("EmberBuffer", buffer)
path.set_texture(embertex)
path.set_two_sided(True)
path.set_attrib(ColorBlendAttrib.make(ColorBlendAttrib.M_add, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_one))
path.set_depth_write(False)
path.node().set_bounds_type(BoundingVolume.BT_box)
node = ComputeNode("simulate")
node.add_dispatch(NUM_EMBERS // 16, 1, 1)
path = base.render.attach_new_node(node)
path.set_shader(Shader.load_compute(Shader.SL_GLSL, "./shaders/menu/simulate.comp"))
path.set_shader_input("windmap", loader.load_texture("./shaders/menu/wind.png"))
path.set_shader_input("EmberBuffer", buffer)
base.cam.set_x(0.5)
base.cam.set_y(-2)
base.cam.set_z(0.5)
class GameApi(DirectObject):
def __init__(self):
ShowBase.__init__(self)
def light(self):
sun = DirectionalLight("sun")
sun.set_color_temperature(6000)
sun.color = sun.color * 4
sun_path = render.attach_new_node(sun)
sun_path.set_pos(10, -10, -10)
sun_path.look_at(0, 0, 0)
sun_path.hprInterval(self.sun_interval, (sun_path.get_h(), sun_path.get_p() - 360, sun_path.get_r()), bakeInStart=True).loop()
render.set_light(sun_path)
def object(self, path, scale, pos):
self.object = Actor(path)
self.object.reparentTo(render)
self.object.setScale(scale)
self.object.setPos(pos)
return self.object
def sound(self, path, volume):
self.sound = loader.loadMusic(path)
self.sound.setVolume(volume)
return self.sound
def shaders(self, vert, frag):
render.set_shader(Shader.load(Shader.SL_GLSL, vert, frag))
def loadParticleConfig(self, filename, pos, object):
self.p.cleanup()
self.p = ParticleEffect()
self.p.loadConfig(Filename(filename))
self.p.start(object)
self.p.setPos(pos)
def make_shader(self, object, pos):
'''ΠΡΠΎ ΡΠ΅ΠΉΠ΄Π΅Ρ'''
object.set_shader(self.light_shader())
object.set_shader_input('pos_light', pos)
Hm⦠for new version??
No. Just a mistake you made. I fixed it.
EDIT: Actually: ShowBase is a new screen and initiating it will cause errors. So DirectObject is what you have to use.
Ok.


