added multiple flipper option
This commit is contained in:
parent
c47464dae6
commit
e546f53e84
2
TODO.txt
2
TODO.txt
|
@ -8,7 +8,7 @@ Add targets and enable bonus
|
|||
|
||||
Add multiple flippers all around the tables/boards
|
||||
|
||||
Add the possibilty to have connected tables using a king on tunnel
|
||||
Add the possibilty to have connected tables using a kind on tunnel
|
||||
|
||||
Add ball launcher with user controle initial velocity
|
||||
|
||||
|
|
96
src/main.cpp
96
src/main.cpp
|
@ -23,12 +23,14 @@
|
|||
#include "extrakeyboard.h"
|
||||
#include "pinball_entities.h"
|
||||
#include "stdint-gcc.h"
|
||||
#include "tables.h"
|
||||
#include "utilities.h"
|
||||
#include "vector2D.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <math.h>
|
||||
#include "tables.h"
|
||||
|
||||
bool screenshot = false;
|
||||
bool record = false;
|
||||
|
@ -66,59 +68,11 @@ uint16_t CX(Vector2D pos) { return (int) (pos.x * cScale); }
|
|||
uint16_t CY(Vector2D pos) { return (int) (libnum::num32(azrp_height) - pos.y * cScale); }
|
||||
|
||||
/* create the pinball board */
|
||||
void SetupScene(void) {
|
||||
libnum::num32 offset = libnum::num32(0.02);
|
||||
|
||||
flipperHeight = libnum::num32(1.7);
|
||||
cScale = libnum::num32(azrp_height) / flipperHeight;
|
||||
simWidth = libnum::num32(azrp_width) / cScale;
|
||||
simHeight = libnum::num32(azrp_height) / cScale;
|
||||
|
||||
MyPinball.score = 0;
|
||||
MyPinball.gravity.Set( Vector2D( libnum::num32(0.0), libnum::num32(-3.0) ) );
|
||||
MyPinball.pause = true;
|
||||
|
||||
|
||||
MyPinball.borders.clear();
|
||||
MyPinball.borders.push_back( Vector2D( libnum::num32(0.74) , libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back( Vector2D( libnum::num32(1.0)-offset, libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back( Vector2D( libnum::num32(1.0)-offset, flipperHeight - offset));
|
||||
MyPinball.borders.push_back( Vector2D( offset , flipperHeight - offset));
|
||||
MyPinball.borders.push_back( Vector2D( offset , libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back( Vector2D( libnum::num32(0.26) , libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back( Vector2D( libnum::num32(0.26) , libnum::num32(offset)));
|
||||
MyPinball.borders.push_back( Vector2D( libnum::num32(0.74) , libnum::num32(offset)));
|
||||
|
||||
void SetupScene( int which_table ) {
|
||||
|
||||
MyPinball.balls.clear();
|
||||
libnum::num32 ball_radius = libnum::num32(0.03);
|
||||
libnum::num32 ball_mass = libnum::num32( PI ) * ball_radius * ball_radius;
|
||||
Vector2D ball_pos1( libnum::num32(0.92), libnum::num32(0.5) );
|
||||
Vector2D ball_vel1( libnum::num32(0.2) , libnum::num32(3.5) );
|
||||
|
||||
MyPinball.balls.push_back( Ball( ball_radius, ball_mass, ball_pos1, ball_vel1, 0.2 ) );
|
||||
Vector2D ball_pos2( libnum::num32(0.08), libnum::num32(0.5) );
|
||||
Vector2D ball_vel2( libnum::num32(0.2) , libnum::num32(3.5) );
|
||||
MyPinball.balls.push_back( Ball( ball_radius, ball_mass, ball_pos2, ball_vel2, 0.2 ) );
|
||||
|
||||
|
||||
MyPinball.obstacles.clear();
|
||||
MyPinball.obstacles.push_back( Obstacle( 0.1 , Vector2D( libnum::num32(0.25), libnum::num32(0.6) ), 2.0 ) );
|
||||
MyPinball.obstacles.push_back( Obstacle( 0.1 , Vector2D( libnum::num32(0.75), libnum::num32(0.5) ), 2.0 ) );
|
||||
MyPinball.obstacles.push_back( Obstacle( 0.12, Vector2D( libnum::num32(0.7 ), libnum::num32(1.0) ), 2.0 ) );
|
||||
MyPinball.obstacles.push_back( Obstacle( 0.1 , Vector2D( libnum::num32(0.2 ), libnum::num32(1.2) ), 2.0 ) );
|
||||
|
||||
|
||||
libnum::num32 flip_radius = libnum::num32( 0.03);
|
||||
libnum::num32 flip_length = libnum::num32( 0.2);
|
||||
libnum::num32 flip_maxRotation = libnum::num32(1.0);
|
||||
libnum::num32 flip_restAngle = libnum::num32(0.5);
|
||||
libnum::num32 flip_angularVelocity = libnum::num32(10.0);
|
||||
libnum::num32 flip_restitution = libnum::num32(0.0);
|
||||
Vector2D flip_pos1( libnum::num32(0.26), libnum::num32(0.22) );
|
||||
Vector2D flip_pos2( libnum::num32(0.74), libnum::num32(0.22) );
|
||||
MyPinball.flippers.push_back( Flipper( flip_radius, flip_pos1, flip_length, -flip_restAngle, flip_maxRotation, flip_angularVelocity, flip_restitution) );
|
||||
MyPinball.flippers.push_back( Flipper( flip_radius, flip_pos2, flip_length, libnum::num32(PI) + flip_restAngle, -flip_maxRotation, flip_angularVelocity, flip_restitution) );
|
||||
if (which_table==0) Setup_Table_0();
|
||||
else if (which_table==1) Setup_Table_1();
|
||||
else Setup_Table_0();
|
||||
}
|
||||
|
||||
void HandleBallBallCollision( Ball *ball1, Ball *ball2 )
|
||||
|
@ -320,12 +274,6 @@ static void render(void) {
|
|||
{
|
||||
Vector2D start = MyPinball.flippers[i].pos;
|
||||
Vector2D end = MyPinball.flippers[i].getTip();
|
||||
//libnum::num32 angleflip = MyPinball.flippers[i].restAngle + MyPinball.flippers[i].sign * MyPinball.flippers[i].rotation;
|
||||
|
||||
//azrp_filledcircle( CX(MyPinball.flippers[i].pos), CY(MyPinball.flippers[i].pos), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
|
||||
//azrp_filledcircle( CX(MyPinball.flippers[i].getTip()), CY(MyPinball.flippers[i].getTip()), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
|
||||
//azrp_line( CX(MyPinball.flippers[i].pos), CY(MyPinball.flippers[i].pos), CX(MyPinball.flippers[i].getTip()), CY(MyPinball.flippers[i].getTip()), C_GREEN );
|
||||
|
||||
azrp_filledcircle( CX(start), CY(start), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
|
||||
azrp_filledcircle( CX(end), CY(end), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
|
||||
azrp_line(CX(start), CY(start), CX(end), CY(end), C_GREEN );
|
||||
|
@ -357,32 +305,38 @@ static void get_inputs(float dt) {
|
|||
|
||||
/* LEFT FLIPPER */
|
||||
if (MyKeyboard.IsKeyPressed(MYKEY_F1)) {
|
||||
MyPinball.flippers[0].touchIdentifier = libnum::num32(0);
|
||||
for(int i=0; i<MyPinball.flippers.size();i++)
|
||||
if (MyPinball.flippers[i].side == LEFT)
|
||||
MyPinball.flippers[i].touchIdentifier = libnum::num32(0);
|
||||
}
|
||||
else {
|
||||
MyPinball.flippers[0].touchIdentifier = libnum::num32(-1);
|
||||
for(int i=0; i<MyPinball.flippers.size();i++)
|
||||
if (MyPinball.flippers[i].side == LEFT)
|
||||
MyPinball.flippers[i].touchIdentifier = libnum::num32(-1);
|
||||
}
|
||||
|
||||
/* RIGHT FLIPPER */
|
||||
if (MyKeyboard.IsKeyPressed(MYKEY_F6)) {
|
||||
MyPinball.flippers[1].touchIdentifier = libnum::num32(0);
|
||||
for(int i=0; i<MyPinball.flippers.size();i++)
|
||||
if (MyPinball.flippers[i].side == RIGHT)
|
||||
MyPinball.flippers[i].touchIdentifier = libnum::num32(0);
|
||||
}
|
||||
else {
|
||||
MyPinball.flippers[1].touchIdentifier = libnum::num32(-1);
|
||||
for(int i=0; i<MyPinball.flippers.size();i++)
|
||||
if (MyPinball.flippers[i].side == RIGHT)
|
||||
MyPinball.flippers[i].touchIdentifier = libnum::num32(-1);
|
||||
}
|
||||
|
||||
|
||||
/* RESET THE GAME */
|
||||
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
|
||||
MyKeyboard.IsKeyHoldPressed(MYKEY_MENU)) {
|
||||
/** TODO : This need to be seriously clean up **/
|
||||
MyPinball.balls[0].pos.Set( Vector2D( libnum::num32(0.92), libnum::num32(0.5) ) );
|
||||
MyPinball.balls[0].vel.Set( Vector2D( libnum::num32(0.2) , libnum::num32(3.5) ) );
|
||||
|
||||
MyPinball.balls[1].pos.Set( Vector2D( libnum::num32(0.08), libnum::num32(0.5) ) );
|
||||
MyPinball.balls[1].vel.Set( Vector2D( libnum::num32(0.2) , libnum::num32(3.5) ) );
|
||||
MyKeyboard.IsKeyHoldPressed(MYKEY_F2)) {
|
||||
SetupScene(0);
|
||||
}
|
||||
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
|
||||
MyKeyboard.IsKeyHoldPressed(MYKEY_F3)) {
|
||||
SetupScene(1);
|
||||
}
|
||||
|
||||
|
||||
#if (DEBUG_MODE)
|
||||
if (MyKeyboard.IsKeyPressed(MYKEY_OPTN) &&
|
||||
|
@ -480,7 +434,7 @@ int main(void) {
|
|||
usb_interface_t const *interfaces[] = {&usb_ff_bulk, NULL};
|
||||
usb_open(interfaces, GINT_CALL_NULL);
|
||||
|
||||
SetupScene();
|
||||
SetupScene(0);
|
||||
|
||||
prof_init();
|
||||
|
||||
|
|
|
@ -8,6 +8,13 @@
|
|||
|
||||
#include <vector>
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
LEFT = 0,
|
||||
RIGHT = 1,
|
||||
};
|
||||
|
||||
class Ball {
|
||||
public:
|
||||
Ball(libnum::num32 radius, libnum::num32 mass, Vector2D pos, Vector2D vel,
|
||||
|
@ -50,7 +57,7 @@ class Flipper {
|
|||
public:
|
||||
Flipper(libnum::num32 radius, Vector2D pos, libnum::num32 length,
|
||||
libnum::num32 restAngle, libnum::num32 maxRotation,
|
||||
libnum::num32 angularVelocity, libnum::num32 restitution) {
|
||||
libnum::num32 angularVelocity, libnum::num32 restitution, uint8_t side ) {
|
||||
this->radius = radius;
|
||||
this->pos = pos.Clone();
|
||||
this->length = length;
|
||||
|
@ -61,6 +68,7 @@ public:
|
|||
this->rotation = libnum::num32(0);
|
||||
this->currentAngularVelocity = libnum::num32(0);
|
||||
this->touchIdentifier = libnum::num32(-1);
|
||||
this->side=side;
|
||||
}
|
||||
|
||||
void Simulate(libnum::num32 dt) {
|
||||
|
@ -93,6 +101,7 @@ public:
|
|||
libnum::num32 rotation;
|
||||
libnum::num32 currentAngularVelocity;
|
||||
libnum::num32 touchIdentifier;
|
||||
uint8_t side;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,201 @@
|
|||
#ifndef TABLES_H
|
||||
#define TABLES_H
|
||||
|
||||
#include "pinball_entities.h"
|
||||
#include "utilities.h"
|
||||
#include "vector2D.h"
|
||||
#include <num/num.h>
|
||||
|
||||
extern Scene MyPinball;
|
||||
extern libnum::num32 flipperHeight;
|
||||
extern libnum::num32 cScale;
|
||||
extern libnum::num32 simWidth;
|
||||
extern libnum::num32 simHeight;
|
||||
|
||||
void Setup_Table_0(void) {
|
||||
libnum::num32 offset = libnum::num32(0.02);
|
||||
|
||||
flipperHeight = libnum::num32(1.7);
|
||||
cScale = libnum::num32(azrp_height) / flipperHeight;
|
||||
simWidth = libnum::num32(azrp_width) / cScale;
|
||||
simHeight = libnum::num32(azrp_height) / cScale;
|
||||
|
||||
MyPinball.score = 0;
|
||||
MyPinball.gravity.Set(Vector2D(libnum::num32(0.0), libnum::num32(-3.0)));
|
||||
MyPinball.pause = true;
|
||||
|
||||
MyPinball.borders.clear();
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(1.0) - offset, libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(1.0) - offset, flipperHeight - offset));
|
||||
MyPinball.borders.push_back(Vector2D(offset, flipperHeight - offset));
|
||||
MyPinball.borders.push_back(Vector2D(offset, libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.26), libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.26), libnum::num32(offset)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.74), libnum::num32(offset)));
|
||||
|
||||
MyPinball.balls.clear();
|
||||
libnum::num32 ball_radius = libnum::num32(0.03);
|
||||
libnum::num32 ball_mass = libnum::num32(PI) * ball_radius * ball_radius;
|
||||
Vector2D ball_pos1(libnum::num32(0.92), libnum::num32(0.5));
|
||||
Vector2D ball_vel1(libnum::num32(0.2), libnum::num32(3.5));
|
||||
MyPinball.balls.push_back(
|
||||
Ball(ball_radius, ball_mass, ball_pos1, ball_vel1, 0.2));
|
||||
Vector2D ball_pos2(libnum::num32(0.08), libnum::num32(0.5));
|
||||
Vector2D ball_vel2(libnum::num32(0.2), libnum::num32(3.5));
|
||||
MyPinball.balls.push_back(
|
||||
Ball(ball_radius, ball_mass, ball_pos2, ball_vel2, 0.2));
|
||||
|
||||
MyPinball.obstacles.clear();
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.1, Vector2D(libnum::num32(0.25), libnum::num32(0.6)), 2.0));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.1, Vector2D(libnum::num32(0.75), libnum::num32(0.5)), 2.0));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.12, Vector2D(libnum::num32(0.7), libnum::num32(1.0)), 2.0));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.1, Vector2D(libnum::num32(0.2), libnum::num32(1.2)), 2.0));
|
||||
|
||||
|
||||
MyPinball.flippers.clear();
|
||||
libnum::num32 flip_radius = libnum::num32(0.03);
|
||||
libnum::num32 flip_length = libnum::num32(0.2);
|
||||
libnum::num32 flip_maxRotation = libnum::num32(1.0);
|
||||
libnum::num32 flip_restAngle = libnum::num32(0.5);
|
||||
libnum::num32 flip_angularVelocity = libnum::num32(10.0);
|
||||
libnum::num32 flip_restitution = libnum::num32(0.0);
|
||||
|
||||
Vector2D flip_pos1(libnum::num32(0.26), libnum::num32(0.22));
|
||||
MyPinball.flippers.push_back(Flipper(flip_radius, flip_pos1, flip_length,
|
||||
-flip_restAngle, flip_maxRotation,
|
||||
flip_angularVelocity, flip_restitution, LEFT));
|
||||
|
||||
Vector2D flip_pos2(libnum::num32(0.74), libnum::num32(0.22));
|
||||
MyPinball.flippers.push_back(Flipper(
|
||||
flip_radius, flip_pos2, flip_length, libnum::num32(PI) + flip_restAngle,
|
||||
-flip_maxRotation, flip_angularVelocity, flip_restitution, RIGHT));
|
||||
|
||||
Vector2D flip_pos3(libnum::num32(offset), libnum::num32(1.50));
|
||||
MyPinball.flippers.push_back(Flipper(flip_radius, flip_pos3, flip_length,
|
||||
-flip_restAngle, flip_maxRotation,
|
||||
flip_angularVelocity, flip_restitution, LEFT));
|
||||
|
||||
Vector2D flip_pos4(libnum::num32(1.0)-offset, libnum::num32(1.25));
|
||||
MyPinball.flippers.push_back(Flipper(
|
||||
flip_radius, flip_pos4, flip_length, libnum::num32(PI) + flip_restAngle,
|
||||
-flip_maxRotation, flip_angularVelocity, flip_restitution, RIGHT));
|
||||
|
||||
}
|
||||
|
||||
void Setup_Table_1(void) {
|
||||
flipperHeight = libnum::num32(2.0);
|
||||
cScale = libnum::num32(azrp_height) / flipperHeight;
|
||||
simWidth = libnum::num32(azrp_width) / cScale;
|
||||
simHeight = libnum::num32(azrp_height) / cScale;
|
||||
|
||||
MyPinball.score = 0;
|
||||
MyPinball.gravity.Set(Vector2D(libnum::num32(0.0), libnum::num32(-0.80)));
|
||||
MyPinball.pause = true;
|
||||
|
||||
MyPinball.borders.clear();
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.995), libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.995), libnum::num32(1.4)));
|
||||
|
||||
libnum::num arcRadius = libnum::num32(0.5);
|
||||
|
||||
libnum::num32 arcStartAngle = libnum::num32(0);
|
||||
libnum::num32 arcEndAngle = libnum::num32(numPI);
|
||||
libnum::num32 arcSegments = libnum::num32(11);
|
||||
libnum::num32 arcAngleStep = (arcEndAngle - arcStartAngle) / arcSegments;
|
||||
for (int i = 1; i <= (int)arcSegments; i++) {
|
||||
libnum::num32 angle = arcStartAngle + libnum::num32(i) * arcAngleStep;
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.5) + arcRadius * COS(angle),
|
||||
libnum::num32(1.375) + arcRadius * SIN(angle)));
|
||||
}
|
||||
|
||||
MyPinball.borders.push_back(Vector2D(libnum::num32(0), libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.26), libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.26), libnum::num32(0.05)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.74), libnum::num32(0.05)));
|
||||
|
||||
MyPinball.borders.clear();
|
||||
libnum::num32 offset = libnum::num32(0.02);
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(1.0) - offset, libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(1.0) - offset, flipperHeight - offset));
|
||||
MyPinball.borders.push_back(Vector2D(offset, flipperHeight - offset));
|
||||
MyPinball.borders.push_back(Vector2D(offset, libnum::num32(0.4)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.26), libnum::num32(0.25)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.26), libnum::num32(offset)));
|
||||
MyPinball.borders.push_back(
|
||||
Vector2D(libnum::num32(0.74), libnum::num32(offset)));
|
||||
|
||||
MyPinball.balls.clear();
|
||||
libnum::num32 ball_radius = libnum::num32(0.03);
|
||||
libnum::num32 ball_mass = libnum::num32(PI) * ball_radius * ball_radius;
|
||||
Vector2D ball_pos1(libnum::num32(0.92), libnum::num32(0.5));
|
||||
Vector2D ball_vel1(libnum::num32(0.2), libnum::num32(3.5));
|
||||
MyPinball.balls.push_back(
|
||||
Ball(ball_radius, ball_mass, ball_pos1, ball_vel1, 0.2));
|
||||
Vector2D ball_pos2(libnum::num32(0.08), libnum::num32(0.5));
|
||||
Vector2D ball_vel2(libnum::num32(0.2), libnum::num32(3.5));
|
||||
MyPinball.balls.push_back(
|
||||
Ball(ball_radius, ball_mass, ball_pos2, ball_vel2, 0.2));
|
||||
|
||||
MyPinball.obstacles.clear();
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.04, Vector2D(libnum::num32(0.10), libnum::num32(1.68)), 0.8));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.08, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.08, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.04, Vector2D(libnum::num32(0.13), libnum::num32(0.80)), 1.5));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.04, Vector2D(libnum::num32(0.87), libnum::num32(0.80)), 1.5));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.60)), 1.5));
|
||||
MyPinball.obstacles.push_back(
|
||||
Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.60)), 1.5));
|
||||
|
||||
MyPinball.flippers.clear();
|
||||
libnum::num32 flip_radius = libnum::num32(0.035);
|
||||
libnum::num32 flip_length = libnum::num32(0.175);
|
||||
libnum::num32 flip_maxRotation = libnum::num32(1.0);
|
||||
libnum::num32 flip_restAngle = libnum::num32(0.5);
|
||||
libnum::num32 flip_angularVelocity = libnum::num32(10.0);
|
||||
libnum::num32 flip_restitution = libnum::num32(0.0);
|
||||
Vector2D flip_pos1(libnum::num32(0.26), libnum::num32(0.22));
|
||||
Vector2D flip_pos2(libnum::num32(0.74), libnum::num32(0.22));
|
||||
MyPinball.flippers.push_back(Flipper(flip_radius, flip_pos1, flip_length,
|
||||
-flip_restAngle, flip_maxRotation,
|
||||
flip_angularVelocity, flip_restitution, LEFT));
|
||||
MyPinball.flippers.push_back(Flipper(
|
||||
flip_radius, flip_pos2, flip_length, libnum::num32(PI) + flip_restAngle,
|
||||
-flip_maxRotation, flip_angularVelocity, flip_restitution, RIGHT));
|
||||
}
|
||||
|
||||
#endif
|
|
@ -27,6 +27,7 @@ void azrp_draw_text(int x, int y, char const *fmt, ...)
|
|||
|
||||
libnum::num32 COS( libnum::num32 angle )
|
||||
{
|
||||
|
||||
float a = (float) angle;
|
||||
float c = cos( a );
|
||||
return libnum::num32(c);
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
#include <num/num.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define numPI 3.14159265
|
||||
|
||||
libnum::num32 sqrt_num32(libnum::num32 v) {
|
||||
uint32_t t, q, b, r;
|
||||
r = v.v;
|
||||
|
@ -24,56 +26,74 @@ libnum::num32 sqrt_num32(libnum::num32 v) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* TO DO : rework these functions for sine and cosine calculation */
|
||||
|
||||
libnum::num32 cos_num32( libnum::num32 angle ) {
|
||||
libnum::num32 cos_num32(libnum::num32 angle) {
|
||||
// Taylor serie for cos(x) = 1 - x²/2! + x⁴/4! + x⁶/6! + x⁸/8! + ...
|
||||
|
||||
if(angle<libnum::num32(0)) return cos_num32(-angle);
|
||||
// Cosine function is even
|
||||
if (angle < libnum::num32(0))
|
||||
return cos_num32(-angle);
|
||||
|
||||
// Look for an angle in the range [0, 2*pi [
|
||||
libnum::num32 anglereduced = angle;
|
||||
while (anglereduced >= libnum::num32(2 * numPI))
|
||||
anglereduced -= libnum::num32(2 * numPI);
|
||||
|
||||
// Exploit the symetry for angle and angle+Pi to reduce the order of the
|
||||
// limited developpement
|
||||
if (anglereduced >= libnum::num(numPI))
|
||||
return -cos_num32(anglereduced - libnum::num(numPI));
|
||||
|
||||
libnum::num32 sum = libnum::num32(1);
|
||||
libnum::num32 angle2 = angle*angle;
|
||||
libnum::num32 angle2 = anglereduced * anglereduced;
|
||||
|
||||
// set first value of the Taylor serie : x⁰/0! = 1/1
|
||||
libnum::num32 numerator = libnum::num32(1);
|
||||
libnum::num32 numerator = libnum::num32(1);
|
||||
libnum::num32 denominator = libnum::num32(1);
|
||||
|
||||
for(int i=2; i<=8; i+=2 )
|
||||
{
|
||||
for (int i = 2; i <= 8; i += 2) {
|
||||
numerator *= (-angle2);
|
||||
denominator *= libnum::num32(i-1) * libnum::num32(i);
|
||||
|
||||
sum += ( numerator / denominator );
|
||||
denominator *= libnum::num32(i - 1) * libnum::num32(i);
|
||||
sum += (numerator / denominator);
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
libnum::num32 sin_num32( libnum::num32 angle ) {
|
||||
libnum::num32 sin_num32(libnum::num32 angle) {
|
||||
// Taylor serie for cos(x) = x/1! - x³/3! + x⁵/5! - x⁷/7! + x⁹/9! + ...
|
||||
|
||||
if(angle<libnum::num32(0)) return -sin_num32(-angle);
|
||||
// Sine function is odd
|
||||
if (angle < libnum::num32(0))
|
||||
return -sin_num32(-angle);
|
||||
|
||||
libnum::num32 sum = angle;
|
||||
libnum::num32 angle2 = angle*angle;
|
||||
// Look for an angle in the range [0, 2*pi [
|
||||
libnum::num32 anglereduced = angle;
|
||||
while (anglereduced >= libnum::num32(2 * numPI))
|
||||
anglereduced -= libnum::num32(2 * numPI);
|
||||
|
||||
// Exploit the symetry for angle and angle+Pi to reduce the order of the
|
||||
// limited developpement
|
||||
if (anglereduced >= libnum::num(numPI))
|
||||
return -sin_num32(anglereduced - libnum::num(numPI));
|
||||
|
||||
libnum::num32 sum = anglereduced;
|
||||
libnum::num32 angle2 = anglereduced * anglereduced;
|
||||
|
||||
// set first value of the Taylor serie : x¹/1! = x/1
|
||||
libnum::num32 numerator = angle;
|
||||
libnum::num32 numerator = anglereduced;
|
||||
libnum::num32 denominator = libnum::num32(1);
|
||||
|
||||
for(int i=2; i<=8; i+=2 )
|
||||
{
|
||||
for (int i = 2; i <= 8; i += 2) {
|
||||
numerator *= (-angle2);
|
||||
denominator *= libnum::num32(i) * libnum::num32(i+1);
|
||||
|
||||
sum += ( numerator / denominator );
|
||||
denominator *= libnum::num32(i) * libnum::num32(i + 1);
|
||||
sum += (numerator / denominator);
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
class Vector2D {
|
||||
|
||||
public:
|
||||
|
@ -99,14 +119,12 @@ public:
|
|||
|
||||
~Vector2D() {}
|
||||
|
||||
void Set( Vector2D v )
|
||||
{
|
||||
void Set(Vector2D v) {
|
||||
this->x = v.x;
|
||||
this->y = v.y;
|
||||
}
|
||||
|
||||
void Normalise( void )
|
||||
{
|
||||
void Normalise(void) {
|
||||
libnum::num32 len = this->Length();
|
||||
this->x /= len;
|
||||
this->y /= len;
|
||||
|
@ -235,19 +253,20 @@ public:
|
|||
libnum::num32 y;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Vector2D ClosestPointOnSegment(Vector2D P, Vector2D A, Vector2D B ) {
|
||||
Vector2D ClosestPointOnSegment(Vector2D P, Vector2D A, Vector2D B) {
|
||||
Vector2D AB = B - A;
|
||||
|
||||
libnum::num32 t = AB.Dot(AB);
|
||||
|
||||
if (t == 0) return A;
|
||||
|
||||
if (t == 0)
|
||||
return A;
|
||||
|
||||
libnum::num32 t2 = (P.Dot(AB) - A.Dot(AB)) / t;
|
||||
|
||||
if (t2 < libnum::num32(0)) t2 = libnum::num32(0);
|
||||
if (t2 > libnum::num32(1)) t2 = libnum::num32(1);
|
||||
if (t2 < libnum::num32(0))
|
||||
t2 = libnum::num32(0);
|
||||
if (t2 > libnum::num32(1))
|
||||
t2 = libnum::num32(1);
|
||||
|
||||
Vector2D C = A.Clone();
|
||||
C.Add(AB, t2);
|
||||
|
@ -255,5 +274,4 @@ Vector2D ClosestPointOnSegment(Vector2D P, Vector2D A, Vector2D B ) {
|
|||
return C;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue