Coder
Join Date: Jun 2011
Location: Australia
Posts: 795
GS2 3D Raycaster
There are a few things that need to be fixed/improved, I never fully finished sprite rendering (it sort of works lol).
Feel free to build on this, or play around with it etc.
I had some floor rendering, but it was extremely laggy as I couldn't access the image buffer directly.
PHP Code:
function onCreated (){
findplayer ( "Gund" ). addweapon ( this ); //Change to your name
}
//#CLIENTSIDE
function onCreated (){
this . maxlooplimit = 2000000 ;
sleep ( 1 );
this . map = {
{ 4 , 4 , 4 , 2 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 },
{ 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 3 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 2 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 2 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 },
{ 1 , 1 , 1 , 1 , 1 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
};
this . sprites = {
{ "bomb.png" , 1 , 3 },
{ "door.png" , 3 , 1 },
};
this . texturewidth = 64 ;
this . w = 700 ;
this . zbuffer = new[ this . w ];
this . h = 500 ;
this . off = { screenwidth / 2 - this . w / 2 , screenheight / 2 - this . h / 2 };
this . off = { 70 , 70 };
this . mapwidth = this . map [ 0 ]. size ();
this . mapheight = this . map . size ();
this . posx = 4 ;
this . posy = 3 ;
this . dirx = - 1 ;
this . diry = 0 ;
this . planex = 0.221 ;
this . planey = 0.5 ;
this . time = 0 ;
this . steps = 0 ;
this . smode = - 4 ;
this . wallcheck = 8 ;
temp . rotspeed = 0.08 ;
this . ntrig = { sin ( temp . rotspeed ), cos ( temp . rotspeed )};
this . trig = { sin (- temp . rotspeed ), cos (- temp . rotspeed )};
if( isobject ( "3D_R_GUN" )){
(@ "3D_R_GUN" ). destroy ();
}
if( isobject ( "Gunderak_3D" )){
(@ "Gunderak_3D" ). destroy ();
}
//return;
new GuiDrawingPanel ( "Gunderak_3D" ){
useownprofile = true ;
profile . fontcolor = "#FFFFFF" ;
width = thiso . w ;
height = thiso . h ;
x = thiso . off [ 0 ];
y = thiso . off [ 1 ];
clearall ();
}
onTimeout ();
}
function sqrt ( n ) {
return n ^ 0.5 ;
}
function onTimeout (){
Gunderak_3D . drawimagestretched ( 0 , 0 , this . w , this . h / 2 , "gunderak_sky.png" , 0 , 0 , 1 , 1 );
Gunderak_3D . drawimagestretched ( 0 , this . h / 2 , this . w , this . h / 2 , "gunderak_floor.png" , 0 , 0 , 1 , 1 );
for( temp . x = 0 ; temp . x < this . w ; temp . x ++){
temp . camerax = 2 * temp . x / this . w - 1 ;
temp . rayposx = this . posx ;
temp . rayposy = this . posy ;
temp . raydirx = this . dirx + this . planex * temp . camerax ;
temp . raydiry = this . diry + this . planey * temp . camerax ;
temp . mapx = int ( temp . rayposx );
temp . mapy = int ( temp . rayposy );
temp . sidedistx = 0 ;
temp . sidedisty = 0 ;
temp . deltadistx = sqrt ( 1 + ( temp . raydiry * temp . raydiry )/( temp . raydirx * temp . raydirx ));
temp . deltadisty = sqrt ( 1 + ( temp . raydirx * temp . raydirx )/( temp . raydiry * temp . raydiry ));
temp . perpwalldist = 0 ;
temp . stepx = 0 ;
temp . stepy = 0 ;
temp . hit = 0 ;
temp . side = 0 ;
if( temp . raydirx < 0 ){
temp . stepx = - 1 ;
temp . sidedistx = ( temp . rayposx - temp . mapx )* temp . deltadistx ;
}else{
temp . stepx = 1 ;
temp . sidedistx = ( temp . mapx + 1 - temp . rayposx ) * temp . deltadistx ;
}
if( temp . raydiry < 0 ){
temp . stepy = - 1 ;
temp . sidedisty = ( temp . rayposy - temp . mapy ) * temp . deltadisty ;
}else{
temp . stepy = 1 ;
temp . sidedisty = ( temp . mapy + 1 - temp . rayposy ) * temp . deltadisty ;
}
temp . count = 0 ;
while( temp . hit == 0 ){
temp . count ++;
if( temp . sidedistx < temp . sidedisty ){
temp . sidedistx += temp . deltadistx ;
temp . mapx += temp . stepx ;
temp . side = 0 ;
}else{
temp . sidedisty += temp . deltadisty ;
temp . mapy += temp . stepy ;
temp . side = 1 ;
}
if( this . map [ temp . mapx ][ temp . mapy ] > 0 ){
temp . hit = 1 ;
}
}
if( temp . side == 0 ){
temp . perpwalldist = abs (( temp . mapx - temp . rayposx + ( 1 - temp . stepx )/ 2 )/ temp . raydirx );
}else{
temp . perpwalldist = abs (( temp . mapy - temp . rayposy + ( 1 - temp . stepy )/ 2 )/ temp . raydiry );
}
temp . lineheight = int ( this . h / temp . perpwalldist );
temp . drawstart = (- temp . lineheight / 2 ) + ( this . h / 2 );
temp . drawend = ( temp . lineheight / 2 ) + ( this . h / 2 );
temp . t = this . map [ temp . mapx ][ temp . mapy ]- 1 ;
temp . wallx = 0 ;
if( temp . side == 0 ){
temp . wallx = temp . rayposy + temp . perpwalldist * temp . raydiry ;
}else{
temp . wallx = temp . rayposx + temp . perpwalldist * temp . raydirx ;
}
temp . wallx -= int ( temp . wallx );
temp . texx = int ( temp . wallx * this . texturewidth );
if( temp . side == 0 && temp . raydirx > 0 ){
temp . texx = this . texturewidth - temp . texx - 1 ;
}
if( temp . side == 1 && temp . raydiry < 0 ){
temp . texx = this . texturewidth - temp . texx - 1 ;
}
temp . texx = this . texturewidth - temp . texx - 1 ;
temp . c = { 1 , 1 , 1 };
if( temp . side == 1 ){
temp . c = { 0.65 , 0.65 , 0.65 };
}
temp . h = temp . drawend - temp . drawstart ;
Gunderak_3D . drawimagestretched ( temp . x , temp . drawstart , 1 , temp . h , "wolftextures.png" , temp . texx +( thiso . texturewidth * temp . t ), 0 , 1 , this . texturewidth );
this . zbuffer [ temp . x ] = temp . perpwalldist ;
}
for( temp . sprite : this . sprites ){
temp . spi = temp . sprite [ 0 ];
temp . spx = temp . sprite [ 1 ] - this . posx ;
temp . spy = temp . sprite [ 2 ] - this . posy ;
temp . invdet = 1 /( this . planex * this . diry - this . dirx * this . planey );
temp . transformx = temp . invdet * ( this . diry * temp . spx - this . dirx * temp . spy );
temp . transformy = temp . invdet * (- this . planey * temp . spx + this . planex * temp . spy );
temp . spritescreenx = int (( this . w / 2 ) * ( 1 + temp . transformx / temp . transformy ));
temp . spriteheight = abs ( int ( this . h / temp . transformy ));
temp . drawstarty = - temp . spriteheight / 2 + this . h / 2 ;
if( temp . drawstarty < 0 ){
temp . drawstarty = 0 ;
}
temp . drawendy = temp . spriteheight / 2 + this . h / 2 ;
if( temp . drawendy >= this . h ){
temp . drawendy = this . h - 1 ;
}
temp . spritewidth = abs ( int ( this . h / temp . transformy ));
temp . drawstartx = - temp . spritewidth / 2 + temp . spritescreenx ;
if( temp . drawstartx < 0 ){
temp . drawstartx = 0 ;
}
temp . drawendx = temp . spritewidth / 2 + temp . spritescreenx ;
if( temp . drawendx >= this . w ){
temp . drawendx = this . w - 1 ;
}
for( temp . tx = temp . drawstartx ; temp . tx < temp . drawendx ; temp . tx ++){
temp . texx = int ( temp . tx - (- temp . spritewidth / 2 + temp . spritescreenx ) * 32 / temp . spritewidth );
temp . texx = 0 ;
//Buggggs ugh
if( temp . transformy > 0 && temp . tx > 0 && temp . tx < this . w && temp . transformy < this . zbuffer [ temp . tx ]){
temp . sh = temp . drawendy - temp . drawstarty ;
Gunderak_3D . drawimagestretched ( temp . tx , temp . drawstarty , 1 , temp . sh , temp . spi , temp . texx , 0 , 1 , 32 );
}
}
}
temp . ms = 0.1 ;
if( keydown ( 1 )){
temp . olddirx = this . dirx ;
this . dirx = this . dirx * this . ntrig [ 1 ] - this . diry * this . ntrig [ 0 ];
this . diry = temp . olddirx * this . ntrig [ 0 ] + this . diry * this . ntrig [ 1 ];
temp . oldplanex = this . planex ;
this . planex = this . planex * this . ntrig [ 1 ] - this . planey * this . ntrig [ 0 ];
this . planey = temp . oldplanex * this . ntrig [ 0 ] + this . planey * this . ntrig [ 1 ];
}
if( keydown ( 3 )){
temp . olddirx = this . dirx ;
this . dirx = this . dirx * this . trig [ 1 ] - this . diry * this . trig [ 0 ];
this . diry = temp . olddirx * this . trig [ 0 ] + this . diry * this . trig [ 1 ];
temp . oldplanex = this . planex ;
this . planex = this . planex * this . trig [ 1 ] - this . planey * this . trig [ 0 ];
this . planey = temp . oldplanex * this . trig [ 0 ] + this . planey * this . trig [ 1 ];
}
if( keydown ( 2 )){
this . steps += this . smode ;
if( this . map [ int ( this . posx - this . dirx * temp . ms * this . wallcheck )][ int ( this . posy )] == 0 ){
this . posx -= this . dirx * temp . ms ;
}
if( this . map [ int ( this . posx )][ int ( this . posy - this . diry * temp . ms * this . wallcheck )] == 0 ){
this . posy -= this . diry * temp . ms ;
}
}
if( keydown ( 0 )){
this . steps += this . smode ;
if( this . map [ int ( this . posx + this . dirx * temp . ms * this . wallcheck )][ int ( this . posy )] == 0 ){
this . posx += this . dirx * temp . ms ;
}
if( this . map [ int ( this . posx )][ int ( this . posy + this . diry * temp . ms * this . wallcheck )] == 0 ){
this . posy += this . diry * temp . ms ;
}
}
if( this . steps > 10 ){
this . smode = - 4 ;
}
if( this . steps < 1 ){
this . smode = 4 ;
}
temp . so = int ( this . steps );
new GuiBitmapCtrl ( "3D_R_GUN" ) {
x = thiso . off [ 0 ] + thiso . w / 2 - 35 ;
y = thiso . off [ 1 ] + thiso . h - 64 ;
bitmaprectangle = { 0 , 0 , 81 , 92 - thiso . steps };
bitmap = "gunderak_3d_gun.png" ;
thiso . catchevent ( this , "onMouseDown" , "onFireGun" );
}
settimer ( 0.05 );
}
function onFireGun (){
//player.chat = "bang!";
}
Attached Thumbnails
Attached Images
__________________
Gund for president.
Remote PM {P*}x (Graal813044) from eraiphone -> Stefan: I hav 1 qustion
*Gunderak: he hav 1
*Gunderak: qustion