added a new table - still some bugs to track

This commit is contained in:
Sylvain PILLOT 2023-05-30 23:29:36 +02:00
parent dedb8cc09c
commit 24016660ff
12 changed files with 488 additions and 189 deletions

View File

@ -23,6 +23,8 @@ set(ASSETS
set(ASSETS_cg
assets-cg/font.png
assets-cg/font_pinball.png
assets-cg/abyss.png
# ...
)

View File

@ -10,7 +10,13 @@ Add targets and enable bonus
Add the possibilty to have connected tables using a kind on tunnel
Add ball launcher with user controle initial velocity
Add ball launcher with user control initial velocity
Add "Board Importation" system with "scanf" feature
[DONE] Create a "Pinball" font
Create text effect like :
- rolling texts
Add Board Importation system with "scanf" feature

BIN
assets-cg/abyss.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

BIN
assets-cg/font_pinball.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,3 +1,8 @@
abyss.png:
type: bopti-image
name_regex: img_abyss
profile: p8
*.png:
type: bopti-image
name_regex: (.*)\.png img_\1

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,3 +1,5 @@
#include "gint/display-cg.h"
#include "gint/display.h"
#include "parameters.h"
#include <azur/azur.h>
@ -29,8 +31,8 @@
#include <vector>
#include <math.h>
#include "tables.h"
#include <math.h>
bool screenshot = false;
bool record = false;
@ -62,30 +64,38 @@ libnum::num32 simWidth;
libnum::num32 simHeight;
/* return the scaled x component of a vector */
uint16_t CX(Vector2D pos) { return (int) (pos.x * cScale); }
uint16_t CX(Vector2D pos) { return (int)(pos.x * cScale) + 25; }
/* return the scaled y component of a vector */
uint16_t CY(Vector2D pos) { return (int) (libnum::num32(azrp_height) - pos.y * cScale); }
/* create the pinball board */
void SetupScene( int which_table ) {
if (which_table==0) Setup_Table_0();
else if (which_table==1) Setup_Table_1();
else if (which_table==2) Setup_Table_2();
else Setup_Table_0();
uint16_t CY(Vector2D pos) {
return (int)(libnum::num32(azrp_height) - pos.y * cScale);
}
void HandleBallBallCollision( Ball *ball1, Ball *ball2 )
{
libnum::num32 restitution = MIN( ball1->restitution, ball2->restitution );
/* create the pinball board */
void SetupScene(int which_table) {
if (which_table == 0)
Setup_Table_0();
else if (which_table == 1)
Setup_Table_1();
else if (which_table == 2)
Setup_Table_2();
else if (which_table == 3)
Setup_Table_3();
else
Setup_Table_0();
}
void HandleBallBallCollision(Ball *ball1, Ball *ball2) {
libnum::num32 restitution = MIN(ball1->restitution, ball2->restitution);
Vector2D dir = ball2->pos - ball1->pos;
libnum::num32 d = dir.Length();
if ( d==libnum::num32(0) || d > (ball1->radius + ball2->radius) ) return;
if (d == libnum::num32(0) || d > (ball1->radius + ball2->radius))
return;
dir.Normalise();
libnum::num32 corr = (ball1->radius + ball2->radius-d) / libnum::num32(2);
libnum::num32 corr = (ball1->radius + ball2->radius - d) / libnum::num32(2);
ball1->pos.Add(dir, -corr);
ball2->pos.Add(dir, corr);
@ -95,42 +105,43 @@ void HandleBallBallCollision( Ball *ball1, Ball *ball2 )
libnum::num32 m1 = ball1->mass;
libnum::num32 m2 = ball2->mass;
libnum::num32 newV1 = (m1*v1 + m2*v2 - m2*(v1-v2)*restitution / (m1+m2) );
libnum::num32 newV2 = (m1*v1 + m2*v2 - m1*(v2-v1)*restitution / (m1+m2) );
libnum::num32 newV1 =
(m1 * v1 + m2 * v2 - m2 * (v1 - v2) * restitution / (m1 + m2));
libnum::num32 newV2 =
(m1 * v1 + m2 * v2 - m1 * (v2 - v1) * restitution / (m1 + m2));
ball1->vel.Add(dir, newV1-v1 );
ball2->vel.Add(dir, newV2-v2 );
ball1->vel.Add(dir, newV1 - v1);
ball2->vel.Add(dir, newV2 - v2);
}
void HandleBallObstacleCollision( Ball *ball, Obstacle obstacle )
{
void HandleBallObstacleCollision(Ball *ball, Obstacle obstacle) {
Vector2D dir = ball->pos - obstacle.pos;
libnum::num32 d = dir.Length();
if ( d==libnum::num32(0) || d > (ball->radius + obstacle.radius) ) return;
if (d == libnum::num32(0) || d > (ball->radius + obstacle.radius))
return;
dir.Normalise();
libnum::num32 corr = ball->radius + obstacle.radius-d;
libnum::num32 corr = ball->radius + obstacle.radius - d;
ball->pos.Add(dir, corr);
libnum::num32 v = ball->vel.Dot(dir);
ball->vel.Add(dir, obstacle.pushVel-v );
MyPinball.score++;
ball->vel.Add(dir, obstacle.pushVel - v);
MyPinball.score += obstacle.points;
}
void HandleBallIslandCollision( Ball *ball, std::vector<Vector2D> island, libnum::num32 rad )
{
void HandleBallIslandCollision(Ball *ball, std::vector<Vector2D> island,
libnum::num32 rad) {
int mod = island.size();
for(int i=0; i<mod; i++ )
{
Vector2D closest = ClosestPointOnSegment( ball->pos, island[i], island[(i+1)%mod] );
for (int i = 0; i < mod; i++) {
Vector2D closest =
ClosestPointOnSegment(ball->pos, island[i], island[(i + 1) % mod]);
Vector2D dir;
dir.SubtractVectors( ball->pos, closest );
dir.SubtractVectors(ball->pos, closest);
libnum::num32 d = dir.Length();
if (!( d==libnum::num32(0) || d > (ball->radius + rad) ))
{
if (!(d == libnum::num32(0) || d > (ball->radius + rad))) {
dir.Normalise();
libnum::num32 corr = ball->radius + rad - d;
@ -139,52 +150,51 @@ void HandleBallIslandCollision( Ball *ball, std::vector<Vector2D> island, libnum
/* Update velocity */
Vector2D radius = closest.Clone();
radius.Add( dir, rad );
radius.Subtract( island[i], libnum::num32(1) );
libnum::num32 v = ball->vel.Dot( dir );
radius.Add(dir, rad);
radius.Subtract(island[i], libnum::num32(1));
libnum::num32 v = ball->vel.Dot(dir);
libnum::num32 newV = ABS(v) * ball->restitution;
ball->vel.Add( dir, newV - v );
ball->vel.Add(dir, newV - v);
}
}
}
void HandleBallFlipperCollision(Ball *ball, Flipper flipper) {
Vector2D closest =
ClosestPointOnSegment(ball->pos, flipper.pos, flipper.getTip());
void HandleBallFlipperCollision( Ball *ball, Flipper flipper )
{
Vector2D closest = ClosestPointOnSegment( ball->pos, flipper.pos, flipper.getTip() );
Vector2D dir;
dir.SubtractVectors( ball->pos, closest );
dir.SubtractVectors(ball->pos, closest);
libnum::num32 d = dir.Length();
if ( d==libnum::num32(0) || d > (ball->radius + flipper.radius) ) return;
if (d == libnum::num32(0) || d > (ball->radius + flipper.radius))
return;
dir.Normalise();
libnum::num32 corr = ball->radius + flipper.radius-d;
libnum::num32 corr = ball->radius + flipper.radius - d;
ball->pos.Add(dir, corr);
/* Update velocity */
Vector2D radius = closest.Clone();
radius.Add( dir, flipper.radius );
radius.Subtract( flipper.pos, libnum::num32(1) );
radius.Add(dir, flipper.radius);
radius.Subtract(flipper.pos, libnum::num32(1));
Vector2D surfaceVel = radius.PerpCW();
surfaceVel.Scale( flipper.currentAngularVelocity );
surfaceVel.Scale(flipper.currentAngularVelocity);
libnum::num32 v = ball->vel.Dot( dir );
libnum::num32 newV = surfaceVel.Dot( dir );
libnum::num32 v = ball->vel.Dot(dir);
libnum::num32 newV = surfaceVel.Dot(dir);
ball->vel.Add( dir, newV - v );
ball->vel.Add(dir, newV - v);
}
void HandleBallBorderCollision( Ball *ball, std::vector<Vector2D> border )
{
void HandleBallBorderCollision(Ball *ball, std::vector<Vector2D> border) {
int mod = border.size();
if (mod<3) return;
if (mod < 3)
return;
/* Find closest segment */
@ -192,18 +202,16 @@ void HandleBallBorderCollision( Ball *ball, std::vector<Vector2D> border )
libnum::num32 minDist = libnum::num32(0);
for( int i=0; i<mod; i++)
{
for (int i = 0; i < mod; i++) {
Vector2D a = border[i];
Vector2D b = border[(i+1) % mod];
Vector2D c = ClosestPointOnSegment( ball->pos, a, b );
Vector2D b = border[(i + 1) % mod];
Vector2D c = ClosestPointOnSegment(ball->pos, a, b);
d.SubtractVectors(ball->pos, c);
libnum::num32 dist = d.Length();
if (i==0 || dist <minDist)
{
if (i == 0 || dist < minDist) {
minDist = dist;
closest.Set( c );
closest.Set(c);
ab.SubtractVectors(b, a);
normal = ab.PerpCW();
}
@ -211,34 +219,30 @@ void HandleBallBorderCollision( Ball *ball, std::vector<Vector2D> border )
/* Push out */
d.SubtractVectors( ball->pos, closest );
d.SubtractVectors(ball->pos, closest);
libnum::num32 dist = d.Length();
if (dist == libnum::num32(0))
{
d.Set( normal );
if (dist == libnum::num32(0)) {
d.Set(normal);
dist = normal.Length();
}
d.Normalise();
if( d.Dot( normal ) >= libnum::num32(0) )
{
if ( dist > ball->radius ) return;
if (d.Dot(normal) >= libnum::num32(0)) {
if (dist > ball->radius)
return;
ball->pos.Add( d, ball->radius - dist );
}
else ball->pos.Add( d, -(ball->radius + dist) );
ball->pos.Add(d, ball->radius - dist);
} else
ball->pos.Add(d, -(ball->radius + dist));
/* Update velocity */
libnum::num32 v = ball->vel.Dot( d );
libnum::num32 v = ball->vel.Dot(d);
libnum::num32 newV = ABS(v) * ball->restitution;
ball->vel.Add( d, newV - v );
ball->vel.Add(d, newV - v);
}
static void hook_prefrag(int id, void *fragment, int size) {
if (!screenshot && !record)
return;
@ -270,29 +274,39 @@ static void hook_prefrag(int id, void *fragment, int size) {
}
}
static void update(float dt)
{
MyPinball.dt = libnum::num32( dt );
static void update(float dt) {
MyPinball.dt = libnum::num32(dt);
for (int i = 0; i < MyPinball.flippers.size(); i++)
MyPinball.flippers[i].Simulate(MyPinball.dt);
for( int i=0; i<MyPinball.flippers.size(); i++ ) MyPinball.flippers[i].Simulate( MyPinball.dt );
for (int i = 0; i < MyPinball.balls.size(); i++) {
/* Update the position of the flippers */
MyPinball.balls[i].Simulate(MyPinball.dt, MyPinball.gravity);
for( int i=0; i<MyPinball.balls.size(); i++ )
{
MyPinball.balls[i].Simulate( MyPinball.dt, MyPinball.gravity );
for( int j=0; j<MyPinball.balls.size(); j++ ) HandleBallBallCollision( &MyPinball.balls[i], &MyPinball.balls[j] );
for( int j=0; j<MyPinball.obstacles.size(); j++ ) HandleBallObstacleCollision( &MyPinball.balls[i], MyPinball.obstacles[j] );
for( int j=0; j<MyPinball.islands.size(); j++ )
{
HandleBallIslandCollision( &MyPinball.balls[i], MyPinball.islands[j], libnum::num(0.01) );
/* Update the balls and check for collisions between balls (if more than two
* balls) */
if (MyPinball.balls.size() >= 2) {
for (int j = 0; j < MyPinball.balls.size(); j++)
HandleBallBallCollision(&MyPinball.balls[i], &MyPinball.balls[j]);
}
for( int j=0; j<MyPinball.flippers.size(); j++ ) HandleBallFlipperCollision( &MyPinball.balls[i], MyPinball.flippers[j] );
/* Check for collision with bumpers (improve the score) */
for (int j = 0; j < MyPinball.obstacles.size(); j++)
HandleBallObstacleCollision(&MyPinball.balls[i], MyPinball.obstacles[j]);
HandleBallBorderCollision( &MyPinball.balls[i], MyPinball.borders );
/* Check for collision with islands (geometric forms to deviate the balls)*/
for (int j = 0; j < MyPinball.islands.size(); j++) {
HandleBallIslandCollision(&MyPinball.balls[i], MyPinball.islands[j],
libnum::num(0.01));
}
/* Check for collision with flippers */
for (int j = 0; j < MyPinball.flippers.size(); j++)
HandleBallFlipperCollision(&MyPinball.balls[i], MyPinball.flippers[j]);
/* Check for collision with the pinball borders */
HandleBallBorderCollision(&MyPinball.balls[i], MyPinball.borders);
}
}
@ -300,69 +314,88 @@ static void render(void) {
azrp_clear(C_BLACK);
if (MyPinball.sideimage != nullptr)
azrp_image_p8(azrp_width - MyPinball.sideimage->width - 25, 5,
MyPinball.sideimage, DIMAGE_NONE);
int mod = MyPinball.borders.size();
for( int i=0; i<MyPinball.borders.size(); i++ ) azrp_line( CX(MyPinball.borders[i]), CY(MyPinball.borders[i]), CX(MyPinball.borders[(i+1) % mod]), CY(MyPinball.borders[(i+1) % mod]), C_WHITE );
for (int i = 0; i < MyPinball.borders.size(); i++)
azrp_line(CX(MyPinball.borders[i]), CY(MyPinball.borders[i]),
CX(MyPinball.borders[(i + 1) % mod]),
CY(MyPinball.borders[(i + 1) % mod]), C_WHITE);
for( int i=0; i<MyPinball.obstacles.size(); i++ ) azrp_filledcircle( CX(MyPinball.obstacles[i].pos), CY(MyPinball.obstacles[i].pos), (int) (MyPinball.obstacles[i].radius*cScale), MyPinball.obstacles[i].color );
for (int i = 0; i < MyPinball.obstacles.size(); i++)
azrp_filledcircle(CX(MyPinball.obstacles[i].pos),
CY(MyPinball.obstacles[i].pos),
(int)(MyPinball.obstacles[i].radius * cScale),
MyPinball.obstacles[i].color);
for( int i=0; i<MyPinball.islands.size(); i++ )
{
for (int i = 0; i < MyPinball.islands.size(); i++) {
int temp = MyPinball.islands[i].size();
for( int j=0; j<temp; j++ ) azrp_line( CX(MyPinball.islands[i][j]), CY(MyPinball.islands[i][j]), CX(MyPinball.islands[i][(j+1)%temp]), CY(MyPinball.islands[i][(j+1)%temp]), C_WHITE );
for (int j = 0; j < temp; j++)
azrp_line(CX(MyPinball.islands[i][j]), CY(MyPinball.islands[i][j]),
CX(MyPinball.islands[i][(j + 1) % temp]),
CY(MyPinball.islands[i][(j + 1) % temp]), C_WHITE);
}
for (int i = 0; i < MyPinball.balls.size(); i++)
azrp_filledcircle(CX(MyPinball.balls[i].pos), CY(MyPinball.balls[i].pos),
(int)(MyPinball.balls[i].radius * cScale),
MyPinball.balls[i].color);
for( int i=0; i<MyPinball.balls.size(); i++ ) azrp_filledcircle( CX(MyPinball.balls[i].pos), CY(MyPinball.balls[i].pos), (int) (MyPinball.balls[i].radius*cScale), MyPinball.balls[i].color );
for( int i=0; i<MyPinball.flippers.size(); i++ )
{
for (int i = 0; i < MyPinball.flippers.size(); i++) {
Vector2D start = MyPinball.flippers[i].pos;
Vector2D end = MyPinball.flippers[i].getTip();
Vector2D end = MyPinball.flippers[i].getTip();
Vector2D SE;
SE.Set( end-start );
SE.Set(end - start);
Vector2D Norm;
Norm.Set( SE.PerpCW() );
Norm.Set(SE.PerpCW());
Norm.Normalise();
Vector2D A = start.Clone();
A.Add( Norm, MyPinball.flippers[i].radius);
A.Add(Norm, MyPinball.flippers[i].radius);
Vector2D B = end.Clone();
B.Add( Norm, MyPinball.flippers[i].radius);
B.Add(Norm, MyPinball.flippers[i].radius);
Vector2D C = end.Clone();
C.Add( Norm, -MyPinball.flippers[i].radius);
C.Add(Norm, -MyPinball.flippers[i].radius);
Vector2D D = start.Clone();
D.Add( Norm, -MyPinball.flippers[i].radius);
D.Add(Norm, -MyPinball.flippers[i].radius);
int Xpoly[4] = { CX(A), CX(B), CX(C), CX(D) };
int Ypoly[4] = { CY(A), CY(B), CY(C), CY(D) };
int Xpoly[4] = {CX(A), CX(B), CX(C), CX(D)};
int Ypoly[4] = {CY(A), CY(B), CY(C), CY(D)};
azrp_filledpoly(Xpoly, Ypoly, 4, MyPinball.flippers[i].color );
azrp_filledpoly(Xpoly, Ypoly, 4, MyPinball.flippers[i].color);
azrp_filledcircle( CX(start), CY(start), (int) (MyPinball.flippers[i].radius*cScale), MyPinball.flippers[i].color );
azrp_filledcircle( CX(end), CY(end), (int) (MyPinball.flippers[i].radius*cScale), MyPinball.flippers[i].color );
azrp_line(CX(start), CY(start), CX(end), CY(end), MyPinball.flippers[i].color );
azrp_filledcircle(CX(start), CY(start),
(int)(MyPinball.flippers[i].radius * cScale),
MyPinball.flippers[i].color);
azrp_filledcircle(CX(end), CY(end),
(int)(MyPinball.flippers[i].radius * cScale),
MyPinball.flippers[i].color);
azrp_line(CX(start), CY(start), CX(end), CY(end),
MyPinball.flippers[i].color);
}
azrp_draw_text(150, 0, "FPS = %.0f - Mem Free = %d", (float)(1.0f / elapsedTime), _uram_stats->free_memory + extram_stats->free_memory);
azrp_draw_text(150, 0, "FPS = %.0f - Mem Free = %d",
(float)(1.0f / elapsedTime),
_uram_stats->free_memory + extram_stats->free_memory);
azrp_draw_text(150, 20, "Score : %d", MyPinball.score );
azrp_draw_pinball(220, 200, RGB565_DEEPPURPLE, "Score:%d", MyPinball.score);
/*
azrp_draw_text(150, 40, "Ball1 : " );
azrp_draw_text(200, 40, "X = : %.2f", (float) MyPinball.balls[0].pos.x );
azrp_draw_text(200, 50, "Y = : %.2f", (float) MyPinball.balls[0].pos.y );
azrp_draw_text(150, 40, "Ball1 : " );
azrp_draw_text(200, 40, "X = : %.2f", (float) MyPinball.balls[0].pos.x );
azrp_draw_text(200, 50, "Y = : %.2f", (float) MyPinball.balls[0].pos.y );
azrp_draw_text(150, 70, "Ball2 : " );
azrp_draw_text(200, 70, "X = : %.2f", (float) MyPinball.balls[1].pos.x );
azrp_draw_text(200, 80, "Y = : %.2f", (float) MyPinball.balls[1].pos.y );
azrp_draw_text(150, 70, "Ball2 : " );
azrp_draw_text(200, 70, "X = : %.2f", (float) MyPinball.balls[1].pos.x );
azrp_draw_text(200, 80, "Y = : %.2f", (float) MyPinball.balls[1].pos.y );
*/
}
static void get_inputs(float dt) {
/* EXIT THE GAME */
@ -373,44 +406,43 @@ static void get_inputs(float dt) {
/* LEFT FLIPPER */
if (MyKeyboard.IsKeyPressed(MYKEY_F1)) {
for(int i=0; i<MyPinball.flippers.size();i++)
if (MyPinball.flippers[i].side == LEFT)
MyPinball.flippers[i].touchIdentifier = libnum::num32(0);
}
else {
for(int i=0; i<MyPinball.flippers.size();i++)
if (MyPinball.flippers[i].side == LEFT)
MyPinball.flippers[i].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(0);
} else {
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)) {
for(int i=0; i<MyPinball.flippers.size();i++)
if (MyPinball.flippers[i].side == RIGHT)
MyPinball.flippers[i].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 {
for (int i = 0; i < MyPinball.flippers.size(); i++)
if (MyPinball.flippers[i].side == RIGHT)
MyPinball.flippers[i].touchIdentifier = libnum::num32(-1);
}
else {
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_F2)) {
SetupScene(0);
if (MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_F2)) {
SetupScene(0);
}
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_F3)) {
SetupScene(1);
if (MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_F3)) {
SetupScene(1);
}
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_F4)) {
SetupScene(2);
if (MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_F4)) {
SetupScene(2);
}
if (MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_F5)) {
SetupScene(3);
}
#if (DEBUG_MODE)
if (MyKeyboard.IsKeyPressed(MYKEY_OPTN) &&
@ -544,11 +576,11 @@ int main(void) {
prof_leave(perf_render);
time_render = prof_time(perf_render);
/* elapsedTime expressed in microseconds when coming from the libprof high
* accuracy time measurement */
// elapsedTime = ((float)(time_update + time_render)) / 1000000.0f;
/* elapsedTime expressed in microseconds when coming from the libprof high accuracy time measurement */
//elapsedTime = ((float)(time_update + time_render)) / 1000000.0f;
elapsedTime = ((float) 1.0f/60.0f);
elapsedTime = ((float)1.0f / 60.0f);
} while (exitToOS == false);

View File

@ -1,6 +1,8 @@
#ifndef PINBALL_ENTITIES_H
#define PINBALL_ENTITIES_H
#include "gint/defs/types.h"
#include "gint/display-cg.h"
#include "stdint-gcc.h"
#include "utilities.h"
#include "vector2D.h"
@ -42,11 +44,12 @@ public:
class Obstacle {
public:
Obstacle(libnum::num32 radius, Vector2D pos, libnum::num32 pushVel, uint16_t color) {
Obstacle(libnum::num32 radius, Vector2D pos, libnum::num32 pushVel, uint16_t color, uint16_t points) {
this->radius = radius;
this->pos = pos.Clone();
this->pushVel = pushVel;
this->color = color;
this->points = points;
}
Obstacle() {}
@ -54,6 +57,7 @@ public:
libnum::num32 radius, pushVel;
Vector2D pos;
uint16_t color;
uint16_t points;
};
@ -111,6 +115,7 @@ public:
};
struct Scene
{
Vector2D gravity;
@ -122,6 +127,7 @@ struct Scene
std::vector<Obstacle> obstacles;
std::vector< std::vector<Vector2D> > islands;
std::vector<Flipper> flippers;
bopti_image_t *sideimage;
};

View File

@ -13,6 +13,10 @@ extern libnum::num32 cScale;
extern libnum::num32 simWidth;
extern libnum::num32 simHeight;
extern bopti_image_t img_abyss;
void Setup_Table_0(void) {
libnum::num32 offset = libnum::num32(0.02);
@ -24,6 +28,8 @@ void Setup_Table_0(void) {
MyPinball.score = 0;
MyPinball.gravity.Set(Vector2D(libnum::num32(0.0), libnum::num32(-1.0)));
MyPinball.sideimage = nullptr;
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)));
@ -45,10 +51,10 @@ void Setup_Table_0(void) {
MyPinball.balls.push_back( Ball(ball_radius, ball_mass, ball_pos2, ball_vel2, 0.2, RGB565_BLOODYRED ));
MyPinball.obstacles.clear();
MyPinball.obstacles.push_back( Obstacle(0.1, Vector2D(libnum::num32(0.25), libnum::num32(0.6)), 2.0, RGB565_OCEANBLUE));
MyPinball.obstacles.push_back( Obstacle(0.1, Vector2D(libnum::num32(0.75), libnum::num32(0.5)), 2.0, RGB565_OCEANBLUE));
MyPinball.obstacles.push_back( Obstacle(0.12, Vector2D(libnum::num32(0.7), libnum::num32(1.0)), 2.0, RGB565_OCEANBLUE));
MyPinball.obstacles.push_back( Obstacle(0.1, Vector2D(libnum::num32(0.2), libnum::num32(1.2)), 2.0, RGB565_OCEANBLUE));
MyPinball.obstacles.push_back( Obstacle(0.10, Vector2D(libnum::num32(0.25), libnum::num32(0.6)), 2.0, RGB565_OCEANBLUE, 25));
MyPinball.obstacles.push_back( Obstacle(0.10, Vector2D(libnum::num32(0.75), libnum::num32(0.5)), 2.0, RGB565_OCEANBLUE, 25));
MyPinball.obstacles.push_back( Obstacle(0.12, Vector2D(libnum::num32(0.70), libnum::num32(1.0)), 2.0, RGB565_OCEANBLUE, 25));
MyPinball.obstacles.push_back( Obstacle(0.10, Vector2D(libnum::num32(0.20), libnum::num32(1.2)), 2.0, RGB565_OCEANBLUE, 25));
for(int i=0; i<MyPinball.islands.size(); i++ ) MyPinball.islands[i].clear();
MyPinball.islands.clear();
@ -85,7 +91,8 @@ void Setup_Table_1(void) {
MyPinball.score = 0;
MyPinball.gravity.Set(Vector2D(libnum::num32(0.0), libnum::num32(-1.0)));
MyPinball.sideimage = nullptr;
MyPinball.borders.clear();
MyPinball.borders.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
@ -119,14 +126,14 @@ void Setup_Table_1(void) {
MyPinball.obstacles.clear();
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.13), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.87), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.60)), 1.5, RGB565_GREEN));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.60)), 1.5, RGB565_GREEN));
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.13), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.87), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
for(int i=0; i<MyPinball.islands.size(); i++ ) MyPinball.islands[i].clear();
MyPinball.islands.clear();
@ -157,6 +164,7 @@ void Setup_Table_2(void) {
MyPinball.score = 0;
MyPinball.gravity.Set(Vector2D(libnum::num32(0.0), libnum::num32(-1.0)));
MyPinball.sideimage = nullptr;
MyPinball.borders.clear();
MyPinball.borders.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
@ -190,14 +198,14 @@ void Setup_Table_2(void) {
MyPinball.obstacles.clear();
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5, RGB565_RED));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.13), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.87), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.60)), 1.5, RGB565_GREEN));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.60)), 1.5, RGB565_GREEN));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.13), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.87), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
for(int i=0; i<MyPinball.islands.size(); i++ ) MyPinball.islands[i].clear();
@ -233,4 +241,224 @@ void Setup_Table_2(void) {
MyPinball.flippers.push_back(Flipper( flip_radius, flip_pos2, flip_length, libnum::num32(PI) + flip_restAngle, -flip_maxRotation, flip_angularVelocity, flip_restitution, RIGHT, RGB565_OCEANBLUE));
}
void Setup_Table_3(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(-1.0)));
MyPinball.sideimage = &img_abyss;
MyPinball.borders.clear();
MyPinball.borders.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.98), libnum::num32(0.40)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.98), libnum::num32(1.20)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.96), libnum::num32(1.34)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.90), libnum::num32(1.46)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.81), libnum::num32(1.56)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.70), libnum::num32(1.64)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.57), libnum::num32(1.68)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.43), libnum::num32(1.68)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.30), libnum::num32(1.64)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.19), libnum::num32(1.56)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.10), libnum::num32(1.46)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.04), libnum::num32(1.34)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.02), libnum::num32(1.20)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.02), libnum::num32(0.40)));
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.02)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.02)));
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.70), libnum::num32(0.70));
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, RGB565_LEMONYELLOW));
Vector2D ball_pos2(libnum::num32(0.30), libnum::num32(0.70));
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, RGB565_LEMONYELLOW ));
MyPinball.obstacles.clear();
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.30), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.70), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
for( int i=0; i<MyPinball.islands.size(); i++ ) MyPinball.islands[i].clear();
MyPinball.islands.clear();
std::vector<Vector2D> island1;
island1.push_back( Vector2D(libnum::num32(0.50), libnum::num32(1.10)) );
island1.push_back( Vector2D(libnum::num32(0.40), libnum::num32(1.20)) );
island1.push_back( Vector2D(libnum::num32(0.50), libnum::num32(1.30)) );
island1.push_back( Vector2D(libnum::num32(0.60), libnum::num32(1.20)) );
MyPinball.islands.push_back( island1 );
std::vector<Vector2D> island2;
island2.push_back( Vector2D(libnum::num32(0.50), libnum::num32(0.60)) );
island2.push_back( Vector2D(libnum::num32(0.40), libnum::num32(0.80)) );
island2.push_back( Vector2D(libnum::num32(0.50), libnum::num32(0.82)) );
island2.push_back( Vector2D(libnum::num32(0.60), libnum::num32(0.80)) );
MyPinball.islands.push_back( island2 );
std::vector<Vector2D> island3;
island3.push_back( Vector2D(libnum::num32(0.12), libnum::num32(0.45)) );
island3.push_back( Vector2D(libnum::num32(0.12), libnum::num32(0.65)) );
island3.push_back( Vector2D(libnum::num32(0.26), libnum::num32(0.37)) );
MyPinball.islands.push_back( island3 );
std::vector<Vector2D> island4;
island4.push_back( Vector2D(libnum::num32(0.88), libnum::num32(0.65)) );
island4.push_back( Vector2D(libnum::num32(0.88), libnum::num32(0.45)) );
island4.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.37)) );
MyPinball.islands.push_back( island4 );
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, RGB565_OCEANBLUE));
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, RGB565_OCEANBLUE));
}
void Setup_Table_4(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(-1.0)));
MyPinball.sideimage = &img_abyss;
MyPinball.borders.clear();
MyPinball.borders.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.98), libnum::num32(0.40)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.98), libnum::num32(1.20)));
// MyPinball.borders.push_back( Vector2D(libnum::num32(0.96), libnum::num32(1.34)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.99), libnum::num32(1.20)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.99), libnum::num32(0.10)));
MyPinball.borders.push_back( Vector2D(libnum::num32(1.10), libnum::num32(0.10)));
MyPinball.borders.push_back( Vector2D(libnum::num32(1.10), libnum::num32(1.20)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.90), libnum::num32(1.46)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.81), libnum::num32(1.56)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.70), libnum::num32(1.64)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.57), libnum::num32(1.68)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.43), libnum::num32(1.68)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.30), libnum::num32(1.64)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.19), libnum::num32(1.56)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.10), libnum::num32(1.46)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.04), libnum::num32(1.34)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.02), libnum::num32(1.20)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.02), libnum::num32(0.40)));
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.02)));
MyPinball.borders.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.02)));
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.70), libnum::num32(0.70));
// Vector2D ball_vel1(libnum::num32(0.2), libnum::num32(3.5));
Vector2D ball_pos1(libnum::num32(1.05), libnum::num32(0.15));
Vector2D ball_vel1(libnum::num32(0.0), libnum::num32(3.5));
MyPinball.balls.push_back( Ball(ball_radius, ball_mass, ball_pos1, ball_vel1, 0.2, RGB565_LEMONYELLOW));
Vector2D ball_pos2(libnum::num32(0.30), libnum::num32(0.70));
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, RGB565_LEMONYELLOW ));
MyPinball.obstacles.clear();
MyPinball.obstacles.reserve( 16 );
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.06, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5, RGB565_RED, 100));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.80)), 1.5, RGB565_LEMONYELLOW, 25));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.30), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
MyPinball.obstacles.push_back( Obstacle(0.04, Vector2D(libnum::num32(0.70), libnum::num32(0.60)), 1.5, RGB565_GREEN, 10));
for( int i=0; i<MyPinball.islands.size(); i++ ) MyPinball.islands[i].clear();
MyPinball.islands.clear();
std::vector<Vector2D> island1;
island1.push_back( Vector2D(libnum::num32(0.50), libnum::num32(1.10)) );
island1.push_back( Vector2D(libnum::num32(0.40), libnum::num32(1.20)) );
island1.push_back( Vector2D(libnum::num32(0.50), libnum::num32(1.30)) );
island1.push_back( Vector2D(libnum::num32(0.60), libnum::num32(1.20)) );
MyPinball.islands.push_back( island1 );
std::vector<Vector2D> island2;
island2.push_back( Vector2D(libnum::num32(0.50), libnum::num32(0.60)) );
island2.push_back( Vector2D(libnum::num32(0.40), libnum::num32(0.80)) );
island2.push_back( Vector2D(libnum::num32(0.50), libnum::num32(0.82)) );
island2.push_back( Vector2D(libnum::num32(0.60), libnum::num32(0.80)) );
MyPinball.islands.push_back( island2 );
std::vector<Vector2D> island3;
island3.push_back( Vector2D(libnum::num32(0.12), libnum::num32(0.45)) );
island3.push_back( Vector2D(libnum::num32(0.12), libnum::num32(0.65)) );
island3.push_back( Vector2D(libnum::num32(0.26), libnum::num32(0.37)) );
MyPinball.islands.push_back( island3 );
std::vector<Vector2D> island4;
island4.push_back( Vector2D(libnum::num32(0.88), libnum::num32(0.65)) );
island4.push_back( Vector2D(libnum::num32(0.88), libnum::num32(0.45)) );
island4.push_back( Vector2D(libnum::num32(0.74), libnum::num32(0.37)) );
MyPinball.islands.push_back( island4 );
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, RGB565_OCEANBLUE));
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, RGB565_OCEANBLUE));
}
#endif

View File

@ -25,6 +25,26 @@ void azrp_draw_text(int x, int y, char const *fmt, ...)
}
}
void azrp_draw_pinball(int x, int y, uint16_t color, char const *fmt, ...)
{
char str[128];
va_list args;
va_start(args, fmt);
vsnprintf(str, 128, fmt, args);
va_end(args);
extern bopti_image_t img_font_pinball;
for(int i = 0; str[i]; i++) {
if(str[i] < 32 || str[i] >= 0x7f) continue;
int row = (str[i] - 32) >> 4;
int col = (str[i] - 32) & 15;
azrp_subimage_p8_dye(x + 11 * i, y, &img_font_pinball, 14 * col + 1, 20 * row + 2, 11, 14, IMAGE_DYE, color);
}
}
libnum::num32 COS( libnum::num32 angle )
{