UnderwareDESIGN

PlayBASIC => Resources => Source Codes => Topic started by: stef on October 31, 2005, 05:49:31 PM

Title: "tech" demo: motor-engine 001
Post by: stef on October 31, 2005, 05:49:31 PM
Hi!

This is my first program!

It shows something like a machine.
It is not quite correct, but it works.

Some remarks:

Mouse controlled
Realtime calculation (no look-up tables)
Graphics of Playbasic (no extern graphics to load)
"Aquarium-Effect" by using alpha-blending (SpriteAlphaLevel)
Rotation-speed goes from 1 - 12 (degrees)


Greetings
stef



[pbcode]
; PROJECT : motor-engine 001
; AUTHOR  : stef
; CREATED : 26.10.2005
; EDITED  : 31.10.2005
; ---------------------------------------------------------------------
RemStart

Demo

This program shows something like a machine
Some remarks:

Mouse controlled
Realtime calculation (no look-up tables)
Graphics of Playbasic (no extern graphics to load)
"Aquarium-Effect" by using alpha-blending (SpriteAlphaLevel)
Rotation-speed goes from 1 - 12 (degrees)


RemEnd

;GRAPHICS

;cylinder housing  back

cyl_back_image=GetFreeImage()
CreateImage cyl_back_image,100,160
RenderToImage cyl_back_image

For x=0 To 49
   BoxC  0+x,0,100-x,160,1,RGB(3*x,3*x,3*x)
   Next x
BoxC 0,0,10,160,1,RGB(20,20,20)
BoxC 90,0,100,160,1,RGB(20,20,20)
BoxC 0,0,100,10,1,RGB(20,20,20)

PrepareFXImage cyl_back_image
cyl_back_sprite=GetFreeSprite()
CreateSprite cyl_back_sprite
SpriteImage cyl_back_sprite,cyl_back_image
SpriteDrawMode cyl_back_sprite,2


;cylinder housing  front

cyl_front_image=GetFreeImage()
CreateImage cyl_front_image,100,160
RenderToImage cyl_front_image

For x=0 To 49
   BoxC  0+x,0,100-x,160,1,RGB(30+3*x,30+3*x,30+3*x)
   Next x
   
For x=0 To 49
   BoxC  0+x,0,100-x,10,1,RGB(3*x,3*x,3*x)
   Next x

PrepareFXImage cyl_front_image
cyl_front_sprite=GetFreeSprite()
CreateSprite cyl_front_sprite
SpriteImage cyl_front_sprite,cyl_front_image
SpriteDrawMode cyl_front_sprite,2+4


;piston

piston_image=GetFreeImage()
CreateImage piston_image,80,70
RenderToImage piston_image


BoxC 30,0,50,50,1,RGB(40,40,40)
CircleC 40,50,12,1,RGB(40,40,40)
CircleC 40,50,8,1,RGB(30,30,50)

For x=0 To 39
   BoxC  0+x,0,80-x,30,1,RGB(3*x,3*x,3*x)
   Next x

PrepareFXImage piston_image
piston_sprite=GetFreeSprite()
CreateSprite piston_sprite
SpriteImage piston_sprite,piston_image
SpriteDrawMode piston_sprite,2

;"pressure"
pressure_image=GetFreeImage()
CreateImage pressure_image,79,160
RenderToImage pressure_image
   
BoxC  0,0,80,60,1,RGB(250,0,0)
   
PrepareFXImage pressure_image
pressure_sprite=GetFreeSprite()
CreateSprite pressure_sprite
SpriteImage pressure_sprite,pressure_image
SpriteDrawMode pressure_sprite,2+1024


;flywheel

flywheel_image=GetFreeImage()
CreateImage flywheel_image,200,200
RenderToImage flywheel_image


CircleC 100,100,100,1,RGB(40,40,40)
CircleC 100,100,90,1,RGB(80,80,80)

CircleC 140,60,25,1,0
CircleC 140,140,25,1,0
CircleC 60,60,25,1,0
CircleC 60,140,25,1,0

CircleC 100,100,25,1,RGB(50,50,50)
CircleC 100,100,8,1,RGB(30,30,30)

PrepareFXImage flywheel_image
flywheel_sprite=GetFreeSprite()
CreateSprite flywheel_sprite
SpriteImage flywheel_sprite,flywheel_image
SpriteDrawMode flywheel_sprite,2
CenterSpriteHandle flywheel_sprite

;rod

rod_image=GetFreeImage()
CreateImage rod_image,205,21
RenderToImage rod_image

BoxC 14,6,191,14,1,RGB (150,20,20)
CircleC 10,10,10,1,RGB (150,20,20)
CircleC 191,10,10,1,RGB (150,20,20)
CircleC 10,10,6,1,RGB (30,30,30)
CircleC 191,10,6,1,RGB (30,30,30)

PrepareFXImage rod_image
rod_sprite=GetFreeSprite()
CreateSprite rod_sprite
SpriteImage rod_sprite,rod_image
SpriteDrawMode rod_sprite,2
SpriteHandle rod_sprite,-10,-10

;startbutton

startbutton_image=GetFreeImage()
CreateImage startbutton_image, 50,50
RenderToImage startbutton_image

CircleC 25,25,24,1,RGB (0,200,0)
CenterText 25,20,"START"

PrepareFXImage startbutton_image
startbutton_sprite=GetFreeSprite()
CreateSprite startbutton_sprite
SpriteImage startbutton_sprite,startbutton_image
SpriteDrawMode startbutton_sprite,2

;stopbutton

stopbutton_image=GetFreeImage()
CreateImage stopbutton_image, 50,50
RenderToImage stopbutton_image

CircleC 25,25,24,1,RGB (200,0,0)
CenterText 25,20,"STOP"

PrepareFXImage stopbutton_image
stopbutton_sprite=GetFreeSprite()
CreateSprite stopbutton_sprite
SpriteImage stopbutton_sprite,stopbutton_image
SpriteDrawMode stopbutton_sprite,2

;acceleratebutton

accelerate_image=GetFreeImage()
CreateImage accelerate_image, 50,50
RenderToImage accelerate_image

TriC  0,50,50,50,25,0,RGB (0,200,0,)
CenterText 25,25,"+"

PrepareFXImage accelerate_image
accelerate_sprite=GetFreeSprite()
CreateSprite accelerate_sprite
SpriteImage accelerate_sprite,accelerate_image
SpriteDrawMode accelerate_sprite,2

;breakbutton

break_image=GetFreeImage()
CreateImage break_image, 50,50
RenderToImage break_image

TriC  0,0,50,0,25,50,RGB (200,0,0,)
CenterText 25,10,"-"

PrepareFXImage break_image
break_sprite=GetFreeSprite()
CreateSprite break_sprite
SpriteImage break_sprite,break_image
SpriteDrawMode break_sprite,2

;colouredtriangle
colour_image=GetFreeImage()
CreateImage colour_image,200,200
RenderToImage colour_image

TriC 100,100,200,100, CosNewValue(100,120,100),SinNewValue(100,120,100),RGB(200,200,0)
TriC 100,100,200,100, CosNewValue(100,-120,100),SinNewValue(100,-120,100),RGB(200,0,200)
TriC 100,100,CosNewValue(100,120,100),SinNewValue(100,120,100),CosNewValue(100,-120,100),SinNewValue(100,-120,100),RGB(0,200,200)

PrepareFXImage colour_image
colour_sprite=GetFreeSprite()
CreateSprite colour_sprite
SpriteImage colour_sprite,colour_image
SpriteDrawMode colour_sprite,2
CenterSpriteHandle colour_sprite

;transmission
transmission_image=GetFreeImage()
CreateImage transmission_image,350,50
RenderToImage transmission_image

LineC 25,5,325,45,RGB(30,30,30)
LineC 25,45,325,5,RGB(30,30,30)
CircleC 25,25,25,1,RGB(50,50,50)
CircleC 25,25,8,1,RGB(30,30,30)
CircleC 325,25,25,1,RGB(50,50,50)
CircleC 325,25,8,1,RGB(30,30,30)


PrepareFXImage transmission_image
transmission_sprite=GetFreeSprite()
CreateSprite transmission_sprite
SpriteImage transmission_sprite,transmission_image
SpriteDrawMode transmission_sprite,0
CenterSpriteHandle transmission_sprite


angle=0
speed=0
AlphaLevel#=1.0
corr#=0.2
stop=1
start=0

;MAINLOOP

Do
   angle_old=angle
   angle= WrapAngle (angle,speed)
   
   sin_angle#=Sin (angle)
   cos_angle#=Cos (angle)
   
   PositionSpriteXYZ stopbutton_sprite, 30,50,stop
   PositionSpriteXYZ startbutton_sprite, 30,50,start
   PositionSpriteXYZ accelerate_sprite, 30,120,300
   PositionSpriteXYZ break_sprite, 30,200,300
   
   
   If PointHitSprite (MouseX(),MouseY(),startbutton_sprite) And LeftMouseButton()=True
    If speed = 0
      speed=1
      start=1
      stop=0
   Else
      
      start=0
     stop=1
  EndIf
     
   EndIf
   
 
   
   If PointHitSprite (MouseX(),MouseY(),accelerate_sprite) And LeftMouseButton()=True
 If stop= 0 Then speed =speed+1
 If speed =12 Then speed =12
   EndIf
   
   If PointHitSprite (MouseX(),MouseY(),break_sprite) And LeftMouseButton()=True
 If stop= 0 Then speed =speed-1
 If speed <=1 And start=1 Then speed =1
   EndIf
   If stop=1 And angle < angle_old Then speed =0   
   FlushMouse
   
   
   
   
;gives the "aquariumeffect" of the cylinder
   If PointHitSprite (MouseX(),MouseY(),cyl_front_sprite) =True
 alphalevel#=alphalevel#-corr#
 If alphalevel#<=0 Then alphalevel#=0
   
 Else alphalevel#=alphalevel#+corr#
 If alphalevel#>=1 Then alphalevel#=1
 
   EndIf
   
   SpriteAlphaLevel  cyl_front_sprite,alphalevel#
   
   PositionSpriteXYZ cyl_back_sprite, 150,110,300
   PositionSpriteXYZ cyl_front_sprite, 150,110,100
   
   RotateSprite flywheel_sprite,angle
   PositionSpriteXYZ flywheel_sprite, 200,406,300
   
   PositionSpriteXYZ piston_sprite, 160,180+(sin_angle#*50),200
   
;representation of pressure
   ScaleSpriteY pressure_sprite, sin_angle# +1.2
;this is not really correct,but it is sufficient.   
   
   If (angle>250 And angle < 270)  Then col = 255
   
   SpriteFlashColour pressure_sprite, RGB (255,col,0)
   PositionSpriteXYZ pressure_sprite, 161,120,210
   
   If cos_angle# < 0 Then PositionSpriteXYZ pressure_sprite, 161,120,310
   col = col + speed
   
   
;movement of rod
   rod_angle#= GetAngle2D (0,-185,cos_angle#*50,0)
   RotateSprite rod_sprite,rod_angle#
   PositionSpriteXYZ rod_sprite, 200,232+(sin_angle#*50) ,150
   
   
   
   RotateSprite colour_sprite,-angle
   PositionSpriteXYZ colour_sprite, 500,406 ,10
   PositionSpriteXYZ transmission_sprite, 350,406 ,400


Cls 100

RenderToScreen

DrawOrderedSprites

Sync

If EscKey()= True Then End  

Loop



[/pbcode]
Title: "tech" demo: motor-engine 001
Post by: kevin on October 31, 2005, 05:57:14 PM
Stef,

 That is simply Excellent... I'm actually stunned!

 Where did you get the idea for that from ?
Title: "tech" demo: motor-engine 001
Post by: empty on October 31, 2005, 06:00:47 PM
indeed, that's awesome (idea & realisation)!
Title: "tech" demo: motor-engine 001
Post by: Draco9898 on October 31, 2005, 07:31:31 PM
very cool piston there
Title: "tech" demo: motor-engine 001
Post by: stef on November 03, 2005, 11:48:28 AM
Hi!

Thanks for response.

Just working on another demo named "fireworks" and thinking about creating a game. Title: "Cool Sliding" . Maybe a funracer.

But must still study  examples and commands.

Btw.: Have just purchased PlayBasic.

Greetings
stef
Title: "tech" demo: motor-engine 001
Post by: stef on November 11, 2005, 11:09:20 AM
Hi!

Fixed a bug in the code above.

The "Transmission" wasn't shown.
Wrong value of SpriteDrawMode!

Should work now correctly.

Sorry
stef
Title: "tech" demo: motor-engine 001
Post by: tomazmb on November 11, 2005, 04:33:16 PM
Hello,

It really is a fantastic demo. Nice work.

Have a nice day,

Tomaz