Simple Scaling and Rotating - 1micha.elok - 02-28-2024
Just a simple scaling and rotating
Possible use in games, such as
- Space Invaders, Gargoyle Attack
- Tetris
Code: '==========================================
' SIMPLE SCALING AND ROTATING
'
'Possible use in games, such as
'- Space Invaders, Gargoyle Attack
'- Tetris
'
'Limitation
'Rotate : only multiplication of 90 degree
'==========================================
'----------------
' INITIALIZATION
'----------------
set window "Pixel Art", 150, 150, false,4
set redraw off
'Color definition
visible cBlack = [0,0,0]
visible cGreen = [0,255,0]
'Sprite class definition
Sprite =
[
'--- Properties ---
data: [
[0,0,0,0,0,0,0,0],
[0,0,1,0,0,1,0,0],
[0,1,1,1,1,1,1,0],
[0,1,1,0,0,1,1,0],
[0,0,1,1,1,1,0,0],
[0,1,1,1,1,1,1,0],
[0,1,0,0,0,0,1,0],
[0,0,0,0,0,0,0,0]
],
img: 0, x:0, y:0,
'--- Methods ---
Transform_Scale : function(s)
this.img = Scale(this.data,s)
this.x = (width(primary)-8*s)/2
this.y = (height(primary)-8*s)/2
endfunc,
Transform_Rotate : function(s,r)
this.img = Rotate(this.data,s,r)
this.x = (width(primary)-8*s)/2
this.y = (height(primary)-8*s)/2
endfunc
]
'--------------
' MAIN PROGRAM
'--------------
TitleScreen()
scale = 1
rotate = 0
do
'Prepare screen
set color cBlack; cls
set color cGreen
'Draw Sprite
'Sprite.Transform_Scale(scale)
Sprite.Transform_Rotate(scale,rotate)
draw image Sprite.img,Sprite.x,Sprite.y
'Pause and wait until SPACE BAR is pressed, ESCAPE to quit
set caret width(primary)/2, height(primary)-20
center "SPACE BAR"; redraw
do;wait 1;if keydown(KEY_ESCAPE,true) end;until keydown(KEY_SPACE,true)
if scale < 10 then
scale = scale + 1
else
scale = 1
endif
if rotate < 3 then
rotate = rotate + 1
else
rotate = 0
endif
free image Sprite.img 'free image from memory
loop
'-----------
' FUNCTIONS
'-----------
function Scale(data,s)
img = createimage(8*s,8*s); set image img
for y = 0 to 7
for x = 0 to 7
if data[y][x] then
set color cGreen
else
set color cBlack
endif
draw rect x*s,y*s,s,s,1
next
next
set image primary; return img
endfunc
function Rotate(data,s,r)
img = createimage(8*s,8*s); set image img
for y = 0 to 6
for x = 0 to 6
if data[y][x] then
set color cGreen
else
set color cBlack
endif
'(a,b) = center point of rotation
'(x,y) is rotated into (m,n)
'd = angle of rotation in radian
'm = cos(d)*(x-a)-sin(d)*(y-b)+a
'n = sin(d)*(x-a)+cos(d)*(y-b)+b
a = 3
b = 3
d = r*90*(22/7)/180
m = (round((cos(d)*(x-a))-(sin(d)*(y-b))+a))
n = (round((sin(d)*(x-a))+(cos(d)*(y-b))+b))
draw rect m*s,n*s,s,s,1
next
next
set image primary; return img
endfunc
function TitleScreen()
set caret width(primary)/2,5
center "Scaling and"
center "Rotating"
set caret width(primary)/2, height(primary)-20
center "Press ENTER"
redraw
do;wait 1;until keydown(KEY_RETURN,true)
endfunc
RE: Simple Scaling and Rotating - kevin - 02-28-2024
Very clever - I always get so confused with the maths in code like this, so I am full of admiration for those that can write such code......well done
RE: Simple Scaling and Rotating - Marcus - 02-28-2024
Cool!
You can also use the raster commands for scaling, flipping and 90 degree rotations. The problem is that 'draw hraster' and 'draw vraster' were created with nothing but raycasting and mode7 in mind (they draw textured horizontal and vertical lines). They treat the alpha channel as "fog density". But as long as you don't need to do colorized/additive drawing and the image data only contains pixels with full opacity or full transparency it works.
Code: #win32
set window "Raster scaling", 640, 480
set redraw off
img = loadimage("weird.png")
a = 0 ' angle for sin scale effect.
while not keydown(KEY_ESCAPE)
a = (a + 0.01)%(PI*2)
' calculate width and height.
w = (0.25 + 0.75*(1.0 + sin(a)))*width(img)
h = (0.25 + 0.75*(1.0 + sin(a)))*height(img)
set color 0, 0, 0
cls
' draw centered.
DrawImageScaled(img, (width(primary) - w)/2, (height(primary) - h)/2, w, h)
DrawImageRotated90(img, 0, 0)
redraw
fwait 60
wend
function DrawImageScaled(img, x, y, w, h)
if w <= 0 or h <= 0 return
set color 255, 255, 255, 0
du = 1/w
u = 0
for x = x to x + w - 1
draw vraster img, x, y, y + h - 1, u, 0, u, 1
u = u + du
next
endfunc
function DrawImageRotated90(img, x, y)
set color 255, 255, 255, 0
dv = 1/height(img)
v = 1
for x = x to x + height(img) - 1
draw vraster img, x, y, y + width(img) - 1, 0, v, 1, v
v = v - dv
next
endfunc
Full support for drawing transformed images (scaling + rotating) is at the absolute top of my todo list. It'll run faster than this solution.
RE: Simple Scaling and Rotating - johnno56 - 02-28-2024
This is SO cool... Thank you.
RE: Simple Scaling and Rotating - aliensoldier - 02-28-2024
With so much mathematics I have not understood anything.
RE: Simple Scaling and Rotating - 1micha.elok - 02-29-2024
@Marcus ... thank you for sharing your "Raster Scaling" code. I'm trying to use your code to make the earth looks bigger and bigger. It works !
@Kevin ... I am actually taking a look at the balls' movement in your "Pool Game", and it's far more advanced in trigonometry. I should learn a lot from you then.
@Johnno... One piece of coding a day, keeps my brain awake
@Aliensoldier... I'll give you more maths in the code below
Code: '====================================================
' THE EARTH AND THE SUN
' The earth is bigger and bigger
'
' Author's Note :
' -The Sun https://giphy.com/gifs/nasa-sun-nasagif-1oLeAsuP5UfPK1KR85
' -The Earth https://news.utk.edu/2023/01/25/the-conversation-how-has-the-inside-of-the-earth-stayed-as-hot-as-the-suns-surface-for-billions-of-years/
' -DrawImageScaled() was created by Marcus
'====================================================
'----------------
' INITIALIZATION
'----------------
set window "The Earth and The Sun",800,600
set redraw off
myfont = createfont("Arial", 30, 1,1,0,0)
'color definition
black = [0,0,0]
white = [255,255,255]
visible white_alpha = [255,255,255,0]
'Sprite class definition
Sprite =[
'--- Properties ---
img:0, x:0, y:0, w:0, h:0, f:0,
'--- Methods ------
Draw:function(x,y,w,h)
set color white_alpha; du = 1/w; u = 0
for x = x to x + w - 1
draw vraster this.img, x, y, y + h - 1, u, 0, u, 1; u = u + du
next
endfunc
]
'Initial Value
earth = copy(Sprite)
earth.img = loadimage("img/earth1.png")
sun = copy(Sprite)
sun.img = loadimage("img/sun1.png",10,3)
sun.x = (width(primary)-width(sun.img))/2
sun.y = (height(primary)-height(sun.img))/2
'--------------
' MAIN PROGRAM
'--------------
for angle = 0 to 15*PI step 0.1
'Clear screen
set color black;cls; set color white
'Just random Stars in the background
for j = 1 to 20
r = rnd(2)
draw ellipse rnd(width(primary)),rnd(height(primary)),r,r,1
next
'Animate the sun's sprite sheet
i = i%30
draw image sun.img,sun.x,sun.y,i
i = i + 1
'Moving earth, bigger and bigger
earth.w = width(earth.img)*(0.25+earth.f)
earth.h = height(earth.img)*(0.25+earth.f)
earth.f = earth.f + 0.008
radius = 5 + 2 * angle
earth.x = radius * cos(angle) + (width(primary)-earth.w)/ 2
earth.y = radius * sin(angle) + (height(primary)-earth.h)/ 2
earth.Draw(earth.x, earth.y, earth.w, earth.h)
redraw
fwait 20
next
'Ending text
set color white; set font myfont;
set caret width(primary)/2, height(primary)/2; center "To be Continued..."
temp=rln()'pause
'Clear memory
free image sun.img
free image earth.img
RE: Simple Scaling and Rotating - johnno56 - 03-01-2024
What? No aliens? lol... Very cool... Nicely done!
RE: Simple Scaling and Rotating - 1micha.elok - 03-04-2024
(03-01-2024, 04:33 AM)johnno56 Wrote: What? No aliens? lol... Very cool... Nicely done!
The aliens are coming in a sleepy tunnel
Please take a look at TUNNEL THE GAME
https://naalaa.com/forum/thread-89-post-511.html#pid511
|