Heim Web-Frontend H5-Tutorial Verwenden Sie HTML5 Canvas, um ein einfaches Masturbationsspiel zu erstellen. HTML5-Tutorial-Fähigkeiten

Verwenden Sie HTML5 Canvas, um ein einfaches Masturbationsspiel zu erstellen. HTML5-Tutorial-Fähigkeiten

May 16, 2016 pm 03:46 PM
canvas html5

Ich habe schon einmal in Donnets DEMO ein Masturbationsspiel gesehen und dann die Bilder und den Ton davon heruntergenommen. . . . Ich habe es nur zum Spaß umgeschrieben. Nur zur Unterhaltung. . . . . . Ich verwende kein Framework, ich schreibe alle JS selbst. . . . . . Dies ist also ein einfaches Tutorial, das für diejenigen hilfreich sein kann, die noch keine Erfahrung mit Canvas haben. Bitte verzeihen Sie mir.

Beginnen wir ohne weitere Umschweife mit der DEMO: Airplane Game. Der Originalposter hat dies nur zum Spaß geschrieben und hatte nicht die Absicht, daraus ein ernstes Spiel zu machen.

Kommen wir zum Thema: Die Masturbationsspieldatei enthält die Index.html-Eintragsdatei, die Logikverarbeitungsdatei des Sprites allSprite.js, die Loading.js-Ladeverarbeitungsdatei und data.js (einige initialisierte Daten).

Zunächst einmal erfordern normale Spiele grundsätzlich ein Laden. Die Ladeseite wird zum Vorladen von Daten verwendet, einschließlich Sprite-Sheet-Bildern, Audio usw. Da es sich um ein kleines Spiel handelt, müssen nur einige Audio- und Bilddateien geladen werden. Der darin enthaltene Ladecode dient hauptsächlich der Erstellung von Ladeanimationen. Wenn Sie interessiert sind, schauen Sie sich einfach die Konsole in der DEMO an >

XML/HTML-Code
Inhalt in die Zwischenablage kopieren
  1. loadImg:function(datas){   
  2.             var _this = this;   
  3.             var dataIndex = 0;   
  4.             li();   
  5.             function li(){   
  6.                 if(datas[dataIndex].indexOf("mp3")>=0){   
  7.                     var audio = document.createElement("audio");   
  8.                     document.body.appendChild(audio);   
  9.                                                                     
  10.                            
  11.                         dataIndex ;                            if(dataIndex
  12. ===datas.length){   
  13.                                                         }else {   
  14.                                
  15.                             li.call(_this);                            }   
  16.                     }   
  17.                 }sonst {   
  18.                     preLoadImg(datas[dataIndex] , function(){   
  19.                         dataIndex ;   
  20.                         if(dataIndex===datas.length){   
  21.                                                         } else {                                   
  22.                             li.call(_this);   
  23.                         }                        })                    }   
  24.             }   
  25.         },   
  26.   
  27. //再贴出preLoadImg的方法   
  28. function preLoadImg(src , callback){   
  29.     var 
  30. img
  31.  = 
  32. neu
  33.  Image();   
  34.     
  35. img.src
  36.  = src;        if(img.complete){            callback.call(img);   
  37.     }sonst {            
  38. img.onload
  39.  = 
  40. function
  41. (){   
  42.             callback.call(img);   
  43.         }        }    }   
  44.   

  45. Ich verwende zuerst ein Array, um die Links zu den Dateien in data.js zu speichern, und bestimme dann, ob es sich bei diesen Links um Bilder oder Audios handelt, um sie mit preLoadImg zu laden ist sehr einfach: Erstellen Sie einfach ein neues Objekt, weisen Sie ihm den Link zu und rufen Sie es nach dem Laden wieder auf. Audio wird geladen, indem ein HTML5-Audio-Dom-Objekt generiert und ihm der Link zugewiesen wird. Wenn der Browser erwartet, dass er die angegebene Audio-/Videowiedergabe fortsetzen kann, ohne ihn zum Puffern anzuhalten, tritt das Ereignis „canplaythrough“ auf , was bedeutet, dass beim Aufruf von canplaythrough das Audio fast geladen wurde und das nächste Audio geladen werden kann. Einfach so: Nachdem alles geladen ist, erfolgt der Rückruf und das Spiel beginnt.

    Das Spiel erfordert viele Objekte, daher habe ich sie in einem Sprite-Objekt zusammengefasst. Die Bewegung jedes Frames zwischen verschiedenen Objekten kann mithilfe des Verhaltens separat geschrieben werden.

    XML/HTML-CodeInhalt in die Zwischenablage kopieren
    1. W.Sprite = Funktion(Name , Maler , Verhalten , Argumente){   
    2.     if(name !== undefiniert) this.name = name;   
    3.     if(maler !== undefiniert) this.painter = maler;   
    4.     this.top = 0;   
    5.     this.left = 0;   
    6.     this.width = 0;   
    7.     this.height = 0;   
    8.     this.velocityX = 3;   
    9.     this.velocityY = 2;   
    10.     this.visible = true;   
    11.     this.animating = false;   
    12.     this.behaviors = behaviors;   
    13.     this.rotateAngle = 0;   
    14.     this.blood = 50;   
    15.     this.fullBlood = 50;   
    16.     if(name==="plan"){   
    17.         this.rotateSpeed = 0.05;   
    18.         this.rotateLeft = false;   
    19.         this.rotateRight = false;   
    20.         this.fire = false;   
    21.         this.firePerFrame = 10;   
    22.         this.fireLevel = 1;   
    23.     }else if(name==="star"){   
    24.         this.width = Math.random()*2;   
    25.         this.speed = 1*this.width/2;   
    26.         this.lightLength = 5;   
    27.         this.cacheCanvas = document.createElement("canvas");   
    28.         thisthis.cacheCtx = this.cacheCanvas.getContext('2d');   
    29.         thisthis.cacheCanvas.width = this.width this.lightLength*2;   
    30.         thisthis.cacheCanvas.height = this.width this.lightLength*2;   
    31.         this.painter.cache(this);   
    32.     }else if(name==="badPlan"){   
    33.         this.badKind = 1;   
    34.         this.speed = 2;   
    35.         this.rotateAngle = Math.PI;   
    36.     }else if(name==="missle"){   
    37.         this.width = missleWidth;   
    38.     }else if(name==="boom"){   
    39.         this.width = boomWidth;   
    40.     }else if(name==="food"){   
    41.         this.width = 40;   
    42.         this.speed = 3;   
    43.         this.kind = "LevelUP"  
    44.     }  
    45.     this.toLeft = false;   
    46.     this.toTop = false;   
    47.     this.toRight = false;   
    48.     this.toBottom = false;   
    49.   
    50.     this.outArcRadius = Math.sqrt((this.width/2*this.width/2 )*2);   
    51.   
    52.     if(args){   
    53.         for(var arg in args){   
    54.             this[arg] = args[arg];   
    55.         }   
    56.     }   
    57. }   
    58. Sprite.prototype = {   
    59.     constructor:Sprite,   
    60.     paint:function(){   
    61.         if(this.name==="badPlan"){this.update();}   
    62.   
    63.         if(this.painter !== undefiniert && this.visible){   
    64.             if(this.name!=="badPlan") {   
    65.                 this.update();   
    66.             }   
    67.             if(this.name==="plan"||this.name===" missle"||this.name==="badPlan"){   
    68.                 ctx.save();   
    69.                 ctx.translate(this.left , this.top);   
    70.                 ctx.rotate(this.rotateAngle);   
    71.                 this.painter.paint(this);   
    72.                 ctx.restore();   
    73.             }else {   
    74.                 this.painter.paint(this);   
    75.             }   
    76.         }   
    77.     },
    78. update:function(time){
    79. if(this.behaviors){
    80. for(var i=0;i<this.behaviors.length;i ){
    81. this.behaviors[i].execute(this,time);
    82.                                                               
    83.                                                              
    84. }
    85. }
    Nachdem Sie die Elf-Klasse geschrieben haben, können Sie verschiedene Objekte generieren, indem Sie jeden Maler und jedes Verhalten schreiben. Der nächste Schritt besteht darin, Maler zu schreiben. Der eine ist der normale Maler und der andere der Sprite-Sheet-Maler. Da Explosionsanimationen und Flugzeugschießanimationen nicht mit nur einem Bild erstellt werden können, müssen Sie es verwenden zum Spritesheet:



    2015511181456172.png (168×24)

    Um diese zu zeichnen, müssen Sie einen Sprite-Sheet-Maler anpassen. Je nach Komplexität des Spiels kann die Sprite-Sheet-Schreibmethode jedoch entsprechend geändert werden , die Prinzipien sind ähnlich, das heißt nur geringfügige Änderungen:

    2015511181533636.png (896×64)

    XML/HTML-Code

    Inhalt in die Zwischenablage kopieren
    1. var SpriteSheetPainter = Funktion(Zellen){   
    2.             this.cells = Zellen || [];   
    3.             this.cellIndex = 0;   
    4.         }   
    5.         SpriteSheetPainter.prototype = {   
    6.             advance:function(){   
    7.                 if(this.cellIndex === this.cells.length-1){   
    8.                                         }                    else this.cellIndex ;   
    9.             },   
    10.             paint:function(sprite){   
    11.                 var 
    12. cell
    13.  = 
    14. this
    15. .cells[this.cellIndex];                    context.drawImage(spritesheet , cell.x , cell.y , cell.w , cell.h , sprite.left , sprite.top , cell.w , cell.h);                }   
    16.         }   
    17.   
    18. 而普通的绘制器就更简单了,直接写一个painter,把要画的什么东西都写进去就行了. 有了精灵类和精灵表绘制器后, 我们就可以把星星, 飞机, 子弹, 爆炸对象都写出来了:下面是整个allSprite.js的代码:
    JavaScript-Code

    复制内容到剪贴板


    1. (Funktion(W){   
    2.     "strikt verwenden"  
    3.     var planWidth = 24,   
    4.         planHeight = 24,   
    5.         missleWidth = 70,   
    6.         missleHeight = 70,   
    7.         boomWidth = 60;   
    8.     //精灵类   
    9.     W.Sprite = Funktion(Name , Maler , Verhalten , Argumente){   
    10.         if(name !== undefiniert) this.name = name;   
    11.         if(painter !== undefiniert) this.painter = painter;   
    12.         dieses.top = 0;   
    13.         dieses.left = 0;   
    14.         dieses.width = 0;   
    15.         this.height = 0;   
    16.         dieses.velocityX = 3;   
    17.         this.velocityY = 2;   
    18.         this.visible = true;   
    19.         this.animating = false;   
    20.         dies.behaviors = behaviors;   
    21.         this.rotateAngle = 0;   
    22.         dieses.blood = 50;   
    23.         dieses.fullBlood = 50;   
    24.         if(name==="plan"){   
    25.             dies.rotateSpeed = 0.05;   
    26.             this.rotateLeft = false;   
    27.             this.rotateRight = false;   
    28.             this.fire = false;   
    29.             dieses.firePerFrame = 10;   
    30.             dieses.fireLevel = 1;   
    31.         }else if(name==="star" ){   
    32.             dieses.width = Math.random()*2;   
    33.             this.speed = 1*this.width/2;   
    34.             dieses.lightLength = 5;   
    35.             this.cacheCanvas = document.createElement("canvas");   
    36.             this.cacheCtx = this.cacheCanvas.getContext('2d');   
    37.             this.cacheCanvas.width = this.width this.lightLength*2;   
    38.             this.cacheCanvas.height = this.width this.lightLength*2;   
    39.             this.painter.cache(this);   
    40.         }else if(name==="badPlan" ){   
    41.             dieses.badKind = 1;   
    42.             dieses.speed = 2;   
    43.             this.rotateAngle = Math.PI;   
    44.         }else if(name==="missle" ){   
    45.             dieses.width = missleWidth;   
    46.         }else if(name==="boom" ){   
    47.             dieses.width = boomWidth;   
    48.         }else if(name==="food"){   
    49.             dieses.width = 40;   
    50.             dieses.speed = 3;   
    51.             dies.kind = "LevelUP"  
    52.         }   
    53.         this.toLeft = false;   
    54.         this.toTop = false;   
    55.         this.toRight = false;   
    56.         this.toBottom = false;   
    57.   
    58.         this.outArcRadius = Math.sqrt((this.width/2*this.width/2)*2);   
    59.   
    60.         if(args){   
    61.             for(var arg in args){
    62.                 dies[arg] = args[arg];   
    63.             }   
    64.         }   
    65.     }   
    66.     Sprite.prototype = {   
    67.         constructor:Sprite,   
    68.         paint:function(){   
    69.             if(this.name==="badPlan" ){this.update();}   
    70.   
    71.             if(this.painter !== undefined && this .sichtbar){   
    72.                 ) {                         this.update();                    }  
    73.                 ||dieses.name==="missle"||dieses .name==="badPlan"){                        ctx.save();                        ctx.translate(this.left , 
    74. this.top);   
    75.                     ctx.rotate(this.rotateAngle);                           
    76.                     ctx.restore();                    }
    77. else {                                            }   
    78.             }   
    79.         },            Update:
    80. Funktion(Zeit){                if(
    81. this.behaviors){   
    82.                 🎜>.behaviors.length;i ){   
    83.                        
    84.                 }                }   
    85.         }        }  
    86.   
    87.     // 精灵表绘制器   
    88.     W.SpriteSheetPainter = fonction(cellules , isloop , endCallback , spritesheet){   
    89.         ce.cells = cells || [] ;   
    90.         ce.cellIndex = 0 ;   
    91.         this.dateCount = null;   
    92.         ce.isloop = isloop;   
    93.         ce.endCallback = endCallback ;   
    94.         this.spritesheet = spritesheet ;   
    95.     }   
    96.     SpriteSheetPainter.prototype = {   
    97.         avance :fonction(){   
    98.             ce.cellIndex = ce.isloop?(ce.cellIndex===ce.cells.length-1?0:ce.cellIndex 1):(ce.cellIndex 1);   
    99.         },   
    100.         peinture :fonction(sprite){   
    101.             if(this.dateCount===null){   
    102.                 this.dateCount = new Date();   
    103.             }autre {   
    104.                 var newd = nouveau Date();   
    105.                 var tc = newd-this.dateCount;   
    106.                 si(tc>40){   
    107.                     ceci.advance();   
    108.                     ce.dateCount = newd;   
    109.                 }   
    110.              }  
    111.             if(this.cellIndex<this. cellules.longueur ||  ce.isloop){   
    112.                 var cell = ceci.cells[ceci .cellIndex];   
    113.                 ctx.drawImage(this.spritesheet , cell.x , cell.y , cell.w , cell.h , sprite.left-sprite.width/ 2 , sprite.top-sprite.width/2 , cell.w , cell.h);   
    114.             } else si(this.endCallback) {   
    115.                 ceci.endCallback.call(sprite);   
    116.                 ceci.cellIndex = 0 ;   
    117.              }   
    118.         }   
    119.     }   
    120.   
    121.     //特制飞机精灵表绘制器   
    122.     W.controllSpriteSheetPainter = fonction(cellules , spritesheet){   
    123.         ce.cells = cells || [] ;   
    124.         ce.cellIndex = 0 ;   
    125.         this.dateCount = null;   
    126.         this.isActive = false;   
    127.         ce.derection = vrai;   
    128.         this.spritesheet = spritesheet ;   
    129.     }  
    130.     controllSpriteSheetPainter.prototype = {   
    131.         avance :fonction(){   
    132.             si(this.isActive){   
    133.                 ceci.cellIndex ;   
    134.                 si(ce.cellIndex === ce.cells.length){   
    135.                     ce.cellIndex = 0 ;   
    136.                     this.isActive = false;   
    137.                 }   
    138.              }   
    139.         },   
    140.         peinture :fonction(sprite){   
    141.             if(this.dateCount===null){   
    142.                 this.dateCount = new Date();   
    143.             }autre {   
    144.                 var newd = nouveau Date();   
    145.                 var tc = newd-this.dateCount;   
    146.                 if(tc>sprite.firePerFrame){   
    147.                     ceci.advance();   
    148.                     ce.dateCount = newd;   
    149.                 }   
    150.              }   
    151.             var cell = ceci.cells[ceci .cellIndex];   
    152.             ctx.drawImage(this.spritesheet , cell.x , cell.y , cell.w , cell.h , -planWidth/2 , -planHeight/ 2 , cellule.w , cellule.h);   
    153.         }  
    154.     }   
    155.   
    156.     W.planBehavior = [   
    157.         {exécuter :fonction(sprite,heure){   
    158.             if(sprite.toTop){   
    159.                 sprite.top = sprite.top
    160.              }   
    161.             if(sprite.toLeft){   
    162.                 sprite.left = sprite.left
    163.              }   
    164.             si(sprite.toRight){   
    165.                 sprite.left = sprite.left>canvas.width-planWidth/2? sprite.left  : sprite.left sprite.velocityX ;   
    166.              }   
    167.             si(sprite.toBottom){   
    168.                 sprite.top = sprite.top>canvas.height-planHeight/2? sprite.top  : sprite.top sprite.velocityY ;   
    169.              }   
    170.             if(sprite.rotateLeft){   
    171.                 sprite.rotateAngle -= sprite.rotateSpeed;   
    172.              }   
    173.             if(sprite.rotateRight){   
    174.                 sprite.rotateAngle  = sprite.rotateSpeed;   
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Tabellenrahmen in HTML Tabellenrahmen in HTML Sep 04, 2024 pm 04:49 PM

Anleitung zum Tabellenrahmen in HTML. Hier besprechen wir verschiedene Möglichkeiten zum Definieren von Tabellenrändern anhand von Beispielen für den Tabellenrand in HTML.

Verschachtelte Tabelle in HTML Verschachtelte Tabelle in HTML Sep 04, 2024 pm 04:49 PM

Dies ist eine Anleitung für verschachtelte Tabellen in HTML. Hier diskutieren wir anhand der entsprechenden Beispiele, wie man eine Tabelle innerhalb der Tabelle erstellt.

HTML-Rand links HTML-Rand links Sep 04, 2024 pm 04:48 PM

Anleitung zum HTML-Rand links. Hier besprechen wir einen kurzen Überblick über HTML margin-left und seine Beispiele sowie seine Code-Implementierung.

HTML-Tabellenlayout HTML-Tabellenlayout Sep 04, 2024 pm 04:54 PM

Leitfaden zum HTML-Tabellenlayout. Hier besprechen wir die Werte des HTML-Tabellenlayouts zusammen mit den Beispielen und Ausgaben im Detail.

HTML-Eingabeplatzhalter HTML-Eingabeplatzhalter Sep 04, 2024 pm 04:54 PM

Leitfaden für HTML-Eingabeplatzhalter. Hier besprechen wir die Beispiele für HTML-Eingabeplatzhalter zusammen mit den Codes und Ausgaben.

Text in HTML verschieben Text in HTML verschieben Sep 04, 2024 pm 04:45 PM

Anleitung zum Verschieben von Text in HTML. Hier besprechen wir eine Einführung, wie Marquee-Tags funktionieren, mit Syntax und Beispielen für die Implementierung.

HTML-geordnete Liste HTML-geordnete Liste Sep 04, 2024 pm 04:43 PM

Leitfaden zur HTML-geordneten Liste. Hier besprechen wir auch die Einführung von HTML-geordneten Listen und Typen sowie deren Beispiele

HTML-Onclick-Button HTML-Onclick-Button Sep 04, 2024 pm 04:49 PM

Anleitung zum HTML-OnClick-Button. Hier diskutieren wir deren Einführung, Funktionsweise, Beispiele und Onclick-Events in verschiedenen Veranstaltungen.

See all articles