Page 1 of 1
Auto-scale a scene?
Posted: Mon Jul 04, 2016 9:39 am
by InterGeek
Sorry for my english, i hope you understand my question/problem
Is there any way to auto scale the render scene, like ScaleManager in phaser.js? (
http://phaser.io/docs/2.4.4/Phaser.ScaleManager.html )? Here is a example what i mean
code:
http://pastebin.com/Au4PJEzb
game:
http://www.intergeek.de/blocks/blocks.html
This example has a 400px x 600px resolution and automatic scale to any other highter or lower resolution. Is this possible in SpiderBasic?I think Pixi.js can resize the output.
Re: Auto-scale a scene?
Posted: Mon Jul 04, 2016 10:00 am
by Fred
For now it's not possible directly with SB internal commands, but it's a great idea for addition, considering all different output available.
Re: Auto-scale a scene?
Posted: Mon Jul 04, 2016 9:11 pm
by InterGeek
Hi Fred, thanks.
Fred wrote:For now it's not possible directly with SB internal commands
and direct with JavaScript in SB code? SB use pixi.js for graphics and pixi.js have the function stage.scale and renderer.resize. Any way to use it?
Code: Select all
// Example for PIXI.JS
function resize() {
// Determine which screen dimension is most constrained
ratio = XXXX
// Scale the view appropriately to fill that dimension
stage.scale.x = stage.scale.y = ratio;
// Update the renderer dimensions
renderer.resize(Math.ceil(GAME_WIDTH * ratio),
Math.ceil(GAME_HEIGHT * ratio));
}
source
http://rocketshipgames.com/tmp/20150908-pixi-scaling/
Re: Auto-scale a scene?
Posted: Mon Jul 04, 2016 11:09 pm
by falsam
Hi InterGeek.
■
Small demonstration
http://purebasic.chat/sb.factory/resizescreen.html
■
Insert this code.Code: Select all
Procedure resizeScreen(Center.b = #False)
!var canvas = document.getElementsByTagName("CANVAS")[0];
!var canvasRatio = canvas.height / canvas.width;
!var windowRatio = window.innerHeight / window.innerWidth;
!var width;
!var height;
!if (windowRatio < canvasRatio) {
! height = window.innerHeight;
! width = height / canvasRatio;
!} else {
! width = window.innerWidth;
! height = width * canvasRatio;
!}
!canvas.style.width = width + 'px';
!canvas.style.height = height + 'px';
If Center = #True
! var style = canvas.style;
! style.marginLeft = "auto";
! style.marginRight = "auto";
! var parentStyle = canvas.parentElement.style;
! parentStyle.textAlign = "center";
! parentStyle.width = "100%";
EndIf
EndProcedure
■
And after ?
Insert
resizeScreen(#True) or
resizeScreen(#False) into your game loop.
■
Bonus.
-If you want to remove the blue background
!$('html').css('background-image', 'none');
-If you want to Change background color
!$('html').css('background-color', '#E2C29E');
■
Sample code of this awful demonstration.
Code: Select all
Declare loadAssets()
Declare onLoadSuccess()
Declare onLoadError()
Declare gameLoop()
Declare resizeScreen(Center.b = #False)
Structure newSprite
id.i
x.i
y.i
vy.i
EndStructure
Global ball.newSprite
Global background, demo
OpenScreen(400, 600, 32, "")
;If you want to remove the blue background
!$('html').css('background-image', 'none');
;If you want to Change background color
!$('html').css('background-color', '#E2C29E');
BindEvent(#PB_Event_Loading, @onLoadSuccess())
BindEvent(#PB_Event_LoadingError, @onLoadError())
BindEvent(#PB_Event_RenderFrame, @gameLoop())
loadAssets()
Procedure loadAssets()
background = LoadSprite(#PB_Any, "assets/sprites/background.png", #PB_Sprite_AlphaBlending)
demo = LoadSprite(#PB_Any, "assets/sprites/demo.png", #PB_Sprite_AlphaBlending)
ball\id = LoadSprite(#PB_Any, "assets/sprites/ball.png", #PB_Sprite_AlphaBlending)
EndProcedure
Procedure onLoadSuccess()
Static CountElement
CountElement + 1
If IsSprite(ball\id)
With Ball
\x = 200
\y = 150
\vy = 3
EndWith
EndIf
If IsSprite(demo)
RotateSprite(demo, -15, #PB_Absolute)
EndIf
If CountElement = 3
FlipBuffers()
EndIf
EndProcedure
Procedure onLoadError()
EndProcedure
Procedure gameLoop()
resizeScreen(#True)
ClearScreen(RGB(205, 92, 92))
DisplayTransparentSprite(background, 0, 0)
DisplayTransparentSprite(demo, 10, 20)
RotateSprite(ball\id, 1, #PB_Relative)
DisplayTransparentSprite(ball\id, ball\x, ball\y)
With ball
\y + \vy
If \y < 0 Or \y > ScreenHeight() - 100
\vy * -1
EndIf
EndWith
FlipBuffers()
EndProcedure
Procedure resizeScreen(Center.b = #False)
!var canvas = document.getElementsByTagName("CANVAS")[0];
!var canvasRatio = canvas.height / canvas.width;
!var windowRatio = window.innerHeight / window.innerWidth;
!var width;
!var height;
!if (windowRatio < canvasRatio) {
! height = window.innerHeight;
! width = height / canvasRatio;
!} else {
! width = window.innerWidth;
! height = width * canvasRatio;
!}
!canvas.style.width = width + 'px';
!canvas.style.height = height + 'px';
If Center = #True
! var style = canvas.style;
! style.marginLeft = "auto";
! style.marginRight = "auto";
! var parentStyle = canvas.parentElement.style;
! parentStyle.textAlign = "center";
! parentStyle.width = "100%";
EndIf
EndProcedure
■
Code and assets.
https://github.com/falsam/SpiderBasic-R ... master.zip
Re: Auto-scale a scene?
Posted: Mon Jul 04, 2016 11:19 pm
by InterGeek
@falsam
Thank you!!!