Code archives/Graphics/Old School tunnel
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
creates a tunnel effect using image deformation. use any image 256x256 or you can get the source, graphics and executable from my signature link | |||||
' Last iteration's tick value 'trancelation from C using SDL to bmax 'original code found at: http://sol.gfxile.net/gp/ch17.html ' by Jari Komppa AKA Sol. Translated by Jesse. SuperStrict ' Screen surface Global gScreen:TPixmap Global GscreenPtr:Int Ptr Global PITCH:Int ' Texture surface Global gTexture:TPixmap Global gTexturePtr:Int Ptr ' Look-up table Global gLut:Short[] ' Distance mask Global gMask:Int[] ' Screen width Const WIDTH:Int = 480 ' Screen height Const HEIGHT:Int = 320 ' Physics iterations per second Const PHYSICSFPS:Int = 10 ' Last iteration's tick value Global gLastTick:Int Function init() Local temp:TPixmap = LoadPixmap("texture17.bmp") gTexture = ConvertPixmap(temp,PF_RGBA8888) gTexturePtr = Int Ptr(gTexture.pixels) gLut = New Short[WIDTH * HEIGHT * 4] gMask = New Int[WIDTH * HEIGHT * 4] Local i:Int, j:Int Local distance:Int For i = 0 Until HEIGHT * 2 For j = 0 Until WIDTH * 2 Local xdist:Int = j - WIDTH Local ydist:Int = i - HEIGHT ' round distance:Int = Sqr(xdist * xdist + ydist * ydist) ' square 'If (Abs(xdist) > Abs(ydist)) distance = Abs(xdist) Else distance = Abs(ydist) ' diamond 'distance = (Abs(xdist) + Abs(ydist)) / 2 ' flower 'distance :+ (Sin(ATan2(xdist,ydist) * 5)*8)*57.2957795 If (distance <= 0) distance = 1 Local d:Int = distance If (d > 255) d = 255 gMask[i * WIDTH * 2 + j] = d * $010101 distance = (64 * 256 / distance) & $ff Local angle:Int = (((ATan2(Float(xdist), Float(ydist)) / Pi*2) + 1.0) * 128)*0.0174532925 gLut[i * WIDTH * 2 + j] = (distance Shl 8) + angle Next Next End Function Function blend_mul:Int(source:Int, target:Int) Local sourcer:Int = (source Shr 0) & $ff Local sourceg:Int = (source Shr 8) & $ff Local sourceb:Int = (source Shr 16) & $ff Local targetr:Int = (target Shr 0) & $ff Local targetg:Int = (target Shr 8) & $ff Local targetb:Int = (target Shr 16) & $ff targetr = (sourcer * targetr) Shr 8 targetg = (sourceg * targetg) Shr 8 targetb = (sourceb * targetb) Shr 8 Return (targetr Shl 0) | (targetg Shl 8) | (targetb Shl 16) End Function Function render() ' Ask For the time in milliseconds Local tick:Int = MilliSecs() If (tick <= gLastTick) Delay(1) Return EndIf While (gLastTick < tick) ' 'physics' here gLastTick :+ 100 / PHYSICSFPS Wend Local posx:Int = (Sin((tick * 0.000645234)*57.2957795) + 1) * WIDTH / 2 Local posy:Int = (Sin(tick * 0.000445234*57.2957795) + 1) * HEIGHT / 2 Local posx2:Int =(Sin(-tick * 0.000645234*57.2957795) + 1) * WIDTH / 2 Local posy2:Int =(Sin(-tick * 0.000445234*57.2957795) + 1) * HEIGHT / 2 Local i:Int, j:Int For i = 0 Until HEIGHT For j = 0 Until WIDTH Local lut:Int = gLut[(i + posy) * WIDTH * 2 + j + posx] - gLut[(i + posy2) * WIDTH * 2 + j + posx2] Local mask:Int = gMask[(i + posy) * WIDTH * 2 + j + posx] Local mask2:Int = gMask[(i + posy2) * WIDTH * 2 + j + posx2] gScreenPtr[(j) + (i) * PITCH] =.. blend_mul(.. blend_mul(.. gTexturePtr[((lut + tick / 32) & $ff) +.. (((lut Shr 8) + tick / 8) & $ff) *.. (gTexture.pitch/4)],.. mask),.. mask2) Next Next End Function ' Attempt To Create a WIDTHxHEIGHT window with 32bit pixels. Graphics width,height gScreen = CreatePixmap(WIDTH, HEIGHT ,PF_RGBA8888) gScreenPtr = Int Ptr(gScreen.pixels) PITCH = gScreen.pitch/4 init() ' Main loop: loop Forever. Repeat Cls render() DrawPixmap gScreen,0,0 Flip(0) Until KeyDown(KEY_ESCAPE) |
Comments
| ||
More old school torus than tunnel, pretty spiffy. |
| ||
I just get a black window. Using Windows Vista Home Premium 32 bit. BFG GeForce 8800 GT OC |
| ||
I don't know what might be the problem. what kind of image and size did you tryed? can you try the executable at my signature link page under graphics_effects and let me if it works. |
Code Archives Forum