Kezdőoldal » Számítástechnika » Programozás » Hogyan tudom megoldani, hogy...

Hogyan tudom megoldani, hogy "rajzoljon"?

Figyelt kérdés

Szóval egy játékot próbálnék készíteni, de egy helyen elakadtam, nem találok hozzá segítséget sehol a neten. Szóval az a lényeg (most ebben a példában), hogy egy kockát lehet mozgatni a képernyőn. És úgy szeretném módosítani a programot, hogy ahol elhaladt a kocka, ott a nyomvonala legyen mondjuk zöld színű. Hogyan tudnám ezt megoldani? Ez lenne a kód:

<script>

var myGamePiece;


function startGame() {

myGamePiece = new component(30, 30, "red", 30, 670);

myGameArea.start();

}


var myGameArea = {

canvas : document.createElement("canvas"),

start : function() {

this.canvas.width = 1200;

this.canvas.height = 700;

this.context = this.canvas.getContext("2d");

document.body.insertBefore(this.canvas, document.body.childNodes[0]);

this.frameNo = 0;

this.interval = setInterval(updateGameArea, 20);

window.addEventListener('keydown', function (e) {

e.preventDefault();

myGameArea.keys = (myGameArea.keys || []);

myGameArea.keys[e.keyCode] = (e.type == "keydown");

})

window.addEventListener('keyup', function (e) {

myGameArea.keys[e.keyCode] = (e.type == "keydown");

})

},

stop : function() {

clearInterval(this.interval);

},

clear : function() {

this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);

}

}


function component(width, height, color, x, y, type) {


this.type = type;

this.width = width;

this.height = height;

this.speed = 0;

this.angle = 0;

this.moveAngle = 0;

this.x = x;

this.y = y;

this.update = function() {

ctx = myGameArea.context;

ctx.save();

ctx.translate(this.x, this.y);

ctx.rotate(this.angle);

ctx.fillStyle = color;

ctx.fillRect(this.width / -2, this.height / -2, this.width, this.height);

ctx.restore();

}

this.newPos = function() {

this.angle += this.moveAngle * Math.PI / 180;

this.x += this.speed * Math.sin(this.angle);

this.y -= this.speed * Math.cos(this.angle);

}

}


function updateGameArea() {

myGameArea.clear();

myGamePiece.moveAngle = 0;

myGamePiece.speed = 0;

if (myGameArea.keys && myGameArea.keys[37]) {myGamePiece.moveAngle = -1; }

if (myGameArea.keys && myGameArea.keys[39]) {myGamePiece.moveAngle = 1; }

if (myGameArea.keys && myGameArea.keys[38]) {myGamePiece.speed= 1; }

myGamePiece.newPos();

myGamePiece.update();

}

</script>



2020. ápr. 20. 22:16
 1/3 DjImipapa ***** válasza:
Továbbra is rossz a kategória.....
2020. ápr. 21. 10:15
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:

egy LIFO kell neked


ha a kocka elmozdul, akkor berakod a koordinátájt egy tömbbe, így fogod tudni, hogy milyen pontok közzé rajzold majd a szakaszokat


ha a tömb mérete elér egy max méretet, akkor elkezded kiszedni a végéről az elemeket

2020. ápr. 21. 11:55
Hasznos számodra ez a válasz?
 3/3 anonim ***** válasza:

Egyetértve a #2-es hozzászólóval, a meglevő kódból kiindulva, valahogy így oldanám meg:

[link]

így példányosítva:

myGamePath = new path(10, "red", 100)

előre mozgáskor így meghívva:

myGamePath.update(myGamePiece.x, myGamePiece.y);

majd a

myGamePiece.update();

után a

myGamePath.draw();

segítségével kirajzolni.


De ha szépen akarod kivitelezni, akkor csináld inkább így:

[link]

* kihasználjuk az ECMAScript 2015-ben megjelent osztályokat:

[link]

áttekinthetőbbé téve a kódot

* a window.setInterval() helyett window.requestAnimationFrame():

[link]

stabilabb

* a ctx.save() / ctx.translate() / ctx.rotate() / ctx.fillRect() / ctx.restore() helyett ctx.beginPath() / ctx.moveTo() / ctx.lineTo() / ctx.closePath() / ctx.fill() - gyorsabb, nem kell az egész context-tet mozgatni

2020. ápr. 21. 19:27
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!