• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

GameMaker (Solved) drawn lines are not at rooms edge

S

Shadowblitz16

Guest
can someone tell me why my lines are 8 pixels away from the rooms edge?
I am trying to draw lines looped by storing the position of a wrapped object and then looping though those positions ad drawing a line between them
I am also in the processes of wrapping the lines by offsetting the prev_pos

Code:
/// @description move_wrap_ext
/// @param hor
/// @param vert
/// @param margin
/// @param min
/// @param max

var _hor    = argument[0]
var _vert   = argument[1]
var _margin = argument[2]
var _min    = argument[3]
var _max    = argument[4]

if      (_hor  and (x+0)-_margin < _min)  { wx = x; x += 128 }
else if (_hor  and (x+0)+_margin > _max)  { wx = x; x -= 128 }

if      (_vert and (y+0)-_margin < _min)  { wy = y; y += 112 }
else if (_vert and (y+0)+_margin > _max)  { wy = y; y -= 112 }

Code:
/// @Object Create event
// You can write your code in this editor

//event scripts
step_script      = undefined
draw_script      = undefined
collision_script = undefined

team             = 0
attachment       = [noone,0,0]
image_death      = false

//Prev variables
prev_team        = team
prev_attachment  = attachment
prev_image_death = image_death
prev_x           = x
prev_y           = y
prev_speed       = speed
prev_hspeed      = hspeed
prev_vspeed      = vspeed
prev_friction    = friction
prev_direction   = direction
prev_image_angle = image_angle
Code:
/// @Object Step event
// You can write your code in this editor

#region //Collision
var w = sprite_get_width (sprite_index)
var h = sprite_get_height(sprite_index)

//wrap h and collision
move_wrap_ext(true, false, w, 0, 128)
var coll = instance_place(x,y,all)
if instance_exists(coll) and collision_script != undefined script_execute(collision_script,id, coll)

//wrap v and collision
move_wrap_ext(false, true, h, 8, 112)
var coll = instance_place(x,y,all)
if instance_exists(coll) and collision_script != undefined script_execute(collision_script,id, coll)

//wrap h and collision again
move_wrap_ext(true, false, w, 0, 128)
var coll = instance_place(x,y,all)
if instance_exists(coll) and collision_script != undefined script_execute(collision_script,id, coll)

//wrap v and collision again
move_wrap_ext(false, true, h, 8, 112)
var coll = instance_place(x,y,all)
if instance_exists(coll) and collision_script != undefined script_execute(collision_script,id, coll)

#endregion

//Prev variables
prev_team        = team
prev_attachment  = attachment
prev_image_death = image_death
prev_x           = x
prev_y           = y
prev_speed       = speed
prev_hspeed      = hspeed
prev_vspeed      = vspeed
prev_friction    = friction
prev_direction   = direction
prev_image_angle = image_angle
Code:
/// @Object EndStep event
// You can write your code in this editor

#region //Attachment
 
if instance_exists(attachment[0])
{
    var o   = attachment[0]
    var ox  = attachment[1]
    var oy  = attachment[2]
    var ang = point_direction(0, 0,    ox, oy) + o.image_angle
    var len = point_distance (0, 0,    ox, oy) + 0
    x = o.x + lengthdir_x(len, ang)
    y = o.y + lengthdir_y(len, ang)
    image_angle = o.image_angle
}

#endregion
Code:
/// @Object Draw event
// You can write your code in this editor

if !sprite_exists(sprite_index) exit

var w = sprite_get_width (sprite_index)
var h = sprite_get_height(sprite_index)

palette_set(spr_pal, team)

//wrap h and draw
move_wrap_ext(true, false, w, 0, 128)
draw_sprite_ext(sprite_index, image_index,x,y, 1,1,image_angle-90,c_white,1)

//wrap v and draw
move_wrap_ext(false, true, h, 8, 112)
draw_sprite_ext(sprite_index, image_index,x,y, 1,1,image_angle-90,c_white,1)


//wrap h and draw again
move_wrap_ext(true, false, w, 0, 128)
draw_sprite_ext(sprite_index, image_index,x,y, 1,1,image_angle-90,c_white,1)

//wrap v and draw again
move_wrap_ext(false, true, h, 8, 112)
draw_sprite_ext(sprite_index, image_index,x,y, 1,1,image_angle-90,c_white,1)

palette_reset()
Code:
/// @Object AnimationEnd event
// You can write your code in this editor

if image_death instance_destroy(id)

Code:
/// @Projectile Create event
// You can write your code in this editor

event_inherited()

sprite_index0 = undefined
sprite_index1 = undefined
sprite_index2 = undefined
sprite_index3 = undefined

//Stats
stats_power              = 1
stats_range              = 1
stats_rapid              = 1
stats_energy             = 1
stats_spread             = 1
stats_special            = 1

//Base stats
stats_power_start        = -1
stats_range_start        = -1
stats_rapid_start        = -1
stats_energy_start       = -1
stats_spread_start       = -1
stats_special_start      = -1

//Extra stats per level
stats_power_extra        =  0
stats_range_extra        =  0
stats_rapid_extra        =  0
stats_energy_extra       =  0
stats_spread_extra       =  0
stats_special_extra      =  0



//Previus vars
prev_stats_power         = stats_power
prev_stats_range         = stats_range
prev_stats_rapid         = stats_rapid
prev_stats_energy        = stats_energy
prev_stats_spread        = stats_spread
prev_stats_special       = stats_special
prev_stats_power_start   = stats_power_start
prev_stats_range_start   = stats_range_start
prev_stats_rapid_start   = stats_rapid_start
prev_stats_energy_start  = stats_energy_start
prev_stats_spread_start  = stats_spread_start
prev_stats_special_start = stats_special_start
prev_stats_power_extra   = stats_power_extra
prev_stats_range_extra   = stats_range_extra
prev_stats_rapid_extra   = stats_rapid_extra
prev_stats_energy_extra  = stats_energy_extra
prev_stats_spread_extra  = stats_spread_extra
prev_stats_special_extra = stats_special_extra
Code:
/// @Projectile Stepevent
// You can write your code in this editor

event_inherited()

//Animation
prev_stats_power         = stats_power
prev_stats_range         = stats_range
prev_stats_rapid         = stats_rapid
prev_stats_energy        = stats_energy
prev_stats_spread        = stats_spread
prev_stats_special       = stats_special
prev_stats_power_start   = stats_power_start
prev_stats_range_start   = stats_range_start
prev_stats_rapid_start   = stats_rapid_start
prev_stats_energy_start  = stats_energy_start
prev_stats_spread_start  = stats_spread_start
prev_stats_special_start = stats_special_start
prev_stats_power_extra   = stats_power_extra
prev_stats_range_extra   = stats_range_extra
prev_stats_rapid_extra   = stats_rapid_extra
prev_stats_energy_extra  = stats_energy_extra
prev_stats_spread_extra  = stats_spread_extra
prev_stats_special_extra = stats_special_extra

#region //Sprite and Animation

if      (sprite_index0 != undefined and stats_power == 0 and stats_power != prev_stats_power)
{
    image_index  = 0
    sprite_index = sprite_index0
}
else if (sprite_index1 != undefined and stats_power == 1 and stats_power != prev_stats_power)
{
    image_index  = 0
    sprite_index = sprite_index1
}
else if (sprite_index2 != undefined and stats_power == 2 and stats_power != prev_stats_power)
{
    image_index  = 0
    sprite_index = sprite_index2
}
else if (sprite_index3 != undefined and stats_power == 3 and stats_power != prev_stats_power)
{
    image_index  = 0
    sprite_index = sprite_index3
}
 
#endregion
#region //Life and Range
    stats_range = max(stats_range-1, -1)
    if stats_range == 0 instance_destroy()
#endregion
Code:
/// @Projectile Draw event

event_inherited()

Code:
/// @Missile Create
// You can write your code in this editor

event_inherited()

sprite_index = spr_missile
team          = 4
tails         = ds_list_create()
tails_length  = 16


//Start stats
stats_power   =  8
stats_range   =  -1
stats_rapid   =  4
stats_energy  =  0
stats_spread  =  0
stats_special =  0
Code:
/// @description Insert description here
// You can write your code in this editor

event_inherited()
//if (tails_length <= 0 and ds_list_size(tails) > 0) ds_list_delete(tails, 0) 
ds_list_add(tails, [x, y])
tails_length--


var inst = instance_nearest(x,y,Entity)
var dir  = point_direction (x,y,inst.x, inst.y)
var len  = point_distance  (x,y,inst.x, inst.y)
motion_add(dir,0.1)
speed = min(speed, 5)
image_angle = direction

Code:
/// @Missile Draw


event_inherited()

//palette_set(spr_pal, team)
for (var i=0; i<ds_list_size(tails)-1; i++)
{
    var color    = make_color_rgb(0,255,255)
    var prev_pos = tails[| i+0]
    var curr_pos = tails[| i+1]

    //wrap line drawing
    //show_debug_message("prev x"+string(prev_pos[0] + prev_hspeed))
    //if      ((prev_pos[0] + prev_hspeed) <=   0) { prev_pos[0] += 128; show_debug_message("prev wrap") }
    //else if ((prev_pos[0] + prev_hspeed) >= 127) { prev_pos[0] -= 128; show_debug_message("prev wrap") }
 
    //show_debug_message("prev y"+string(prev_pos[1] + prev_vspeed))
    //if      ((prev_pos[1] + prev_vspeed) <=   8) { prev_pos[1] += 112; show_debug_message("prev wrap") }
    //else if ((prev_pos[1] + prev_vspeed) >= 111) { prev_pos[1] -= 112; show_debug_message("prev wrap") }

    draw_set_color(color)
    draw_line(curr_pos[0], curr_pos[1], prev_pos[0], prev_pos[1])
    //show_debug_message("test")
 
}
//palette_reset()

pic.png
 
S

Shadowblitz16

Guest
@Alex_Beach thankyou, however even when using this function from that topic
Code:
///draw_line_width_poly( x1, y1, x2, y2, width )
//
// 2017/01/29
// @jujuadams

var _x1 = argument0;
var _y1 = argument1;
var _x2 = argument2;
var _y2 = argument3;
var _w  = argument4;

var _d  = _w * 0.5 / point_distance( _x1, _y1, _x2, _y2 );
var _dx = ( _x2 - _x1 ) * _d;
var _dy = ( _y2 - _y1 ) * _d;

draw_primitive_begin( pr_trianglestrip );
draw_vertex( _x1 + _dy, _y1 - _dx );
draw_vertex( _x2 + _dy, _y2 - _dx );
draw_vertex( _x1 - _dy, _y1 + _dx );
draw_vertex( _x2 - _dy, _y2 + _dx );
draw_primitive_end();
the lines seems to still be not drawing to where the missile wraps
however it does fix the 1 pixel offsets issues from draw line
 
S

Shadowblitz16

Guest
here is my updated code

Code:
/// @description draw_sprite_wrapped
/// @param sprite
/// @param subimg
/// @param l
/// @param t
/// @param w
/// @param h
/// @param x
/// @param y
/// @param xs
/// @param ys
/// @param rot
/// @param c1
/// @param c2
/// @param c3
/// @param c4
/// @param alpha
/// @param wrapw
/// @param wraph

var _spr = argument[0]
var _ind = argument[1]
var _l   = argument[2]
var _t   = argument[3]
var _w   = argument[4]
var _h   = argument[5]
var _x   = argument[6]
var _y   = argument[7]
var _xs  = argument[8]
var _ys  = argument[9]
var _rot = argument[10]
var _c1  = argument[11]
var _c2  = argument[12]
var _c3  = argument[13]
var _c4  = argument[14]
var _alp = argument[15]
var _ww  = argument[16]
var _wh  = argument[17]
var _xo  = sprite_get_xoffset(sprite_index)
var _yo  = sprite_get_yoffset(sprite_index)

var _pdir = point_direction(0,0,_xo, _yo) + _rot
var _plen = point_distance (0,0,_xo, _yo) + 0
    _x   -= lengthdir_x(_plen, _pdir)
    _y   -= lengthdir_y(_plen, _pdir)

//Right
_x += _ww
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Right Bottom
_y += _wh
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Bottom
_x -= _ww
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Left Bottom
_x -= _ww
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Left
_y -= _wh
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Top Left
_y -= _wh
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Top
_x += _ww
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Top Right
_x += _ww
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)

//Actual Pos
_x -= _ww
_y += _wh
draw_sprite_general(_spr, _ind, _l, _t, _w, _h, _x, _y, _xs, _ys, _rot, _c1, _c2, _c3, _c4, _alp)
Code:
//Missile Step
/// @description Insert description here
// You can write your code in this editor

if (tails_length <= 0 and ds_list_size(tails) > 0) ds_list_delete(tails, 0)
ds_list_add(tails, [x, y])
tails_length--

event_inherited()


var wrap  = false
var wrapx = 0
var wrapy = 8
var wrapw = 128
var wraph = 112
var lx    = x-wrapw
var mx    = x
var rx    = x+wrapw
var ty    = y-wraph
var my    = y
var by    = y+wraph


var checks    = []
    checks[0] = [instance_nearest(mx,my, Entity), mx, my] //Middle, Middle
    checks[1] = [instance_nearest(rx,my, Entity), rx, my] //Right,  Middle
    checks[2] = [instance_nearest(rx,by, Entity), rx, by] //Right,  Bottom
    checks[3] = [instance_nearest(mx,by, Entity), mx, by] //Middle, Bottom
    checks[4] = [instance_nearest(lx,by, Entity), lx, by] //Left,   Bottom
    checks[5] = [instance_nearest(lx,my, Entity), lx, my] //Left,   Middle
    checks[6] = [instance_nearest(lx,ty, Entity), lx, ty] //Left,   Top
    checks[7] = [instance_nearest(mx,ty, Entity), mx, ty] //Middle, Top
    checks[8] = [instance_nearest(rx,ty, Entity), rx, ty] //Right,  Top

var nearest   = checks[0]
for (var i=0; i<array_length_1d(checks); i++)
{
    var check   = checks[i]
    var checkO  = check [0]
    var checkX2 = check [1]
    var checkY2 = check [2]
    var checkX1 = x
    var checkY1 = y
 
    var dist1 = point_distance(checkX1, checkY1, checkO.x, checkO.y)
    var dist2 = point_distance(checkX2, checkY2, checkO.x, checkO.y)
    if (dist1 > dist2)
    {
        nearest = check
    }
}
target   = nearest[0]
target_x = nearest[1]
target_y = nearest[2]

//Homing
if instance_exists(target)
{
    var dir  = point_direction(target_x, target_y, target.x, target.y)
    var len  = point_distance (target_x, target_y, target.x, target.y)
    motion_add(dir,(0.3))
    speed = min(speed, 4)
    image_angle = direction
}
Code:
///Missile Draw
event_inherited()

var wrap  = false
var wrapx = 0
var wrapy = 8
var wrapw = 128
var wraph = 112


//palette_set(spr_pal, team)
for (var i=0; i<ds_list_size(tails)-1; i++)
{
 
    var color    = make_color_rgb(0,255,255)
    var prev_pos = tails[| i+0]
    var curr_pos = tails[| i+1]

    draw_set_color(color)
    draw_line_width_poly(curr_pos[0]+000, curr_pos[1]+000, prev_pos[0]+000, prev_pos[1]+000, 1) //Middle
    draw_line_width_poly(curr_pos[0]+000, curr_pos[1]-112, prev_pos[0]+000, prev_pos[1]-112, 1) //Up
    draw_line_width_poly(curr_pos[0]+000, curr_pos[1]+112, prev_pos[0]+000, prev_pos[1]+112, 1) //Down
    draw_line_width_poly(curr_pos[0]-128, curr_pos[1]+000, prev_pos[0]-128, prev_pos[1]+000, 1) //Left
    draw_line_width_poly(curr_pos[0]+128, curr_pos[1]+000, prev_pos[0]+128, prev_pos[1]+000, 1) //Right
    draw_line_width_poly(curr_pos[0]-128, curr_pos[1]-112, prev_pos[0]-128, prev_pos[1]-112, 1) //Up Left
    draw_line_width_poly(curr_pos[0]-128, curr_pos[1]+112, prev_pos[0]-128, prev_pos[1]+112, 1) //Down Left
    draw_line_width_poly(curr_pos[0]+128, curr_pos[1]-112, prev_pos[0]+128, prev_pos[1]-112, 1) //Up Right
    draw_line_width_poly(curr_pos[0]+128, curr_pos[1]+112, prev_pos[0]+128, prev_pos[1]+112, 1) //Down Right
 
    if      (curr_pos[0] < wrapx) {  wrap = true }
    else if (curr_pos[0] > wrapw) {  wrap = true }
 
    if      (curr_pos[1] < wrapy) {  wrap = true }
    else if (curr_pos[1] > wraph) {  wrap = true }
 
    if (wrap == true)
    {
        i+=1;
        wrap = false;
        show_debug_message("Inf Loop?")
    }
}
pic.png
it still seems to stop at edges of screen but its mostly only at the edges its coming from

EDIT: this is due to not adding the position to the list after it wraps around
 
Last edited by a moderator:
Top