diff options
| author | jussi | 2022-05-22 14:47:06 +0300 |
|---|---|---|
| committer | jussi | 2022-05-22 14:47:06 +0300 |
| commit | 44e8b06603d91d398c0955f34da33d0242b7551a (patch) | |
| tree | a14e70cc7bff7673ccc5b8a04750ed7aed56b701 /examples | |
| parent | 85fc6cd6a3865f19ceac448dcb33b0c19b8e6b77 (diff) | |
| download | reilua-enhanced-44e8b06603d91d398c0955f34da33d0242b7551a.tar.gz reilua-enhanced-44e8b06603d91d398c0955f34da33d0242b7551a.tar.bz2 reilua-enhanced-44e8b06603d91d398c0955f34da33d0242b7551a.zip | |
Pong example, type named fields and vector lib changes.
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/pong/main.lua | 125 | ||||
| -rw-r--r-- | examples/pong_vec/main.lua | 130 | ||||
| -rw-r--r-- | examples/resources/lib/vector2.lua | 65 | ||||
| -rw-r--r-- | examples/resources/lib/vector3.lua | 81 |
4 files changed, 360 insertions, 41 deletions
diff --git a/examples/pong/main.lua b/examples/pong/main.lua new file mode 100644 index 0000000..ae3c321 --- /dev/null +++ b/examples/pong/main.lua @@ -0,0 +1,125 @@ +-- Settings. +local winSize = { 800, 600 } +local monitor = 0 + +-- Constants. +local PLAYER_SPEED = 300 +local BALL_SPEED = 330 + +-- Game objects. +local playerLeft = { + pos = { 0, 0 }, + size = { 10, 70 }, + score = 0, +} +local playerRight = { + pos = { 0, 0 }, + size = { 10, 70 }, + score = 0, +} +local ball = { + pos = { 0, 0 }, + radius = 8.0, + vel = { 0, 0 }, +} + +local function reset() + -- Initialize player positions. + playerLeft.pos[1] = playerLeft.size[1] + playerLeft.pos[2] = winSize[2] / 2 - playerLeft.size[2] / 2 + + playerRight.pos[1] = winSize[1] - playerRight.size[1] * 2 + playerRight.pos[2] = winSize[2] / 2 - playerRight.size[2] / 2 + + -- Set ball to center. + ball.pos = { winSize[1] / 2, winSize[2] / 2 } + -- Short for if math random result 1, set BALL_SPEED otherwise set -BALL_SPEED. + ball.vel[1] = math.random( 0, 1 ) == 1 and BALL_SPEED or -BALL_SPEED + -- Start slow. + ball.vel[2] = 0 +end + +local function ballHit( padPos, padSize ) + ball.vel[1] = -ball.vel[1] + + local padCenter = padPos[2] + padSize[2] / 2 + local relHitPos = ball.pos[2] - padCenter + ball.vel[2] = BALL_SPEED * relHitPos / padSize[2] * 2 +end + +function init() + -- Set window to center of monitor. + local mPos = RL_GetMonitorPosition( monitor ) + local mSize = RL_GetMonitorSize( monitor ) + + RL_SetWindowSize( winSize ) + RL_SetWindowPosition( { mPos[1] + mSize[1] / 2 - winSize[1] / 2, mPos[2] + mSize[2] / 2 - winSize[2] / 2 } ) + RL_SetWindowTitle( "Pong" ) + + -- Initialize ball pos. + math.randomseed( os.time() ) + reset() +end + +function process( delta ) + -- Left player controls. + if RL_IsKeyDown( string.byte( "W" ) ) and 0 < playerLeft.pos[2] then + playerLeft.pos[2] = playerLeft.pos[2] - PLAYER_SPEED * delta + elseif RL_IsKeyDown( string.byte( "S" ) ) and playerLeft.pos[2] + playerLeft.size[2] < winSize[2] then + playerLeft.pos[2] = playerLeft.pos[2] + PLAYER_SPEED * delta + end + + -- Right player controls. + if RL_IsKeyDown( KEY_UP ) and 0 < playerRight.pos[2] then + playerRight.pos[2] = playerRight.pos[2] - PLAYER_SPEED * delta + elseif RL_IsKeyDown( KEY_DOWN ) and playerRight.pos[2] + playerRight.size[2] < winSize[2] then + playerRight.pos[2] = playerRight.pos[2] + PLAYER_SPEED * delta + end + + -- Move ball. + ball.pos = { ball.pos[1] + ball.vel[1] * delta, + ball.pos[2] + ball.vel[2] * delta } + + -- Bounce from window edge. + if ( ball.pos[2] < ball.radius and ball.vel[2] < 0 ) + or ( winSize[2] < ball.pos[2] + ball.radius and 0 < ball.vel[2] ) then + ball.vel[2] = -ball.vel[2] + end + + -- Bounce from players. + local playerLeftRect = { playerLeft.pos[1], playerLeft.pos[2], + playerLeft.size[1], playerLeft.size[2] } + local playerRightRect = { playerRight.pos[1], playerRight.pos[2], + playerRight.size[1], playerRight.size[2] } + + if RL_CheckCollisionCircleRec( ball.pos, ball.radius, playerLeftRect ) and ball.vel[1] < 0 then + ballHit( playerLeft.pos, playerLeft.size ) + elseif RL_CheckCollisionCircleRec( ball.pos, ball.radius, playerRightRect ) and 0 < ball.vel[1] then + ballHit( playerRight.pos, playerRight.size ) + end + + -- Score. + if ball.pos[1] < 0 then + playerRight.score = playerRight.score + 1 + reset() + elseif winSize[1] < ball.pos[1] then + playerLeft.score = playerLeft.score + 1 + reset() + end +end + +function draw() + RL_ClearBackground( BLACK ) + + -- Draw players. + RL_DrawRectangle( { playerLeft.pos[1], playerLeft.pos[2], playerLeft.size[1], playerLeft.size[2] }, WHITE ) + RL_DrawRectangle( { playerRight.pos[1], playerRight.pos[2], playerRight.size[1], playerRight.size[2] }, WHITE ) + + -- Draw ball. Ball position will be the center in drawCircle. + RL_DrawCircle( ball.pos, ball.radius, WHITE ) + + -- Draw scire + RL_DrawText( 0, playerLeft.score, { 50, 10 }, 40, 2, WHITE ) + local rightTextSize = RL_MeasureText( 0, playerRight.score, 40, 2 ) + RL_DrawText( 0, playerRight.score, { winSize[1] - 50 - rightTextSize[1], 10 }, 40, 2, WHITE ) +end diff --git a/examples/pong_vec/main.lua b/examples/pong_vec/main.lua new file mode 100644 index 0000000..02d6a90 --- /dev/null +++ b/examples/pong_vec/main.lua @@ -0,0 +1,130 @@ +-- Pong example using Vector2 library. + +package.path = package.path..";"..RL_GetBasePath().."../resources/lib/?.lua" + +Vec2 = require "vector2" + +-- Settings. +local winSize = Vec2:new( 800, 600 ) +local monitor = 0 + +-- Constants. +local PLAYER_SPEED = 300 +local BALL_SPEED = 330 + +-- Game objects. +local playerLeft = { + pos = Vec2:new( 0, 0 ), + size = Vec2:new( 10, 70 ), + score = 0, +} +local playerRight = { + pos = Vec2:new( 0, 0 ), + size = Vec2:new( 10, 70 ), + score = 0, +} +local ball = { + pos = Vec2:new( 0, 0 ), + radius = 8.0, + vel = Vec2:new( 0, 0 ), +} + +local function reset() + -- Initialize player positions. + playerLeft.pos.x = playerLeft.size.x + playerLeft.pos.y = winSize.y / 2 - playerLeft.size.y / 2 + + playerRight.pos.x = winSize.x - playerRight.size.x * 2 + playerRight.pos.y = winSize.y / 2 - playerRight.size.y / 2 + + -- Set ball to center. + ball.pos:set( winSize.x / 2, winSize.y / 2 ) + -- Short for if math random result 1, set BALL_SPEED otherwise set -BALL_SPEED. + ball.vel.x = math.random( 0, 1 ) == 1 and BALL_SPEED or -BALL_SPEED + -- Start slow. + ball.vel.y = 0 +end + +local function ballHit( padPos, padSize ) + ball.vel.x = -ball.vel.x + + local padCenter = padPos.y + padSize.y / 2 + local relHitPos = ball.pos.y - padCenter + ball.vel.y = BALL_SPEED * relHitPos / padSize.y * 2 +end + +function init() + -- Set window to center of monitor. + local mPos = Vec2:new( RL_GetMonitorPosition( monitor ) ) + local mSize = Vec2:new( RL_GetMonitorSize( monitor ) ) + + RL_SetWindowSize( winSize ) + RL_SetWindowPosition( { mPos.x + mSize.x / 2 - winSize.x / 2, mPos.y + mSize.y / 2 - winSize.y / 2 } ) + RL_SetWindowTitle( "Pong" ) + + -- Initialize ball pos. + math.randomseed( os.time() ) + reset() +end + +function process( delta ) + -- Left player controls. + if RL_IsKeyDown( string.byte( "W" ) ) and 0 < playerLeft.pos.y then + playerLeft.pos.y = playerLeft.pos.y - PLAYER_SPEED * delta + elseif RL_IsKeyDown( string.byte( "S" ) ) and playerLeft.pos.y + playerLeft.size.y < winSize.y then + playerLeft.pos.y = playerLeft.pos.y + PLAYER_SPEED * delta + end + + -- Right player controls. + if RL_IsKeyDown( KEY_UP ) and 0 < playerRight.pos.y then + playerRight.pos.y = playerRight.pos.y - PLAYER_SPEED * delta + elseif RL_IsKeyDown( KEY_DOWN ) and playerRight.pos.y + playerRight.size.y < winSize.y then + playerRight.pos.y = playerRight.pos.y + PLAYER_SPEED * delta + end + + -- Move ball. + ball.pos = ball.pos + ball.vel:scale( delta ) + + -- Bounce from window edge. + if ( ball.pos.y < ball.radius and ball.vel.y < 0 ) + or ( winSize.y < ball.pos.y + ball.radius and 0 < ball.vel.y ) then + ball.vel.y = -ball.vel.y + end + + -- Bounce from players. + local playerLeftRect = { playerLeft.pos.x, playerLeft.pos.y, + playerLeft.size.x, playerLeft.size.y } + local playerRightRect = { playerRight.pos.x, playerRight.pos.y, + playerRight.size.x, playerRight.size.y } + + if RL_CheckCollisionCircleRec( ball.pos, ball.radius, playerLeftRect ) and ball.vel.x < 0 then + ballHit( playerLeft.pos, playerLeft.size ) + elseif RL_CheckCollisionCircleRec( ball.pos, ball.radius, playerRightRect ) and 0 < ball.vel.x then + ballHit( playerRight.pos, playerRight.size ) + end + + -- Score. + if ball.pos.x < 0 then + playerRight.score = playerRight.score + 1 + reset() + elseif winSize.x < ball.pos.x then + playerLeft.score = playerLeft.score + 1 + reset() + end +end + +function draw() + RL_ClearBackground( BLACK ) + + -- Draw players. + RL_DrawRectangle( { playerLeft.pos.x, playerLeft.pos.y, playerLeft.size.x, playerLeft.size.y }, WHITE ) + RL_DrawRectangle( { playerRight.pos.x, playerRight.pos.y, playerRight.size.x, playerRight.size.y }, WHITE ) + + -- Draw ball. Ball position will be the center in drawCircle. + RL_DrawCircle( ball.pos, ball.radius, WHITE ) + + -- Draw scire + RL_DrawText( 0, playerLeft.score, { 50, 10 }, 40, 2, WHITE ) + local rightTextSize = Vec2:new( RL_MeasureText( 0, playerRight.score, 40, 2 ) ) + RL_DrawText( 0, playerRight.score, { winSize.x - 50 - rightTextSize.x, 10 }, 40, 2, WHITE ) +end diff --git a/examples/resources/lib/vector2.lua b/examples/resources/lib/vector2.lua index 0ea10b9..305f483 100644 --- a/examples/resources/lib/vector2.lua +++ b/examples/resources/lib/vector2.lua @@ -43,6 +43,10 @@ Vector2.meta = { } function Vector2:new( x, y ) + if type( x ) == "table" then + x, y = table.unpack( x ) + end + local o = { x = x, y = y, @@ -51,15 +55,23 @@ function Vector2:new( x, y ) return o end -function Vector2:set( vec ) - self.x = vec[1] - self.y = vec[2] +function Vector2:set( x, y ) + if type( x ) == "table" then + x, y = table.unpack( x ) + end + + self.x = x + self.y = y end function Vector2:arr() return { self.x, self.y } end +function Vector2:unpack() + return self.x, self.y +end + function Vector2:clone() return Vector2:new( self.x, self.y ) end @@ -68,45 +80,64 @@ function Vector2:abs() return Vector2:new( math.abs( self.x ), math.abs( self.y ) ) end +function Vector2:min( v2 ) + return Vector2:new( math.min( self.x, v2.x ), math.min( self.y, v2.y ) ) +end + +function Vector2:max( v2 ) + return Vector2:new( math.max( self.x, v2.x ), math.max( self.y, v2.y ) ) +end + +function Vector2:addValue( value ) + return Vector2:new( RL_Vector2AddValue( self, value ) ) +end + +function Vector2:subValue( value ) + return Vector2:new( RL_Vector2SubtractValue( self, value ) ) +end + function Vector2:length() - return RL_Vector2Length( self:arr() ) + return RL_Vector2Length( self ) +end + +function Vector2:lengthSqr() + return RL_Vector2LengthSqr( self ) end function Vector2:dot( v2 ) - return RL_Vector2DotProduct( self:arr(), v2:arr() ) + return RL_Vector2DotProduct( self, v2 ) end function Vector2:distance( v2 ) - return RL_Vector2Distance( self:arr(), v2:arr() ) + return RL_Vector2Distance( self, v2 ) end function Vector2:angle( v2 ) - return RL_Vector2Angle( self:arr(), v2:arr() ) + return RL_Vector2Angle( self, v2 ) +end + +function Vector2:scale( scale ) + return Vector2:new( RL_Vector2Scale( self, scale ) ) end function Vector2:normalize() - local r = RL_Vector2Normalize( self:arr() ) - return Vector2:new( r[1], r[2] ) + return Vector2:new( RL_Vector2Normalize( self ) ) end function Vector2:lerp( v2, value ) - local r = RL_Vector2Lerp( self:arr(), v2:arr(), value ) - return Vector2:new( r[1], r[2] ) + return Vector2:new( RL_Vector2Lerp( self, v2, value ) ) end function Vector2:reflect( normal ) - local r = RL_Vector2Reflect( self:arr(), normal:arr() ) - return Vector2:new( r[1], r[2] ) + return Vector2:new( RL_Vector2Reflect( self, normal ) ) end function Vector2:rotate( angle ) - local r = RL_Vector2Rotate( self:arr(), angle ) - return Vector2:new( r[1], r[2] ) + return Vector2:new( RL_Vector2Rotate( self, angle ) ) end function Vector2:moveTowards( target, maxDistance ) - local r = RL_Vector2MoveTowards( self:arr(), target:arr(), maxDistance ) - return Vector2:new( r[1], r[2] ) + return Vector2:new( RL_Vector2MoveTowards( self, target, maxDistance ) ) end return Vector2 diff --git a/examples/resources/lib/vector3.lua b/examples/resources/lib/vector3.lua index e3da9f1..b0f1be9 100644 --- a/examples/resources/lib/vector3.lua +++ b/examples/resources/lib/vector3.lua @@ -43,6 +43,10 @@ Vector3.meta = { } function Vector3:new( x, y, z ) + if type( x ) == "table" then + x, y, z = table.unpack( x ) + end + local o = { x = x, y = y, @@ -52,16 +56,24 @@ function Vector3:new( x, y, z ) return o end -function Vector3:set( vec ) - self.x = vec[1] - self.y = vec[2] - self.z = vec[3] +function Vector3:set( x, y, z ) + if type( x ) == "table" then + x, y, z = table.unpack( x ) + end + + self.x = x + self.y = y + self.z = z end function Vector3:arr() return { self.x, self.y, self.z } end +function Vector3:unpack() + return self.x, self.y, self.z +end + function Vector3:clone() return Vector3:new( self.x, self.y, self.z ) end @@ -70,60 +82,81 @@ function Vector3:abs() return Vector3:new( math.abs( self.x ), math.abs( self.y ), math.abs( self.z ) ) end +function Vector3:min( v2 ) + return Vector3:new( RL_Vector3Min( self, v2 ) ) +end + +function Vector3:max( v2 ) + return Vector3:new( RL_Vector3Max( self, v2 ) ) +end + +function Vector3:addValue( value ) + return Vector3:new( RL_Vector3AddValue( self, value ) ) +end + +function Vector3:subValue( value ) + return Vector3:new( RL_Vector3SubtractValue( self, value ) ) +end + +function Vector3:scale( scalar ) + return Vector3:new( RL_Vector3Scale( self, scalar ) ) +end + function Vector3:cross( v2 ) - local r = RL_Vector3CrossProduct( self:arr(), v2:arr() ) - return Vector3:new( r[1], r[2], r[3] ) + return Vector3:new( RL_Vector3CrossProduct( self, v2 ) ) end function Vector3:perpendicular() - local r = RL_Vector3Perpendicular( self:arr() ) - return Vector3:new( r[1], r[2], r[3] ) + return Vector3:new( RL_Vector3Perpendicular( self ) ) end function Vector3:length() - return RL_Vector3Length( self:arr() ) + return RL_Vector3Length( self ) end function Vector3:lengthSqr() - return RL_Vector3LengthSqr( self:arr() ) + return RL_Vector3LengthSqr( self ) end function Vector3:dot( v2 ) - return RL_Vector3DotProduct( self:arr(), v2:arr() ) + return RL_Vector3DotProduct( self, v2 ) end function Vector3:distance( v2 ) - return RL_Vector3Distance( self:arr(), v2:arr() ) + return RL_Vector3Distance( self, v2 ) +end + +function Vector3:angle( v2 ) + return RL_Vector3Angle( self, v2 ) +end + +function Vector3:negate() + return Vector3:new( RL_Vector3Negate( self ) ) end function Vector3:normalize() - local r = RL_Vector3Normalize( self:arr() ) - return Vector3:new( r[1], r[2], r[3] ) + return Vector3:new( RL_Vector3Normalize( self ) ) end function Vector3:orthoNormalize( v2 ) - local r1, r2 = RL_Vector3OrthoNormalize( self:arr(), v2:arr() ) + local r1, r2 = RL_Vector3OrthoNormalize( self, v2 ) return Vector3:new( r1[1], r1[2], r1[3] ), Vector3:new( r2[1], r2[2], r2[3] ) end function Vector3:transform( mat ) - local r = RL_Vector3Transform( self:arr(), mat ) - return Vector3:new( r[1], r[2], r[3] ) + return Vector3:new( RL_Vector3Transform( self, mat ) ) end -function Vector3:rotateByQuaternion( qua ) - local r = RL_Vector3RotateByQuaternion( self:arr(), qua ) - return Vector3:new( r[1], r[2], r[3] ) +function Vector3:rotateByQuaternion( q ) + return Vector3:new( RL_Vector3RotateByQuaternion( self, q ) ) end function Vector3:lerp( v2, value ) - local r = RL_Vector3Lerp( self:arr(), v2:arr(), value ) - return Vector3:new( r[1], r[2], r[3] ) + return Vector3:new( RL_Vector3Lerp( self, v2, value ) ) end function Vector3:reflect( normal ) - local r = RL_Vector3Reflect( self:arr(), normal:arr() ) - return Vector3:new( r[1], r[2], r[3] ) + return Vector3:new( RL_Vector3Reflect( self, normal ) ) end return Vector3 |
