-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenemy.py
More file actions
160 lines (132 loc) · 5.7 KB
/
Copy pathenemy.py
File metadata and controls
160 lines (132 loc) · 5.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# enemy - set up enemy statistics, movements, and actions
import sys, math, random
from direct.showbase.ShowBase import ShowBase
from direct.task import Task
from direct.showbase.DirectObject import DirectObject
from panda3d.core import *
from panda3d.core import CollisionNode
from panda3d.core import CollisionSphere
from panda3d.core import CollisionTraverser
from panda3d.core import CollideMask
# enemy object
class Enemy(DirectObject):
def __init__(self, state, numb, player):
# Model taken from https://www.blendswap.com/blends/view/76294
self.enemyModel = base.loader.loadModel('models/knight')
self.state = state
self.player = player
self.enemyModel.setScale(3.5, 3.5, 3.5)
x = random.randint(-120, 120)
y = random.randint(-100, 100)
self.enemyModel.setPos(x, y, 3)
self.enemyModel.setHpr(0, 0, 0)
self.isAlive = True
self.numb = numb
self.speed = 0.1
self.enemyModel.reparentTo(render)
# fire
self.fireballFired = Fireball(self)
taskMgr.doMethodLater(5, self.fire, 'fireFireballs')
# set up collision
self.enemyCollide = CollisionSphere(0, 0, 0, 0.5)
self.enemyCollisionNode = CollisionNode('enemy' + str(self.numb))
self.enemyCollisionNode.addSolid(self.enemyCollide)
self.enemyCollisionNode.setFromCollideMask(CollideMask.bit(0))
self.enemyCollisionNode.setIntoCollideMask(CollideMask.allOff())
self.collider = self.enemyModel.attachNewNode(self.enemyCollisionNode)
# image taken from https://br.depositphotos.com/186812564/stock-photo-gray-steel-background-old-iron.html
enemyTexture = loader.loadTexture("models/enemyTexture.jpg")
self.enemyModel.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition)
self.enemyModel.setTexture(enemyTexture)
# fire fireballs at the player
def fire(self, task):
if self.isAlive:
self.fireballFired.isLive = False
self.fireballFired.fireball.removeNode()
newFireball = Fireball(self)
self.fireballFired = newFireball
task.delayTime += 1
return task.again
else:
return task.done
# move the enemy towards the target
def move(self, target):
target = target
speed = self.speed
# move to target if is alive
if self.isAlive and self.state == 0:
angle = self.enemyModel.getH()
radian = math.radians(angle)
targetPosX = target.getX()
targetPosY = target.getY()
enemyPosX = self.enemyModel.getX()
enemyPosY = self.enemyModel.getY()
margin = 1
deltaX = abs(speed * math.sin(radian))
deltaY = abs(speed * math.cos(radian))
# stop enemy from moving if too close to player
if abs(targetPosX - enemyPosX) <= margin or abs(targetPosY - enemyPosY) <= margin:
deltaX = 0
deltaY = 0
if targetPosY < enemyPosY:
deltaY = - deltaY
if targetPosX < enemyPosX:
deltaX = -deltaX
self.enemyModel.setX(self.enemyModel.getX() + deltaX)
self.enemyModel.setY(self.enemyModel.getY() + deltaY)
# remove said enemy from nodepath when called
def killEnemy(self, task):
if self.player.damage and self.isAlive:
self.player.changeStats(0, 1)
self.isAlive = False
self.fireballFired.isLive = False
self.enemyModel.removeNode()
# calculate where the enemy should face given the location of the player
def lookAtPlayer(self, flyBot):
flyBot = flyBot
if self.isAlive:
deltaX = self.enemyModel.getX() - flyBot.flyBot.getX()
deltaY = self.enemyModel.getY() - flyBot.flyBot.getY()
if deltaY == 0 and deltaX >= 0:
change = 90
elif deltaY == 0 and deltaX < 0:
change = -90
change = math.degrees(math.atan(deltaX/deltaY))
if deltaY < 0:
change = change + 180
self.enemyModel.setH(-change)
# class object fireball
class Fireball(DirectObject):
def __init__(self, enemy):
# which enemy it is fired from
self.enemy = enemy
self.fireball = base.loader.loadModel('models/fireball')
self.fireball.setScale(1, 1, 1)
self.fireball.reparentTo(self.enemy.enemyModel)
self.isLive = True
# starting position from the enemy
self.fireball.setPos(0, 0, 0)
self.fireball.setHpr(0, 0, 0)
# set up texture
# image taken from https://www.youtube.com/user/AdamAndEveNOTsteve2/playlists?app=desktop
fireballTexture = loader.loadTexture("models/fireballTexture.jpg")
self.fireball.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition)
self.fireball.setTexture(fireballTexture)
# move the fireball
taskMgr.doMethodLater(0.05, self.move, 'moveFireball')
# move the fireball
def move(self, task):
if self.isLive:
self.speed = 1.5
# get original position
posY = self.fireball.getY()
# move the ball
self.fireball.setY(self.fireball, posY - self.speed)
task.delayTime += 0.01
return task.again
else:
return task.done
# remove the fireball
def removeFireball(self, task):
self.isLive = False
self.fireball.removeNode()