Hola a todos,

Estoy experimentando con GM :D - después de lo básico (evita las bolas que rebotan y tal), quiero hacer un juego en el que una pelota se mueve según la dirección y el tiempo que dejes pulsado el botón:

EDIT5 (Código final):

En create:
Código:
vertical=0
horizontal=0


Set Friction: 0.7

En step:
Código:
if vertical>20 vertical=20
if horizontal>20 horizontal=20
if vertical<-20 vertical=-20
if horizontal<-20 horizontal=-20

(esto es para limitar la velocidad, en este caso, el desplazamiento horizontal y vertical por encima y por debajo)


Key left (cuidado aquí que son keys, no keys pressed, ya que el key pressed realiza el evento una sola vez aunque lo deje pulsado, y aunque este en relative no se va a ir sumando)
Set variable horizontal relative to -2

Key right
Set variable horizontal relative to 2

Key up
Set variable vertical relative to -2

Key down
Set variable vertical relative to 2

Release left
Set the horizontal speed = horizontal (osea, velocidad variable horizontal)
Set variable horizontal no relative to 0 (esto sirve para que se ponga el contador de velocidad a cero, esto es muy importante, sino, pj, dejas pulsado derecha, sueltas, sale a 20; pulsas izquierda un poco y sueltas, y saldrá a derecha de nuevo, pq la horizontal estará en 15 o por ahí)

Release right
Set the horizontal speed = horizontal
Set variable horizontal no relative to 0

Release up
Set the vertical speed = vertical
Set variable vertical no relative to 0

Release down
Set the vertical speed = vertical
Set variable vertical no relative to 0

EDIT ANTERIOR:

[spoiler]- Objeto pelota y objeto muro para que la pelota colisiona (obvio).

Pero vayamos a la chicha, al objeto pelota (he usado una mezcla de código y D&D ((soy novato))):

-Create:
Código: [Seleccionar]

vertical=0
horizontal=0


-Step:
Código: [Seleccionar]

if vertical>30 vertical=30
if horizontal>30 horizontal=30
if vertical<-30 vertical=-30
if horizontal<-30 horizontal=-30


-Press left: D&D set variable horizontal relative to -2
-Press right: D&D set variable horizontal relative to 2
-Press down: D&D set variable vertical relative to 2
-Press up: D&D set variable horizontal relative to 2

- Release left: D&D set the horizontal speed to horizontal
- Release right: D&D set the horizontal speed to horizontal
- Release up: D&D set the horizontal speed to vertical
- Release down: D&D set the horizontal speed to vertical

¿Qué he conseguido?: La pelota sale disparada al lugar donde se indica, PERO, no suma la velocidad dejando pulsado el botón más tiempo sino repitiendo la pulsación del botón.

Ejemplo: Pulso derecha, la pelota sale a la derecha a velocidad 2, pulse derecha mucho o poco antes de soltar.

¿Qué estoy haciendo mal?

Muchas gracias a todos!  :D[/spoiler]

[spoiler]ANTERIORES EDITS:

Hasta ahora lo que tengo en lo siguiente, para que la pelota se mueva a la derecha por ejemplo, tengo (de momento trabajo con los D&D):

En el objeto pelota:

- Con release left (lo hago con la tecla izquierda pq quiero darle el estilo tirachinas, que dejas pulsado el lado contrario al que realmente quieres lanzarlo)
1. jump to position (+5, 0) (edito: sobra, es redundante)
2. set the horizontal speed to 5

Ahora estoy pensando cómo hago para que cuando deje pulsada la tecla, según el tiempo que pase salga con más o menos velocidad, se me ocurre:

- Crear una variable potencia_(nombredirección)
- Con el evento keypress ir sumando milisegundos a la variable potencia, ¿cómo se hace? :(
- Con el evento release, sumar toda la potencia al set horizontal speed, ¿cómo se hace?
- Limitar la variable a un máximo, para que no sea infinita, ¿cómo se hace? (edito: estoy en ello en el tercer post de este hilo  XD)

Voy a investigar por mi cuenta a ver si encuentro la solución por mi cuenta, y si es así edito, si no lo hago es que sigo perdido, muchas gracias a todos  :P

EDIT: Vale, ya me he dado cuenta de que el jump to position en este caso sobra, con determinar la velocidad de movimiento en suficiente.  :-[

EDIT2: ¿Este sería el GML para poner un tope a la velocidad?:

if vspeed>10 vspeed=10


¿Dónde tendría que colocarlo? ¿en el evento create de la bola?.

Gracias

EDIT3: Lo he intentado poniéndolo en el create de la bola, y poniendo la velocidad vertical al pulsar up o down en relative, para ver si funcionaba, y no ha sido así :/ de hecho llega a coger tanta velocidad que termina atravesando el muro con el que debe rebotar. (algo hago mal)
[/spoiler]

El tope de velocidad lo debes poner en el evento step, para que chequee permanentemente la velocidad, en el evento create solamente lo chequea cuando se crea el objeto y no creo que se cree con una velocidad superior a cero.

`•.¸¸.•´´¯`••._.•(Algunos se divierten jugando,)•.¸¸.•´´¯`••._.•
`•.¸¸.•´´¯`••._.•(yo me divierto creando juegos.)•.¸¸.•´´¯`••._.•


Disculpa Texic me siento como un elefante en una cacharrería  :-[
Si quieres edito y rehago el hilo en tres post, tu me dices.

Gracias  ;)

#4 Noviembre 02, 2012, 11:32:29 PM Ultima modificación: Noviembre 02, 2012, 11:39:56 PM por Texic
No, ya está, ya lo arreglé. A ver, en el evento create poné
[gml]actpot=0[/gml]
En el evento keyboard pressed poné
[gml]actpot=1[/gml]
En step poné
[gml]if actpot=1 {pot=min(100,pot+1)} else {pot=0}[/gml]
Y en el keyboard release
[gml]hspeed=pot/10
actpot=0[/gml]
Y listo. Para darle un máximo a una variable se suele usar la función min (la que usé), o un if que controle que la variable no se pase de ese número (encuetro el min mucho más cómodo y simple)




#5 Noviembre 03, 2012, 12:00:19 AM Ultima modificación: Noviembre 03, 2012, 12:18:55 AM por pepecajon
Muchísimas gracias Texic, estoy testando el código y te comento las cosas que creo que hago mal o no entiendo:

Primero he eliminado el /10 en release por que la pelota se movía muy lentamente.

Después encuentro que el disparo invariablemente se realiza a la derecha, y una vez que rebota contra el muro del final al pulsar la tecla la pelota sale a izquierda o derecha impredeciblemente (o eso me parece  ???).

A mi me gustaría que según dejes pulsado una tecla u otra la pelota se dirija a esa nueva dirección (dependiendo del tiempo pulsado con una potencia u otra), un ejemplo de lo que quiero hacer es este flash que he contrado (quiero hacer algo similar pero con teclado no con ratón y de momento sin gravedad): http://www.myfootballgames.co.uk/game/287/Crazy-Balls.html

¿Cómo puedo controlar la dirección con el código que me adjuntas?  :-[ he intentado añadir al key release un jump position pero me sigue pasando lo mismo, algo hago mal sin duda.

Muchas gracias!  ;)

Depende, yo tengo algo como lo que tu tienes, disparar con potencia, siempre al objeto que sale disparado, este caso una bola, al principio le pongo que se mueva hacia un objeto, en mi caso es el mouse, entonces le pongo en X mouse_x y en Y mouse_y, y en la velocidad lo que te dio Texic, unque yo uso otro metodo, en mi caso, la velocidad es (Powerr.x -320)/5, osea mi objeto Powerr al mantener presionado el boton de carga se va hacia la derecha, el -320 es enrealidad la posicion al inverso en el que esta en el room ( en este caso esta en 320).

cueck

#7 Noviembre 05, 2012, 04:33:45 PM Ultima modificación: Noviembre 05, 2012, 04:45:58 PM por pepecajon
Ufff... he probado vuestros código y luego les he intentado dar la vuelta pero no consigo lo que quiero exactamente  ???, os cuento desde el principio, necesito una pelota que al pulsar una de las teclas de dirección vaya acumulando potencia para salir más o menos fuerte según el tiempo pulsado, bien, hasta ahora he hecho lo siguiente:

- Objeto pelota y objeto muro para que la pelota colisiona (obvio).

Pero vayamos a la chicha, al objeto pelota (he usado una mezcla de código y D&D ((soy novato))):

-Create:
vertical=0
horizontal=0


-Step:
if vertical>30 vertical=30
if horizontal>30 horizontal=30
if vertical<-30 vertical=-30
if horizontal<-30 horizontal=-30


-Press left: D&D set variable horizontal relative to -2
-Press right: D&D set variable horizontal relative to 2
-Press down: D&D set variable vertical relative to 2
-Press up: D&D set variable horizontal relative to -2

- Release left: D&D set the horizontal speed to horizontal
- Release right: D&D set the horizontal speed to horizontal
- Release up: D&D set the horizontal speed to vertical
- Release down: D&D set the horizontal speed to vertical

¿Qué he conseguido?: La pelota sale disparada al lugar donde se indica, PERO, no suma la velocidad dejando pulsado el botón más tiempo sino repitiendo la pulsación del botón.

Ejemplo: Pulso derecha, la pelota sale a la derecha a velocidad 2, pulse derecha mucho o poco antes de soltar.

¿Qué estoy haciendo mal?

Muchas gracias a todos!  :D

#8 Noviembre 05, 2012, 06:12:12 PM Ultima modificación: Noviembre 05, 2012, 06:13:54 PM por ledillman
Mira el ejemplo que te adjunto, revisalo para que te hagas una idea, saludos.

Trata de adaptarlo a tu juego, como por ejemplo, en vez de ser el mouse donde sale el tiro, puede ser algun otro objeto que ande por ahí.

Muchas gracias a todos, ya se lo que estaba haciendo mal: el evento key pressed no sirve en este caso puesto que ese evento se produce sólo una vez aunque dejes pulsada la tecla. Lo que estaba en key pressed había que pasarlo todo a simplemente key, os dejo el código tal y como lo he dejado en mi juego:

En create:
Código:
vertical=0
horizontal=0


Set Friction: 0.7

En step:
Código:
if vertical>20 vertical=20
if horizontal>20 horizontal=20
if vertical<-20 vertical=-20
if horizontal<-20 horizontal=-20

(esto es para limitar la velocidad, en este caso, el desplazamiento horizontal y vertical por encima y por debajo)


Key left (cuidado aquí que son keys, no keys pressed, ya que el key pressed realiza el evento una sola vez aunque lo deje pulsado, y aunque este en relative no se va a ir sumando)
Set variable horizontal relative to -2

Key right
Set variable horizontal relative to 2

Key up
Set variable vertical relative to -2

Key down
Set variable vertical relative to 2

Release left
Set the horizontal speed = horizontal (osea, velocidad variable horizontal)
Set variable horizontal no relative to 0 (esto sirve para que se ponga el contador de velocidad a cero, esto es muy importante, sino, pj, dejas pulsado derecha, sueltas, sale a 20; pulsas izquierda un poco y sueltas, y saldrá a derecha de nuevo, pq la horizontal estará en 15 o por ahí)

Release right
Set the horizontal speed = horizontal
Set variable horizontal no relative to 0

Release up
Set the vertical speed = vertical
Set variable vertical no relative to 0

Release down
Set the vertical speed = vertical
Set variable vertical no relative to 0

Gracias a todos por la ayuda