-
Notifications
You must be signed in to change notification settings - Fork 0
/
Ball.cpp
114 lines (105 loc) · 2.47 KB
/
Ball.cpp
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
#include <sstream>
#include <string>
#include "Ball.h"
Ball::Ball(Node ArgCurNode, const char *TexName) : NPC(ArgCurNode)
{
FramesPerJump = 5;
FramesPerWait = 5;
InitGraphics(TexName);
}
void Ball::InitGraphics(const char *TexName)
{
D3DXMATRIX pos;
D3DXMATRIX rota;
D3DXMATRIX trans;
CurNode.RelCube->get_transform(&pos);
D3DXMatrixRotationY(&rota, -D3DX_PI/2.0f);
D3DXMatrixTranslation(&trans, 0, 5.0f, 0);
load("TriPrism.x", "myQBert/Models");
std::stringstream ss;
ss <<"myQBert/Textures/" <<TexName <<".png";
TexNorm.load((char*)ss.str().c_str());
ss.str(std::string()); ss.clear();
ss <<"myQBert/Textures/" <<TexName <<"-Jump.png";
TexJump.load((char*)ss.str().c_str());
ss.str(std::string()); ss.clear();
set_texture(0, &TexNorm);
disable_reflections();
add_transform(&rota);
add_transform(&pos);
add_transform(&trans);
return;
}
void Ball::Step(applikation &myqbert, const AdjacencyList &adjacency_list, GameStats &stats, const Node qbert_cur_node, const Node qbert_tar_node)
{
// Wartet der NPC?
if (isWaiting)
{
// Weiter warten..
FramesWaited++;
// Hat der NPC genug gewartet?
if (FramesWaited == FramesPerWait)
{
// Freigeben
FramesWaited = 0;
isWaiting = false;
}
}
else
{
// Bewegt sich der NPC?
if (isMoving)
{
// Weiter bewegen..
Move(MoveDirection);
// Springen der NPC und Q*Bert sich entgegen?
if ((CurNode.NodeNum == qbert_tar_node.NodeNum) && (TargetNode.NodeNum == qbert_cur_node.NodeNum))
Collision(myqbert, stats);
// Bewegung fertig?
if (!isMoving)
{
// Sind der NPC und Q*Bert auf dem gleichen Knoten?
if (CurNode.NodeNum == qbert_cur_node.NodeNum)
Collision(myqbert, stats);
}
}
else
{
// Sind der NPC und Q*Bert nicht auf dem gleichen Knoten?
if (CurNode.NodeNum != qbert_cur_node.NodeNum)
{
// neuen Knoten und damit auch die neue Richtung zufällig bestimmen
int rnd = rand() % 2;
if (rnd)
{
TargetNode = adjacency_list[CurNode.NodeNum][1].target;
MoveDirection = DIR_RIGHTDOWN;
}
else
{
TargetNode = adjacency_list[CurNode.NodeNum][2].target;
MoveDirection = DIR_LEFTDOWN;
}
// Sound abspielen
myqbert.play_sound(12, 0);
// NPC bewegen
isMoving = true;
Move(MoveDirection);
}
else
{
// Kollision
Collision(myqbert, stats);
}
}
}
return;
}
void Ball::SetTexture(void)
{
if (isMoving)
set_texture(0, &this->TexJump);
else
set_texture(0, &this->TexNorm);
return;
}