Hola tengo una imagen en pantalla y quiero rotarla, por ejemplo en el sentido de las horas. Para que os hagais una idea es un coche que va recorriendo la pantalla y quier que tuerza. ¿Conoceis alguna funcion de LUA que rote una imagen?
Os recomiendo pasaros al LPHMv2 que trae una funcion para hacer eso mucho mas sencillo simplemente introduciendo la variable de la imagen y el angulo de giro.
ufff, le he echado un ojo y esto es cada vez mas complicado. entre LUA, LPHM8, PGE, LPHMv2... tengo los conocimientos informaticos necesarios `pero para mi es mas dificil decidirme por uno u otro que ponerme a programar en si, ademas parece que no son muy parecidos unos de otros...
Tampoco cambian mucho de LPHM8 a LPHMv2 (éste último es mas facil a mi parecer) pero si estas acostumbrado a LPHM7 e inferiores es mirar un poco las novedades y los cambios de sintaxis na mas ;)
-- Usando el LuaplayerHM hay que usar las funciones en 3D GU, no lo hé explicado antes puesto que es un poco complejo. Si bien es cierto que usando en nuevo Luaplayer PGE es mucho más fácil. Esta información está sacada de la libreria:
-- GX - Graphics Express -- Simple sprite rendering library for PSP -- Version 0.1 -- Andrew Carpenter -- http://www.studiokagato.com
function startGX() Gu.start3d() Gu.clearDepth(0); Gu.clear(Gu.COLOR_BUFFER_BIT+Gu.DEPTH_BUFFER_BIT) Gum.matrixMode(Gu.PROJECTION) Gum.loadIdentity() Gum.perspective(75, 480/272, 0.5, 1000) Gum.matrixMode(Gu.VIEW) Gum.loadIdentity() end
function endGX() Gu.end3d() end
function createSprite(img,color,x,y,width,height) if color==nil then color = Color.new(255,255,255) end if x==nil then x = 0; u0 = 0 else if x >= img:width() then x = img:width() u0 = 1 else u0 = x/img:width() end end if y==nil then y = 0; v0 = 0 else if y >= img:height() then y = img:height() v0 = 1 else v0 = y/img:height() end end if width==nil then width = img:width() u1 = 1; else if width > img:width() then width = img:width() end if (x+width) >= img:width() then u1 = 1 else u1 = (x+width)/img:width() end end if height==nil then height = img:height() v1 = 1; else if height > img:height() then height = img:height() end if (y+height) >= img:height() then v1 = 1 else v1 = (y+height)/img:height() end end w = width/2 h = height/2 sprite = { image = img, vertices = { {u0, v1, color, -w, -h, 0}, {u0, v0, color, -w, h, 0}, {u1, v0, color, w, h, 0},
function drawSprite(sprite,x,y,angle) if x==nil then x=0 end if y==nil then y=0 end if angle==nil then angle=0 end white = Color.new(255,255,255) Gu.enable(Gu.BLEND) Gu.blendFunc(Gu.ADD, Gu.SRC_ALPHA, Gu.ONE_MINUS_SRC_ALPHA, 0, 0) Gu.enable(Gu.TEXTURE_2D); Gu.texImage(sprite.image) Gu.texFunc(Gu.TFX_MODULATE, Gu.TCC_RGBA) Gu.texEnvColor(white) Gu.texFilter(Gu.LINEAR, Gu.LINEAR) Gu.texScale(1, 1) Gu.texOffset(0, 0) Gu.ambientColor(white) Gum.matrixMode(Gu.MODEL) Gum.loadIdentity() Gum.translate(x, y, -176); Gum.rotateXYZ(0, 0, -angle) Gum.drawArray(Gu.TRIANGLES, Gu.TEXTURE_32BITF+Gu.COLOR_8888+Gu.VERTEX_32BITF+Gu.TRANSFORM_3D, sprite.vertices) end
black = Color.new(0, 0, 0) image = Image.load("gx.png"); sprite = createSprite(image) x = 0; y = 0; angle = 0
while true do screen:clear(black) startGX()
drawSprite(sprite,x,y,angle)
endGX();
ctrl = Controls.read()
if ctrl:left() then x = x - 1; if x < -200 then x = -200 end elseif ctrl:right() then x = x + 1; if x > 200 then x = 200 end end if ctrl:down() then y = y - 1; if y < -100 then y = -100 end elseif ctrl:up() then y = y + 1; if y > 100 then y = 100 end end
stick = ctrl:analogX() -- ignore dead zone if stick > -35 and stick < 35 then stick = 0 end stick = stick/2000; angle = angle + stick
Muchas gracias a los 2. El script que usaba yo de 3D GU era parecido al que ha puesto Pipagerardo, solo cambiaba en un par de lines (lo sufuciente como para que el resultado no se pàreciese en nada ). En cuanto a lo del Phoenix la verdad es que es bastante interesante, muchas de las cosas mas comunes se simplifican bastante y lleva funcionalidades nuevas... Habra que tenerlo muy en cuenta...
Gracias a ambos, sigo con el tajo a ver si cuando tenga algo visible lo cuelgo...
Hola amigo, te recomiendo que uses el motor phoenix game engine lua, es genial, puedes dibujar por pantalla cualquier imagen y rotarlo lo que quieras en radianes, la funcion es esta:
pge.texture.draweasy(texture, x, y, [rotation], [alpha])
donde texture es tu imagen, x e y la posicion en pantalla, rotation es el angulo que la quieres girar en radianes (1.57 es mas o menos 90 grados, 3.14 es mas o menos 180... etc), si no pones rotacion por defecto es 0, y alpha es la trasparencia de la imagen, 255 es opaco y 0 es transparente totalmente, si no pones nada por defecto son 255, aver si te sirve, yo antes usaba el lua player hm pero abia cosas que no podia hacer, me pase al phoenix y estoy super contento con lo que me permite hacer.
Gracias a todos, efecivamente si tengo las imagenes hacia arriba y hacia abajo los movimientos serian muy bruscos. La intencion es que el coche se mueva la pantalla girando libremente.
Pucelano le he echado un ojo a los script pero el de rotar imagen solo permite en 90º, 180º y 270º. Estoy metido con las librerias GU 3D pero armo cada pifostio de guiness que no veais, y en los manuales de Pipagerardo tampoco aparece nada. Bueno si alguien encuentra algo no dudeis en dejarlopor aca...
para que una imagen vaya girando poco a poco en una plantilla tiene que tener 200 sprites, y para cargar eso... es mejor buscar una solución de rotación, si la hay.
Efectivamente como dice CkFra tendriamos que tener una plantilla con 360 sprites que son los posibles angulos en una rotacion, porque con 20 o 30 el salto al girar quedaria feo . Anoche me quede hasta las miles viendo lo de las GU 3d pero es una odisea. Tiene que haber algo mas sencillo... Sigo con la busqueda...
como minimo necesitas una plantilla de 4 imagenes, poque cuando vayya hacia delante el coche supongo que solo se vera el culo del cohe, cuando va hacia la detecha se vera de lado, cuando mira hacia abajo se vera el capo y cuando se va hacia la izquierda tres cuartos de lo mismo,
salu2
PD. suerte con la busqueda,
PD2. ¿de que tamaño es el coche?, porquer creo que la solucion va a ser la plantilla pero alomejor alguien te soluciona la duda
PD3. con hacer una imgen cada 5º bastaria pero tu sigue buscando
creo que no me expliqué antes, el juego es visto desde arriba. Para aprender LUA estoy pasando un tuto de un juego en FLASH. El juego es un circuito visto desde arriba y tu vas moviendo el coche con el stick. Tengo implementado todo el movimiento del coche, la aceleracion, la frenada, el giro... todo excepto que el morro del coche se gire hacia donde va. Pero eso es facilmente solucionable girando la imagen del coche un cierto angulo, angulo que tambien tengo ya calculado en cada pasada. Algo que es facilmente implementable en cualquier lenguaje como es girar una imagen un cierto grado en LUA se me esta haciendo cuesta arriba...
Os pongo el enlace de lo que llevo hecho asi lo veis:
Os recomiendo...
Os recomiendo pasaros al LPHMv2 que trae una funcion para hacer eso mucho mas sencillo simplemente introduciendo la variable de la imagen y el angulo de giro.
Salu2
¡Visca el Barça y Viva España!
ufff, le he echado un ojo y
ufff, le he echado un ojo y esto es cada vez mas complicado. entre LUA, LPHM8, PGE, LPHMv2... tengo los conocimientos informaticos necesarios `pero para mi es mas dificil decidirme por uno u otro que ponerme a programar en si, ademas parece que no son muy parecidos unos de otros...
No te creas
Tampoco cambian mucho de LPHM8 a LPHMv2 (éste último es mas facil a mi parecer) pero si estas acostumbrado a LPHM7 e inferiores es mirar un poco las novedades y los cambios de sintaxis na mas ;)
Salu2
¡Visca el Barça y Viva España!
Rotar imágenes
-- Usando el LuaplayerHM hay que usar las funciones en 3D GU, no lo hé explicado antes puesto que es un poco complejo. Si bien es cierto que usando en nuevo Luaplayer PGE es mucho más fácil. Esta información está sacada de la libreria:
-- GX - Graphics Express
-- Simple sprite rendering library for PSP
-- Version 0.1
-- Andrew Carpenter
-- http://www.studiokagato.com
function startGX()
Gu.start3d()
Gu.clearDepth(0);
Gu.clear(Gu.COLOR_BUFFER_BIT+Gu.DEPTH_BUFFER_BIT)
Gum.matrixMode(Gu.PROJECTION)
Gum.loadIdentity()
Gum.perspective(75, 480/272, 0.5, 1000)
Gum.matrixMode(Gu.VIEW)
Gum.loadIdentity()
end
function endGX()
Gu.end3d()
end
function createSprite(img,color,x,y,width,height)
if color==nil then color = Color.new(255,255,255) end
if x==nil then
x = 0; u0 = 0
else
if x >= img:width() then
x = img:width()
u0 = 1
else
u0 = x/img:width()
end
end
if y==nil then
y = 0; v0 = 0
else
if y >= img:height() then
y = img:height()
v0 = 1
else
v0 = y/img:height()
end
end
if width==nil then
width = img:width()
u1 = 1;
else
if width > img:width() then
width = img:width()
end
if (x+width) >= img:width() then
u1 = 1
else
u1 = (x+width)/img:width()
end
end
if height==nil then
height = img:height()
v1 = 1;
else
if height > img:height() then
height = img:height()
end
if (y+height) >= img:height() then
v1 = 1
else
v1 = (y+height)/img:height()
end
end
w = width/2
h = height/2
sprite = {
image = img,
vertices = {
{u0, v1, color, -w, -h, 0},
{u0, v0, color, -w, h, 0},
{u1, v0, color, w, h, 0},
{u0, v1, color, -w, -h, 0},
{u1, v0, color, w, h, 0},
{u1, v1, color, w, -h, 0}
}
}
return sprite
end
function drawSprite(sprite,x,y,angle)
if x==nil then x=0 end
if y==nil then y=0 end
if angle==nil then angle=0 end
white = Color.new(255,255,255)
Gu.enable(Gu.BLEND)
Gu.blendFunc(Gu.ADD, Gu.SRC_ALPHA, Gu.ONE_MINUS_SRC_ALPHA, 0, 0)
Gu.enable(Gu.TEXTURE_2D);
Gu.texImage(sprite.image)
Gu.texFunc(Gu.TFX_MODULATE, Gu.TCC_RGBA)
Gu.texEnvColor(white)
Gu.texFilter(Gu.LINEAR, Gu.LINEAR)
Gu.texScale(1, 1)
Gu.texOffset(0, 0)
Gu.ambientColor(white)
Gum.matrixMode(Gu.MODEL)
Gum.loadIdentity()
Gum.translate(x, y, -176);
Gum.rotateXYZ(0, 0, -angle)
Gum.drawArray(Gu.TRIANGLES, Gu.TEXTURE_32BITF+Gu.COLOR_8888+Gu.VERTEX_32BITF+Gu.TRANSFORM_3D, sprite.vertices)
end
black = Color.new(0, 0, 0)
image = Image.load("gx.png");
sprite = createSprite(image)
x = 0; y = 0;
angle = 0
while true do
screen:clear(black)
startGX()
drawSprite(sprite,x,y,angle)
endGX();
ctrl = Controls.read()
if ctrl:left() then
x = x - 1;
if x < -200 then x = -200 end
elseif ctrl:right() then
x = x + 1;
if x > 200 then x = 200 end
end
if ctrl:down() then
y = y - 1;
if y < -100 then y = -100 end
elseif ctrl:up() then
y = y + 1;
if y > 100 then y = 100 end
end
stick = ctrl:analogX()
-- ignore dead zone
if stick > -35 and stick < 35 then stick = 0 end
stick = stick/2000;
angle = angle + stick
if ctrl:start() then
screen:clear()
break
end
screen.waitVblankStart()
screen.flip()
end
Muchas gracias a los 2. El
Muchas gracias a los 2. El script que usaba yo de 3D GU era parecido al que ha puesto Pipagerardo, solo cambiaba en un par de lines (lo sufuciente como para que el resultado no se pàreciese en nada ). En cuanto a lo del Phoenix la verdad es que es bastante interesante, muchas de las cosas mas comunes se simplifican bastante y lleva funcionalidades nuevas... Habra que tenerlo muy en cuenta...
Gracias a ambos, sigo con el tajo a ver si cuando tenga algo visible lo cuelgo...
Hola amigo, te recomiendo
Hola amigo, te recomiendo que uses el motor phoenix game engine lua, es genial, puedes dibujar por pantalla cualquier imagen y rotarlo lo que quieras en radianes, la funcion es esta:
pge.texture.draweasy(texture, x, y, [rotation], [alpha])
donde texture es tu imagen, x e y la posicion en pantalla, rotation es el angulo que la quieres girar en radianes (1.57 es mas o menos 90 grados, 3.14 es mas o menos 180... etc), si no pones rotacion por defecto es 0, y alpha es la trasparencia de la imagen, 255 es opaco y 0 es transparente totalmente, si no pones nada por defecto son 255, aver si te sirve, yo antes usaba el lua player hm pero abia cosas que no podia hacer, me pase al phoenix y estoy super contento con lo que me permite hacer.
Espero que sirva.
Aqui tienes unos cuantos
Aqui tienes unos cuantos scripts, entre ellos uno para rotar una imagen: Enlace
Saludos
Gracias a todos,
Gracias a todos, efecivamente si tengo las imagenes hacia arriba y hacia abajo los movimientos serian muy bruscos. La intencion es que el coche se mueva la pantalla girando libremente.
Pucelano le he echado un ojo a los script pero el de rotar imagen solo permite en 90º, 180º y 270º. Estoy metido con las librerias GU 3D pero armo cada pifostio de guiness que no veais, y en los manuales de Pipagerardo tampoco aparece nada. Bueno si alguien encuentra algo no dudeis en dejarlopor aca...
Gracias a todos
Yo no se
Pero si nadie sabe puedes usar 2 imagenes diferentes que de un coche no pesaran mucho ;)
Salu2
estoy contigo
aunque en vez de dos imagenes puede hacer una plantilla donde este el coche mirando hacia arriba derecha izquierda y abajo
Ya claro
pero los giros serían muy bruscos, y lo que quieres es que vaya rotando poco a poco la imagen para que el giro sea real.
Busca el tutorial de pipagerardo y si hay no viene, no habrá en ningún otro sitio xD
Saludos
hombre...
en una plantilla, puedes hacer el coche poco a poco valla girando para eso son las plantillas ¿no? para hacer "mini animaciones" de giro y demas
Pero
para que una imagen vaya girando poco a poco en una plantilla tiene que tener 200 sprites, y para cargar eso... es mejor buscar una solución de rotación, si la hay.
Efectivamente como dice
Efectivamente como dice CkFra tendriamos que tener una plantilla con 360 sprites que son los posibles angulos en una rotacion, porque con 20 o 30 el salto al girar quedaria feo . Anoche me quede hasta las miles viendo lo de las GU 3d pero es una odisea. Tiene que haber algo mas sencillo... Sigo con la busqueda...
pero...
como minimo necesitas una plantilla de 4 imagenes, poque cuando vayya hacia delante el coche supongo que solo se vera el culo del cohe, cuando va hacia la detecha se vera de lado, cuando mira hacia abajo se vera el capo y cuando se va hacia la izquierda tres cuartos de lo mismo,
salu2
PD. suerte con la busqueda,
PD2. ¿de que tamaño es el coche?, porquer creo que la solucion va a ser la plantilla pero alomejor alguien te soluciona la duda
PD3. con hacer una imgen cada 5º bastaria pero tu sigue buscando
creo que no me expliqué...
creo que no me expliqué antes, el juego es visto desde arriba. Para aprender LUA estoy pasando un tuto de un juego en FLASH. El juego es un circuito visto desde arriba y tu vas moviendo el coche con el stick. Tengo implementado todo el movimiento del coche, la aceleracion, la frenada, el giro... todo excepto que el morro del coche se gire hacia donde va. Pero eso es facilmente solucionable girando la imagen del coche un cierto angulo, angulo que tambien tengo ya calculado en cada pasada. Algo que es facilmente implementable en cualquier lenguaje como es girar una imagen un cierto grado en LUA se me esta haciendo cuesta arriba...
Os pongo el enlace de lo que llevo hecho asi lo veis:
http://www.javalinuevo.com/ficherossubidos/paco_car.rar
He visto tambien las librerias GD donde hay una funcion ROTATE(imagen,angulo), pero no se como usarlas desde LUA pues estan en C.